From 686e23f0d7f6f65b72a639504a202dbf198992ae Mon Sep 17 00:00:00 2001 From: Lewin Kelly Date: Mon, 17 Apr 2023 23:06:10 +0100 Subject: [PATCH] Port more corescripts to yuescript --- yue/153556783.lua | 526 ++++++++++++++++++++++++++++++++++++++++++ yue/153556783.yue | 576 ++++++++++++++++++++++++++++++++++++++++++++++ yue/89449093.lua | 389 +++++++++++++++++++++++++++++++ yue/89449093.yue | 411 +++++++++++++++++++++++++++++++++ 4 files changed, 1902 insertions(+) create mode 100644 yue/153556783.lua create mode 100644 yue/89449093.lua diff --git a/yue/153556783.lua b/yue/153556783.lua new file mode 100644 index 0000000..b12a16c --- /dev/null +++ b/yue/153556783.lua @@ -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() diff --git a/yue/153556783.yue b/yue/153556783.yue index e69de29..e4fa2ca 100644 --- a/yue/153556783.yue +++ b/yue/153556783.yue @@ -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! + diff --git a/yue/89449093.lua b/yue/89449093.lua new file mode 100644 index 0000000..708c38e --- /dev/null +++ b/yue/89449093.lua @@ -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 diff --git a/yue/89449093.yue b/yue/89449093.yue index e69de29..9b7ec1a 100644 --- a/yue/89449093.yue +++ b/yue/89449093.yue @@ -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!