Port more corescripts to yuescript

This commit is contained in:
Lewin Kelly 2023-04-17 23:06:10 +01:00
parent 55d3a622aa
commit 686e23f0d7
4 changed files with 1902 additions and 0 deletions

526
yue/153556783.lua Normal file
View File

@ -0,0 +1,526 @@
local New
New = function(className, name, props)
if not (props ~= nil) then
props = name
name = nil
end
local obj = Instance.new(className)
if name then
obj.Name = name
end
local parent
for k, v in pairs(props) do
if type(k) == "string" then
if k == "Parent" then
parent = v
else
obj[k] = v
end
elseif type(k) == "number" and type(v) == "userdata" then
v.Parent = obj
end
end
obj.Parent = parent
return obj
end
while not Game do
wait()
end
while not Game:FindFirstChild("Players") do
wait()
end
while not Game.Players.LocalPlayer do
wait()
end
while not Game:FindFirstChild("CoreGui") do
wait()
end
while not Game.CoreGui:FindFirstChild("RobloxGui") do
wait()
end
local userInputService = Game:GetService("UserInputService")
local success = pcall(function()
return userInputService:IsLuaTouchControls()
end)
if not success then
script:Destroy()
end
local screenResolution = Game:GetService("GuiService"):GetScreenResolution()
local isSmallScreenDevice
isSmallScreenDevice = function()
return screenResolution.y <= 320
end
local localPlayer = Game.Players.LocalPlayer
local thumbstickSize = 120
if isSmallScreenDevice() then
thumbstickSize = 70
end
local touchControlsSheet = "rbxasset://textures/ui/TouchControlsSheet.png"
local ThumbstickDeadZone = 5
local ThumbstickMaxPercentGive = 0.92
local thumbstickTouches = { }
local jumpButtonSize = 90
if isSmallScreenDevice() then
jumpButtonSize = 70
end
local oldJumpTouches = { }
local currentJumpTouch
local CameraRotateSensitivity = 0.007
local CameraRotateDeadZone = CameraRotateSensitivity * 16
local CameraZoomSensitivity = 0.03
local PinchZoomDelay = 0.2
local cameraTouch
Game:GetService("ContentProvider"):Preload(touchControlsSheet)
local DistanceBetweenTwoPoints
DistanceBetweenTwoPoints = function(point1, point2)
local dx = point2.x - point1.x
local dy = point2.y - point1.y
return math.sqrt(dx * dx + dy * dy)
end
local transformFromCenterToTopLeft
transformFromCenterToTopLeft = function(pointToTranslate, guiObject)
return UDim2.new(0, pointToTranslate.x - guiObject.AbsoluteSize.x / 2, 0, pointToTranslate.y - guiObject.AbsoluteSize.y / 2)
end
local rotatePointAboutLocation
rotatePointAboutLocation = function(pointToRotate, pointToRotateAbout, radians)
local sinAnglePercent = math.sin(radians)
local cosAnglePercent = math.cos(radians)
local transformedPoint = pointToRotate
transformedPoint = Vector2.new(transformedPoint.x - pointToRotateAbout.x, transformedPoint.y - pointToRotateAbout.y)
local xNew = transformedPoint.x * cosAnglePercent - transformedPoint.y * sinAnglePercent
local yNew = transformedPoint.x * sinAnglePercent + transformedPoint.y * cosAnglePercent
transformedPoint = Vector2.new(xNew + pointToRotateAbout.x, yNew + pointToRotateAbout.y)
return transformedPoint
end
local dotProduct
dotProduct = function(v1, v2)
return v1.x * v2.x + v1.y * v2.y
end
local stationaryThumbstickTouchMove
stationaryThumbstickTouchMove = function(thumbstickFrame, thumbstickOuter, touchLocation)
local thumbstickOuterCenterPosition = Vector2.new(thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2)
local centerDiff = DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenterPosition)
if centerDiff > (thumbstickSize / 2) then
local thumbVector = Vector2.new(touchLocation.x - thumbstickOuterCenterPosition.x, touchLocation.y - thumbstickOuterCenterPosition.y)
local normal = thumbVector.unit
if normal.x == math.nan or normal.x == math.inf then
normal = Vector2.new(0, normal.y)
end
if normal.y == math.nan or normal.y == math.inf then
normal = Vector2.new(normal.x, 0)
end
local newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize / 2))
thumbstickFrame.Position = transformFromCenterToTopLeft(newThumbstickInnerPosition, thumbstickFrame)
else
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame)
end
return Vector2.new(thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset, thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset)
end
local followThumbstickTouchMove
followThumbstickTouchMove = function(thumbstickFrame, thumbstickOuter, touchLocation)
local thumbstickOuterCenter = Vector2.new(thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2, thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2)
if DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) > thumbstickSize / 2 then
local thumbstickInnerCenter = Vector2.new(thumbstickFrame.Position.X.Offset + thumbstickFrame.AbsoluteSize.x / 2, thumbstickFrame.Position.Y.Offset + thumbstickFrame.AbsoluteSize.y / 2)
local movementVectorUnit = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit
local outerToInnerVectorCurrent = Vector2.new(thumbstickInnerCenter.x - thumbstickOuterCenter.x, thumbstickInnerCenter.y - thumbstickOuterCenter.y)
local outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit
local movementVector = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y)
local crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y) - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x)
local angle = math.atan2(crossOuterToInnerWithMovement, dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit))
local anglePercent = angle * math.min(movementVector.magnitude / outerToInnerVectorCurrent.magnitude, 1.0)
if math.abs(anglePercent) > 0.00001 then
local outerThumbCenter = rotatePointAboutLocation(thumbstickOuterCenter, thumbstickInnerCenter, anglePercent)
thumbstickOuter.Position = transformFromCenterToTopLeft(Vector2.new(outerThumbCenter.x, outerThumbCenter.y), thumbstickOuter)
end
thumbstickOuter.Position = UDim2.new(0, thumbstickOuter.Position.X.Offset + movementVector.x, 0, thumbstickOuter.Position.Y.Offset + movementVector.y)
end
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame)
local thumbstickFramePosition = Vector2.new(thumbstickFrame.Position.X.Offset, thumbstickFrame.Position.Y.Offset)
local thumbstickOuterPosition = Vector2.new(thumbstickOuter.Position.X.Offset, thumbstickOuter.Position.Y.Offset)
if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize / 2 then
local vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize / 2
thumbstickOuter.Position = UDim2.new(0, thumbstickFramePosition.x + vectorWithLength.x, 0, thumbstickFramePosition.y + vectorWithLength.y)
end
return Vector2.new(thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset, thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset)
end
local movementOutsideDeadZone
movementOutsideDeadZone = function(movementVector)
return (math.abs(movementVector.x) > ThumbstickDeadZone) or (math.abs(movementVector.y) > ThumbstickDeadZone)
end
local constructThumbstick
constructThumbstick = function(defaultThumbstickPos, updateFunction, stationaryThumbstick)
local thumbstickFrame = New("Frame", "ThumbstickFrame", {
Active = true,
Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize),
Position = defaultThumbstickPos,
BackgroundTransparency = 1
})
New("ImageLabel", "InnerThumbstick", {
Image = touchControlsSheet,
ImageRectOffset = Vector2.new(220, 0),
ImageRectSize = Vector2.new(111, 111),
BackgroundTransparency = 1,
Size = UDim2.new(0, thumbstickSize / 2, 0, thumbstickSize / 2),
Position = UDim2.new(0, thumbstickFrame.Size.X.Offset / 2 - thumbstickSize / 4, 0, thumbstickFrame.Size.Y.Offset / 2 - thumbstickSize / 4),
ZIndex = 2,
Parent = thumbstickFrame
})
local outerThumbstick = New("ImageLabel", "OuterThumbstick", {
Image = touchControlsSheet,
ImageRectOffset = Vector2.new(0, 0),
ImageRectSize = Vector2.new(220, 220),
BackgroundTransparency = 1,
Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize),
Position = defaultThumbstickPos,
Parent = Game.CoreGui.RobloxGui
})
local thumbstickTouch
local userInputServiceTouchMovedCon
local userInputSeviceTouchEndedCon
local startInputTracking
startInputTracking = function(inputObject)
if thumbstickTouch then
return
end
if inputObject == cameraTouch then
return
end
if inputObject == currentJumpTouch then
return
end
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
return
end
thumbstickTouch = inputObject
table.insert(thumbstickTouches, thumbstickTouch)
thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position, thumbstickFrame)
outerThumbstick.Position = thumbstickFrame.Position
userInputServiceTouchMovedCon = userInputService.TouchMoved:connect(function(movedInput)
if movedInput == thumbstickTouch then
local movementVector
if stationaryThumbstick then
movementVector = stationaryThumbstickTouchMove(thumbstickFrame, outerThumbstick, Vector2.new(movedInput.Position.x, movedInput.Position.y))
else
movementVector = followThumbstickTouchMove(thumbstickFrame, outerThumbstick, Vector2.new(movedInput.Position.x, movedInput.Position.y))
end
if updateFunction then
return updateFunction(movementVector, outerThumbstick.Size.X.Offset / 2)
end
end
end)
userInputSeviceTouchEndedCon = userInputService.TouchEnded:connect(function(endedInput)
if endedInput == thumbstickTouch then
if updateFunction then
updateFunction(Vector2.new(0, 0), 1)
end
userInputSeviceTouchEndedCon:disconnect()
userInputServiceTouchMovedCon:disconnect()
thumbstickFrame.Position = defaultThumbstickPos
outerThumbstick.Position = defaultThumbstickPos
for i, object in pairs(thumbstickTouches) do
if object == thumbstickTouch then
table.remove(thumbstickTouches, i)
break
end
end
thumbstickTouch = nil
end
end)
end
userInputService.Changed:connect(function(prop)
if prop == "ModalEnabled" then
do
local _tmp_0 = not userInputService.ModalEnabled
thumbstickFrame.Visible = _tmp_0
outerThumbstick.Visible = _tmp_0
end
end
end)
thumbstickFrame.InputBegan:connect(startInputTracking)
return thumbstickFrame
end
local setupCharacterMovement
setupCharacterMovement = function(parentFrame)
local lastMovementVector, lastMaxMovement
local moveCharacterFunc = localPlayer.MoveCharacter
local moveCharacterFunction
moveCharacterFunction = function(movementVector, maxMovement)
if localPlayer then
if movementOutsideDeadZone(movementVector) then
lastMovementVector = movementVector
lastMaxMovement = maxMovement
if movementVector.magnitude / maxMovement > ThumbstickMaxPercentGive then
maxMovement = movementVector.magnitude - 1
end
return moveCharacterFunc(localPlayer, movementVector, maxMovement)
else
lastMovementVector = Vector2.new(0, 0)
lastMaxMovement = 1
return moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement)
end
end
end
local thumbstickPos = UDim2.new(0, thumbstickSize / 2, 1, -thumbstickSize * 1.75)
if isSmallScreenDevice() then
thumbstickPos = UDim2.new(0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20)
end
local characterThumbstick = constructThumbstick(thumbstickPos, moveCharacterFunction, false)
characterThumbstick.Name = "CharacterThumbstick"
characterThumbstick.Parent = parentFrame
local refreshCharacterMovement
refreshCharacterMovement = function()
if localPlayer and moveCharacterFunc and lastMovementVector and lastMaxMovement then
return moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement)
end
end
return refreshCharacterMovement
end
local setupJumpButton
setupJumpButton = function(parentFrame)
local jumpButton = New("ImageButton", "JumpButton", {
BackgroundTransparency = 1,
Image = touchControlsSheet,
ImageRectOffset = Vector2.new(176, 222),
ImageRectSize = Vector2.new(174, 174),
Size = UDim2.new(0, jumpButtonSize, 0, jumpButtonSize),
Position = UDim2.new(1, (function()
if isSmallScreenDevice() then
return -(jumpButtonSize * 2.25), 1, -jumpButtonSize - 20
else
return -(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120
end
end)())
})
local playerJumpFunc = localPlayer.JumpCharacter
local doJumpLoop
doJumpLoop = function()
while currentJumpTouch do
if localPlayer then
playerJumpFunc(localPlayer)
end
wait(1 / 60)
end
end
jumpButton.InputBegan:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
return
end
if currentJumpTouch then
return
end
if inputObject == cameraTouch then
return
end
for _, touch in pairs(oldJumpTouches) do
if touch == inputObject then
return
end
end
currentJumpTouch = inputObject
jumpButton.ImageRectOffset = Vector2.new(0, 222)
jumpButton.ImageRectSize = Vector2.new(174, 174)
return doJumpLoop()
end)
jumpButton.InputEnded:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
return
end
jumpButton.ImageRectOffset = Vector2.new(176, 222)
jumpButton.ImageRectSize = Vector2.new(174, 174)
if inputObject == currentJumpTouch then
table.insert(oldJumpTouches, currentJumpTouch)
currentJumpTouch = nil
end
end)
userInputService.InputEnded:connect(function(globalInputObject)
for i, touch in pairs(oldJumpTouches) do
if touch == globalInputObject then
table.remove(oldJumpTouches, i)
break
end
end
end)
userInputService.Changed:connect(function(prop)
if prop == "ModalEnabled" then
jumpButton.Visible = not userInputService.ModalEnabled
end
end)
jumpButton.Parent = parentFrame
end
local isTouchUsedByJumpButton
isTouchUsedByJumpButton = function(touch)
if touch == currentJumpTouch then
return true
end
for _, touchToCompare in pairs(oldJumpTouches) do
if touch == touchToCompare then
return true
end
end
return false
end
local isTouchUsedByThumbstick
isTouchUsedByThumbstick = function(touch)
for _, touchToCompare in pairs(thumbstickTouches) do
if touch == touchToCompare then
return true
end
end
return false
end
local setupCameraControl
setupCameraControl = function(parentFrame, refreshCharacterMoveFunc)
local lastPos
local hasRotatedCamera = false
local rotateCameraFunc = userInputService.RotateCamera
local pinchTime = -1
local shouldPinch = false
local lastPinchScale
local zoomCameraFunc = userInputService.ZoomCamera
local pinchTouches = { }
local pinchFrame
local resetCameraRotateState
resetCameraRotateState = function()
cameraTouch = nil
hasRotatedCamera = false
lastPos = nil
end
local resetPinchState
resetPinchState = function()
pinchTouches = { }
lastPinchScale = nil
shouldPinch = false
pinchFrame:Destroy()
pinchFrame = nil
end
local startPinch
startPinch = function(firstTouch, secondTouch)
if pinchFrame ~= nil then
pinchFrame:Destroy()
end
pinchFrame = New("Frame", {
Name = "PinchFrame",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Parent = parentFrame
})
pinchFrame.InputChanged:connect(function(inputObject)
if not shouldPinch then
resetPinchState()
return
end
resetCameraRotateState()
if not (lastPinchScale ~= nil) then
if inputObject == firstTouch then
lastPinchScale = (inputObject.Position - secondTouch.Position).magnitude
firstTouch = inputObject
elseif inputObject == secondTouch then
lastPinchScale = (inputObject.Position - firstTouch.Position).magnitude
secondTouch = inputObject
end
else
local newPinchDistance = 0
if inputObject == firstTouch then
newPinchDistance = (inputObject.Position - secondTouch.Position).magnitude
firstTouch = inputObject
elseif inputObject == secondTouch then
newPinchDistance = (inputObject.Position - firstTouch.Position).magnitude
secondTouch = inputObject
end
if newPinchDistance ~= 0 then
local pinchDiff = newPinchDistance - lastPinchScale
if pinchDiff ~= 0 then
zoomCameraFunc(userInputService, (pinchDiff * CameraZoomSensitivity))
end
lastPinchScale = newPinchDistance
end
end
end)
return pinchFrame.InputEnded:connect(function(inputObject)
if inputObject == firstTouch or inputObject == secondTouch then
return resetPinchState()
end
end)
end
local pinchGestureReceivedTouch
pinchGestureReceivedTouch = function(inputObject)
if #pinchTouches < 1 then
table.insert(pinchTouches, inputObject)
pinchTime = tick()
shouldPinch = false
elseif #pinchTouches == 1 then
shouldPinch = ((tick() - pinchTime) <= PinchZoomDelay)
if shouldPinch then
table.insert(pinchTouches, inputObject)
return startPinch(pinchTouches[1], pinchTouches[2])
else
pinchTouches = { }
end
end
end
parentFrame.InputBegan:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
return
end
if isTouchUsedByJumpButton(inputObject) then
return
end
local usedByThumbstick = isTouchUsedByThumbstick(inputObject)
if not usedByThumbstick then
pinchGestureReceivedTouch(inputObject)
end
if not (cameraTouch ~= nil) and not usedByThumbstick then
cameraTouch = inputObject
lastPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y)
end
end)
userInputService.InputChanged:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
return
end
if cameraTouch ~= inputObject then
return
end
local newPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y)
local touchDiff = (lastPos - newPos) * CameraRotateSensitivity
if not hasRotatedCamera and (touchDiff.magnitude > CameraRotateDeadZone) then
hasRotatedCamera = true
lastPos = newPos
end
if hasRotatedCamera and (lastPos ~= newPos) then
rotateCameraFunc(userInputService, touchDiff)
refreshCharacterMoveFunc()
lastPos = newPos
end
end)
return userInputService.InputEnded:connect(function(inputObject)
if cameraTouch == inputObject or not (cameraTouch ~= nil) then
resetCameraRotateState()
end
for i, touch in pairs(pinchTouches) do
if touch == inputObject then
table.remove(pinchTouches, i)
end
end
end)
end
local setupTouchControls
setupTouchControls = function()
local touchControlFrame = New("Frame", "TouchControlFrame", {
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
Parent = Game.CoreGui.RobloxGui
})
local refreshCharacterMoveFunc = setupCharacterMovement(touchControlFrame)
setupJumpButton(touchControlFrame)
setupCameraControl(touchControlFrame, refreshCharacterMoveFunc)
return userInputService.ProcessedEvent:connect(function(inputObject, processed)
if not processed then
return
end
if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin then
cameraTouch = nil
end
end)
end
return setupTouchControls()

View File

@ -0,0 +1,576 @@
-- This is responsible for all touch controls we show (as of this writing, only on iOS)
-- this includes character move thumbsticks, and buttons for jump, use of items, camera, etc.
-- Written by Ben Tkacheff, Roblox 2013
-- Heliodex's basic New function (basically a simplified version of melt)
New = (className, name, props) ->
if not props? -- no name was provided
props = name
name = nil
obj = Instance.new className
obj.Name = name if name
local parent
for k, v in pairs props
if type(k) == "string"
if k == "Parent"
parent = v
else
obj[k] = v
elseif type(k) == "number" and type(v) == "userdata"
v.Parent = obj
obj.Parent = parent
obj
--
-- obligatory stuff to make sure we don't access nil data
wait! until Game
wait! until Game\FindFirstChild "Players"
wait! until Game.Players.LocalPlayer
wait! until Game\FindFirstChild "CoreGui"
wait! until Game.CoreGui\FindFirstChild "RobloxGui"
userInputService = Game\GetService "UserInputService"
success = try
userInputService\IsLuaTouchControls!
if not success
script\Destroy!
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Variables
screenResolution = Game\GetService("GuiService")\GetScreenResolution!
isSmallScreenDevice = ->
return screenResolution.y <= 320
localPlayer = Game.Players.LocalPlayer
thumbstickSize = 120
if isSmallScreenDevice!
thumbstickSize = 70
touchControlsSheet = "rbxasset://textures/ui/TouchControlsSheet.png"
ThumbstickDeadZone = 5
ThumbstickMaxPercentGive = 0.92
thumbstickTouches = {}
jumpButtonSize = 90
if isSmallScreenDevice!
jumpButtonSize = 70
oldJumpTouches = {}
local currentJumpTouch
CameraRotateSensitivity = 0.007
CameraRotateDeadZone = CameraRotateSensitivity * 16
CameraZoomSensitivity = 0.03
PinchZoomDelay = 0.2
local cameraTouch
-- make sure all of our images are good to go
Game\GetService("ContentProvider")\Preload touchControlsSheet
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Functions
DistanceBetweenTwoPoints = (point1, point2) ->
dx = point2.x - point1.x
dy = point2.y - point1.y
math.sqrt dx * dx + dy * dy
transformFromCenterToTopLeft = (pointToTranslate, guiObject) ->
UDim2.new(
0,
pointToTranslate.x - guiObject.AbsoluteSize.x / 2,
0,
pointToTranslate.y - guiObject.AbsoluteSize.y / 2
)
rotatePointAboutLocation = (pointToRotate, pointToRotateAbout, radians) ->
sinAnglePercent = math.sin radians
cosAnglePercent = math.cos radians
transformedPoint = pointToRotate
-- translate point back to origin:
transformedPoint = Vector2.new transformedPoint.x - pointToRotateAbout.x, transformedPoint.y - pointToRotateAbout.y
-- rotate point
xNew = transformedPoint.x * cosAnglePercent - transformedPoint.y * sinAnglePercent
yNew = transformedPoint.x * sinAnglePercent + transformedPoint.y * cosAnglePercent
-- translate point back:
transformedPoint = Vector2.new xNew + pointToRotateAbout.x, yNew + pointToRotateAbout.y
transformedPoint
dotProduct = (v1, v2) -> v1.x * v2.x + v1.y * v2.y
stationaryThumbstickTouchMove = (thumbstickFrame, thumbstickOuter, touchLocation) ->
thumbstickOuterCenterPosition = Vector2.new(
thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2,
thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2
)
centerDiff = DistanceBetweenTwoPoints touchLocation, thumbstickOuterCenterPosition
-- thumbstick is moving outside our region, need to cap its distance
if centerDiff > (thumbstickSize / 2)
thumbVector = Vector2.new(
touchLocation.x - thumbstickOuterCenterPosition.x,
touchLocation.y - thumbstickOuterCenterPosition.y
)
normal = thumbVector.unit
if normal.x == math.nan or normal.x == math.inf
normal = Vector2.new 0, normal.y
if normal.y == math.nan or normal.y == math.inf
normal = Vector2.new normal.x, 0
newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize / 2))
thumbstickFrame.Position = transformFromCenterToTopLeft newThumbstickInnerPosition, thumbstickFrame
else
thumbstickFrame.Position = transformFromCenterToTopLeft touchLocation, thumbstickFrame
Vector2.new(
thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,
thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset
)
followThumbstickTouchMove = (thumbstickFrame, thumbstickOuter, touchLocation) ->
thumbstickOuterCenter = Vector2.new(
thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x / 2,
thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y / 2
)
-- thumbstick is moving outside our region, need to position outer thumbstick texture carefully (to make look and feel like actual joystick controller)
if DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) > thumbstickSize / 2
thumbstickInnerCenter = Vector2.new(
thumbstickFrame.Position.X.Offset + thumbstickFrame.AbsoluteSize.x / 2,
thumbstickFrame.Position.Y.Offset + thumbstickFrame.AbsoluteSize.y / 2
)
movementVectorUnit = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit
outerToInnerVectorCurrent = Vector2.new(
thumbstickInnerCenter.x - thumbstickOuterCenter.x,
thumbstickInnerCenter.y - thumbstickOuterCenter.y
)
outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit
movementVector = Vector2.new touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y
-- First, find the angle between the new thumbstick movement vector,
-- and the vector between thumbstick inner and thumbstick outer.
-- We will use this to pivot thumbstick outer around thumbstick inner, gives a nice joystick feel
crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y) -
(outerToInnerVectorCurrentUnit.y * movementVectorUnit.x)
angle = math.atan2 crossOuterToInnerWithMovement, dotProduct outerToInnerVectorCurrentUnit, movementVectorUnit
anglePercent = angle * math.min(movementVector.magnitude / outerToInnerVectorCurrent.magnitude, 1.0)
-- If angle is significant, rotate about the inner thumbsticks current center
if math.abs(anglePercent) > 0.00001
outerThumbCenter = rotatePointAboutLocation thumbstickOuterCenter, thumbstickInnerCenter, anglePercent
thumbstickOuter.Position = transformFromCenterToTopLeft Vector2.new(outerThumbCenter.x, outerThumbCenter.y), thumbstickOuter
-- now just translate outer thumbstick to make sure it stays nears inner thumbstick
thumbstickOuter.Position = UDim2.new(
0,
thumbstickOuter.Position.X.Offset + movementVector.x,
0,
thumbstickOuter.Position.Y.Offset + movementVector.y
)
thumbstickFrame.Position = transformFromCenterToTopLeft touchLocation, thumbstickFrame
-- a bit of error checking to make sure thumbsticks stay close to eachother
thumbstickFramePosition = Vector2.new thumbstickFrame.Position.X.Offset, thumbstickFrame.Position.Y.Offset
thumbstickOuterPosition = Vector2.new thumbstickOuter.Position.X.Offset, thumbstickOuter.Position.Y.Offset
if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize / 2
vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize / 2
thumbstickOuter.Position = UDim2.new(
0,
thumbstickFramePosition.x + vectorWithLength.x,
0,
thumbstickFramePosition.y + vectorWithLength.y
)
Vector2.new(
thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,
thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset
)
movementOutsideDeadZone = (movementVector) ->
(math.abs(movementVector.x) > ThumbstickDeadZone) or (math.abs(movementVector.y) > ThumbstickDeadZone)
constructThumbstick = (defaultThumbstickPos, updateFunction, stationaryThumbstick) ->
thumbstickFrame = New "Frame", "ThumbstickFrame"
Active: true
Size: UDim2.new 0, thumbstickSize, 0, thumbstickSize
Position: defaultThumbstickPos
BackgroundTransparency: 1
New "ImageLabel", "InnerThumbstick"
Image: touchControlsSheet
ImageRectOffset: Vector2.new 220, 0
ImageRectSize: Vector2.new 111, 111
BackgroundTransparency: 1
Size: UDim2.new 0, thumbstickSize / 2, 0, thumbstickSize / 2
Position: UDim2.new(
0,
thumbstickFrame.Size.X.Offset / 2 - thumbstickSize / 4,
0,
thumbstickFrame.Size.Y.Offset / 2 - thumbstickSize / 4
)
ZIndex: 2
Parent: thumbstickFrame
outerThumbstick = New "ImageLabel", "OuterThumbstick"
Image: touchControlsSheet
ImageRectOffset: Vector2.new 0, 0
ImageRectSize: Vector2.new 220, 220
BackgroundTransparency: 1
Size: UDim2.new 0, thumbstickSize, 0, thumbstickSize
Position: defaultThumbstickPos
Parent: Game.CoreGui.RobloxGui
local thumbstickTouch
local userInputServiceTouchMovedCon
local userInputSeviceTouchEndedCon
startInputTracking = (inputObject) ->
return if thumbstickTouch
return if inputObject == cameraTouch
return if inputObject == currentJumpTouch
return if inputObject.UserInputType ~= Enum.UserInputType.Touch
thumbstickTouch = inputObject
table.insert thumbstickTouches, thumbstickTouch
thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position, thumbstickFrame)
outerThumbstick.Position = thumbstickFrame.Position
userInputServiceTouchMovedCon = userInputService.TouchMoved\connect (movedInput) ->
if movedInput == thumbstickTouch
local movementVector
if stationaryThumbstick
movementVector = stationaryThumbstickTouchMove(
thumbstickFrame,
outerThumbstick,
Vector2.new movedInput.Position.x, movedInput.Position.y
)
else
movementVector = followThumbstickTouchMove(
thumbstickFrame,
outerThumbstick,
Vector2.new movedInput.Position.x, movedInput.Position.y
)
if updateFunction
updateFunction movementVector, outerThumbstick.Size.X.Offset / 2
userInputSeviceTouchEndedCon = userInputService.TouchEnded\connect (endedInput) ->
if endedInput == thumbstickTouch
if updateFunction
updateFunction Vector2.new(0, 0), 1
userInputSeviceTouchEndedCon\disconnect!
userInputServiceTouchMovedCon\disconnect!
thumbstickFrame.Position = defaultThumbstickPos
outerThumbstick.Position = defaultThumbstickPos
for i, object in pairs thumbstickTouches
if object == thumbstickTouch
table.remove thumbstickTouches, i
break
thumbstickTouch = nil
userInputService.Changed\connect (prop) ->
if prop == "ModalEnabled"
thumbstickFrame.Visible = outerThumbstick.Visible = not userInputService.ModalEnabled
thumbstickFrame.InputBegan\connect startInputTracking
thumbstickFrame
setupCharacterMovement = (parentFrame) ->
local lastMovementVector, lastMaxMovement
moveCharacterFunc = localPlayer.MoveCharacter
moveCharacterFunction = (movementVector, maxMovement) ->
if localPlayer
if movementOutsideDeadZone movementVector
lastMovementVector = movementVector
lastMaxMovement = maxMovement
-- sometimes rounding error will not allow us to go max speed at some
-- thumbstick angles, fix this with a bit of fudging near 100% throttle
if movementVector.magnitude / maxMovement > ThumbstickMaxPercentGive
maxMovement = movementVector.magnitude - 1
moveCharacterFunc localPlayer, movementVector, maxMovement
else
lastMovementVector = Vector2.new 0, 0
lastMaxMovement = 1
moveCharacterFunc localPlayer, lastMovementVector, lastMaxMovement
thumbstickPos = UDim2.new 0, thumbstickSize / 2, 1, -thumbstickSize * 1.75
if isSmallScreenDevice!
thumbstickPos = UDim2.new 0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20
characterThumbstick = constructThumbstick thumbstickPos, moveCharacterFunction, false
characterThumbstick.Name = "CharacterThumbstick"
characterThumbstick.Parent = parentFrame
refreshCharacterMovement = ->
if localPlayer and moveCharacterFunc and lastMovementVector and lastMaxMovement
moveCharacterFunc localPlayer, lastMovementVector, lastMaxMovement
refreshCharacterMovement
setupJumpButton = (parentFrame) ->
jumpButton = New "ImageButton", "JumpButton"
BackgroundTransparency: 1
Image: touchControlsSheet
ImageRectOffset: Vector2.new 176, 222
ImageRectSize: Vector2.new 174, 174
Size: UDim2.new 0, jumpButtonSize, 0, jumpButtonSize
Position: UDim2.new 1, if isSmallScreenDevice!
-(jumpButtonSize * 2.25), 1, -jumpButtonSize - 20
else
-(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120
playerJumpFunc = localPlayer.JumpCharacter
doJumpLoop = ->
while currentJumpTouch
if localPlayer
playerJumpFunc localPlayer
wait 1 / 60
jumpButton.InputBegan\connect (inputObject) ->
return if inputObject.UserInputType ~= Enum.UserInputType.Touch
return if currentJumpTouch
return if inputObject == cameraTouch
for _, touch in pairs oldJumpTouches
return if touch == inputObject
currentJumpTouch = inputObject
jumpButton.ImageRectOffset = Vector2.new 0, 222
jumpButton.ImageRectSize = Vector2.new 174, 174
doJumpLoop!
jumpButton.InputEnded\connect (inputObject) ->
return if inputObject.UserInputType ~= Enum.UserInputType.Touch
jumpButton.ImageRectOffset = Vector2.new 176, 222
jumpButton.ImageRectSize = Vector2.new 174, 174
if inputObject == currentJumpTouch
table.insert oldJumpTouches, currentJumpTouch
currentJumpTouch = nil
userInputService.InputEnded\connect (globalInputObject) ->
for i, touch in pairs oldJumpTouches
if touch == globalInputObject
table.remove oldJumpTouches, i
break
userInputService.Changed\connect (prop) ->
if prop == "ModalEnabled"
jumpButton.Visible = not userInputService.ModalEnabled
jumpButton.Parent = parentFrame
isTouchUsedByJumpButton = (touch) ->
if touch == currentJumpTouch
return true
for _, touchToCompare in pairs oldJumpTouches
if touch == touchToCompare
return true
false
isTouchUsedByThumbstick = (touch) ->
for _, touchToCompare in pairs thumbstickTouches
if touch == touchToCompare
return true
false
setupCameraControl = (parentFrame, refreshCharacterMoveFunc) ->
local lastPos
hasRotatedCamera = false
rotateCameraFunc = userInputService.RotateCamera
pinchTime = -1
shouldPinch = false
local lastPinchScale
zoomCameraFunc = userInputService.ZoomCamera
pinchTouches = {}
local pinchFrame
resetCameraRotateState = ->
cameraTouch = nil
hasRotatedCamera = false
lastPos = nil
resetPinchState = ->
pinchTouches = {}
lastPinchScale = nil
shouldPinch = false
pinchFrame\Destroy!
pinchFrame = nil
startPinch = (firstTouch, secondTouch) ->
-- track pinching in new frame
pinchFrame?\Destroy!
-- make sure we didn't track in any mud
pinchFrame = New "Frame"
Name: "PinchFrame"
BackgroundTransparency: 1
Size: UDim2.new 1, 0, 1, 0
Parent: parentFrame
pinchFrame.InputChanged\connect (inputObject) ->
if not shouldPinch
resetPinchState!
return
resetCameraRotateState!
if not lastPinchScale? then -- first pinch move, just set up scale
if inputObject == firstTouch
lastPinchScale = (inputObject.Position - secondTouch.Position).magnitude
firstTouch = inputObject
elseif inputObject == secondTouch
lastPinchScale = (inputObject.Position - firstTouch.Position).magnitude
secondTouch = inputObject
else -- we are now actually pinching, do comparison to last pinch size
newPinchDistance = 0
if inputObject == firstTouch
newPinchDistance = (inputObject.Position - secondTouch.Position).magnitude
firstTouch = inputObject
elseif inputObject == secondTouch
newPinchDistance = (inputObject.Position - firstTouch.Position).magnitude
secondTouch = inputObject
if newPinchDistance ~= 0
pinchDiff = newPinchDistance - lastPinchScale
if pinchDiff ~= 0
zoomCameraFunc userInputService, (pinchDiff * CameraZoomSensitivity)
lastPinchScale = newPinchDistance
pinchFrame.InputEnded\connect (inputObject) -> -- pinch is over, destroy all
if inputObject == firstTouch or inputObject == secondTouch
resetPinchState!
pinchGestureReceivedTouch = (inputObject) ->
if #pinchTouches < 1
table.insert pinchTouches, inputObject
pinchTime = tick!
shouldPinch = false
elseif #pinchTouches == 1
shouldPinch = ((tick! - pinchTime) <= PinchZoomDelay)
if shouldPinch
table.insert pinchTouches, inputObject
startPinch pinchTouches[1], pinchTouches[2]
else -- shouldn't ever get here, but just in case
pinchTouches = {}
parentFrame.InputBegan\connect (inputObject) ->
return if inputObject.UserInputType ~= Enum.UserInputType.Touch
return if isTouchUsedByJumpButton inputObject
usedByThumbstick = isTouchUsedByThumbstick inputObject
if not usedByThumbstick
pinchGestureReceivedTouch inputObject
if not cameraTouch? and not usedByThumbstick
cameraTouch = inputObject
lastPos = Vector2.new cameraTouch.Position.x, cameraTouch.Position.y
-- lastTick = tick!
userInputService.InputChanged\connect (inputObject) ->
return if inputObject.UserInputType ~= Enum.UserInputType.Touch
return if cameraTouch ~= inputObject
newPos = Vector2.new cameraTouch.Position.x, cameraTouch.Position.y
touchDiff = (lastPos - newPos) * CameraRotateSensitivity
-- first time rotating outside deadzone, just setup for next changed event
if not hasRotatedCamera and (touchDiff.magnitude > CameraRotateDeadZone)
hasRotatedCamera = true
lastPos = newPos
-- fire everytime after we have rotated out of deadzone
if hasRotatedCamera and (lastPos ~= newPos)
rotateCameraFunc userInputService, touchDiff
refreshCharacterMoveFunc!
lastPos = newPos
userInputService.InputEnded\connect (inputObject) ->
if cameraTouch == inputObject or not cameraTouch?
resetCameraRotateState!
for i, touch in pairs pinchTouches
if touch == inputObject
table.remove pinchTouches, i
setupTouchControls = ->
touchControlFrame = New "Frame", "TouchControlFrame"
Size: UDim2.new 1, 0, 1, 0
BackgroundTransparency: 1
Parent: Game.CoreGui.RobloxGui
refreshCharacterMoveFunc = setupCharacterMovement touchControlFrame
setupJumpButton touchControlFrame
setupCameraControl touchControlFrame, refreshCharacterMoveFunc
userInputService.ProcessedEvent\connect (inputObject, processed) ->
return if not processed
-- kill camera pan if the touch is used by some user controls
if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin
cameraTouch = nil
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Start of Script
-- if true then --userInputService\IsLuaTouchControls!
setupTouchControls!
-- else
-- script\Destroy!

389
yue/89449093.lua Normal file
View File

@ -0,0 +1,389 @@
if game.CoreGui.Version < 7 then
return
end
local waitForChild
waitForChild = function(instance, name)
while not instance:FindFirstChild(name) do
instance.ChildAdded:wait()
end
return instance:FindFirstChild(name)
end
local waitForProperty
waitForProperty = function(instance, property)
while not instance[property] do
instance.Changed:wait()
end
end
waitForChild(game, "Players")
if #game.Players:GetChildren() < 1 then
game.Players.ChildAdded:wait()
end
waitForProperty(game.Players, "LocalPlayer")
local backpack = script.Parent
waitForChild(backpack, "Gear")
local screen = script.Parent.Parent
assert(screen:IsA("ScreenGui"))
waitForChild(backpack, "Tabs")
waitForChild(backpack.Tabs, "CloseButton")
local closeButton = backpack.Tabs.CloseButton
waitForChild(backpack.Tabs, "InventoryButton")
local inventoryButton = backpack.Tabs.InventoryButton
local wardrobeButton
if game.CoreGui.Version >= 8 then
waitForChild(backpack.Tabs, "WardrobeButton")
wardrobeButton = backpack.Tabs.WardrobeButton
end
waitForChild(backpack.Parent, "ControlFrame")
local backpackButton = waitForChild(backpack.Parent.ControlFrame, "BackpackButton")
local currentTab = "gear"
local searchFrame = waitForChild(backpack, "SearchFrame")
waitForChild(backpack.SearchFrame, "SearchBoxFrame")
local searchBox = waitForChild(backpack.SearchFrame.SearchBoxFrame, "SearchBox")
local searchButton = waitForChild(backpack.SearchFrame, "SearchButton")
local resetButton = waitForChild(backpack.SearchFrame, "ResetButton")
local robloxGui = waitForChild(Game.CoreGui, "RobloxGui")
local currentLoadout = waitForChild(robloxGui, "CurrentLoadout")
local loadoutBackground = waitForChild(currentLoadout, "Background")
local canToggle = true
local readyForNextEvent = true
local backpackIsOpen = false
local active = true
local disabledByDeveloper = false
local humanoidDiedCon
local guiTweenSpeed = 0.25
local searchDefaultText = "Search..."
local tilde = "~"
local backquote = "`"
local backpackSize = UDim2.new(0, 600, 0, 400)
if robloxGui.AbsoluteSize.Y <= 320 then
backpackSize = UDim2.new(0, 200, 0, 140)
end
local createPublicEvent
createPublicEvent = function(eventName)
assert(eventName, "eventName is nil")
assert(tostring(eventName), "eventName is not a string")
local _with_0 = Instance.new("BindableEvent")
_with_0.Name = tostring(eventName)
_with_0.Parent = script
return _with_0
end
local createPublicFunction
createPublicFunction = function(funcName, invokeFunc)
assert(funcName, "funcName is nil")
assert(tostring(funcName), "funcName is not a string")
assert(invokeFunc, "invokeFunc is nil")
assert(type(invokeFunc) == "function", "invokeFunc should be of type 'function'")
local _with_0 = Instance.new("BindableFunction")
_with_0.Name = tostring(funcName)
_with_0.OnInvoke = invokeFunc
_with_0.Parent = script
return _with_0
end
local resizeEvent = createPublicEvent("ResizeEvent")
local backpackOpenEvent = createPublicEvent("BackpackOpenEvent")
local backpackCloseEvent = createPublicEvent("BackpackCloseEvent")
local tabClickedEvent = createPublicEvent("TabClickedEvent")
local searchRequestedEvent = createPublicEvent("SearchRequestedEvent")
local resetSearchBoxGui
resetSearchBoxGui = function()
resetButton.Visible = false
searchBox.Text = searchDefaultText
end
local resetSearch
resetSearch = function()
resetSearchBoxGui()
return searchRequestedEvent:Fire()
end
local deactivateBackpack
deactivateBackpack = function()
backpack.Visible = false
active = false
end
local initHumanoidDiedConnections
initHumanoidDiedConnections = function()
if humanoidDiedCon then
humanoidDiedCon:disconnect()
end
waitForProperty(game.Players.LocalPlayer, "Character")
waitForChild(game.Players.LocalPlayer.Character, "Humanoid")
humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect(deactivateBackpack)
end
local hideBackpack
hideBackpack = function()
backpackIsOpen = false
readyForNextEvent = false
backpackButton.Selected = false
resetSearch()
backpackCloseEvent:Fire(currentTab)
backpack.Tabs.Visible = false
searchFrame.Visible = false
backpack:TweenSizeAndPosition(UDim2.new(0, backpackSize.X.Offset, 0, 0), UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -85), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, guiTweenSpeed, true, function()
game.GuiService:RemoveCenterDialog(backpack)
backpack.Visible = false
backpackButton.Selected = false
end)
return delay(guiTweenSpeed, function()
game.GuiService:RemoveCenterDialog(backpack)
backpack.Visible = false
backpackButton.Selected = false
readyForNextEvent = true
canToggle = true
end)
end
local showBackpack
showBackpack = function()
game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, function()
backpack.Visible = true
backpackButton.Selected = true
end, function()
backpack.Visible = false
backpackButton.Selected = false
end)
backpack.Visible = true
backpackButton.Selected = true
backpack:TweenSizeAndPosition(backpackSize, UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -backpackSize.Y.Offset - 88), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, guiTweenSpeed, true)
return delay(guiTweenSpeed, function()
backpack.Tabs.Visible = false
searchFrame.Visible = true
backpackOpenEvent:Fire(currentTab)
canToggle = true
readyForNextEvent = true
backpackButton.Image = "http://www.roblox.com/asset/?id=97644093"
backpackButton.Position = UDim2.new(0.5, -60, 1, -backpackSize.Y.Offset - 103)
end)
end
local toggleBackpack
toggleBackpack = function()
if not game.Players.LocalPlayer then
return
end
if not game.Players.LocalPlayer["Character"] then
return
end
if not canToggle then
return
end
if not readyForNextEvent then
return
end
readyForNextEvent = false
canToggle = false
backpackIsOpen = not backpackIsOpen
if backpackIsOpen then
loadoutBackground.Image = "http://www.roblox.com/asset/?id=97623721"
loadoutBackground.Position = UDim2.new(-0.03, 0, -0.17, 0)
loadoutBackground.Size = UDim2.new(1.05, 0, 1.25, 0)
loadoutBackground.ZIndex = 2.0
loadoutBackground.Visible = true
return showBackpack()
else
backpackButton.Position = UDim2.new(0.5, -60, 1, -44)
loadoutBackground.Visible = false
backpackButton.Selected = false
backpackButton.Image = "http://www.roblox.com/asset/?id=97617958"
loadoutBackground.Image = "http://www.roblox.com/asset/?id=96536002"
loadoutBackground.Position = UDim2.new(-0.1, 0, -0.1, 0)
loadoutBackground.Size = UDim2.new(1.2, 0, 1.2, 0)
hideBackpack()
local clChildren = currentLoadout:GetChildren()
for i = 1, #clChildren do
if clChildren[i] and clChildren[i]:IsA("Frame") then
local frame = clChildren[i]
if #frame:GetChildren() > 0 then
backpackButton.Position = UDim2.new(0.5, -60, 1, -108)
backpackButton.Visible = true
loadoutBackground.Visible = true
if frame:GetChildren()[1]:IsA("ImageButton") then
local imgButton = frame:GetChildren()[1]
imgButton.Active = true
imgButton.Draggable = false
end
end
end
end
end
end
local activateBackpack
activateBackpack = function()
initHumanoidDiedConnections()
active = true
backpack.Visible = backpackIsOpen
if backpackIsOpen then
return toggleBackpack()
end
end
local closeBackpack
closeBackpack = function()
if backpackIsOpen then
return toggleBackpack()
end
end
local setSelected
setSelected = function(tab)
assert(tab)
assert(tab:IsA("TextButton"))
tab.BackgroundColor3 = Color3.new(1, 1, 1)
tab.TextColor3 = Color3.new(0, 0, 0)
tab.Selected = true
tab.ZIndex = 3
return tab
end
local setUnselected
setUnselected = function(tab)
assert(tab)
assert(tab:IsA("TextButton"))
tab.BackgroundColor3 = Color3.new(0, 0, 0)
tab.TextColor3 = Color3.new(1, 1, 1)
tab.Selected = false
tab.ZIndex = 1
return tab
end
local updateTabGui
updateTabGui = function(selectedTab)
assert(selectedTab)
if selectedTab == "gear" then
setSelected(inventoryButton)
return setUnselected(wardrobeButton)
elseif selectedTab == "wardrobe" then
setSelected(wardrobeButton)
return setUnselected(inventoryButton)
end
end
local mouseLeaveTab
mouseLeaveTab = function(button)
assert(button)
assert(button:IsA("TextButton"))
if button.Selected then
return
end
button.BackgroundColor3 = Color3.new(0, 0, 0)
end
local mouseOverTab
mouseOverTab = function(button)
assert(button)
assert(button:IsA("TextButton"))
if button.Selected then
return
end
button.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255)
end
local newTabClicked
newTabClicked = function(tabName)
assert(tabName)
tabName = string.lower(tabName)
currentTab = tabName
updateTabGui(tabName)
tabClickedEvent:Fire(tabName)
return resetSearch()
end
local trim
trim = function(s)
return s:gsub("^%s*(.-)%s*$", "%1")
end
local doSearch
doSearch = function()
local searchText = searchBox.Text
if searchText == "" then
resetSearch()
return
end
searchText = trim(searchText)
resetButton.Visible = true
return searchRequestedEvent:Fire(searchText)
end
local backpackReady
backpackReady = function()
readyForNextEvent = true
end
local coreGuiChanged
coreGuiChanged = function(coreGuiType, enabled)
if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then
active = enabled
disabledByDeveloper = not enabled
do
local _with_0 = game:GetService("GuiService")
if disabledByDeveloper then
pcall(function()
_with_0:RemoveKey(tilde)
return _with_0:RemoveKey(backquote)
end)
else
_with_0:AddKey(tilde)
_with_0:AddKey(backquote)
end
end
resetSearch()
searchFrame.Visible = enabled and backpackIsOpen
currentLoadout.Visible = enabled
backpack.Visible = enabled
backpackButton.Visible = enabled
end
end
createPublicFunction("CloseBackpack", hideBackpack)
createPublicFunction("BackpackReady", backpackReady)
pcall(function()
coreGuiChanged(Enum.CoreGuiType.Backpack, Game.StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack))
return Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged)
end)
inventoryButton.MouseButton1Click:connect(function()
return newTabClicked("gear")
end)
inventoryButton.MouseEnter:connect(function()
return mouseOverTab(inventoryButton)
end)
inventoryButton.MouseLeave:connect(function()
return mouseLeaveTab(inventoryButton)
end)
if game.CoreGui.Version >= 8 then
wardrobeButton.MouseButton1Click:connect(function()
return newTabClicked("wardrobe")
end)
wardrobeButton.MouseEnter:connect(function()
return mouseOverTab(wardrobeButton)
end)
wardrobeButton.MouseLeave:connect(function()
return mouseLeaveTab(wardrobeButton)
end)
end
closeButton.MouseButton1Click:connect(closeBackpack)
screen.Changed:connect(function(prop)
if prop == "AbsoluteSize" then
return resizeEvent:Fire(screen.AbsoluteSize)
end
end)
do
local _with_0 = game:GetService("GuiService")
_with_0:AddKey(tilde)
_with_0:AddKey(backquote)
_with_0.KeyPressed:connect(function(key)
if not active or disabledByDeveloper then
return
end
if key == tilde or key == backquote then
return toggleBackpack()
end
end)
end
backpackButton.MouseButton1Click:connect(function()
if not active or disabledByDeveloper then
return
end
return toggleBackpack()
end)
if game.Players.LocalPlayer["Character"] then
activateBackpack()
end
game.Players.LocalPlayer.CharacterAdded:connect(activateBackpack)
searchBox.FocusLost:connect(function(enterPressed)
if enterPressed or searchBox.Text ~= "" then
return doSearch()
elseif searchBox.Text == "" then
return resetSearch()
end
end)
searchButton.MouseButton1Click:connect(doSearch)
resetButton.MouseButton1Click:connect(resetSearch)
if searchFrame and robloxGui.AbsoluteSize.Y <= 320 then
searchFrame.RobloxLocked = false
return searchFrame:Destroy()
end

View File

@ -0,0 +1,411 @@
-- This script manages context switches in the backpack (Gear to Wardrobe, etc.) and player state changes. Also manages global functions across different tabs (currently only search)
return if game.CoreGui.Version < 7
-- peace out if we aren't using the right client
-- basic functions
waitForChild = (instance, name) ->
until instance\FindFirstChild name
instance.ChildAdded\wait!
instance\FindFirstChild name
waitForProperty = (instance, property) ->
until instance[property]
instance.Changed\wait!
-- don't do anything if we are in an empty game
waitForChild game, "Players"
if #game.Players\GetChildren! < 1
game.Players.ChildAdded\wait!
-- make sure everything is loaded in before we do anything
-- get our local player
waitForProperty game.Players, "LocalPlayer"
------------------------ Locals ------------------------------
backpack = script.Parent
waitForChild backpack, "Gear"
screen = script.Parent.Parent
assert screen\IsA "ScreenGui"
waitForChild backpack, "Tabs"
waitForChild backpack.Tabs, "CloseButton"
closeButton = backpack.Tabs.CloseButton
waitForChild backpack.Tabs, "InventoryButton"
inventoryButton = backpack.Tabs.InventoryButton
local wardrobeButton
if game.CoreGui.Version >= 8
waitForChild backpack.Tabs, "WardrobeButton"
wardrobeButton = backpack.Tabs.WardrobeButton
waitForChild backpack.Parent, "ControlFrame"
backpackButton = waitForChild backpack.Parent.ControlFrame, "BackpackButton"
currentTab = "gear"
searchFrame = waitForChild backpack, "SearchFrame"
waitForChild backpack.SearchFrame, "SearchBoxFrame"
searchBox = waitForChild backpack.SearchFrame.SearchBoxFrame, "SearchBox"
searchButton = waitForChild backpack.SearchFrame, "SearchButton"
resetButton = waitForChild backpack.SearchFrame, "ResetButton"
robloxGui = waitForChild Game.CoreGui, "RobloxGui"
currentLoadout = waitForChild robloxGui, "CurrentLoadout"
loadoutBackground = waitForChild currentLoadout, "Background"
canToggle = true
readyForNextEvent = true
backpackIsOpen = false
active = true
disabledByDeveloper = false
local humanoidDiedCon
guiTweenSpeed = 0.25 -- how quickly we open/close the backpack
searchDefaultText = "Search..."
tilde = "~"
backquote = "`"
backpackSize = UDim2.new 0, 600, 0, 400
if robloxGui.AbsoluteSize.Y <= 320
backpackSize = UDim2.new 0, 200, 0, 140
------------------------ End Locals ---------------------------
---------------------------------------- Public Event Setup ----------------------------------------
createPublicEvent = (eventName) ->
assert eventName, "eventName is nil"
assert "#{eventName}", "eventName is not a string"
with Instance.new "BindableEvent"
.Name = "#{eventName}"
.Parent = script
createPublicFunction = (funcName, invokeFunc) ->
assert funcName, "funcName is nil"
assert "#{funcName}", "funcName is not a string"
assert invokeFunc, "invokeFunc is nil"
assert type(invokeFunc) == "function", "invokeFunc should be of type 'function'"
with Instance.new "BindableFunction"
.Name = "#{funcName}"
.OnInvoke = invokeFunc
.Parent = script
-- Events
resizeEvent = createPublicEvent "ResizeEvent"
backpackOpenEvent = createPublicEvent "BackpackOpenEvent"
backpackCloseEvent = createPublicEvent "BackpackCloseEvent"
tabClickedEvent = createPublicEvent "TabClickedEvent"
searchRequestedEvent = createPublicEvent "SearchRequestedEvent"
---------------------------------------- End Public Event Setup ----------------------------------------
--------------------------- Internal Functions ----------------------------------------
resetSearchBoxGui = ->
resetButton.Visible = false
searchBox.Text = searchDefaultText
resetSearch = ->
resetSearchBoxGui!
searchRequestedEvent\Fire!
deactivateBackpack = ->
backpack.Visible = false
active = false
initHumanoidDiedConnections = ->
if humanoidDiedCon
humanoidDiedCon\disconnect!
waitForProperty game.Players.LocalPlayer, "Character"
waitForChild game.Players.LocalPlayer.Character, "Humanoid"
humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died\connect deactivateBackpack
hideBackpack = ->
backpackIsOpen = false
readyForNextEvent = false
backpackButton.Selected = false
resetSearch!
backpackCloseEvent\Fire currentTab
backpack.Tabs.Visible = false
searchFrame.Visible = false
backpack\TweenSizeAndPosition(
UDim2.new(0, backpackSize.X.Offset, 0, 0),
UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -85),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quad,
guiTweenSpeed,
true,
->
game.GuiService\RemoveCenterDialog backpack
backpack.Visible = false
backpackButton.Selected = false
)
delay guiTweenSpeed, ->
game.GuiService\RemoveCenterDialog backpack
backpack.Visible = false
backpackButton.Selected = false
readyForNextEvent = true
canToggle = true
showBackpack = ->
game.GuiService\AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, ->
backpack.Visible = true
backpackButton.Selected = true
->
backpack.Visible = false
backpackButton.Selected = false
)
backpack.Visible = true
backpackButton.Selected = true
backpack\TweenSizeAndPosition(
backpackSize,
UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -backpackSize.Y.Offset - 88),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quad,
guiTweenSpeed,
true
)
delay guiTweenSpeed, ->
backpack.Tabs.Visible = false
searchFrame.Visible = true
backpackOpenEvent\Fire currentTab
canToggle = true
readyForNextEvent = true
backpackButton.Image = "http://www.roblox.com/asset/?id=97644093"
backpackButton.Position = UDim2.new 0.5, -60, 1, -backpackSize.Y.Offset - 103
toggleBackpack = ->
return if not game.Players.LocalPlayer
return if not game.Players.LocalPlayer["Character"]
return if not canToggle
return if not readyForNextEvent
readyForNextEvent = false
canToggle = false
backpackIsOpen = not backpackIsOpen
if backpackIsOpen
with loadoutBackground
.Image = "http://www.roblox.com/asset/?id=97623721"
.Position = UDim2.new -0.03, 0, -0.17, 0
.Size = UDim2.new 1.05, 0, 1.25, 0
.ZIndex = 2.0
.Visible = true
showBackpack!
else
backpackButton.Position = UDim2.new 0.5, -60, 1, -44
loadoutBackground.Visible = false
backpackButton.Selected = false
backpackButton.Image = "http://www.roblox.com/asset/?id=97617958"
loadoutBackground.Image = "http://www.roblox.com/asset/?id=96536002"
loadoutBackground.Position = UDim2.new -0.1, 0, -0.1, 0
loadoutBackground.Size = UDim2.new 1.2, 0, 1.2, 0
hideBackpack!
clChildren = currentLoadout\GetChildren!
for i = 1, #clChildren
if clChildren[i] and clChildren[i]\IsA "Frame"
frame = clChildren[i]
if #frame\GetChildren! > 0
backpackButton.Position = UDim2.new 0.5, -60, 1, -108
backpackButton.Visible = true
loadoutBackground.Visible = true
if frame\GetChildren![1]\IsA "ImageButton"
imgButton = frame\GetChildren![1]
imgButton.Active = true
imgButton.Draggable = false
activateBackpack = ->
initHumanoidDiedConnections!
active = true
backpack.Visible = backpackIsOpen
if backpackIsOpen
toggleBackpack!
closeBackpack = ->
if backpackIsOpen
toggleBackpack!
setSelected = (tab) ->
assert tab
with tab
assert \IsA "TextButton"
.BackgroundColor3 = Color3.new 1, 1, 1
.TextColor3 = Color3.new 0, 0, 0
.Selected = true
.ZIndex = 3
setUnselected = (tab) ->
assert tab
with tab
assert \IsA "TextButton"
.BackgroundColor3 = Color3.new 0, 0, 0
.TextColor3 = Color3.new 1, 1, 1
.Selected = false
.ZIndex = 1
updateTabGui = (selectedTab) ->
assert selectedTab
if selectedTab == "gear"
setSelected inventoryButton
setUnselected wardrobeButton
elseif selectedTab == "wardrobe"
setSelected wardrobeButton
setUnselected inventoryButton
mouseLeaveTab = (button) ->
assert button
assert button\IsA "TextButton"
return if button.Selected
button.BackgroundColor3 = Color3.new 0, 0, 0
mouseOverTab = (button) ->
assert button
assert button\IsA "TextButton"
return if button.Selected
button.BackgroundColor3 = Color3.new 39 / 255, 39 / 255, 39 / 255
newTabClicked = (tabName) ->
assert tabName
tabName = string.lower tabName
currentTab = tabName
updateTabGui tabName
tabClickedEvent\Fire tabName
resetSearch!
trim = (s) -> s\gsub "^%s*(.-)%s*$", "%1"
-- splitByWhitespace = (text) ->
-- return if type(text) ~= "string"
-- terms = {}
-- for token in string.gmatch text, "[^%s]+"
-- if string.len(token) > 0
-- table.insert terms, token
-- terms
doSearch = ->
searchText = searchBox.Text
if searchText == ""
resetSearch!
return
searchText = trim searchText
resetButton.Visible = true
-- termTable = splitByWhitespace(searchText)
searchRequestedEvent\Fire searchText -- todo: replace this with termtable when table passing is possible
backpackReady = ->
readyForNextEvent = true
coreGuiChanged = (coreGuiType, enabled) ->
if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All
active = enabled
disabledByDeveloper = not enabled
with game\GetService "GuiService"
if disabledByDeveloper
try
\RemoveKey tilde
\RemoveKey backquote
else
\AddKey tilde
\AddKey backquote
resetSearch!
searchFrame.Visible = enabled and backpackIsOpen
currentLoadout.Visible = enabled
backpack.Visible = enabled
backpackButton.Visible = enabled
--------------------------- End Internal Functions -------------------------------------
------------------------------ Public Functions Setup -------------------------------------
createPublicFunction "CloseBackpack", hideBackpack
createPublicFunction "BackpackReady", backpackReady
------------------------------ End Public Functions Setup ---------------------------------
------------------------ Connections/Script Main -------------------------------------------
try
coreGuiChanged Enum.CoreGuiType.Backpack, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Backpack
Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged
with inventoryButton
.MouseButton1Click\connect -> newTabClicked "gear"
.MouseEnter\connect -> mouseOverTab inventoryButton
.MouseLeave\connect -> mouseLeaveTab inventoryButton
if game.CoreGui.Version >= 8
with wardrobeButton
.MouseButton1Click\connect -> newTabClicked "wardrobe"
.MouseEnter\connect -> mouseOverTab wardrobeButton
.MouseLeave\connect -> mouseLeaveTab wardrobeButton
closeButton.MouseButton1Click\connect closeBackpack
screen.Changed\connect (prop) ->
if prop == "AbsoluteSize"
resizeEvent\Fire screen.AbsoluteSize
-- GuiService key setup
with game\GetService "GuiService"
\AddKey tilde
\AddKey backquote
.KeyPressed\connect (key) ->
return if not active or disabledByDeveloper
if key == tilde or key == backquote
toggleBackpack!
backpackButton.MouseButton1Click\connect ->
return if not active or disabledByDeveloper
toggleBackpack!
if game.Players.LocalPlayer["Character"]
activateBackpack!
game.Players.LocalPlayer.CharacterAdded\connect activateBackpack
-- search functions
searchBox.FocusLost\connect (enterPressed) ->
if enterPressed or searchBox.Text ~= ""
doSearch!
elseif searchBox.Text == ""
resetSearch!
searchButton.MouseButton1Click\connect doSearch
resetButton.MouseButton1Click\connect resetSearch
if searchFrame and robloxGui.AbsoluteSize.Y <= 320
searchFrame.RobloxLocked = false
searchFrame\Destroy!