Fuck with the CoreScripts despite task telling me very clearly not to fuck with the corescripts

This commit is contained in:
Lewin Kelly 2023-04-08 08:13:02 +01:00
parent 26dfa13ee3
commit bb1eb0faa6
26 changed files with 20382 additions and 8568 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
-- Essentially a user can bind a lua function to a key code, input type (mousebutton1 etc.) and this -- Essentially a user can bind a lua function to a key code, input type (mousebutton1 etc.) and this
-- Variables -- Variables
local contextActionService = Game:GetService("ContextActionService") local contextActionService = Game:GetService "ContextActionService"
local isTouchDevice = Game:GetService("UserInputService").TouchEnabled local isTouchDevice = Game:GetService("UserInputService").TouchEnabled
local functionTable = {} local functionTable = {}
local buttonVector = {} local buttonVector = {}
@ -17,14 +17,14 @@ local ContextUpImage = "http://www.banland.xyz/asset/?id=97166444"
local oldTouches = {} local oldTouches = {}
local buttonPositionTable = { local buttonPositionTable = {
[1] = UDim2.new(0,123,0,70), [1] = UDim2.new(0, 123, 0, 70),
[2] = UDim2.new(0,30,0,60), [2] = UDim2.new(0, 30, 0, 60),
[3] = UDim2.new(0,180,0,160), [3] = UDim2.new(0, 180, 0, 160),
[4] = UDim2.new(0,85,0,-25), [4] = UDim2.new(0, 85, 0, -25),
[5] = UDim2.new(0,185,0,-25), [5] = UDim2.new(0, 185, 0, -25),
[6] = UDim2.new(0,185,0,260), [6] = UDim2.new(0, 185, 0, 260),
[7] = UDim2.new(0,216,0,65) [7] = UDim2.new(0, 216, 0, 65),
} }
local maxButtons = #buttonPositionTable local maxButtons = #buttonPositionTable
-- Preload images -- Preload images
@ -41,13 +41,13 @@ end
function createContextActionGui() function createContextActionGui()
if not buttonScreenGui and isTouchDevice then if not buttonScreenGui and isTouchDevice then
buttonScreenGui = Instance.new("ScreenGui") buttonScreenGui = Instance.new "ScreenGui"
buttonScreenGui.Name = "ContextActionGui" buttonScreenGui.Name = "ContextActionGui"
buttonFrame = Instance.new("Frame") buttonFrame = Instance.new "Frame"
buttonFrame.BackgroundTransparency = 1 buttonFrame.BackgroundTransparency = 1
buttonFrame.Size = UDim2.new(0.3,0,0.5,0) buttonFrame.Size = UDim2.new(0.3, 0, 0.5, 0)
buttonFrame.Position = UDim2.new(0.7,0,0.5,0) buttonFrame.Position = UDim2.new(0.7, 0, 0.5, 0)
buttonFrame.Name = "ContextButtonFrame" buttonFrame.Name = "ContextButtonFrame"
buttonFrame.Parent = buttonScreenGui buttonFrame.Parent = buttonScreenGui
end end
@ -66,7 +66,7 @@ function setButtonSizeAndPosition(object)
xOffset = 40 xOffset = 40
end end
object.Size = UDim2.new(0,buttonSize,0,buttonSize) object.Size = UDim2.new(0, buttonSize, 0, buttonSize)
end end
function contextButtonDown(button, inputObject, actionName) function contextButtonDown(button, inputObject, actionName)
@ -85,7 +85,10 @@ end
function contextButtonUp(button, inputObject, actionName) function contextButtonUp(button, inputObject, actionName)
button.Image = ContextUpImage button.Image = ContextUpImage
if inputObject.UserInputType == Enum.UserInputType.Touch and inputObject.UserInputState == Enum.UserInputState.End then if
inputObject.UserInputType == Enum.UserInputType.Touch
and inputObject.UserInputState == Enum.UserInputState.End
then
contextActionService:CallFunction(actionName, Enum.UserInputState.End, inputObject) contextActionService:CallFunction(actionName, Enum.UserInputState.End, inputObject)
end end
end end
@ -94,26 +97,27 @@ function isSmallScreenDevice()
return Game:GetService("GuiService"):GetScreenResolution().y <= 320 return Game:GetService("GuiService"):GetScreenResolution().y <= 320
end end
function createNewButton(actionName, functionInfoTable) function createNewButton(actionName, functionInfoTable)
local contextButton = Instance.new("ImageButton") local contextButton = Instance.new "ImageButton"
contextButton.Name = "ContextActionButton" contextButton.Name = "ContextActionButton"
contextButton.BackgroundTransparency = 1 contextButton.BackgroundTransparency = 1
contextButton.Size = UDim2.new(0,90,0,90) contextButton.Size = UDim2.new(0, 90, 0, 90)
contextButton.Active = true contextButton.Active = true
if isSmallScreenDevice() then if isSmallScreenDevice() then
contextButton.Size = UDim2.new(0,70,0,70) contextButton.Size = UDim2.new(0, 70, 0, 70)
end end
contextButton.Image = ContextUpImage contextButton.Image = ContextUpImage
contextButton.Parent = buttonFrame contextButton.Parent = buttonFrame
local currentButtonTouch = nil local currentButtonTouch = nil
Game:GetService("UserInputService").InputEnded:connect(function ( inputObject ) Game:GetService("UserInputService").InputEnded:connect(function(inputObject)
oldTouches[inputObject] = nil oldTouches[inputObject] = nil
end) end)
contextButton.InputBegan:connect(function(inputObject) contextButton.InputBegan:connect(function(inputObject)
if oldTouches[inputObject] then return end if oldTouches[inputObject] then
return
end
if inputObject.UserInputState == Enum.UserInputState.Begin and currentButtonTouch == nil then if inputObject.UserInputState == Enum.UserInputState.Begin and currentButtonTouch == nil then
currentButtonTouch = inputObject currentButtonTouch = inputObject
@ -121,21 +125,29 @@ function createNewButton(actionName, functionInfoTable)
end end
end) end)
contextButton.InputChanged:connect(function(inputObject) contextButton.InputChanged:connect(function(inputObject)
if oldTouches[inputObject] then return end if oldTouches[inputObject] then
if currentButtonTouch ~= inputObject then return end return
end
if currentButtonTouch ~= inputObject then
return
end
contextButtonMoved(contextButton, inputObject, actionName) contextButtonMoved(contextButton, inputObject, actionName)
end) end)
contextButton.InputEnded:connect(function(inputObject) contextButton.InputEnded:connect(function(inputObject)
if oldTouches[inputObject] then return end if oldTouches[inputObject] then
if currentButtonTouch ~= inputObject then return end return
end
if currentButtonTouch ~= inputObject then
return
end
currentButtonTouch = nil currentButtonTouch = nil
oldTouches[inputObject] = true oldTouches[inputObject] = true
contextButtonUp(contextButton, inputObject, actionName) contextButtonUp(contextButton, inputObject, actionName)
end) end)
local actionIcon = Instance.new("ImageLabel") local actionIcon = Instance.new "ImageLabel"
actionIcon.Name = "ActionIcon" actionIcon.Name = "ActionIcon"
actionIcon.Position = UDim2.new(0.175, 0, 0.175, 0) actionIcon.Position = UDim2.new(0.175, 0, 0.175, 0)
actionIcon.Size = UDim2.new(0.65, 0, 0.65, 0) actionIcon.Size = UDim2.new(0.65, 0, 0.65, 0)
@ -145,12 +157,12 @@ function createNewButton(actionName, functionInfoTable)
end end
actionIcon.Parent = contextButton actionIcon.Parent = contextButton
local actionTitle = Instance.new("TextLabel") local actionTitle = Instance.new "TextLabel"
actionTitle.Name = "ActionTitle" actionTitle.Name = "ActionTitle"
actionTitle.Size = UDim2.new(1,0,1,0) actionTitle.Size = UDim2.new(1, 0, 1, 0)
actionTitle.BackgroundTransparency = 1 actionTitle.BackgroundTransparency = 1
actionTitle.Font = Enum.Font.SourceSansBold actionTitle.Font = Enum.Font.SourceSansBold
actionTitle.TextColor3 = Color3.new(1,1,1) actionTitle.TextColor3 = Color3.new(1, 1, 1)
actionTitle.TextStrokeTransparency = 0 actionTitle.TextStrokeTransparency = 0
actionTitle.FontSize = Enum.FontSize.Size18 actionTitle.FontSize = Enum.FontSize.Size18
actionTitle.TextWrapped = true actionTitle.TextWrapped = true
@ -163,11 +175,11 @@ function createNewButton(actionName, functionInfoTable)
return contextButton return contextButton
end end
function createButton( actionName, functionInfoTable ) function createButton(actionName, functionInfoTable)
local button = createNewButton(actionName, functionInfoTable) local button = createNewButton(actionName, functionInfoTable)
local position = nil local position = nil
for i = 1,#buttonVector do for i = 1, #buttonVector do
if buttonVector[i] == "empty" then if buttonVector[i] == "empty" then
position = i position = i
break break
@ -194,14 +206,16 @@ function createButton( actionName, functionInfoTable )
end end
function removeAction(actionName) function removeAction(actionName)
if not functionTable[actionName] then return end if not functionTable[actionName] then
return
end
local actionButton = functionTable[actionName]["button"] local actionButton = functionTable[actionName]["button"]
if actionButton then if actionButton then
actionButton.Parent = nil actionButton.Parent = nil
for i = 1,#buttonVector do for i = 1, #buttonVector do
if buttonVector[i] == actionButton then if buttonVector[i] == actionButton then
buttonVector[i] = "empty" buttonVector[i] = "empty"
break break
@ -214,11 +228,11 @@ function removeAction(actionName)
functionTable[actionName] = nil functionTable[actionName] = nil
end end
function addAction(actionName,createTouchButton,functionInfoTable) function addAction(actionName, createTouchButton, functionInfoTable)
if functionTable[actionName] then if functionTable[actionName] then
removeAction(actionName) removeAction(actionName)
end end
functionTable[actionName] = {functionInfoTable} functionTable[actionName] = { functionInfoTable }
if createTouchButton and isTouchDevice then if createTouchButton and isTouchDevice then
createContextActionGui() createContextActionGui()
createButton(actionName, functionInfoTable) createButton(actionName, functionInfoTable)
@ -226,7 +240,7 @@ function addAction(actionName,createTouchButton,functionInfoTable)
end end
-- Connections -- Connections
contextActionService.BoundActionChanged:connect( function(actionName, changeName, changeTable) contextActionService.BoundActionChanged:connect(function(actionName, changeName, changeTable)
if functionTable[actionName] and changeTable then if functionTable[actionName] and changeTable then
local button = functionTable[actionName]["button"] local button = functionTable[actionName]["button"]
if button then if button then
@ -243,15 +257,15 @@ contextActionService.BoundActionChanged:connect( function(actionName, changeName
end end
end) end)
contextActionService.BoundActionAdded:connect( function(actionName, createTouchButton, functionInfoTable) contextActionService.BoundActionAdded:connect(function(actionName, createTouchButton, functionInfoTable)
addAction(actionName, createTouchButton, functionInfoTable) addAction(actionName, createTouchButton, functionInfoTable)
end) end)
contextActionService.BoundActionRemoved:connect( function(actionName, functionInfoTable) contextActionService.BoundActionRemoved:connect(function(actionName, functionInfoTable)
removeAction(actionName) removeAction(actionName)
end) end)
contextActionService.GetActionButtonEvent:connect( function(actionName) contextActionService.GetActionButtonEvent:connect(function(actionName)
if functionTable[actionName] then if functionTable[actionName] then
contextActionService:FireActionButtonFoundSignal(actionName, functionTable[actionName]["button"]) contextActionService:FireActionButtonFoundSignal(actionName, functionTable[actionName]["button"])
end end
@ -260,5 +274,5 @@ end)
-- make sure any bound data before we setup connections is handled -- make sure any bound data before we setup connections is handled
local boundActions = contextActionService:GetAllBoundActionInfo() local boundActions = contextActionService:GetAllBoundActionInfo()
for actionName, actionData in pairs(boundActions) do for actionName, actionData in pairs(boundActions) do
addAction(actionName,actionData["createTouchButton"],actionData) addAction(actionName, actionData["createTouchButton"], actionData)
end end

View File

@ -6,21 +6,23 @@
while not Game do while not Game do
wait() wait()
end end
while not Game:FindFirstChild("Players") do while not Game:FindFirstChild "Players" do
wait() wait()
end end
while not Game.Players.LocalPlayer do while not Game.Players.LocalPlayer do
wait() wait()
end end
while not Game:FindFirstChild("CoreGui") do while not Game:FindFirstChild "CoreGui" do
wait() wait()
end end
while not Game.CoreGui:FindFirstChild("RobloxGui") do while not Game.CoreGui:FindFirstChild "RobloxGui" do
wait() wait()
end end
local userInputService = Game:GetService("UserInputService") local userInputService = Game:GetService "UserInputService"
local success = pcall(function() userInputService:IsLuaTouchControls() end) local success = pcall(function()
userInputService:IsLuaTouchControls()
end)
if not success then if not success then
script:Destroy() script:Destroy()
end end
@ -34,7 +36,6 @@ function isSmallScreenDevice()
end end
local localPlayer = Game.Players.LocalPlayer local localPlayer = Game.Players.LocalPlayer
local thumbstickInactiveAlpha = 0.3
local thumbstickSize = 120 local thumbstickSize = 120
if isSmallScreenDevice() then if isSmallScreenDevice() then
thumbstickSize = 70 thumbstickSize = 70
@ -58,7 +59,6 @@ local CameraZoomSensitivity = 0.03
local PinchZoomDelay = 0.2 local PinchZoomDelay = 0.2
local cameraTouch = nil local cameraTouch = nil
-- make sure all of our images are good to go -- make sure all of our images are good to go
Game:GetService("ContentProvider"):Preload(touchControlsSheet) Game:GetService("ContentProvider"):Preload(touchControlsSheet)
@ -69,11 +69,16 @@ Game:GetService("ContentProvider"):Preload(touchControlsSheet)
function DistanceBetweenTwoPoints(point1, point2) function DistanceBetweenTwoPoints(point1, point2)
local dx = point2.x - point1.x local dx = point2.x - point1.x
local dy = point2.y - point1.y local dy = point2.y - point1.y
return math.sqrt( (dx*dx) + (dy*dy) ) return math.sqrt((dx * dx) + (dy * dy))
end end
function transformFromCenterToTopLeft(pointToTranslate, guiObject) function transformFromCenterToTopLeft(pointToTranslate, guiObject)
return UDim2.new(0,pointToTranslate.x - guiObject.AbsoluteSize.x/2,0,pointToTranslate.y - guiObject.AbsoluteSize.y/2) return UDim2.new(
0,
pointToTranslate.x - guiObject.AbsoluteSize.x / 2,
0,
pointToTranslate.y - guiObject.AbsoluteSize.y / 2
)
end end
function rotatePointAboutLocation(pointToRotate, pointToRotateAbout, radians) function rotatePointAboutLocation(pointToRotate, pointToRotateAbout, radians)
@ -95,106 +100,148 @@ function rotatePointAboutLocation(pointToRotate, pointToRotateAbout, radians)
return transformedPoint return transformedPoint
end end
function dotProduct(v1,v2) function dotProduct(v1, v2)
return ((v1.x*v2.x) + (v1.y*v2.y)) return ((v1.x * v2.x) + (v1.y * v2.y))
end end
function stationaryThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation) function stationaryThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation)
local thumbstickOuterCenterPosition = Vector2.new(thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x/2, thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y/2) 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) local centerDiff = DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenterPosition)
-- thumbstick is moving outside our region, need to cap its distance -- thumbstick is moving outside our region, need to cap its distance
if centerDiff > (thumbstickSize/2) then if centerDiff > (thumbstickSize / 2) then
local thumbVector = Vector2.new(touchLocation.x - thumbstickOuterCenterPosition.x,touchLocation.y - thumbstickOuterCenterPosition.y); local thumbVector = Vector2.new(
touchLocation.x - thumbstickOuterCenterPosition.x,
touchLocation.y - thumbstickOuterCenterPosition.y
)
local normal = thumbVector.unit local normal = thumbVector.unit
if normal.x == math.nan or normal.x == math.inf then if normal.x == math.nan or normal.x == math.inf then
normal = Vector2.new(0,normal.y) normal = Vector2.new(0, normal.y)
end end
if normal.y == math.nan or normal.y == math.inf then if normal.y == math.nan or normal.y == math.inf then
normal = Vector2.new(normal.x,0) normal = Vector2.new(normal.x, 0)
end end
local newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize/2)) local newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize / 2))
thumbstickFrame.Position = transformFromCenterToTopLeft(newThumbstickInnerPosition, thumbstickFrame) thumbstickFrame.Position = transformFromCenterToTopLeft(newThumbstickInnerPosition, thumbstickFrame)
else else
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation,thumbstickFrame) thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame)
end end
return Vector2.new(thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset) return Vector2.new(
thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,
thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset
)
end end
function followThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation) function followThumbstickTouchMove(thumbstickFrame, thumbstickOuter, touchLocation)
local thumbstickOuterCenter = Vector2.new(thumbstickOuter.Position.X.Offset + thumbstickOuter.AbsoluteSize.x/2, thumbstickOuter.Position.Y.Offset + thumbstickOuter.AbsoluteSize.y/2) local 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) -- 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 then 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 thumbstickInnerCenter = Vector2.new(
local movementVectorUnit = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit 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 outerToInnerVectorCurrent = Vector2.new(
thumbstickInnerCenter.x - thumbstickOuterCenter.x,
thumbstickInnerCenter.y - thumbstickOuterCenter.y
)
local outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit local outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit
local movementVector = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y) local movementVector =
Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y)
-- First, find the angle between the new thumbstick movement vector, -- First, find the angle between the new thumbstick movement vector,
-- and the vector between thumbstick inner and thumbstick outer. -- 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 -- We will use this to pivot thumbstick outer around thumbstick inner, gives a nice joystick feel
local crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y) - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x) local crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y)
local angle = math.atan2(crossOuterToInnerWithMovement, dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit)) - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x)
local anglePercent = angle * math.min( (movementVector.magnitude)/(outerToInnerVectorCurrent.magnitude), 1.0); local angle =
math.atan2(crossOuterToInnerWithMovement, dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit))
local anglePercent = angle * math.min(movementVector.magnitude / outerToInnerVectorCurrent.magnitude, 1.0)
-- If angle is significant, rotate about the inner thumbsticks current center -- If angle is significant, rotate about the inner thumbsticks current center
if math.abs(anglePercent) > 0.00001 then if math.abs(anglePercent) > 0.00001 then
local outerThumbCenter = rotatePointAboutLocation(thumbstickOuterCenter, thumbstickInnerCenter, anglePercent) local outerThumbCenter =
thumbstickOuter.Position = transformFromCenterToTopLeft(Vector2.new(outerThumbCenter.x,outerThumbCenter.y), thumbstickOuter) rotatePointAboutLocation(thumbstickOuterCenter, thumbstickInnerCenter, anglePercent)
thumbstickOuter.Position =
transformFromCenterToTopLeft(Vector2.new(outerThumbCenter.x, outerThumbCenter.y), thumbstickOuter)
end end
-- now just translate outer thumbstick to make sure it stays nears inner thumbstick -- 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) thumbstickOuter.Position = UDim2.new(
0,
thumbstickOuter.Position.X.Offset + movementVector.x,
0,
thumbstickOuter.Position.Y.Offset + movementVector.y
)
end end
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation,thumbstickFrame) thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame)
-- a bit of error checking to make sure thumbsticks stay close to eachother -- a bit of error checking to make sure thumbsticks stay close to eachother
thumbstickFramePosition = Vector2.new(thumbstickFrame.Position.X.Offset,thumbstickFrame.Position.Y.Offset) thumbstickFramePosition = Vector2.new(thumbstickFrame.Position.X.Offset, thumbstickFrame.Position.Y.Offset)
thumbstickOuterPosition = Vector2.new(thumbstickOuter.Position.X.Offset,thumbstickOuter.Position.Y.Offset) thumbstickOuterPosition = Vector2.new(thumbstickOuter.Position.X.Offset, thumbstickOuter.Position.Y.Offset)
if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize/2 then if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize / 2 then
local vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize/2 local vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize / 2
thumbstickOuter.Position = UDim2.new(0,thumbstickFramePosition.x + vectorWithLength.x,0,thumbstickFramePosition.y + vectorWithLength.y) thumbstickOuter.Position = UDim2.new(
0,
thumbstickFramePosition.x + vectorWithLength.x,
0,
thumbstickFramePosition.y + vectorWithLength.y
)
end end
return Vector2.new(thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset) return Vector2.new(
thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,
thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset
)
end end
function movementOutsideDeadZone(movementVector) function movementOutsideDeadZone(movementVector)
return ( (math.abs(movementVector.x) > ThumbstickDeadZone) or (math.abs(movementVector.y) > ThumbstickDeadZone) ) return ((math.abs(movementVector.x) > ThumbstickDeadZone) or (math.abs(movementVector.y) > ThumbstickDeadZone))
end end
function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThumbstick) function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThumbstick)
local thumbstickFrame = Instance.new("Frame") local thumbstickFrame = Instance.new "Frame"
thumbstickFrame.Name = "ThumbstickFrame" thumbstickFrame.Name = "ThumbstickFrame"
thumbstickFrame.Active = true thumbstickFrame.Active = true
thumbstickFrame.Size = UDim2.new(0,thumbstickSize,0,thumbstickSize) thumbstickFrame.Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize)
thumbstickFrame.Position = defaultThumbstickPos thumbstickFrame.Position = defaultThumbstickPos
thumbstickFrame.BackgroundTransparency = 1 thumbstickFrame.BackgroundTransparency = 1
local outerThumbstick = Instance.new("ImageLabel") local outerThumbstick = Instance.new "ImageLabel"
outerThumbstick.Name = "OuterThumbstick" outerThumbstick.Name = "OuterThumbstick"
outerThumbstick.Image = touchControlsSheet outerThumbstick.Image = touchControlsSheet
outerThumbstick.ImageRectOffset = Vector2.new(0,0) outerThumbstick.ImageRectOffset = Vector2.new(0, 0)
outerThumbstick.ImageRectSize = Vector2.new(220,220) outerThumbstick.ImageRectSize = Vector2.new(220, 220)
outerThumbstick.BackgroundTransparency = 1 outerThumbstick.BackgroundTransparency = 1
outerThumbstick.Size = UDim2.new(0,thumbstickSize,0,thumbstickSize) outerThumbstick.Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize)
outerThumbstick.Position = defaultThumbstickPos outerThumbstick.Position = defaultThumbstickPos
outerThumbstick.Parent = Game.CoreGui.RobloxGui outerThumbstick.Parent = Game.CoreGui.RobloxGui
local innerThumbstick = Instance.new("ImageLabel") local innerThumbstick = Instance.new "ImageLabel"
innerThumbstick.Name = "InnerThumbstick" innerThumbstick.Name = "InnerThumbstick"
innerThumbstick.Image = touchControlsSheet innerThumbstick.Image = touchControlsSheet
innerThumbstick.ImageRectOffset = Vector2.new(220,0) innerThumbstick.ImageRectOffset = Vector2.new(220, 0)
innerThumbstick.ImageRectSize = Vector2.new(111,111) innerThumbstick.ImageRectSize = Vector2.new(111, 111)
innerThumbstick.BackgroundTransparency = 1 innerThumbstick.BackgroundTransparency = 1
innerThumbstick.Size = UDim2.new(0,thumbstickSize/2,0,thumbstickSize/2) innerThumbstick.Size = UDim2.new(0, thumbstickSize / 2, 0, thumbstickSize / 2)
innerThumbstick.Position = UDim2.new(0, thumbstickFrame.Size.X.Offset/2 - thumbstickSize/4, 0, thumbstickFrame.Size.Y.Offset/2 - thumbstickSize/4) innerThumbstick.Position = UDim2.new(
0,
thumbstickFrame.Size.X.Offset / 2 - thumbstickSize / 4,
0,
thumbstickFrame.Size.Y.Offset / 2 - thumbstickSize / 4
)
innerThumbstick.Parent = thumbstickFrame innerThumbstick.Parent = thumbstickFrame
innerThumbstick.ZIndex = 2 innerThumbstick.ZIndex = 2
@ -203,35 +250,51 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu
local userInputSeviceTouchEndedCon = nil local userInputSeviceTouchEndedCon = nil
local startInputTracking = function(inputObject) local startInputTracking = function(inputObject)
if thumbstickTouch then return end if thumbstickTouch then
if inputObject == cameraTouch then return end return
if inputObject == currentJumpTouch then return end end
if inputObject.UserInputType ~= Enum.UserInputType.Touch 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 thumbstickTouch = inputObject
table.insert(thumbstickTouches,thumbstickTouch) table.insert(thumbstickTouches, thumbstickTouch)
thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position,thumbstickFrame) thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position, thumbstickFrame)
outerThumbstick.Position = thumbstickFrame.Position outerThumbstick.Position = thumbstickFrame.Position
userInputServiceTouchMovedCon = userInputService.TouchMoved:connect(function(movedInput) userInputServiceTouchMovedCon = userInputService.TouchMoved:connect(function(movedInput)
if movedInput == thumbstickTouch then if movedInput == thumbstickTouch then
local movementVector = nil local movementVector = nil
if stationaryThumbstick then if stationaryThumbstick then
movementVector = stationaryThumbstickTouchMove(thumbstickFrame,outerThumbstick,Vector2.new(movedInput.Position.x,movedInput.Position.y)) movementVector = stationaryThumbstickTouchMove(
thumbstickFrame,
outerThumbstick,
Vector2.new(movedInput.Position.x, movedInput.Position.y)
)
else else
movementVector = followThumbstickTouchMove(thumbstickFrame,outerThumbstick,Vector2.new(movedInput.Position.x,movedInput.Position.y)) movementVector = followThumbstickTouchMove(
thumbstickFrame,
outerThumbstick,
Vector2.new(movedInput.Position.x, movedInput.Position.y)
)
end end
if updateFunction then if updateFunction then
updateFunction(movementVector,outerThumbstick.Size.X.Offset/2) updateFunction(movementVector, outerThumbstick.Size.X.Offset / 2)
end end
end end
end) end)
userInputSeviceTouchEndedCon = userInputService.TouchEnded:connect(function(endedInput) userInputSeviceTouchEndedCon = userInputService.TouchEnded:connect(function(endedInput)
if endedInput == thumbstickTouch then if endedInput == thumbstickTouch then
if updateFunction then if updateFunction then
updateFunction(Vector2.new(0,0),1) updateFunction(Vector2.new(0, 0), 1)
end end
userInputSeviceTouchEndedCon:disconnect() userInputSeviceTouchEndedCon:disconnect()
@ -242,7 +305,7 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu
for i, object in pairs(thumbstickTouches) do for i, object in pairs(thumbstickTouches) do
if object == thumbstickTouch then if object == thumbstickTouch then
table.remove(thumbstickTouches,i) table.remove(thumbstickTouches, i)
break break
end end
end end
@ -262,31 +325,31 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu
return thumbstickFrame return thumbstickFrame
end end
function setupCharacterMovement( parentFrame ) function setupCharacterMovement(parentFrame)
local lastMovementVector, lastMaxMovement = nil local lastMovementVector, lastMaxMovement = nil
local moveCharacterFunc = localPlayer.MoveCharacter local moveCharacterFunc = localPlayer.MoveCharacter
local moveCharacterFunction = function ( movementVector, maxMovement ) local moveCharacterFunction = function(movementVector, maxMovement)
if localPlayer then if localPlayer then
if movementOutsideDeadZone(movementVector) then if movementOutsideDeadZone(movementVector) then
lastMovementVector = movementVector lastMovementVector = movementVector
lastMaxMovement = maxMovement lastMaxMovement = maxMovement
-- sometimes rounding error will not allow us to go max speed at some -- 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 -- thumbstick angles, fix this with a bit of fudging near 100% throttle
if movementVector.magnitude/maxMovement > ThumbstickMaxPercentGive then if movementVector.magnitude / maxMovement > ThumbstickMaxPercentGive then
maxMovement = movementVector.magnitude - 1 maxMovement = movementVector.magnitude - 1
end end
moveCharacterFunc(localPlayer, movementVector, maxMovement) moveCharacterFunc(localPlayer, movementVector, maxMovement)
else else
lastMovementVector = Vector2.new(0,0) lastMovementVector = Vector2.new(0, 0)
lastMaxMovement = 1 lastMaxMovement = 1
moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement) moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement)
end end
end end
end end
local thumbstickPos = UDim2.new(0,thumbstickSize/2,1,-thumbstickSize*1.75) local thumbstickPos = UDim2.new(0, thumbstickSize / 2, 1, -thumbstickSize * 1.75)
if isSmallScreenDevice() then if isSmallScreenDevice() then
thumbstickPos = UDim2.new(0,(thumbstickSize/2) - 10,1,-thumbstickSize - 20) thumbstickPos = UDim2.new(0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20)
end end
local characterThumbstick = constructThumbstick(thumbstickPos, moveCharacterFunction, false) local characterThumbstick = constructThumbstick(thumbstickPos, moveCharacterFunction, false)
characterThumbstick.Name = "CharacterThumbstick" characterThumbstick.Name = "CharacterThumbstick"
@ -300,36 +363,41 @@ function setupCharacterMovement( parentFrame )
return refreshCharacterMovement return refreshCharacterMovement
end end
function setupJumpButton(parentFrame)
function setupJumpButton( parentFrame ) local jumpButton = Instance.new "ImageButton"
local jumpButton = Instance.new("ImageButton")
jumpButton.Name = "JumpButton" jumpButton.Name = "JumpButton"
jumpButton.BackgroundTransparency = 1 jumpButton.BackgroundTransparency = 1
jumpButton.Image = touchControlsSheet jumpButton.Image = touchControlsSheet
jumpButton.ImageRectOffset = Vector2.new(176,222) jumpButton.ImageRectOffset = Vector2.new(176, 222)
jumpButton.ImageRectSize = Vector2.new(174,174) jumpButton.ImageRectSize = Vector2.new(174, 174)
jumpButton.Size = UDim2.new(0,jumpButtonSize,0,jumpButtonSize) jumpButton.Size = UDim2.new(0, jumpButtonSize, 0, jumpButtonSize)
if isSmallScreenDevice() then if isSmallScreenDevice() then
jumpButton.Position = UDim2.new(1, -(jumpButtonSize*2.25), 1, -jumpButtonSize - 20) jumpButton.Position = UDim2.new(1, -(jumpButtonSize * 2.25), 1, -jumpButtonSize - 20)
else else
jumpButton.Position = UDim2.new(1, -(jumpButtonSize*2.75), 1, -jumpButtonSize - 120) jumpButton.Position = UDim2.new(1, -(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120)
end end
local playerJumpFunc = localPlayer.JumpCharacter local playerJumpFunc = localPlayer.JumpCharacter
local doJumpLoop = function () local doJumpLoop = function()
while currentJumpTouch do while currentJumpTouch do
if localPlayer then if localPlayer then
playerJumpFunc(localPlayer) playerJumpFunc(localPlayer)
end end
wait(1/60) wait(1 / 60)
end end
end end
jumpButton.InputBegan:connect(function(inputObject) jumpButton.InputBegan:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end if inputObject.UserInputType ~= Enum.UserInputType.Touch then
if currentJumpTouch then return end return
if inputObject == cameraTouch then return end end
if currentJumpTouch then
return
end
if inputObject == cameraTouch then
return
end
for i, touch in pairs(oldJumpTouches) do for i, touch in pairs(oldJumpTouches) do
if touch == inputObject then if touch == inputObject then
return return
@ -337,25 +405,27 @@ function setupJumpButton( parentFrame )
end end
currentJumpTouch = inputObject currentJumpTouch = inputObject
jumpButton.ImageRectOffset = Vector2.new(0,222) jumpButton.ImageRectOffset = Vector2.new(0, 222)
jumpButton.ImageRectSize = Vector2.new(174,174) jumpButton.ImageRectSize = Vector2.new(174, 174)
doJumpLoop() doJumpLoop()
end) end)
jumpButton.InputEnded:connect(function (inputObject) jumpButton.InputEnded:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end if inputObject.UserInputType ~= Enum.UserInputType.Touch then
return
end
jumpButton.ImageRectOffset = Vector2.new(176,222) jumpButton.ImageRectOffset = Vector2.new(176, 222)
jumpButton.ImageRectSize = Vector2.new(174,174) jumpButton.ImageRectSize = Vector2.new(174, 174)
if inputObject == currentJumpTouch then if inputObject == currentJumpTouch then
table.insert(oldJumpTouches,currentJumpTouch) table.insert(oldJumpTouches, currentJumpTouch)
currentJumpTouch = nil currentJumpTouch = nil
end end
end) end)
userInputService.InputEnded:connect(function ( globalInputObject ) userInputService.InputEnded:connect(function(globalInputObject)
for i, touch in pairs(oldJumpTouches) do for i, touch in pairs(oldJumpTouches) do
if touch == globalInputObject then if touch == globalInputObject then
table.remove(oldJumpTouches,i) table.remove(oldJumpTouches, i)
break break
end end
end end
@ -370,8 +440,10 @@ function setupJumpButton( parentFrame )
jumpButton.Parent = parentFrame jumpButton.Parent = parentFrame
end end
function isTouchUsedByJumpButton( touch ) function isTouchUsedByJumpButton(touch)
if touch == currentJumpTouch then return true end if touch == currentJumpTouch then
return true
end
for i, touchToCompare in pairs(oldJumpTouches) do for i, touchToCompare in pairs(oldJumpTouches) do
if touch == touchToCompare then if touch == touchToCompare then
return true return true
@ -409,7 +481,7 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
lastPos = nil lastPos = nil
end end
local resetPinchState = function () local resetPinchState = function()
pinchTouches = {} pinchTouches = {}
lastPinchScale = nil lastPinchScale = nil
shouldPinch = false shouldPinch = false
@ -419,12 +491,14 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
local startPinch = function(firstTouch, secondTouch) local startPinch = function(firstTouch, secondTouch)
-- track pinching in new frame -- track pinching in new frame
if pinchFrame then pinchFrame:Destroy() end -- make sure we didn't track in any mud if pinchFrame then
pinchFrame = Instance.new("Frame") pinchFrame:Destroy()
end -- make sure we didn't track in any mud
pinchFrame = Instance.new "Frame"
pinchFrame.Name = "PinchFrame" pinchFrame.Name = "PinchFrame"
pinchFrame.BackgroundTransparency = 1 pinchFrame.BackgroundTransparency = 1
pinchFrame.Parent = parentFrame pinchFrame.Parent = parentFrame
pinchFrame.Size = UDim2.new(1,0,1,0) pinchFrame.Size = UDim2.new(1, 0, 1, 0)
pinchFrame.InputChanged:connect(function(inputObject) pinchFrame.InputChanged:connect(function(inputObject)
if not shouldPinch then if not shouldPinch then
@ -468,14 +542,14 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
local pinchGestureReceivedTouch = function(inputObject) local pinchGestureReceivedTouch = function(inputObject)
if #pinchTouches < 1 then if #pinchTouches < 1 then
table.insert(pinchTouches,inputObject) table.insert(pinchTouches, inputObject)
pinchTime = tick() pinchTime = tick()
shouldPinch = false shouldPinch = false
elseif #pinchTouches == 1 then elseif #pinchTouches == 1 then
shouldPinch = ( (tick() - pinchTime) <= PinchZoomDelay ) shouldPinch = ((tick() - pinchTime) <= PinchZoomDelay)
if shouldPinch then if shouldPinch then
table.insert(pinchTouches,inputObject) table.insert(pinchTouches, inputObject)
startPinch(pinchTouches[1], pinchTouches[2]) startPinch(pinchTouches[1], pinchTouches[2])
else -- shouldn't ever get here, but just in case else -- shouldn't ever get here, but just in case
pinchTouches = {} pinchTouches = {}
@ -483,9 +557,13 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
end end
end end
parentFrame.InputBegan:connect(function (inputObject) parentFrame.InputBegan:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end if inputObject.UserInputType ~= Enum.UserInputType.Touch then
if isTouchUsedByJumpButton(inputObject) then return end return
end
if isTouchUsedByJumpButton(inputObject) then
return
end
local usedByThumbstick = isTouchUsedByThumbstick(inputObject) local usedByThumbstick = isTouchUsedByThumbstick(inputObject)
if not usedByThumbstick then if not usedByThumbstick then
@ -494,15 +572,19 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
if cameraTouch == nil and not usedByThumbstick then if cameraTouch == nil and not usedByThumbstick then
cameraTouch = inputObject cameraTouch = inputObject
lastPos = Vector2.new(cameraTouch.Position.x,cameraTouch.Position.y) lastPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y)
lastTick = tick() lastTick = tick()
end end
end) end)
userInputService.InputChanged:connect(function (inputObject) userInputService.InputChanged:connect(function(inputObject)
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end if inputObject.UserInputType ~= Enum.UserInputType.Touch then
if cameraTouch ~= inputObject then return end return
end
if cameraTouch ~= inputObject then
return
end
local newPos = Vector2.new(cameraTouch.Position.x,cameraTouch.Position.y) local newPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y)
local touchDiff = (lastPos - newPos) * CameraRotateSensitivity local touchDiff = (lastPos - newPos) * CameraRotateSensitivity
-- first time rotating outside deadzone, just setup for next changed event -- first time rotating outside deadzone, just setup for next changed event
@ -518,23 +600,23 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
lastPos = newPos lastPos = newPos
end end
end) end)
userInputService.InputEnded:connect(function (inputObject) userInputService.InputEnded:connect(function(inputObject)
if cameraTouch == inputObject or cameraTouch == nil then if cameraTouch == inputObject or cameraTouch == nil then
resetCameraRotateState() resetCameraRotateState()
end end
for i, touch in pairs(pinchTouches) do for i, touch in pairs(pinchTouches) do
if touch == inputObject then if touch == inputObject then
table.remove(pinchTouches,i) table.remove(pinchTouches, i)
end end
end end
end) end)
end end
function setupTouchControls() function setupTouchControls()
local touchControlFrame = Instance.new("Frame") local touchControlFrame = Instance.new "Frame"
touchControlFrame.Name = "TouchControlFrame" touchControlFrame.Name = "TouchControlFrame"
touchControlFrame.Size = UDim2.new(1,0,1,0) touchControlFrame.Size = UDim2.new(1, 0, 1, 0)
touchControlFrame.BackgroundTransparency = 1 touchControlFrame.BackgroundTransparency = 1
touchControlFrame.Parent = Game.CoreGui.RobloxGui touchControlFrame.Parent = Game.CoreGui.RobloxGui
@ -543,7 +625,9 @@ function setupTouchControls()
setupCameraControl(touchControlFrame, refreshCharacterMoveFunc) setupCameraControl(touchControlFrame, refreshCharacterMoveFunc)
userInputService.ProcessedEvent:connect(function(inputObject, processed) userInputService.ProcessedEvent:connect(function(inputObject, processed)
if not processed then return end if not processed then
return
end
-- kill camera pan if the touch is used by some user controls -- kill camera pan if the touch is used by some user controls
if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin then if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin then
@ -552,7 +636,6 @@ function setupTouchControls()
end) end)
end end
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
-- Start of Script -- Start of Script

File diff suppressed because it is too large Load Diff

View File

@ -1,28 +1,28 @@
local controlFrame = script.Parent:FindFirstChild("ControlFrame") local controlFrame = script.Parent:FindFirstChild "ControlFrame"
if not controlFrame then return end if not controlFrame then
return
end
local topLeftControl = controlFrame:FindFirstChild("TopLeftControl") local bottomLeftControl = controlFrame:FindFirstChild "BottomLeftControl"
local bottomLeftControl = controlFrame:FindFirstChild("BottomLeftControl") local bottomRightControl = controlFrame:FindFirstChild "BottomRightControl"
local bottomRightControl = controlFrame:FindFirstChild("BottomRightControl")
local frameTip = Instance.new "TextLabel"
local frameTip = Instance.new("TextLabel")
frameTip.Name = "ToolTip" frameTip.Name = "ToolTip"
frameTip.Text = "" frameTip.Text = ""
frameTip.Font = Enum.Font.ArialBold frameTip.Font = Enum.Font.ArialBold
frameTip.FontSize = Enum.FontSize.Size12 frameTip.FontSize = Enum.FontSize.Size12
frameTip.TextColor3 = Color3.new(1,1,1) frameTip.TextColor3 = Color3.new(1, 1, 1)
frameTip.BorderSizePixel = 0 frameTip.BorderSizePixel = 0
frameTip.ZIndex = 10 frameTip.ZIndex = 10
frameTip.Size = UDim2.new(2,0,1,0) frameTip.Size = UDim2.new(2, 0, 1, 0)
frameTip.Position = UDim2.new(1,0,0,0) frameTip.Position = UDim2.new(1, 0, 0, 0)
frameTip.BackgroundColor3 = Color3.new(0,0,0) frameTip.BackgroundColor3 = Color3.new(0, 0, 0)
frameTip.BackgroundTransparency = 1 frameTip.BackgroundTransparency = 1
frameTip.TextTransparency = 1 frameTip.TextTransparency = 1
frameTip.TextWrap = true frameTip.TextWrap = true
local inside = Instance.new("BoolValue") local inside = Instance.new "BoolValue"
inside.Name = "inside" inside.Name = "inside"
inside.Value = false inside.Value = false
inside.Parent = frameTip inside.Parent = frameTip
@ -30,7 +30,7 @@ inside.Parent = frameTip
function setUpListeners(frameToListen) function setUpListeners(frameToListen)
local fadeSpeed = 0.1 local fadeSpeed = 0.1
frameToListen.Parent.MouseEnter:connect(function() frameToListen.Parent.MouseEnter:connect(function()
if frameToListen:FindFirstChild("inside") then if frameToListen:FindFirstChild "inside" then
frameToListen.inside.Value = true frameToListen.inside.Value = true
wait(1.2) wait(1.2)
if frameToListen.inside.Value then if frameToListen.inside.Value then
@ -47,20 +47,24 @@ function setUpListeners(frameToListen)
killFrame.BackgroundTransparency = 1 killFrame.BackgroundTransparency = 1
killFrame.TextTransparency = 1 killFrame.TextTransparency = 1
end end
frameToListen.Parent.MouseLeave:connect(function() killTip(frameToListen) end) frameToListen.Parent.MouseLeave:connect(function()
frameToListen.Parent.MouseButton1Click:connect(function() killTip(frameToListen) end) killTip(frameToListen)
end)
frameToListen.Parent.MouseButton1Click:connect(function()
killTip(frameToListen)
end)
end end
function createSettingsButtonTip(parent) function createSettingsButtonTip(parent)
if parent == nil then if parent == nil then
parent = bottomLeftControl:FindFirstChild("SettingsButton") parent = bottomLeftControl:FindFirstChild "SettingsButton"
end end
local toolTip = frameTip:clone() local toolTip = frameTip:clone()
toolTip.RobloxLocked = true toolTip.RobloxLocked = true
toolTip.Text = "Settings/Leave Game" toolTip.Text = "Settings/Leave Game"
toolTip.Position = UDim2.new(0,0,0,-18) toolTip.Position = UDim2.new(0, 0, 0, -18)
toolTip.Size = UDim2.new(0,120,0,20) toolTip.Size = UDim2.new(0, 120, 0, 20)
toolTip.Parent = parent toolTip.Parent = parent
setUpListeners(toolTip) setUpListeners(toolTip)
end end
@ -70,16 +74,14 @@ wait(5) -- make sure we are loaded in, won't need tool tips for first 5 seconds
---------------- set up Bottom Left Tool Tips ------------------------- ---------------- set up Bottom Left Tool Tips -------------------------
local bottomLeftChildren = bottomLeftControl:GetChildren() local bottomLeftChildren = bottomLeftControl:GetChildren()
local hasSettingsTip = false
for i = 1, #bottomLeftChildren do for i = 1, #bottomLeftChildren do
if bottomLeftChildren[i].Name == "Exit" then if bottomLeftChildren[i].Name == "Exit" then
local exitTip = frameTip:clone() local exitTip = frameTip:clone()
exitTip.RobloxLocked = true exitTip.RobloxLocked = true
exitTip.Text = "Leave Place" exitTip.Text = "Leave Place"
exitTip.Position = UDim2.new(0,0,-1,0) exitTip.Position = UDim2.new(0, 0, -1, 0)
exitTip.Size = UDim2.new(1,0,1,0) exitTip.Size = UDim2.new(1, 0, 1, 0)
exitTip.Parent = bottomLeftChildren[i] exitTip.Parent = bottomLeftChildren[i]
setUpListeners(exitTip) setUpListeners(exitTip)
elseif bottomLeftChildren[i].Name == "SettingsButton" then elseif bottomLeftChildren[i].Name == "SettingsButton" then
@ -93,16 +95,16 @@ end
local bottomRightChildren = bottomRightControl:GetChildren() local bottomRightChildren = bottomRightControl:GetChildren()
for i = 1, #bottomRightChildren do for i = 1, #bottomRightChildren do
if bottomRightChildren[i].Name:find("Camera") ~= nil then if bottomRightChildren[i].Name:find "Camera" ~= nil then
local cameraTip = frameTip:clone() local cameraTip = frameTip:clone()
cameraTip.RobloxLocked = true cameraTip.RobloxLocked = true
cameraTip.Text = "Camera View" cameraTip.Text = "Camera View"
if bottomRightChildren[i].Name:find("Zoom") then if bottomRightChildren[i].Name:find "Zoom" then
cameraTip.Position = UDim2.new(-1,0,-1.5) cameraTip.Position = UDim2.new(-1, 0, -1.5)
else else
cameraTip.Position = UDim2.new(0,0,-1.5,0) cameraTip.Position = UDim2.new(0, 0, -1.5, 0)
end end
cameraTip.Size = UDim2.new(2,0,1.25,0) cameraTip.Size = UDim2.new(2, 0, 1.25, 0)
cameraTip.Parent = bottomRightChildren[i] cameraTip.Parent = bottomRightChildren[i]
setUpListeners(cameraTip) setUpListeners(cameraTip)
end end

View File

@ -1,13 +1,14 @@
-- Creates all neccessary scripts for the gui on initial load, everything except build tools -- Creates all neccessary scripts for the gui on initial load, everything except build tools
-- Created by Ben T. 10/29/10 -- Created by Ben T. 10/29/10
-- Please note that these are loaded in a specific order to diminish errors/perceived load time by user -- Please note that these are loaded in a specific order to diminish errors/perceived load time by user
local scriptContext = game:GetService("ScriptContext") local scriptContext = game:GetService "ScriptContext"
local touchEnabled = false local touchEnabled = false
pcall(function() touchEnabled = game:GetService("UserInputService").TouchEnabled end) pcall(function()
touchEnabled = game:GetService("UserInputService").TouchEnabled
end)
-- library registration -- library registration
scriptContext:AddCoreScript(60595695, scriptContext,"/Libraries/LibraryRegistration/LibraryRegistration") scriptContext:AddCoreScript(60595695, scriptContext, "/Libraries/LibraryRegistration/LibraryRegistration")
local function waitForChild(instance, name) local function waitForChild(instance, name)
while not instance:FindFirstChild(name) do while not instance:FindFirstChild(name) do
@ -21,90 +22,87 @@ local function waitForProperty(instance, property)
end end
-- Responsible for tracking logging items -- Responsible for tracking logging items
local scriptContext = game:GetService("ScriptContext") local scriptContext = game:GetService "ScriptContext"
scriptContext:AddCoreScript(59002209, scriptContext, "CoreScripts/Sections") scriptContext:AddCoreScript(59002209, scriptContext, "CoreScripts/Sections")
waitForChild(game:GetService("CoreGui"),"RobloxGui") waitForChild(game:GetService "CoreGui", "RobloxGui")
local screenGui = game:GetService("CoreGui"):FindFirstChild("RobloxGui") local screenGui = game:GetService("CoreGui"):FindFirstChild "RobloxGui"
if not touchEnabled then if not touchEnabled then
-- ToolTipper (creates tool tips for gui) -- ToolTipper (creates tool tips for gui)
scriptContext:AddCoreScript(36868950,screenGui,"CoreScripts/ToolTip") scriptContext:AddCoreScript(36868950, screenGui, "CoreScripts/ToolTip")
-- SettingsScript -- SettingsScript
scriptContext:AddCoreScript(46295863,screenGui,"CoreScripts/Settings") scriptContext:AddCoreScript(46295863, screenGui, "CoreScripts/Settings")
else else
scriptContext:AddCoreScript(153556783,screenGui,"CoreScripts/TouchControls") scriptContext:AddCoreScript(153556783, screenGui, "CoreScripts/TouchControls")
end end
-- MainBotChatScript -- MainBotChatScript
scriptContext:AddCoreScript(39250920,screenGui,"CoreScripts/MainBotChatScript") scriptContext:AddCoreScript(39250920, screenGui, "CoreScripts/MainBotChatScript")
-- Popup Script -- Popup Script
scriptContext:AddCoreScript(48488451,screenGui,"CoreScripts/PopupScript") scriptContext:AddCoreScript(48488451, screenGui, "CoreScripts/PopupScript")
-- Friend Notification Script (probably can use this script to expand out to other notifications) -- Friend Notification Script (probably can use this script to expand out to other notifications)
scriptContext:AddCoreScript(48488398,screenGui,"CoreScripts/NotificationScript") scriptContext:AddCoreScript(48488398, screenGui, "CoreScripts/NotificationScript")
-- Chat script -- Chat script
scriptContext:AddCoreScript(97188756, screenGui, "CoreScripts/ChatScript") scriptContext:AddCoreScript(97188756, screenGui, "CoreScripts/ChatScript")
-- Purchase Prompt Script -- Purchase Prompt Script
scriptContext:AddCoreScript(107893730, screenGui, "CoreScripts/PurchasePromptScript") scriptContext:AddCoreScript(107893730, screenGui, "CoreScripts/PurchasePromptScript")
if not touchEnabled then if not touchEnabled or screenGui.AbsoluteSize.Y > 600 then
-- New Player List -- New Player List
scriptContext:AddCoreScript(48488235,screenGui,"CoreScripts/PlayerListScript") scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript")
elseif screenGui.AbsoluteSize.Y > 600 then
-- New Player List
scriptContext:AddCoreScript(48488235,screenGui,"CoreScripts/PlayerListScript")
else else
delay(5, function() delay(5, function()
if screenGui.AbsoluteSize.Y >= 600 then if screenGui.AbsoluteSize.Y >= 600 then
-- New Player List -- New Player List
scriptContext:AddCoreScript(48488235,screenGui,"CoreScripts/PlayerListScript") scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript")
end end
end) end)
end end
if game.CoreGui.Version >= 3 and game.PlaceId ~= 130815926 then --todo: remove placeid hack for halloween if game.CoreGui.Version >= 3 and game.PlaceId ~= 130815926 then --todo: remove placeid hack for halloween
-- Backpack Builder, creates most of the backpack gui -- Backpack Builder, creates most of the backpack gui
scriptContext:AddCoreScript(53878047,screenGui,"CoreScripts/BackpackScripts/BackpackBuilder") scriptContext:AddCoreScript(53878047, screenGui, "CoreScripts/BackpackScripts/BackpackBuilder")
waitForChild(screenGui,"CurrentLoadout") waitForChild(screenGui, "CurrentLoadout")
waitForChild(screenGui,"Backpack") waitForChild(screenGui, "Backpack")
local Backpack = screenGui.Backpack local Backpack = screenGui.Backpack
-- Manager handles all big backpack state changes, other scripts subscribe to this and do things accordingly -- Manager handles all big backpack state changes, other scripts subscribe to this and do things accordingly
if game.CoreGui.Version >= 7 then if game.CoreGui.Version >= 7 then
scriptContext:AddCoreScript(89449093,Backpack,"CoreScripts/BackpackScripts/BackpackManager") scriptContext:AddCoreScript(89449093, Backpack, "CoreScripts/BackpackScripts/BackpackManager")
end end
-- Backpack Gear (handles all backpack gear tab stuff) -- Backpack Gear (handles all backpack gear tab stuff)
game:GetService("ScriptContext"):AddCoreScript(89449008,Backpack,"CoreScripts/BackpackScripts/BackpackGear") game:GetService("ScriptContext"):AddCoreScript(89449008, Backpack, "CoreScripts/BackpackScripts/BackpackGear")
-- Loadout Script, used for gear hotkeys -- Loadout Script, used for gear hotkeys
scriptContext:AddCoreScript(53878057,screenGui.CurrentLoadout,"CoreScripts/BackpackScripts/LoadoutScript") scriptContext:AddCoreScript(53878057, screenGui.CurrentLoadout, "CoreScripts/BackpackScripts/LoadoutScript")
if game.CoreGui.Version >= 8 then if game.CoreGui.Version >= 8 then
-- Wardrobe script handles all character dressing operations -- Wardrobe script handles all character dressing operations
scriptContext:AddCoreScript(-1,Backpack,"CoreScripts/BackpackScripts/BackpackWardrobe") scriptContext:AddCoreScript(-1, Backpack, "CoreScripts/BackpackScripts/BackpackWardrobe")
end end
end end
local IsPersonalServer = not not game.Workspace:FindFirstChild("PSVariable") local IsPersonalServer = not not game.Workspace:FindFirstChild "PSVariable"
if IsPersonalServer then if IsPersonalServer then
game:GetService("ScriptContext"):AddCoreScript(64164692,game.Players.LocalPlayer,"BuildToolManager") game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager")
end end
game.Workspace.ChildAdded:connect(function(nchild) game.Workspace.ChildAdded:connect(function(nchild)
if nchild.Name=='PSVariable' and nchild:IsA('BoolValue') then if nchild.Name == "PSVariable" and nchild:IsA "BoolValue" then
IsPersonalServer = true IsPersonalServer = true
game:GetService("ScriptContext"):AddCoreScript(64164692,game.Players.LocalPlayer,"BuildToolManager") game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager")
end end
end) end)
if touchEnabled then -- touch devices don't use same control frame if touchEnabled then -- touch devices don't use same control frame
-- only used for touch device button generation -- only used for touch device button generation
scriptContext:AddCoreScript(152908679,screenGui,"CoreScripts/ContextActionTouch") scriptContext:AddCoreScript(152908679, screenGui, "CoreScripts/ContextActionTouch")
waitForChild(screenGui, 'ControlFrame') waitForChild(screenGui, "ControlFrame")
waitForChild(screenGui.ControlFrame, 'BottomLeftControl') waitForChild(screenGui.ControlFrame, "BottomLeftControl")
screenGui.ControlFrame.BottomLeftControl.Visible = false screenGui.ControlFrame.BottomLeftControl.Visible = false
waitForChild(screenGui.ControlFrame, 'TopLeftControl') waitForChild(screenGui.ControlFrame, "TopLeftControl")
screenGui.ControlFrame.TopLeftControl.Visible = false screenGui.ControlFrame.TopLeftControl.Visible = false
end end

View File

@ -1,52 +1,52 @@
local damageGuiWidth = 5.0 local damageGuiWidth = 5.0
local damageGuiHeight = 5.0 local damageGuiHeight = 5.0
function waitForChild(parent, childName) function waitForChild(parent, childName)
local child = parent:findFirstChild(childName) local child = parent:findFirstChild(childName)
if child then return child end if child then
return child
end
while true do while true do
child = parent.ChildAdded:wait() child = parent.ChildAdded:wait()
if child.Name==childName then return child end if child.Name == childName then
return child
end
end end
end end
-- declarations -- declarations
local Figure = script.Parent local Figure = script.Parent
local Head = waitForChild(Figure, &quot;Head&quot;) local Humanoid = waitForChild(Figure, "Humanoid")
local Humanoid = waitForChild(Figure, &quot;Humanoid&quot;) local Torso = waitForChild(Figure, "Torso")
local walkSpeed = Humanoid.WalkSpeed
local Torso = waitForChild(Figure, &quot;Torso&quot;)
local config = Figure:FindFirstChild(&quot;PlayerStats&quot;) local config = Figure:FindFirstChild "PlayerStats"
local inCharTag = Instance.new(&quot;BoolValue&quot;) local inCharTag = Instance.new "BoolValue"
inCharTag.Name = &quot;InCharTag&quot; inCharTag.Name = "InCharTag"
local hider = Instance.new(&quot;BoolValue&quot;) local hider = Instance.new "BoolValue"
hider.Name = &quot;RobloxBuildTool&quot; hider.Name = "RobloxBuildTool"
local currentChildren local currentChildren
local backpackTools local backpackTools
if config == nil then if config == nil then
config = Instance.new(&quot;Configuration&quot;) config = Instance.new "Configuration"
config.Parent = Figure config.Parent = Figure
config.Name = &quot;PlayerStats&quot; config.Name = "PlayerStats"
end end
local myHealth = config:FindFirstChild(&quot;MaxHealth&quot;) local myHealth = config:FindFirstChild "MaxHealth"
if myHealth == nil then if myHealth == nil then
myHealth = Instance.new(&quot;NumberValue&quot;) myHealth = Instance.new "NumberValue"
myHealth.Parent = config myHealth.Parent = config
myHealth.Value = 100 myHealth.Value = 100
myHealth.Name = &quot;MaxHealth&quot; myHealth.Name = "MaxHealth"
end end
Humanoid.MaxHealth = myHealth.Value Humanoid.MaxHealth = myHealth.Value
Humanoid.Health = myHealth.Value Humanoid.Health = myHealth.Value
function onMaxHealthChange() function onMaxHealthChange()
Humanoid.MaxHealth = myHealth.Value Humanoid.MaxHealth = myHealth.Value
Humanoid.Health = myHealth.Value Humanoid.Health = myHealth.Value
@ -54,39 +54,43 @@ end
myHealth.Changed:connect(onMaxHealthChange) myHealth.Changed:connect(onMaxHealthChange)
--Humanoid.MaxHealth = myHealth.Value --Humanoid.MaxHealth = myHealth.Value
--Humanoid.Health = Humanoid.MaxHealth --Humanoid.Health = Humanoid.MaxHealth
local vPlayer = game.Players:GetPlayerFromCharacter(script.Parent) local vPlayer = game.Players:GetPlayerFromCharacter(script.Parent)
local dotGui = vPlayer.PlayerGui:FindFirstChild(&quot;DamageOverTimeGui&quot;) local dotGui = vPlayer.PlayerGui:FindFirstChild "DamageOverTimeGui"
if dotGui == nil then if dotGui == nil then
dotGui = Instance.new(&quot;BillboardGui&quot;) dotGui = Instance.new "BillboardGui"
dotGui.Name = &quot;DamageOverTimeGui&quot; dotGui.Name = "DamageOverTimeGui"
dotGui.Parent = vPlayer.PlayerGui dotGui.Parent = vPlayer.PlayerGui
dotGui.Adornee = script.Parent:FindFirstChild(&quot;Head&quot;) dotGui.Adornee = script.Parent:FindFirstChild "Head"
dotGui.Active = true dotGui.Active = true
dotGui.size = UDim2.new(damageGuiWidth, 0.0, damageGuiHeight, 0.0) dotGui.size = UDim2.new(damageGuiWidth, 0, damageGuiHeight, 0.0)
dotGui.StudsOffset = Vector3.new(0.0, 2.0, 0.0) dotGui.StudsOffset = Vector3.new(0, 2.0, 0.0)
end end
print(&quot;newHealth declarations finished&quot;) print "newHealth declarations finished"
function billboardHealthChange(dmg) function billboardHealthChange(dmg)
local textLabel = Instance.new(&quot;TextLabel&quot;) local textLabel = Instance.new "TextLabel"
if dmg &gt; 0 then textLabel.Text = tostring(dmg) textLabel.TextColor3 = Color3.new(0, 1, 0) if dmg > 0 then
else textLabel.Text = tostring(dmg) textLabel.TextColor3 = Color3.new(1, 0, 1) end textLabel.Text = tostring(dmg)
textLabel.size = UDim2.new(1.0, 0.0, 1.0, 0.0) textLabel.TextColor3 = Color3.new(0, 1, 0)
else
textLabel.Text = tostring(dmg)
textLabel.TextColor3 = Color3.new(1, 0, 1)
end
textLabel.size = UDim2.new(1, 0, 1, 0.0)
textLabel.Active = true textLabel.Active = true
textLabel.FontSize = 6 textLabel.FontSize = 6
textLabel.BackgroundTransparency = 1 textLabel.BackgroundTransparency = 1
textLabel.Parent = dotGui textLabel.Parent = dotGui
for t = 1, 10 do for t = 1, 10 do
wait(.1) wait(0.1)
textLabel.TextTransparency = t/10 textLabel.TextTransparency = t / 10
textLabel.Position = UDim2.new(0, 0, 0, -t*5) textLabel.Position = UDim2.new(0, 0, 0, -t * 5)
textLabel.FontSize = 6-t*.6 textLabel.FontSize = 6 - t * 0.6
end end
textLabel:remove() textLabel:remove()
@ -94,10 +98,10 @@ end
function setMaxHealth() function setMaxHealth()
--print(Humanoid.Health) --print(Humanoid.Health)
if myHealth.Value &gt;=0 then if myHealth.Value >= 0 then
Humanoid.MaxHealth = myHealth.Value Humanoid.MaxHealth = myHealth.Value
print(Humanoid.MaxHealth) print(Humanoid.MaxHealth)
if Humanoid.Health &gt; Humanoid.MaxHealth then if Humanoid.Health > Humanoid.MaxHealth then
Humanoid.Health = Humanoid.MaxHealth Humanoid.Health = Humanoid.MaxHealth
end end
end end
@ -107,43 +111,50 @@ myHealth.Changed:connect(setMaxHealth)
-- Visual Effects -- -- Visual Effects --
fireEffect = Instance.new(&quot;Fire&quot;) fireEffect = Instance.new "Fire"
fireEffect.Heat = 0.1 fireEffect.Heat = 0.1
fireEffect.Size = 3.0 fireEffect.Size = 3.0
fireEffect.Name = &quot;FireEffect&quot; fireEffect.Name = "FireEffect"
fireEffect.Enabled = false fireEffect.Enabled = false
-- --
-- regeneration
-- regeneration while true do
while true do
local s = wait(1) local s = wait(1)
local health = Humanoid.Health local health = Humanoid.Health
if health &gt; 0 then -- and health &lt; Humanoid.MaxHealth then if health > 0 then -- and health < Humanoid.MaxHealth then
local delta = 0 local delta = 0
if config then if config then
regen = config:FindFirstChild(&quot;Regen&quot;) regen = config:FindFirstChild "Regen"
poison = config:FindFirstChild(&quot;Poison&quot;) poison = config:FindFirstChild "Poison"
ice = config:FindFirstChild(&quot;Ice&quot;) ice = config:FindFirstChild "Ice"
fire = config:FindFirstChild(&quot;Fire&quot;) fire = config:FindFirstChild "Fire"
stun = config:FindFirstChild(&quot;Stun&quot;) stun = config:FindFirstChild "Stun"
if regen then if regen then
delta = delta + regen.Value.X delta = delta + regen.Value.X
if regen.Value.Y &gt;= 0 then regen.Value = Vector3.new(regen.Value.X+regen.Value.Z, regen.Value.Y - s, regen.Value.Z) -- maybe have 3rd parameter be an increaser/decreaser? if regen.Value.Y >= 0 then
elseif regen.Value.Y == -1 then regen.Value = Vector3.new(regen.Value.X+regen.Value.Z, -1, regen.Value.Z) regen.Value = Vector3.new(regen.Value.X + regen.Value.Z, regen.Value.Y - s, regen.Value.Z) -- maybe have 3rd parameter be an increaser/decreaser?
else regen:remove() end -- infinity is -1 elseif regen.Value.Y == -1 then
regen.Value = Vector3.new(regen.Value.X + regen.Value.Z, -1, regen.Value.Z)
else
regen:remove()
end -- infinity is -1
end end
if poison then if poison then
delta = delta - poison.Value.X delta = delta - poison.Value.X
if poison.Value.Y &gt;= 0 then poison.Value = Vector3.new(poison.Value.X+poison.Value.Z, poison.Value.Y - s, poison.Value.Z) if poison.Value.Y >= 0 then
elseif poison.Value.Y == -1 then poison.Value = Vector3.new(poison.Value.X+poison.Value.Z, -1, poison.Value.Z) poison.Value = Vector3.new(poison.Value.X + poison.Value.Z, poison.Value.Y - s, poison.Value.Z)
else poison:remove() end -- infinity is -1 elseif poison.Value.Y == -1 then
poison.Value = Vector3.new(poison.Value.X + poison.Value.Z, -1, poison.Value.Z)
else
poison:remove()
end -- infinity is -1
end end
if ice then if ice then
--print(&quot;IN ICE&quot;) --print("IN ICE")
delta = delta - ice.Value.X delta = delta - ice.Value.X
if ice.Value.Y &gt;=0 then if ice.Value.Y >= 0 then
ice.Value = Vector3.new(ice.Value.X, ice.Value.Y - s, ice.Value.Z) ice.Value = Vector3.new(ice.Value.X, ice.Value.Y - s, ice.Value.Z)
else else
ice:remove() ice:remove()
@ -154,7 +165,7 @@ fireEffect.Enabled = false
fireEffect.Enabled = true fireEffect.Enabled = true
fireEffect.Parent = Figure.Torso fireEffect.Parent = Figure.Torso
delta = delta - fire.Value.X delta = delta - fire.Value.X
if fire.Value.Y &gt;= 0 then if fire.Value.Y >= 0 then
fire.Value = Vector3.new(fire.Value.X, fire.Value.Y - s, fire.Value.Z) fire.Value = Vector3.new(fire.Value.X, fire.Value.Y - s, fire.Value.Z)
else else
fire:remove() fire:remove()
@ -164,19 +175,19 @@ fireEffect.Enabled = false
end end
if stun then if stun then
if stun.Value &gt; 0 then if stun.Value > 0 then
Torso.Anchored = true Torso.Anchored = true
currentChildren = script.Parent:GetChildren() currentChildren = script.Parent:GetChildren()
backpackTools = game.Players:GetPlayerFromCharacter(script.Parent).Backpack:GetChildren() backpackTools = game.Players:GetPlayerFromCharacter(script.Parent).Backpack:GetChildren()
for i = 1, #currentChildren do for i = 1, #currentChildren do
if currentChildren[i].className == &quot;Tool&quot; then if currentChildren[i].className == "Tool" then
inCharTag:Clone().Parent = currentChildren[i] inCharTag:Clone().Parent = currentChildren[i]
print(backpackTools) print(backpackTools)
table.insert(backpackTools, currentChildren[i]) table.insert(backpackTools, currentChildren[i])
end end
end end
for i = 1, #backpackTools do for i = 1, #backpackTools do
if backpackTools[i]:FindFirstChild(&quot;RobloxBuildTool&quot;) == nil then if backpackTools[i]:FindFirstChild "RobloxBuildTool" == nil then
hider:Clone().Parent = backpackTools[i] hider:Clone().Parent = backpackTools[i]
backpackTools[i].Parent = game.Lighting backpackTools[i].Parent = game.Lighting
end end
@ -189,13 +200,15 @@ fireEffect.Enabled = false
else else
Torso.Anchored = false Torso.Anchored = false
for i = 1, #backpackTools do for i = 1, #backpackTools do
rbTool = backpackTools[i]:FindFirstChild(&quot;RobloxBuildTool&quot;) rbTool = backpackTools[i]:FindFirstChild "RobloxBuildTool"
if rbTool then rbTool:Remove() end if rbTool then
rbTool:Remove()
end
backpackTools[i].Parent = game.Lighting backpackTools[i].Parent = game.Lighting
end end
wait(0.2) wait(0.2)
for i = 1, #backpackTools do for i = 1, #backpackTools do
wasInCharacter = backpackTools[i]:FindFirstChild(&quot;InCharTag&quot;) wasInCharacter = backpackTools[i]:FindFirstChild "InCharTag"
if wasInChar then if wasInChar then
wasInChar:Remove() wasInChar:Remove()
backpackTools[i].Parent = script.Parent backpackTools[i].Parent = script.Parent
@ -216,12 +229,12 @@ fireEffect.Enabled = false
--health = health + delta * s * Humanoid.MaxHealth --health = health + delta * s * Humanoid.MaxHealth
health = Humanoid.Health + delta * s health = Humanoid.Health + delta * s
if health * 1.01 &lt; Humanoid.MaxHealth then if health * 1.01 < Humanoid.MaxHealth then
Humanoid.Health = health Humanoid.Health = health
--myHealth.Value = math.floor(Humanoid.Health) --myHealth.Value = math.floor(Humanoid.Health)
elseif delta &gt; 0 then elseif delta > 0 then
Humanoid.Health = Humanoid.MaxHealth Humanoid.Health = Humanoid.MaxHealth
--myHealth.Value = Humanoid.Health --myHealth.Value = Humanoid.Health
end end
end end
end end

View File

@ -10,7 +10,6 @@ function waitForChild(instance, name)
end end
end end
local mainFrame local mainFrame
local choices = {} local choices = {}
local lastChoice local lastChoice
@ -27,7 +26,6 @@ local conversationTimedOut = "Chat ended because you didn't reply"
local conversationTimedOutSize = 350 local conversationTimedOutSize = 350
local player local player
local screenGui
local chatNotificationGui local chatNotificationGui
local messageDialog local messageDialog
local timeoutScript local timeoutScript
@ -36,9 +34,9 @@ local dialogMap = {}
local dialogConnections = {} local dialogConnections = {}
local gui = nil local gui = nil
waitForChild(game,"CoreGui") waitForChild(game, "CoreGui")
waitForChild(game.CoreGui,"RobloxGui") waitForChild(game.CoreGui, "RobloxGui")
if game.CoreGui.RobloxGui:FindFirstChild("ControlFrame") then if game.CoreGui.RobloxGui:FindFirstChild "ControlFrame" then
gui = game.CoreGui.RobloxGui.ControlFrame gui = game.CoreGui.RobloxGui.ControlFrame
else else
gui = game.CoreGui.RobloxGui gui = game.CoreGui.RobloxGui
@ -52,30 +50,28 @@ function currentTone()
end end
end end
function createChatNotificationGui() function createChatNotificationGui()
chatNotificationGui = Instance.new("BillboardGui") chatNotificationGui = Instance.new "BillboardGui"
chatNotificationGui.Name = "ChatNotificationGui" chatNotificationGui.Name = "ChatNotificationGui"
chatNotificationGui.ExtentsOffset = Vector3.new(0,1,0) chatNotificationGui.ExtentsOffset = Vector3.new(0, 1, 0)
chatNotificationGui.Size = UDim2.new(4, 0, 5.42857122, 0) chatNotificationGui.Size = UDim2.new(4, 0, 5.42857122, 0)
chatNotificationGui.SizeOffset = Vector2.new(0,0) chatNotificationGui.SizeOffset = Vector2.new(0, 0)
chatNotificationGui.StudsOffset = Vector3.new(0.4, 4.3, 0) chatNotificationGui.StudsOffset = Vector3.new(0.4, 4.3, 0)
chatNotificationGui.Enabled = true chatNotificationGui.Enabled = true
chatNotificationGui.RobloxLocked = true chatNotificationGui.RobloxLocked = true
chatNotificationGui.Active = true chatNotificationGui.Active = true
local image = Instance.new("ImageLabel") local image = Instance.new "ImageLabel"
image.Name = "Image" image.Name = "Image"
image.Active = false image.Active = false
image.BackgroundTransparency = 1 image.BackgroundTransparency = 1
image.Position = UDim2.new(0,0,0,0) image.Position = UDim2.new(0, 0, 0, 0)
image.Size = UDim2.new(1.0,0,1.0,0) image.Size = UDim2.new(1, 0, 1, 0)
image.Image = "" image.Image = ""
image.RobloxLocked = true image.RobloxLocked = true
image.Parent = chatNotificationGui image.Parent = chatNotificationGui
local button = Instance.new "ImageButton"
local button = Instance.new("ImageButton")
button.Name = "Button" button.Name = "Button"
button.AutoButtonColor = false button.AutoButtonColor = false
button.Position = UDim2.new(0.0879999995, 0, 0.0529999994, 0) button.Position = UDim2.new(0.0879999995, 0, 0.0529999994, 0)
@ -97,7 +93,7 @@ function getChatColor(tone)
end end
function styleChoices(tone) function styleChoices(tone)
for i, obj in pairs(choices) do for _, obj in pairs(choices) do
resetColor(obj, tone) resetColor(obj, tone)
end end
resetColor(lastChoice, tone) resetColor(lastChoice, tone)
@ -135,26 +131,26 @@ function setChatNotificationTone(gui, purpose, tone)
end end
function createMessageDialog() function createMessageDialog()
messageDialog = Instance.new("Frame"); messageDialog = Instance.new "Frame"
messageDialog.Name = "DialogScriptMessage" messageDialog.Name = "DialogScriptMessage"
messageDialog.Style = Enum.FrameStyle.RobloxRound messageDialog.Style = Enum.FrameStyle.RobloxRound
messageDialog.Visible = false messageDialog.Visible = false
local text = Instance.new("TextLabel") local text = Instance.new "TextLabel"
text.Name = "Text" text.Name = "Text"
text.Position = UDim2.new(0,0,0,-1) text.Position = UDim2.new(0, 0, 0, -1)
text.Size = UDim2.new(1,0,1,0) text.Size = UDim2.new(1, 0, 1, 0)
text.FontSize = Enum.FontSize.Size14 text.FontSize = Enum.FontSize.Size14
text.BackgroundTransparency = 1 text.BackgroundTransparency = 1
text.TextColor3 = Color3.new(1,1,1) text.TextColor3 = Color3.new(1, 1, 1)
text.RobloxLocked = true text.RobloxLocked = true
text.Parent = messageDialog text.Parent = messageDialog
end end
function showMessage(msg, size) function showMessage(msg, size)
messageDialog.Text.Text = msg messageDialog.Text.Text = msg
messageDialog.Size = UDim2.new(0,size,0,40) messageDialog.Size = UDim2.new(0, size, 0, 40)
messageDialog.Position = UDim2.new(0.5, -size/2, 0.5, -40) messageDialog.Position = UDim2.new(0.5, -size / 2, 0.5, -40)
messageDialog.Visible = true messageDialog.Visible = true
wait(2) wait(2)
messageDialog.Visible = false messageDialog.Visible = false
@ -162,50 +158,50 @@ end
function variableDelay(str) function variableDelay(str)
local length = math.min(string.len(str), 100) local length = math.min(string.len(str), 100)
wait(0.75 + ((length/75) * 1.5)) wait(0.75 + ((length / 75) * 1.5))
end end
function resetColor(frame, tone) function resetColor(frame, tone)
if tone == Enum.DialogTone.Neutral then if tone == Enum.DialogTone.Neutral then
frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255) frame.BackgroundColor3 = Color3.new(0 / 255, 0 / 255, 179 / 255)
frame.Number.TextColor3 = Color3.new(45/255, 142/255, 245/255) frame.Number.TextColor3 = Color3.new(45 / 255, 142 / 255, 245 / 255)
elseif tone == Enum.DialogTone.Friendly then elseif tone == Enum.DialogTone.Friendly then
frame.BackgroundColor3 = Color3.new(0/255, 77/255, 0/255) frame.BackgroundColor3 = Color3.new(0 / 255, 77 / 255, 0 / 255)
frame.Number.TextColor3 = Color3.new(0/255, 190/255, 0/255) frame.Number.TextColor3 = Color3.new(0 / 255, 190 / 255, 0 / 255)
elseif tone == Enum.DialogTone.Enemy then elseif tone == Enum.DialogTone.Enemy then
frame.BackgroundColor3 = Color3.new(140/255, 0/255, 0/255) frame.BackgroundColor3 = Color3.new(140 / 255, 0 / 255, 0 / 255)
frame.Number.TextColor3 = Color3.new(255/255,88/255, 79/255) frame.Number.TextColor3 = Color3.new(255 / 255, 88 / 255, 79 / 255)
end end
end end
function highlightColor(frame, tone) function highlightColor(frame, tone)
if tone == Enum.DialogTone.Neutral then if tone == Enum.DialogTone.Neutral then
frame.BackgroundColor3 = Color3.new(2/255, 108/255, 255/255) frame.BackgroundColor3 = Color3.new(2 / 255, 108 / 255, 255 / 255)
frame.Number.TextColor3 = Color3.new(1, 1, 1) frame.Number.TextColor3 = Color3.new(1, 1, 1)
elseif tone == Enum.DialogTone.Friendly then elseif tone == Enum.DialogTone.Friendly then
frame.BackgroundColor3 = Color3.new(0/255, 128/255, 0/255) frame.BackgroundColor3 = Color3.new(0 / 255, 128 / 255, 0 / 255)
frame.Number.TextColor3 = Color3.new(1, 1, 1) frame.Number.TextColor3 = Color3.new(1, 1, 1)
elseif tone == Enum.DialogTone.Enemy then elseif tone == Enum.DialogTone.Enemy then
frame.BackgroundColor3 = Color3.new(204/255, 0/255, 0/255) frame.BackgroundColor3 = Color3.new(204 / 255, 0 / 255, 0 / 255)
frame.Number.TextColor3 = Color3.new(1, 1, 1) frame.Number.TextColor3 = Color3.new(1, 1, 1)
end end
end end
function wanderDialog() function wanderDialog()
print("Wander") print "Wander"
mainFrame.Visible = false mainFrame.Visible = false
endDialog() endDialog()
showMessage(characterWanderedOffMessage, characterWanderedOffSize) showMessage(characterWanderedOffMessage, characterWanderedOffSize)
end end
function timeoutDialog() function timeoutDialog()
print("Timeout") print "Timeout"
mainFrame.Visible = false mainFrame.Visible = false
endDialog() endDialog()
showMessage(conversationTimedOut, conversationTimedOutSize) showMessage(conversationTimedOut, conversationTimedOutSize)
end end
function normalEndDialog() function normalEndDialog()
print("Done") print "Done"
endDialog() endDialog()
end end
@ -253,10 +249,18 @@ function selectChoice(choice)
else else
local dialogChoice = choiceMap[choice] local dialogChoice = choiceMap[choice]
game.Chat:Chat(game.Players.LocalPlayer.Character, sanitizeMessage(dialogChoice.UserDialog), getChatColor(currentTone())) game.Chat:Chat(
game.Players.LocalPlayer.Character,
sanitizeMessage(dialogChoice.UserDialog),
getChatColor(currentTone())
)
wait(1) wait(1)
currentConversationDialog:SignalDialogChoiceSelected(player, dialogChoice) currentConversationDialog:SignalDialogChoiceSelected(player, dialogChoice)
game.Chat:Chat(currentConversationPartner, sanitizeMessage(dialogChoice.ResponseDialog), getChatColor(currentTone())) game.Chat:Chat(
currentConversationPartner,
sanitizeMessage(dialogChoice.ResponseDialog),
getChatColor(currentTone())
)
variableDelay(dialogChoice.ResponseDialog) variableDelay(dialogChoice.ResponseDialog)
presentDialogChoices(currentConversationPartner, dialogChoice:GetChildren()) presentDialogChoices(currentConversationPartner, dialogChoice:GetChildren())
@ -264,36 +268,42 @@ function selectChoice(choice)
end end
function newChoice(numberText) function newChoice(numberText)
local frame = Instance.new("TextButton") local frame = Instance.new "TextButton"
frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255) frame.BackgroundColor3 = Color3.new(0 / 255, 0 / 255, 179 / 255)
frame.AutoButtonColor = false frame.AutoButtonColor = false
frame.BorderSizePixel = 0 frame.BorderSizePixel = 0
frame.Text = "" frame.Text = ""
frame.MouseEnter:connect(function() highlightColor(frame, currentTone()) end) frame.MouseEnter:connect(function()
frame.MouseLeave:connect(function() resetColor(frame, currentTone()) end) highlightColor(frame, currentTone())
frame.MouseButton1Click:connect(function() selectChoice(frame) end) end)
frame.MouseLeave:connect(function()
resetColor(frame, currentTone())
end)
frame.MouseButton1Click:connect(function()
selectChoice(frame)
end)
frame.RobloxLocked = true frame.RobloxLocked = true
local number = Instance.new("TextLabel") local number = Instance.new "TextLabel"
number.Name = "Number" number.Name = "Number"
number.TextColor3 = Color3.new(127/255, 212/255, 255/255) number.TextColor3 = Color3.new(127 / 255, 212 / 255, 255 / 255)
number.Text = numberText number.Text = numberText
number.FontSize = Enum.FontSize.Size14 number.FontSize = Enum.FontSize.Size14
number.BackgroundTransparency = 1 number.BackgroundTransparency = 1
number.Position = UDim2.new(0,4,0,2) number.Position = UDim2.new(0, 4, 0, 2)
number.Size = UDim2.new(0,20,0,24) number.Size = UDim2.new(0, 20, 0, 24)
number.TextXAlignment = Enum.TextXAlignment.Left number.TextXAlignment = Enum.TextXAlignment.Left
number.TextYAlignment = Enum.TextYAlignment.Top number.TextYAlignment = Enum.TextYAlignment.Top
number.RobloxLocked = true number.RobloxLocked = true
number.Parent = frame number.Parent = frame
local prompt = Instance.new("TextLabel") local prompt = Instance.new "TextLabel"
prompt.Name = "UserPrompt" prompt.Name = "UserPrompt"
prompt.BackgroundTransparency = 1 prompt.BackgroundTransparency = 1
prompt.TextColor3 = Color3.new(1,1,1) prompt.TextColor3 = Color3.new(1, 1, 1)
prompt.FontSize = Enum.FontSize.Size14 prompt.FontSize = Enum.FontSize.Size14
prompt.Position = UDim2.new(0,28, 0, 2) prompt.Position = UDim2.new(0, 28, 0, 2)
prompt.Size = UDim2.new(1,-32, 1, -4) prompt.Size = UDim2.new(1, -32, 1, -4)
prompt.TextXAlignment = Enum.TextXAlignment.Left prompt.TextXAlignment = Enum.TextXAlignment.Left
prompt.TextYAlignment = Enum.TextYAlignment.Top prompt.TextYAlignment = Enum.TextYAlignment.Top
prompt.TextWrap = true prompt.TextWrap = true
@ -303,25 +313,25 @@ function newChoice(numberText)
return frame return frame
end end
function initialize(parent) function initialize(parent)
choices[1] = newChoice("1)") choices[1] = newChoice "1)"
choices[2] = newChoice("2)") choices[2] = newChoice "2)"
choices[3] = newChoice("3)") choices[3] = newChoice "3)"
choices[4] = newChoice("4)") choices[4] = newChoice "4)"
lastChoice = newChoice("5)") lastChoice = newChoice "5)"
lastChoice.UserPrompt.Text = "Goodbye!" lastChoice.UserPrompt.Text = "Goodbye!"
lastChoice.Size = UDim2.new(1,0,0,28) lastChoice.Size = UDim2.new(1, 0, 0, 28)
mainFrame = Instance.new("Frame") mainFrame = Instance.new "Frame"
mainFrame.Name = "UserDialogArea" mainFrame.Name = "UserDialogArea"
mainFrame.Size = UDim2.new(0, 350, 0, 200) mainFrame.Size = UDim2.new(0, 350, 0, 200)
mainFrame.Style = Enum.FrameStyle.ChatBlue mainFrame.Style = Enum.FrameStyle.ChatBlue
mainFrame.Visible = false mainFrame.Visible = false
imageLabel = Instance.new("ImageLabel") imageLabel = Instance.new "ImageLabel"
imageLabel.Name = "Tail" imageLabel.Name = "Tail"
imageLabel.Size = UDim2.new(0,62,0,53) imageLabel.Size = UDim2.new(0, 62, 0, 53)
imageLabel.Position = UDim2.new(1,8,0.25) imageLabel.Position = UDim2.new(1, 8, 0.25)
imageLabel.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" imageLabel.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png"
imageLabel.BackgroundTransparency = 1 imageLabel.BackgroundTransparency = 1
imageLabel.RobloxLocked = true imageLabel.RobloxLocked = true
@ -346,11 +356,13 @@ function presentDialogChoices(talkingPart, dialogChoices)
currentConversationPartner = talkingPart currentConversationPartner = talkingPart
sortedDialogChoices = {} sortedDialogChoices = {}
for n, obj in pairs(dialogChoices) do for n, obj in pairs(dialogChoices) do
if obj:IsA("DialogChoice") then if obj:IsA "DialogChoice" then
table.insert(sortedDialogChoices, obj) table.insert(sortedDialogChoices, obj)
end end
end end
table.sort(sortedDialogChoices, function(a,b) return a.Name < b.Name end) table.sort(sortedDialogChoices, function(a, b)
return a.Name < b.Name
end)
if #sortedDialogChoices == 0 then if #sortedDialogChoices == 0 then
normalEndDialog() normalEndDialog()
@ -367,9 +379,9 @@ function presentDialogChoices(talkingPart, dialogChoices)
for n, obj in pairs(sortedDialogChoices) do for n, obj in pairs(sortedDialogChoices) do
if pos <= #choices then if pos <= #choices then
--3 lines is the maximum, set it to that temporarily --3 lines is the maximum, set it to that temporarily
choices[pos].Size = UDim2.new(1, 0, 0, 24*3) choices[pos].Size = UDim2.new(1, 0, 0, 24 * 3)
choices[pos].UserPrompt.Text = obj.UserDialog choices[pos].UserPrompt.Text = obj.UserDialog
local height = math.ceil(choices[pos].UserPrompt.TextBounds.Y/24)*24 local height = math.ceil(choices[pos].UserPrompt.TextBounds.Y / 24) * 24
choices[pos].Position = UDim2.new(0, 0, 0, yPosition) choices[pos].Position = UDim2.new(0, 0, 0, yPosition)
choices[pos].Size = UDim2.new(1, 0, 0, height) choices[pos].Size = UDim2.new(1, 0, 0, height)
@ -382,11 +394,11 @@ function presentDialogChoices(talkingPart, dialogChoices)
end end
end end
lastChoice.Position = UDim2.new(0,0,0,yPosition) lastChoice.Position = UDim2.new(0, 0, 0, yPosition)
lastChoice.Number.Text = pos .. ")" lastChoice.Number.Text = pos .. ")"
mainFrame.Size = UDim2.new(0, 350, 0, yPosition+24+32) mainFrame.Size = UDim2.new(0, 350, 0, yPosition + 24 + 32)
mainFrame.Position = UDim2.new(0,20,0.0, -mainFrame.Size.Y.Offset-20) mainFrame.Position = UDim2.new(0, 20, 0, -mainFrame.Size.Y.Offset - 20)
styleMainFrame(currentTone()) styleMainFrame(currentTone())
mainFrame.Visible = true mainFrame.Visible = true
end end
@ -425,7 +437,13 @@ end
function checkForLeaveArea() function checkForLeaveArea()
while currentConversationDialog do while currentConversationDialog do
if currentConversationDialog.Parent and (player:DistanceFromCharacter(currentConversationDialog.Parent.Position) >= currentConversationDialog.ConversationDistance) then if
currentConversationDialog.Parent
and (
player:DistanceFromCharacter(currentConversationDialog.Parent.Position)
>= currentConversationDialog.ConversationDistance
)
then
wanderDialog() wanderDialog()
end end
wait(1) wait(1)
@ -433,7 +451,7 @@ function checkForLeaveArea()
end end
function startDialog(dialog) function startDialog(dialog)
if dialog.Parent and dialog.Parent:IsA("BasePart") then if dialog.Parent and dialog.Parent:IsA "BasePart" then
if player:DistanceFromCharacter(dialog.Parent.Position) >= dialog.ConversationDistance then if player:DistanceFromCharacter(dialog.Parent.Position) >= dialog.ConversationDistance then
showMessage(tooFarAwayMessage, tooFarAwaySize) showMessage(tooFarAwayMessage, tooFarAwaySize)
return return
@ -465,13 +483,15 @@ end
function addDialog(dialog) function addDialog(dialog)
if dialog.Parent then if dialog.Parent then
if dialog.Parent:IsA("BasePart") then if dialog.Parent:IsA "BasePart" then
local chatGui = chatNotificationGui:clone() local chatGui = chatNotificationGui:clone()
chatGui.Enabled = not dialog.InUse chatGui.Enabled = not dialog.InUse
chatGui.Adornee = dialog.Parent chatGui.Adornee = dialog.Parent
chatGui.RobloxLocked = true chatGui.RobloxLocked = true
chatGui.Parent = game.CoreGui chatGui.Parent = game.CoreGui
chatGui.Image.Button.MouseButton1Click:connect(function() startDialog(dialog) end) chatGui.Image.Button.MouseButton1Click:connect(function()
startDialog(dialog)
end)
setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone)
dialogMap[dialog] = chatGui dialogMap[dialog] = chatGui
@ -512,9 +532,9 @@ function fetchScripts()
return return
end end
waitForChild(model,"TimeoutScript") waitForChild(model, "TimeoutScript")
timeoutScript = model.TimeoutScript timeoutScript = model.TimeoutScript
waitForChild(model,"ReenableDialogScript") waitForChild(model, "ReenableDialogScript")
reenableDialogScript = model.ReenableDialogScript reenableDialogScript = model.ReenableDialogScript
end end
@ -538,20 +558,28 @@ function onLoad()
waitForChild(gui, "BottomLeftControl") waitForChild(gui, "BottomLeftControl")
--print("Initializing Frame") --print("Initializing Frame")
local frame = Instance.new("Frame") local frame = Instance.new "Frame"
frame.Name = "DialogFrame" frame.Name = "DialogFrame"
frame.Position = UDim2.new(0,0,0,0) frame.Position = UDim2.new(0, 0, 0, 0)
frame.Size = UDim2.new(0,0,0,0) frame.Size = UDim2.new(0, 0, 0, 0)
frame.BackgroundTransparency = 1 frame.BackgroundTransparency = 1
frame.RobloxLocked = true frame.RobloxLocked = true
frame.Parent = gui.BottomLeftControl frame.Parent = gui.BottomLeftControl
initialize(frame) initialize(frame)
--print("Adding Dialogs") --print("Adding Dialogs")
game.CollectionService.ItemAdded:connect(function(obj) if obj:IsA("Dialog") then addDialog(obj) end end) game.CollectionService.ItemAdded:connect(function(obj)
game.CollectionService.ItemRemoved:connect(function(obj) if obj:IsA("Dialog") then removeDialog(obj) end end) if obj:IsA "Dialog" then
for i, obj in pairs(game.CollectionService:GetCollection("Dialog")) do addDialog(obj)
if obj:IsA("Dialog") then end
end)
game.CollectionService.ItemRemoved:connect(function(obj)
if obj:IsA "Dialog" then
removeDialog(obj)
end
end)
for _, obj in pairs(game.CollectionService:GetCollection "Dialog") do
if obj:IsA "Dialog" then
addDialog(obj) addDialog(obj)
end end
end end

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +1,20 @@
local t = {} local t = {}
t.Foo = t.Foo = function()
function() print "foo"
print("foo") end
end
t.Bar = t.Bar = function()
function() print "bar"
print("bar") end
end
t.Help = t.Help = function(funcNameOrFunc)
function(funcNameOrFunc)
--input argument can be a string or a function. Should return a description (of arguments and expected side effects) --input argument can be a string or a function. Should return a description (of arguments and expected side effects)
if funcNameOrFunc == "Foo" or funcNameOrFunc == t.Foo then if funcNameOrFunc == "Foo" or funcNameOrFunc == t.Foo then
return "Function Foo. Arguments: None. Side effect: prints foo" return "Function Foo. Arguments: None. Side effect: prints foo"
elseif funcNameOrFunc == "Bar" or funcNameOrFunc == t.Bar then elseif funcNameOrFunc == "Bar" or funcNameOrFunc == t.Bar then
return "Function Bar. Arguments: None. Side effect: prints bar" return "Function Bar. Arguments: None. Side effect: prints bar"
end end
end end
return t return t

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -9,101 +9,134 @@ function waitForChild(instance, name)
end end
end end
waitForProperty(game.Players,"LocalPlayer") waitForProperty(game.Players, "LocalPlayer")
waitForChild(script.Parent,"Popup") waitForChild(script.Parent, "Popup")
waitForChild(script.Parent.Popup,"AcceptButton") waitForChild(script.Parent.Popup, "AcceptButton")
script.Parent.Popup.AcceptButton.Modal = true script.Parent.Popup.AcceptButton.Modal = true
local localPlayer = game.Players.LocalPlayer local localPlayer = game.Players.LocalPlayer
local teleportUI = nil local teleportUI = nil
local acceptedTeleport = Instance.new("IntValue")
local friendRequestBlacklist = {} local friendRequestBlacklist = {}
local teleportEnabled = true local teleportEnabled = true
local makePopupInvisible = function() local makePopupInvisible = function()
if script.Parent.Popup then script.Parent.Popup.Visible = false end if script.Parent.Popup then
script.Parent.Popup.Visible = false
end
end end
function makeFriend(fromPlayer,toPlayer) function makeFriend(fromPlayer, toPlayer)
local popup = script.Parent:FindFirstChild "Popup"
local popup = script.Parent:FindFirstChild("Popup") if popup == nil then
if popup == nil then return end -- there is no popup! return
if popup.Visible then return end -- currently popping something, abort! end -- there is no popup!
if friendRequestBlacklist[fromPlayer] then return end -- previously cancelled friend request, we don't want it! if popup.Visible then
return
end -- currently popping something, abort!
if friendRequestBlacklist[fromPlayer] then
return
end -- previously cancelled friend request, we don't want it!
popup.PopupText.Text = "Accept Friend Request from " .. tostring(fromPlayer.Name) .. "?" popup.PopupText.Text = "Accept Friend Request from " .. tostring(fromPlayer.Name) .. "?"
popup.PopupImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?userId="..tostring(fromPlayer.userId).."&x=352&y=352" popup.PopupImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?userId="
.. tostring(fromPlayer.userId)
.. "&x=352&y=352"
showTwoButtons() showTwoButtons()
popup.Visible = true popup.Visible = true
popup.AcceptButton.Text = "Accept" popup.AcceptButton.Text = "Accept"
popup.DeclineButton.Text = "Decline" popup.DeclineButton.Text = "Decline"
popup:TweenSize(UDim2.new(0,330,0,350),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true) popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true)
local yesCon, noCon local yesCon, noCon
yesCon = popup.AcceptButton.MouseButton1Click:connect(function() yesCon = popup.AcceptButton.MouseButton1Click:connect(function()
popup.Visible = false popup.Visible = false
toPlayer:RequestFriendship(fromPlayer) toPlayer:RequestFriendship(fromPlayer)
if yesCon then yesCon:disconnect() end if yesCon then
if noCon then noCon:disconnect() end yesCon:disconnect()
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) end
if noCon then
noCon:disconnect()
end
popup:TweenSize(
UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end) end)
noCon = popup.DeclineButton.MouseButton1Click:connect(function() noCon = popup.DeclineButton.MouseButton1Click:connect(function()
popup.Visible = false popup.Visible = false
toPlayer:RevokeFriendship(fromPlayer) toPlayer:RevokeFriendship(fromPlayer)
friendRequestBlacklist[fromPlayer] = true friendRequestBlacklist[fromPlayer] = true
print("pop up blacklist") print "pop up blacklist"
if yesCon then yesCon:disconnect() end if yesCon then
if noCon then noCon:disconnect() end yesCon:disconnect()
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) end
if noCon then
noCon:disconnect()
end
popup:TweenSize(
UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end) end)
end end
game.Players.FriendRequestEvent:connect(function(fromPlayer, toPlayer, event)
game.Players.FriendRequestEvent:connect(function(fromPlayer,toPlayer,event)
-- if this doesn't involve me, then do nothing -- if this doesn't involve me, then do nothing
if fromPlayer ~= localPlayer and toPlayer ~= localPlayer then return end if fromPlayer ~= localPlayer and toPlayer ~= localPlayer then
return
end
if fromPlayer == localPlayer then if fromPlayer == localPlayer then
if event == Enum.FriendRequestEvent.Accept then if event == Enum.FriendRequestEvent.Accept then
game:GetService("GuiService"):SendNotification("You are Friends", game:GetService("GuiService"):SendNotification(
"You are Friends",
"With " .. toPlayer.Name .. "!", "With " .. toPlayer.Name .. "!",
"http://www.roblox.com/thumbs/avatar.ashx?userId="..tostring(toPlayer.userId).."&x=48&y=48", "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(toPlayer.userId) .. "&x=48&y=48",
5, 5,
function() function() end
)
end)
end end
elseif toPlayer == localPlayer then elseif toPlayer == localPlayer then
if event == Enum.FriendRequestEvent.Issue then if event == Enum.FriendRequestEvent.Issue then
if friendRequestBlacklist[fromPlayer] then return end -- previously cancelled friend request, we don't want it! if friendRequestBlacklist[fromPlayer] then
game:GetService("GuiService"):SendNotification("Friend Request", return
end -- previously cancelled friend request, we don't want it!
game:GetService("GuiService"):SendNotification(
"Friend Request",
"From " .. fromPlayer.Name, "From " .. fromPlayer.Name,
"http://www.roblox.com/thumbs/avatar.ashx?userId="..tostring(fromPlayer.userId).."&x=48&y=48", "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48",
8, 8,
function() function()
makeFriend(fromPlayer,toPlayer) makeFriend(fromPlayer, toPlayer)
end) end
)
elseif event == Enum.FriendRequestEvent.Accept then elseif event == Enum.FriendRequestEvent.Accept then
game:GetService("GuiService"):SendNotification("You are Friends", game:GetService("GuiService"):SendNotification(
"You are Friends",
"With " .. fromPlayer.Name .. "!", "With " .. fromPlayer.Name .. "!",
"http://www.roblox.com/thumbs/avatar.ashx?userId="..tostring(fromPlayer.userId).."&x=48&y=48", "http://www.roblox.com/thumbs/avatar.ashx?userId=" .. tostring(fromPlayer.userId) .. "&x=48&y=48",
5, 5,
function() function() end
)
end)
end end
end end
end) end)
function showOneButton() function showOneButton()
local popup = script.Parent:FindFirstChild("Popup") local popup = script.Parent:FindFirstChild "Popup"
if popup then if popup then
popup.OKButton.Visible = true popup.OKButton.Visible = true
popup.DeclineButton.Visible = false popup.DeclineButton.Visible = false
@ -112,7 +145,7 @@ function showOneButton()
end end
function showTwoButtons() function showTwoButtons()
local popup = script.Parent:FindFirstChild("Popup") local popup = script.Parent:FindFirstChild "Popup"
if popup then if popup then
popup.OKButton.Visible = false popup.OKButton.Visible = false
popup.DeclineButton.Visible = true popup.DeclineButton.Visible = true
@ -120,7 +153,7 @@ function showTwoButtons()
end end
end end
function onTeleport(teleportState, placeId, spawnName) function onTeleport(teleportState, _, _)
if game:GetService("TeleportService").CustomizedTeleportUI == false then if game:GetService("TeleportService").CustomizedTeleportUI == false then
if teleportState == Enum.TeleportState.Started then if teleportState == Enum.TeleportState.Started then
showTeleportUI("Teleport started...", 0) showTeleportUI("Teleport started...", 0)
@ -139,8 +172,9 @@ function showTeleportUI(message, timer)
teleportUI:Remove() teleportUI:Remove()
end end
waitForChild(localPlayer, "PlayerGui") waitForChild(localPlayer, "PlayerGui")
teleportUI = Instance.new("Message", localPlayer.PlayerGui) teleportUI = Instance.new "Message"
teleportUI.Text = message teleportUI.Text = message
teleportUI.Parent = localPlayer.PlayerGui
if timer > 0 then if timer > 0 then
wait(timer) wait(timer)
teleportUI:Remove() teleportUI:Remove()
@ -148,100 +182,173 @@ function showTeleportUI(message, timer)
end end
if teleportEnabled then if teleportEnabled then
localPlayer.OnTeleport:connect(onTeleport) localPlayer.OnTeleport:connect(onTeleport)
game:GetService("TeleportService").ErrorCallback = function(message) game:GetService("TeleportService").ErrorCallback = function(message)
local popup = script.Parent:FindFirstChild("Popup") local popup = script.Parent:FindFirstChild "Popup"
showOneButton() showOneButton()
popup.PopupText.Text = message popup.PopupText.Text = message
local clickCon local clickCon
clickCon = popup.OKButton.MouseButton1Click:connect(function() clickCon = popup.OKButton.MouseButton1Click:connect(function()
game:GetService("TeleportService"):TeleportCancel() game:GetService("TeleportService"):TeleportCancel()
if clickCon then clickCon:disconnect() end if clickCon then
game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild("Popup")) clickCon:disconnect()
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) end
game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup")
popup:TweenSize(
UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end) end)
game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup"), Enum.CenterDialogType.QuitDialog, game.GuiService:AddCenterDialog(
script.Parent:FindFirstChild "Popup",
Enum.CenterDialogType.QuitDialog,
--ShowFunction --ShowFunction
function() function()
showOneButton() showOneButton()
script.Parent:FindFirstChild("Popup").Visible = true script.Parent:FindFirstChild("Popup").Visible = true
popup:TweenSize(UDim2.new(0,330,0,350),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true) popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true)
end, end,
--HideFunction --HideFunction
function() function()
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) popup:TweenSize(
end) UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end
)
end end
game:GetService("TeleportService").ConfirmationCallback = function(message, placeId, spawnName) game:GetService("TeleportService").ConfirmationCallback = function(message, placeId, spawnName)
local popup = script.Parent:FindFirstChild("Popup") local popup = script.Parent:FindFirstChild "Popup"
popup.PopupText.Text = message popup.PopupText.Text = message
popup.PopupImage.Image = "" popup.PopupImage.Image = ""
local yesCon, noCon local yesCon, noCon
local function killCons() local function killCons()
if yesCon then yesCon:disconnect() end if yesCon then
if noCon then noCon:disconnect() end yesCon:disconnect()
game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild("Popup")) end
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) if noCon then
noCon:disconnect()
end
game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup")
popup:TweenSize(
UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end end
yesCon = popup.AcceptButton.MouseButton1Click:connect(function() yesCon = popup.AcceptButton.MouseButton1Click:connect(function()
killCons() killCons()
local success, err = pcall(function() game:GetService("TeleportService"):TeleportImpl(placeId,spawnName) end) local success, err = pcall(function()
game:GetService("TeleportService"):TeleportImpl(placeId, spawnName)
end)
if not success then if not success then
showOneButton() showOneButton()
popup.PopupText.Text = err popup.PopupText.Text = err
local clickCon local clickCon
clickCon = popup.OKButton.MouseButton1Click:connect(function() clickCon = popup.OKButton.MouseButton1Click:connect(function()
if clickCon then clickCon:disconnect() end if clickCon then
game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild("Popup")) clickCon:disconnect()
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) end
game.GuiService:RemoveCenterDialog(script.Parent:FindFirstChild "Popup")
popup:TweenSize(
UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end) end)
game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup"), Enum.CenterDialogType.QuitDialog, game.GuiService:AddCenterDialog(
script.Parent:FindFirstChild "Popup",
Enum.CenterDialogType.QuitDialog,
--ShowFunction --ShowFunction
function() function()
showOneButton() showOneButton()
script.Parent:FindFirstChild("Popup").Visible = true script.Parent:FindFirstChild("Popup").Visible = true
popup:TweenSize(UDim2.new(0,330,0,350),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true) popup:TweenSize(
UDim2.new(0, 330, 0, 350),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true
)
end, end,
--HideFunction --HideFunction
function() function()
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) popup:TweenSize(
end) UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end
)
end end
end) end)
noCon = popup.DeclineButton.MouseButton1Click:connect(function() noCon = popup.DeclineButton.MouseButton1Click:connect(function()
killCons() killCons()
local success = pcall(function() game:GetService("TeleportService"):TeleportCancel() end) pcall(function()
game:GetService("TeleportService"):TeleportCancel()
end)
end) end)
local centerDialogSuccess = pcall(function() game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup"), Enum.CenterDialogType.QuitDialog, local centerDialogSuccess = pcall(function()
game.GuiService:AddCenterDialog(
script.Parent:FindFirstChild "Popup",
Enum.CenterDialogType.QuitDialog,
--ShowFunction --ShowFunction
function() function()
showTwoButtons() showTwoButtons()
popup.AcceptButton.Text = "Leave" popup.AcceptButton.Text = "Leave"
popup.DeclineButton.Text = "Stay" popup.DeclineButton.Text = "Stay"
script.Parent:FindFirstChild("Popup").Visible = true script.Parent:FindFirstChild("Popup").Visible = true
popup:TweenSize(UDim2.new(0,330,0,350),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true) popup:TweenSize(
UDim2.new(0, 330, 0, 350),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true
)
end, end,
--HideFunction --HideFunction
function() function()
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible()) popup:TweenSize(
end) UDim2.new(0, 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quart,
1,
true,
makePopupInvisible()
)
end
)
end) end)
if centerDialogSuccess == false then if centerDialogSuccess == false then
script.Parent:FindFirstChild("Popup").Visible = true script.Parent:FindFirstChild("Popup").Visible = true
popup.AcceptButton.Text = "Leave" popup.AcceptButton.Text = "Leave"
popup.DeclineButton.Text = "Stay" popup.DeclineButton.Text = "Stay"
popup:TweenSize(UDim2.new(0,330,0,350),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true) popup:TweenSize(UDim2.new(0, 330, 0, 350), Enum.EasingDirection.Out, Enum.EasingStyle.Quart, 1, true)
end end
return true return true
end end
end end

View File

@ -1,8 +1,8 @@
--build our gui --build our gui
local popupFrame = Instance.new("Frame") local popupFrame = Instance.new "Frame"
popupFrame.Position = UDim2.new(0.5,-165,0.5,-175) popupFrame.Position = UDim2.new(0.5, -165, 0.5, -175)
popupFrame.Size = UDim2.new(0,330,0,350) popupFrame.Size = UDim2.new(0, 330, 0, 350)
popupFrame.Style = Enum.FrameStyle.RobloxRound popupFrame.Style = Enum.FrameStyle.RobloxRound
popupFrame.ZIndex = 4 popupFrame.ZIndex = 4
popupFrame.Name = "Popup" popupFrame.Name = "Popup"
@ -10,26 +10,26 @@ popupFrame.Visible = false
popupFrame.Parent = script.Parent popupFrame.Parent = script.Parent
local darken = popupFrame:clone() local darken = popupFrame:clone()
darken.Size = UDim2.new(1,16,1,16) darken.Size = UDim2.new(1, 16, 1, 16)
darken.Position = UDim2.new(0,-8,0,-8) darken.Position = UDim2.new(0, -8, 0, -8)
darken.Name = "Darken" darken.Name = "Darken"
darken.ZIndex = 1 darken.ZIndex = 1
darken.Parent = popupFrame darken.Parent = popupFrame
local acceptButton = Instance.new("TextButton") local acceptButton = Instance.new "TextButton"
acceptButton.Position = UDim2.new(0,20,0,270) acceptButton.Position = UDim2.new(0, 20, 0, 270)
acceptButton.Size = UDim2.new(0,100,0,50) acceptButton.Size = UDim2.new(0, 100, 0, 50)
acceptButton.Font = Enum.Font.ArialBold acceptButton.Font = Enum.Font.ArialBold
acceptButton.FontSize = Enum.FontSize.Size24 acceptButton.FontSize = Enum.FontSize.Size24
acceptButton.Style = Enum.ButtonStyle.RobloxButton acceptButton.Style = Enum.ButtonStyle.RobloxButton
acceptButton.TextColor3 = Color3.new(248/255,248/255,248/255) acceptButton.TextColor3 = Color3.new(248 / 255, 248 / 255, 248 / 255)
acceptButton.Text = "Yes" acceptButton.Text = "Yes"
acceptButton.ZIndex = 5 acceptButton.ZIndex = 5
acceptButton.Name = "AcceptButton" acceptButton.Name = "AcceptButton"
acceptButton.Parent = popupFrame acceptButton.Parent = popupFrame
local declineButton = acceptButton:clone() local declineButton = acceptButton:clone()
declineButton.Position = UDim2.new(1,-120,0,270) declineButton.Position = UDim2.new(1, -120, 0, 270)
declineButton.Text = "No" declineButton.Text = "No"
declineButton.Name = "DeclineButton" declineButton.Name = "DeclineButton"
declineButton.Parent = popupFrame declineButton.Parent = popupFrame
@ -37,34 +37,34 @@ declineButton.Parent = popupFrame
local okButton = acceptButton:clone() local okButton = acceptButton:clone()
okButton.Name = "OKButton" okButton.Name = "OKButton"
okButton.Text = "OK" okButton.Text = "OK"
okButton.Position = UDim2.new(0.5,-50,0,270) okButton.Position = UDim2.new(0.5, -50, 0, 270)
okButton.Visible = false okButton.Visible = false
okButton.Parent = popupFrame okButton.Parent = popupFrame
local popupImage = Instance.new("ImageLabel") local popupImage = Instance.new "ImageLabel"
popupImage.BackgroundTransparency = 1 popupImage.BackgroundTransparency = 1
popupImage.Position = UDim2.new(0.5,-140,0,0) popupImage.Position = UDim2.new(0.5, -140, 0, 0)
popupImage.Size = UDim2.new(0,280,0,280) popupImage.Size = UDim2.new(0, 280, 0, 280)
popupImage.ZIndex = 3 popupImage.ZIndex = 3
popupImage.Name = "PopupImage" popupImage.Name = "PopupImage"
popupImage.Parent = popupFrame popupImage.Parent = popupFrame
local backing = Instance.new("ImageLabel") local backing = Instance.new "ImageLabel"
backing.BackgroundTransparency = 1 backing.BackgroundTransparency = 1
backing.Size = UDim2.new(1,0,1,0) backing.Size = UDim2.new(1, 0, 1, 0)
backing.Image = "http://www.roblox.com/asset/?id=47574181" backing.Image = "http://www.roblox.com/asset/?id=47574181"
backing.Name = "Backing" backing.Name = "Backing"
backing.ZIndex = 2 backing.ZIndex = 2
backing.Parent = popupImage backing.Parent = popupImage
local popupText = Instance.new("TextLabel") local popupText = Instance.new "TextLabel"
popupText.Name = "PopupText" popupText.Name = "PopupText"
popupText.Size = UDim2.new(1,0,0.8,0) popupText.Size = UDim2.new(1, 0, 0.8, 0)
popupText.Font = Enum.Font.ArialBold popupText.Font = Enum.Font.ArialBold
popupText.FontSize = Enum.FontSize.Size36 popupText.FontSize = Enum.FontSize.Size36
popupText.BackgroundTransparency = 1 popupText.BackgroundTransparency = 1
popupText.Text = "Hello I'm a popup" popupText.Text = "Hello I'm a popup"
popupText.TextColor3 = Color3.new(248/255,248/255,248/255) popupText.TextColor3 = Color3.new(248 / 255, 248 / 255, 248 / 255)
popupText.TextWrap = true popupText.TextWrap = true
popupText.ZIndex = 5 popupText.ZIndex = 5
popupText.Parent = popupFrame popupText.Parent = popupFrame

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@

View File

@ -1,7 +1,5 @@
local t = {} local t = {}
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
@ -10,29 +8,29 @@ local t = {}
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
--JSON Encoder and Parser for Lua 5.1 --JSON Encoder and Parser for Lua 5.1
-- --
--Copyright 2007 Shaun Brown (http://www.chipmunkav.com) --Copyright 2007 Shaun Brown (http://www.chipmunkav.com)
--All Rights Reserved. --All Rights Reserved.
--Permission is hereby granted, free of charge, to any person --Permission is hereby granted, free of charge, to any person
--obtaining a copy of this software to deal in the Software without --obtaining a copy of this software to deal in the Software without
--restriction, including without limitation the rights to use, --restriction, including without limitation the rights to use,
--copy, modify, merge, publish, distribute, sublicense, and/or --copy, modify, merge, publish, distribute, sublicense, and/or
--sell copies of the Software, and to permit persons to whom the --sell copies of the Software, and to permit persons to whom the
--Software is furnished to do so, subject to the following conditions: --Software is furnished to do so, subject to the following conditions:
--The above copyright notice and this permission notice shall be --The above copyright notice and this permission notice shall be
--included in all copies or substantial portions of the Software. --included in all copies or substantial portions of the Software.
--If you find this software useful please give www.chipmunkav.com a mention. --If you find this software useful please give www.chipmunkav.com a mention.
--THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, --THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
--EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES --EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
--OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
--IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR --IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
--ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF --ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
--CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN --CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
--CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
local string = string local string = string
local math = math local math = math
@ -47,9 +45,8 @@ local ipairs = ipairs
local assert = assert local assert = assert
local Chipmunk = Chipmunk local Chipmunk = Chipmunk
local StringBuilder = { local StringBuilder = {
buffer = {} buffer = {},
} }
function StringBuilder:New() function StringBuilder:New()
@ -61,7 +58,7 @@ function StringBuilder:New()
end end
function StringBuilder:Append(s) function StringBuilder:Append(s)
self.buffer[#self.buffer+1] = s self.buffer[#self.buffer + 1] = s
end end
function StringBuilder:ToString() function StringBuilder:ToString()
@ -70,15 +67,15 @@ end
local JsonWriter = { local JsonWriter = {
backslashes = { backslashes = {
['\b'] = "\\b", ["\b"] = "\\b",
['\t'] = "\\t", ["\t"] = "\\t",
['\n'] = "\\n", ["\n"] = "\\n",
['\f'] = "\\f", ["\f"] = "\\f",
['\r'] = "\\r", ["\r"] = "\\r",
['"'] = "\\\"", ['"'] = '\\"',
['\\'] = "\\\\", ["\\"] = "\\\\",
['/'] = "\\/" ["/"] = "\\/",
} },
} }
function JsonWriter:New() function JsonWriter:New()
@ -119,7 +116,7 @@ function JsonWriter:Write(o)
end end
function JsonWriter:WriteNil() function JsonWriter:WriteNil()
self:Append("null") self:Append "null"
end end
function JsonWriter:WriteString(o) function JsonWriter:WriteString(o)
@ -127,13 +124,15 @@ function JsonWriter:WriteString(o)
end end
function JsonWriter:ParseString(s) function JsonWriter:ParseString(s)
self:Append('"') self:Append '"'
self:Append(string.gsub(s, "[%z%c\\\"/]", function(n) self:Append(string.gsub(s, '[%z%c\\"/]', function(n)
local c = self.backslashes[n] local c = self.backslashes[n]
if c then return c end if c then
return c
end
return string.format("\\u%.4X", string.byte(n)) return string.format("\\u%.4X", string.byte(n))
end)) end))
self:Append('"') self:Append '"'
end end
function JsonWriter:IsArray(t) function JsonWriter:IsArray(t)
@ -146,14 +145,14 @@ function JsonWriter:IsArray(t)
end end
return false return false
end end
for k,v in pairs(t) do for k, v in pairs(t) do
if not isindex(k) then if not isindex(k) then
return false, '{', '}' return false, "{", "}"
else else
count = math.max(count, k) count = math.max(count, k)
end end
end end
return true, '[', ']', count return true, "[", "]", count
end end
function JsonWriter:WriteTable(t) function JsonWriter:WriteTable(t)
@ -163,18 +162,18 @@ function JsonWriter:WriteTable(t)
for i = 1, n do for i = 1, n do
self:Write(t[i]) self:Write(t[i])
if i < n then if i < n then
self:Append(',') self:Append ","
end end
end end
else else
local first = true; local first = true
for k, v in pairs(t) do for k, v in pairs(t) do
if not first then if not first then
self:Append(',') self:Append ","
end end
first = false; first = false
self:ParseString(k) self:ParseString(k)
self:Append(':') self:Append ":"
self:Write(v) self:Write(v)
end end
end end
@ -182,9 +181,7 @@ function JsonWriter:WriteTable(t)
end end
function JsonWriter:WriteError(o) function JsonWriter:WriteError(o)
error(string.format( error(string.format("Encoding of %s unsupported", tostring(o)))
"Encoding of %s unsupported",
tostring(o)))
end end
function JsonWriter:WriteFunction(o) function JsonWriter:WriteFunction(o)
@ -197,7 +194,7 @@ end
local StringReader = { local StringReader = {
s = "", s = "",
i = 0 i = 0,
} }
function StringReader:New(s) function StringReader:New(s)
@ -217,7 +214,7 @@ function StringReader:Peek()
end end
function StringReader:Next() function StringReader:Next()
self.i = self.i+1 self.i = self.i + 1
if self.i <= #self.s then if self.i <= #self.s then
return string.sub(self.s, self.i, self.i) return string.sub(self.s, self.i, self.i)
end end
@ -230,12 +227,12 @@ end
local JsonReader = { local JsonReader = {
escapes = { escapes = {
['t'] = '\t', ["t"] = "\t",
['n'] = '\n', ["n"] = "\n",
['f'] = '\f', ["f"] = "\f",
['r'] = '\r', ["r"] = "\r",
['b'] = '\b', ["b"] = "\b",
} },
} }
function JsonReader:New(s) function JsonReader:New(s)
@ -243,31 +240,29 @@ function JsonReader:New(s)
o.reader = StringReader:New(s) o.reader = StringReader:New(s)
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o; return o
end end
function JsonReader:Read() function JsonReader:Read()
self:SkipWhiteSpace() self:SkipWhiteSpace()
local peek = self:Peek() local peek = self:Peek()
if peek == nil then if peek == nil then
error(string.format( error(string.format("Nil string: '%s'", self:All()))
"Nil string: '%s'", elseif peek == "{" then
self:All()))
elseif peek == '{' then
return self:ReadObject() return self:ReadObject()
elseif peek == '[' then elseif peek == "[" then
return self:ReadArray() return self:ReadArray()
elseif peek == '"' then elseif peek == '"' then
return self:ReadString() return self:ReadString()
elseif string.find(peek, "[%+%-%d]") then elseif string.find(peek, "[%+%-%d]") then
return self:ReadNumber() return self:ReadNumber()
elseif peek == 't' then elseif peek == "t" then
return self:ReadTrue() return self:ReadTrue()
elseif peek == 'f' then elseif peek == "f" then
return self:ReadFalse() return self:ReadFalse()
elseif peek == 'n' then elseif peek == "n" then
return self:ReadNull() return self:ReadNull()
elseif peek == '/' then elseif peek == "/" then
self:ReadComment() self:ReadComment()
return self:Read() return self:Read()
else else
@ -276,27 +271,24 @@ function JsonReader:Read()
end end
function JsonReader:ReadTrue() function JsonReader:ReadTrue()
self:TestReservedWord{'t','r','u','e'} self:TestReservedWord { "t", "r", "u", "e" }
return true return true
end end
function JsonReader:ReadFalse() function JsonReader:ReadFalse()
self:TestReservedWord{'f','a','l','s','e'} self:TestReservedWord { "f", "a", "l", "s", "e" }
return false return false
end end
function JsonReader:ReadNull() function JsonReader:ReadNull()
self:TestReservedWord{'n','u','l','l'} self:TestReservedWord { "n", "u", "l", "l" }
return nil return nil
end end
function JsonReader:TestReservedWord(t) function JsonReader:TestReservedWord(t)
for i, v in ipairs(t) do for i, v in ipairs(t) do
if self:Next() ~= v then if self:Next() ~= v then
error(string.format( error(string.format("Error reading '%s': %s", table.concat(t), self:All()))
"Error reading '%s': %s",
table.concat(t),
self:All()))
end end
end end
end end
@ -304,17 +296,13 @@ end
function JsonReader:ReadNumber() function JsonReader:ReadNumber()
local result = self:Next() local result = self:Next()
local peek = self:Peek() local peek = self:Peek()
while peek ~= nil and string.find( while peek ~= nil and string.find(peek, "[%+%-%d%.eE]") do
peek,
"[%+%-%d%.eE]") do
result = result .. self:Next() result = result .. self:Next()
peek = self:Peek() peek = self:Peek()
end end
result = tonumber(result) result = tonumber(result)
if result == nil then if result == nil then
error(string.format( error(string.format("Invalid number: '%s'", result))
"Invalid number: '%s'",
result))
else else
return result return result
end end
@ -325,7 +313,7 @@ function JsonReader:ReadString()
assert(self:Next() == '"') assert(self:Next() == '"')
while self:Peek() ~= '"' do while self:Peek() ~= '"' do
local ch = self:Next() local ch = self:Next()
if ch == '\\' then if ch == "\\" then
ch = self:Next() ch = self:Next()
if self.escapes[ch] then if self.escapes[ch] then
ch = self.escapes[ch] ch = self.escapes[ch]
@ -337,23 +325,18 @@ function JsonReader:ReadString()
local fromunicode = function(m) local fromunicode = function(m)
return string.char(tonumber(m, 16)) return string.char(tonumber(m, 16))
end end
return string.gsub( return string.gsub(result, "u%x%x(%x%x)", fromunicode)
result,
"u%x%x(%x%x)",
fromunicode)
end end
function JsonReader:ReadComment() function JsonReader:ReadComment()
assert(self:Next() == '/') assert(self:Next() == "/")
local second = self:Next() local second = self:Next()
if second == '/' then if second == "/" then
self:ReadSingleLineComment() self:ReadSingleLineComment()
elseif second == '*' then elseif second == "*" then
self:ReadBlockComment() self:ReadBlockComment()
else else
error(string.format( error(string.format("Invalid comment: %s", self:All()))
"Invalid comment: %s",
self:All()))
end end
end end
@ -361,15 +344,11 @@ function JsonReader:ReadBlockComment()
local done = false local done = false
while not done do while not done do
local ch = self:Next() local ch = self:Next()
if ch == '*' and self:Peek() == '/' then if ch == "*" and self:Peek() == "/" then
done = true done = true
end end
if not done and if not done and ch == "/" and self:Peek() == "*" then
ch == '/' and error(string.format("Invalid comment: %s, '/*' illegal.", self:All()))
self:Peek() == "*" then
error(string.format(
"Invalid comment: %s, '/*' illegal.",
self:All()))
end end
end end
self:Next() self:Next()
@ -377,74 +356,64 @@ end
function JsonReader:ReadSingleLineComment() function JsonReader:ReadSingleLineComment()
local ch = self:Next() local ch = self:Next()
while ch ~= '\r' and ch ~= '\n' do while ch ~= "\r" and ch ~= "\n" do
ch = self:Next() ch = self:Next()
end end
end end
function JsonReader:ReadArray() function JsonReader:ReadArray()
local result = {} local result = {}
assert(self:Next() == '[') assert(self:Next() == "[")
local done = false local done = false
if self:Peek() == ']' then if self:Peek() == "]" then
done = true; done = true
end end
while not done do while not done do
local item = self:Read() local item = self:Read()
result[#result+1] = item result[#result + 1] = item
self:SkipWhiteSpace() self:SkipWhiteSpace()
if self:Peek() == ']' then if self:Peek() == "]" then
done = true done = true
end end
if not done then if not done then
local ch = self:Next() local ch = self:Next()
if ch ~= ',' then if ch ~= "," then
error(string.format( error(string.format("Invalid array: '%s' due to: '%s'", self:All(), ch))
"Invalid array: '%s' due to: '%s'",
self:All(), ch))
end end
end end
end end
assert(']' == self:Next()) assert("]" == self:Next())
return result return result
end end
function JsonReader:ReadObject() function JsonReader:ReadObject()
local result = {} local result = {}
assert(self:Next() == '{') assert(self:Next() == "{")
local done = false local done = false
if self:Peek() == '}' then if self:Peek() == "}" then
done = true done = true
end end
while not done do while not done do
local key = self:Read() local key = self:Read()
if type(key) ~= "string" then if type(key) ~= "string" then
error(string.format( error(string.format("Invalid non-string object key: %s", key))
"Invalid non-string object key: %s",
key))
end end
self:SkipWhiteSpace() self:SkipWhiteSpace()
local ch = self:Next() local ch = self:Next()
if ch ~= ':' then if ch ~= ":" then
error(string.format( error(string.format("Invalid object: '%s' due to: '%s'", self:All(), ch))
"Invalid object: '%s' due to: '%s'",
self:All(),
ch))
end end
self:SkipWhiteSpace() self:SkipWhiteSpace()
local val = self:Read() local val = self:Read()
result[key] = val result[key] = val
self:SkipWhiteSpace() self:SkipWhiteSpace()
if self:Peek() == '}' then if self:Peek() == "}" then
done = true done = true
end end
if not done then if not done then
ch = self:Next() ch = self:Next()
if ch ~= ',' then if ch ~= "," then
error(string.format( error(string.format("Invalid array: '%s' near: '%s'", self:All(), ch))
"Invalid array: '%s' near: '%s'",
self:All(),
ch))
end end
end end
end end
@ -455,7 +424,7 @@ end
function JsonReader:SkipWhiteSpace() function JsonReader:SkipWhiteSpace()
local p = self:Peek() local p = self:Peek()
while p ~= nil and string.find(p, "[%s/]") do while p ~= nil and string.find(p, "[%s/]") do
if p == '/' then if p == "/" then
self:ReadComment() self:ReadComment()
else else
self:Next() self:Next()
@ -492,12 +461,11 @@ function Null()
end end
-------------------- End JSON Parser ------------------------ -------------------- End JSON Parser ------------------------
t.DecodeJSON = function(jsonString) t.DecodeJSON = function(jsonString)
if type(jsonString) == "string" then if type(jsonString) == "string" then
return Decode(jsonString) return Decode(jsonString)
end end
print("RbxUtil.DecodeJSON expects string argument!") print "RbxUtil.DecodeJSON expects string argument!"
return nil return nil
end end
@ -505,13 +473,6 @@ t.EncodeJSON = function(jsonTable)
return Encode(jsonTable) return Encode(jsonTable)
end end
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
@ -523,21 +484,23 @@ end
--sets cell x, y, z to default material if parameter is provided, if not sets cell x, y, z to be whatever material it previously w --sets cell x, y, z to default material if parameter is provided, if not sets cell x, y, z to be whatever material it previously w
--returns true if made a wedge, false if the cell remains a block --returns true if made a wedge, false if the cell remains a block
t.MakeWedge = function(x, y, z, defaultmaterial) t.MakeWedge = function(x, y, z, defaultmaterial)
return game:GetService("Terrain"):AutoWedgeCell(x,y,z) return game:GetService("Terrain"):AutoWedgeCell(x, y, z)
end end
t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, selectionParent) t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, selectionParent)
local terrain = game.Workspace:FindFirstChild("Terrain") local terrain = game.Workspace:FindFirstChild "Terrain"
if not terrain then return end if not terrain then
return
end
assert(regionToSelect) assert(regionToSelect)
assert(color) assert(color)
if not type(regionToSelect) == "Region3" then if not type(regionToSelect) == "Region3" then
error("regionToSelect (first arg), should be of type Region3, but is type",type(regionToSelect)) error("regionToSelect (first arg), should be of type Region3, but is type", type(regionToSelect))
end end
if not type(color) == "BrickColor" then if not type(color) == "BrickColor" then
error("color (second arg), should be of type BrickColor, but is type",type(color)) error("color (second arg), should be of type BrickColor, but is type", type(color))
end end
-- frequently used terrain calls (speeds up call, no lookup necessary) -- frequently used terrain calls (speeds up call, no lookup necessary)
@ -547,7 +510,7 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
local emptyMaterial = Enum.CellMaterial.Empty local emptyMaterial = Enum.CellMaterial.Empty
-- container for all adornments, passed back to user -- container for all adornments, passed back to user
local selectionContainer = Instance.new("Model") local selectionContainer = Instance.new "Model"
selectionContainer.Name = "SelectionContainer" selectionContainer.Name = "SelectionContainer"
selectionContainer.Archivable = false selectionContainer.Archivable = false
if selectionParent then if selectionParent then
@ -563,29 +526,29 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
local adornments = {} -- contains all adornments local adornments = {} -- contains all adornments
local reusableAdorns = {} local reusableAdorns = {}
local selectionPart = Instance.new("Part") local selectionPart = Instance.new "Part"
selectionPart.Name = "SelectionPart" selectionPart.Name = "SelectionPart"
selectionPart.Transparency = 1 selectionPart.Transparency = 1
selectionPart.Anchored = true selectionPart.Anchored = true
selectionPart.Locked = true selectionPart.Locked = true
selectionPart.CanCollide = false selectionPart.CanCollide = false
selectionPart.FormFactor = Enum.FormFactor.Custom selectionPart.FormFactor = Enum.FormFactor.Custom
selectionPart.Size = Vector3.new(4.2,4.2,4.2) selectionPart.Size = Vector3.new(4.2, 4.2, 4.2)
local selectionBox = Instance.new("SelectionBox") local selectionBox = Instance.new "SelectionBox"
-- srs translation from region3 to region3int16 -- srs translation from region3 to region3int16
function Region3ToRegion3int16(region3) function Region3ToRegion3int16(region3)
local theLowVec = region3.CFrame.p - (region3.Size/2) + Vector3.new(2,2,2) local theLowVec = region3.CFrame.p - (region3.Size / 2) + Vector3.new(2, 2, 2)
local lowCell = WorldToCellPreferSolid(terrain,theLowVec) local lowCell = WorldToCellPreferSolid(terrain, theLowVec)
local theHighVec = region3.CFrame.p + (region3.Size/2) - Vector3.new(2,2,2) local theHighVec = region3.CFrame.p + (region3.Size / 2) - Vector3.new(2, 2, 2)
local highCell = WorldToCellPreferSolid(terrain, theHighVec) local highCell = WorldToCellPreferSolid(terrain, theHighVec)
local highIntVec = Vector3int16.new(highCell.x,highCell.y,highCell.z) local highIntVec = Vector3int16.new(highCell.x, highCell.y, highCell.z)
local lowIntVec = Vector3int16.new(lowCell.x,lowCell.y,lowCell.z) local lowIntVec = Vector3int16.new(lowCell.x, lowCell.y, lowCell.z)
return Region3int16.new(lowIntVec,highIntVec) return Region3int16.new(lowIntVec, highIntVec)
end end
-- helper function that creates the basis for a selection box -- helper function that creates the basis for a selection box
@ -596,7 +559,7 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
if #reusableAdorns > 0 then if #reusableAdorns > 0 then
selectionPartClone = reusableAdorns[1]["part"] selectionPartClone = reusableAdorns[1]["part"]
selectionBoxClone = reusableAdorns[1]["box"] selectionBoxClone = reusableAdorns[1]["box"]
table.remove(reusableAdorns,1) table.remove(reusableAdorns, 1)
selectionBoxClone.Visible = true selectionBoxClone.Visible = true
else else
@ -624,10 +587,9 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
-- iterates through all current adornments and deletes any that don't have latest tag -- iterates through all current adornments and deletes any that don't have latest tag
function cleanUpAdornments() function cleanUpAdornments()
for cellPos, adornTable in pairs(adornments) do for cellPos, adornTable in pairs(adornments) do
if adornTable.KeepAlive ~= currentKeepAliveTag then -- old news, we should get rid of this if adornTable.KeepAlive ~= currentKeepAliveTag then -- old news, we should get rid of this
adornTable.SelectionBox.Visible = false adornTable.SelectionBox.Visible = false
table.insert(reusableAdorns,{part = adornTable.SelectionPart, box = adornTable.SelectionBox}) table.insert(reusableAdorns, { part = adornTable.SelectionPart, box = adornTable.SelectionBox })
adornments[cellPos] = nil adornments[cellPos] = nil
end end
end end
@ -644,8 +606,8 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
-- finds full cells in region and adorns each cell with a box, with the argument color -- finds full cells in region and adorns each cell with a box, with the argument color
function adornFullCellsInRegion(region, color) function adornFullCellsInRegion(region, color)
local regionBegin = region.CFrame.p - (region.Size/2) + Vector3.new(2,2,2) local regionBegin = region.CFrame.p - (region.Size / 2) + Vector3.new(2, 2, 2)
local regionEnd = region.CFrame.p + (region.Size/2) - Vector3.new(2,2,2) local regionEnd = region.CFrame.p + (region.Size / 2) - Vector3.new(2, 2, 2)
local cellPosBegin = WorldToCellPreferSolid(terrain, regionBegin) local cellPosBegin = WorldToCellPreferSolid(terrain, regionBegin)
local cellPosEnd = WorldToCellPreferSolid(terrain, regionEnd) local cellPosEnd = WorldToCellPreferSolid(terrain, regionEnd)
@ -658,7 +620,7 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
if cellMaterial ~= emptyMaterial then if cellMaterial ~= emptyMaterial then
local cframePos = CellCenterToWorld(terrain, x, y, z) local cframePos = CellCenterToWorld(terrain, x, y, z)
local cellPos = Vector3int16.new(x,y,z) local cellPos = Vector3int16.new(x, y, z)
local updated = false local updated = false
for cellPosAdorn, adornTable in pairs(adornments) do for cellPosAdorn, adornTable in pairs(adornments) do
@ -674,9 +636,13 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
if not updated then if not updated then
local selectionPart, selectionBox = createAdornment(color) local selectionPart, selectionBox = createAdornment(color)
selectionPart.Size = Vector3.new(4,4,4) selectionPart.Size = Vector3.new(4, 4, 4)
selectionPart.CFrame = CFrame.new(cframePos) selectionPart.CFrame = CFrame.new(cframePos)
local adornTable = {SelectionPart = selectionPart, SelectionBox = selectionBox, KeepAlive = currentKeepAliveTag} local adornTable = {
SelectionPart = selectionPart,
SelectionBox = selectionBox,
KeepAlive = currentKeepAliveTag,
}
adornments[cellPos] = adornTable adornments[cellPos] = adornTable
end end
end end
@ -686,7 +652,6 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
cleanUpAdornments() cleanUpAdornments()
end end
------------------------------------- setup code ------------------------------ ------------------------------------- setup code ------------------------------
lastRegion = regionToSelect lastRegion = regionToSelect
@ -699,8 +664,7 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
adornments.SelectionPart = selectionPart adornments.SelectionPart = selectionPart
adornments.SelectionBox = selectionBox adornments.SelectionBox = selectionBox
updateSelection = updateSelection = function(newRegion, color)
function (newRegion, color)
if newRegion and newRegion ~= lastRegion then if newRegion and newRegion ~= lastRegion then
lastRegion = newRegion lastRegion = newRegion
selectionPart.Size = newRegion.Size selectionPart.Size = newRegion.Size
@ -712,19 +676,19 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
end end
else -- use individual cell adorns to represent the area selected else -- use individual cell adorns to represent the area selected
adornFullCellsInRegion(regionToSelect, color) adornFullCellsInRegion(regionToSelect, color)
updateSelection = updateSelection = function(newRegion, color)
function (newRegion, color)
if newRegion and newRegion ~= lastRegion then if newRegion and newRegion ~= lastRegion then
lastRegion = newRegion lastRegion = newRegion
adornFullCellsInRegion(newRegion, color) adornFullCellsInRegion(newRegion, color)
end end
end end
end end
local destroyFunc = function() local destroyFunc = function()
updateSelection = nil updateSelection = nil
if selectionContainer then selectionContainer:Destroy() end if selectionContainer then
selectionContainer:Destroy()
end
adornments = nil adornments = nil
end end
@ -733,12 +697,6 @@ end
-----------------------------Terrain Utilities End----------------------------- -----------------------------Terrain Utilities End-----------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
@ -777,14 +735,16 @@ Method :wait()
function t.CreateSignal() function t.CreateSignal()
local this = {} local this = {}
local mBindableEvent = Instance.new('BindableEvent') local mBindableEvent = Instance.new "BindableEvent"
local mAllCns = {} --all connection objects returned by mBindableEvent::connect local mAllCns = {} --all connection objects returned by mBindableEvent::connect
--main functions --main functions
function this:connect(func) function this:connect(func)
if self ~= this then error("connect must be called with `:`, not `.`", 2) end if self ~= this then
if type(func) ~= 'function' then error("connect must be called with `:`, not `.`", 2)
error("Argument #1 of connect must be a function, got a "..type(func), 2) end
if type(func) ~= "function" then
error("Argument #1 of connect must be a function, got a " .. type(func), 2)
end end
local cn = mBindableEvent.Event:connect(func) local cn = mBindableEvent.Event:connect(func)
mAllCns[cn] = true mAllCns[cn] = true
@ -796,18 +756,24 @@ function t.CreateSignal()
return pubCn return pubCn
end end
function this:disconnect() function this:disconnect()
if self ~= this then error("disconnect must be called with `:`, not `.`", 2) end if self ~= this then
error("disconnect must be called with `:`, not `.`", 2)
end
for cn, _ in pairs(mAllCns) do for cn, _ in pairs(mAllCns) do
cn:disconnect() cn:disconnect()
mAllCns[cn] = nil mAllCns[cn] = nil
end end
end end
function this:wait() function this:wait()
if self ~= this then error("wait must be called with `:`, not `.`", 2) end if self ~= this then
error("wait must be called with `:`, not `.`", 2)
end
return mBindableEvent.Event:wait() return mBindableEvent.Event:wait()
end end
function this:fire(...) function this:fire(...)
if self ~= this then error("fire must be called with `:`, not `.`", 2) end if self ~= this then
error("fire must be called with `:`, not `.`", 2)
end
mBindableEvent:Fire(...) mBindableEvent:Fire(...)
end end
@ -816,9 +782,6 @@ end
------------------------------------------------- Sigal class End ------------------------------------------------------ ------------------------------------------------- Sigal class End ------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
@ -913,7 +876,7 @@ Note: It is also perfectly legal to save a reference to the function returned by
--the Create function need to be created as a functor, not a function, in order to support the Create.E syntax, so it --the Create function need to be created as a functor, not a function, in order to support the Create.E syntax, so it
--will be created in several steps rather than as a single function declaration. --will be created in several steps rather than as a single function declaration.
local function Create_PrivImpl(objectType) local function Create_PrivImpl(objectType)
if type(objectType) ~= 'string' then if type(objectType) ~= "string" then
error("Argument of Create must be a string", 2) error("Argument of Create must be a string", 2)
end end
--return the proxy function that gives us the nice Create'string'{data} syntax --return the proxy function that gives us the nice Create'string'{data} syntax
@ -932,41 +895,44 @@ local function Create_PrivImpl(objectType)
for k, v in pairs(dat) do for k, v in pairs(dat) do
--add property --add property
if type(k) == 'string' then if type(k) == "string" then
obj[k] = v obj[k] = v
--add child --add child
elseif type(k) == 'number' then elseif type(k) == "number" then
if type(v) ~= 'userdata' then if type(v) ~= "userdata" then
error("Bad entry in Create body: Numeric keys must be paired with children, got a: "..type(v), 2) error("Bad entry in Create body: Numeric keys must be paired with children, got a: " .. type(v), 2)
end end
v.Parent = obj v.Parent = obj
--event connect --event connect
elseif type(k) == 'table' and k.__eventname then elseif type(k) == "table" and k.__eventname then
if type(v) ~= 'function' then if type(v) ~= "function" then
error("Bad entry in Create body: Key `[Create.E\'"..k.__eventname.."\']` must have a function value\ error(
got: "..tostring(v), 2) "Bad entry in Create body: Key `[Create.E'"
.. k.__eventname
.. "']` must have a function value, got: "
.. tostring(v),
2
)
end end
obj[k.__eventname]:connect(v) obj[k.__eventname]:connect(v)
--define constructor function --define constructor function
elseif k == t.Create then elseif k == t.Create then
if type(v) ~= 'function' then if type(v) ~= "function" then
error("Bad entry in Create body: Key `[Create]` should be paired with a constructor function, \ error(
got: "..tostring(v), 2) "Bad entry in Create body: Key `[Create]` should be paired with a constructor function, got: "
.. tostring(v),
2
)
elseif ctor then elseif ctor then
--ctor already exists, only one allowed --ctor already exists, only one allowed
error("Bad entry in Create body: Only one constructor function is allowed", 2) error("Bad entry in Create body: Only one constructor function is allowed", 2)
end end
ctor = v ctor = v
else else
error("Bad entry ("..tostring(k).." => "..tostring(v)..") in Create body", 2) error("Bad entry (" .. tostring(k) .. " => " .. tostring(v) .. ") in Create body", 2)
end end
end end
@ -981,19 +947,20 @@ local function Create_PrivImpl(objectType)
end end
--now, create the functor: --now, create the functor:
t.Create = setmetatable({}, {__call = function(tb, ...) return Create_PrivImpl(...) end}) t.Create = setmetatable({}, {
__call = function(_, ...)
return Create_PrivImpl(...)
end,
})
--and create the "Event.E" syntax stub. Really it's just a stub to construct a table which our Create --and create the "Event.E" syntax stub. Really it's just a stub to construct a table which our Create
--function can recognize as special. --function can recognize as special.
t.Create.E = function(eventName) t.Create.E = function(eventName)
return {__eventname = eventName} return { __eventname = eventName }
end end
-------------------------------------------------Create function End---------------------------------------------------- -------------------------------------------------Create function End----------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
@ -1002,114 +969,87 @@ end
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
t.Help = t.Help = function(funcNameOrFunc)
function(funcNameOrFunc)
--input argument can be a string or a function. Should return a description (of arguments and expected side effects) --input argument can be a string or a function. Should return a description (of arguments and expected side effects)
if funcNameOrFunc == "DecodeJSON" or funcNameOrFunc == t.DecodeJSON then if funcNameOrFunc == "DecodeJSON" or funcNameOrFunc == t.DecodeJSON then
return "Function DecodeJSON. " .. return "Function DecodeJSON. "
"Arguments: (string). " .. .. "Arguments: (string). "
"Side effect: returns a table with all parsed JSON values" .. "Side effect: returns a table with all parsed JSON values"
end end
if funcNameOrFunc == "EncodeJSON" or funcNameOrFunc == t.EncodeJSON then if funcNameOrFunc == "EncodeJSON" or funcNameOrFunc == t.EncodeJSON then
return "Function EncodeJSON. " .. return "Function EncodeJSON. "
"Arguments: (table). " .. .. "Arguments: (table). "
"Side effect: returns a string composed of argument table in JSON data format" .. "Side effect: returns a string composed of argument table in JSON data format"
end end
if funcNameOrFunc == "MakeWedge" or funcNameOrFunc == t.MakeWedge then if funcNameOrFunc == "MakeWedge" or funcNameOrFunc == t.MakeWedge then
return "Function MakeWedge. " .. return "Function MakeWedge. "
"Arguments: (x, y, z, [default material]). " .. .. "Arguments: (x, y, z, [default material]). "
"Description: Makes a wedge at location x, y, z. Sets cell x, y, z to default material if ".. .. "Description: Makes a wedge at location x, y, z. Sets cell x, y, z to default material if "
"parameter is provided, if not sets cell x, y, z to be whatever material it previously was. ".. .. "parameter is provided, if not sets cell x, y, z to be whatever material it previously was. "
"Returns true if made a wedge, false if the cell remains a block " .. "Returns true if made a wedge, false if the cell remains a block "
end end
if funcNameOrFunc == "SelectTerrainRegion" or funcNameOrFunc == t.SelectTerrainRegion then if funcNameOrFunc == "SelectTerrainRegion" or funcNameOrFunc == t.SelectTerrainRegion then
return "Function SelectTerrainRegion. " .. return "Function SelectTerrainRegion. "
"Arguments: (regionToSelect, color, selectEmptyCells, selectionParent). " .. .. "Arguments: (regionToSelect, color, selectEmptyCells, selectionParent). "
"Description: Selects all terrain via a series of selection boxes within the regionToSelect " .. .. "Description: Selects all terrain via a series of selection boxes within the regionToSelect "
"(this should be a region3 value). The selection box color is detemined by the color argument " .. .. "(this should be a region3 value). The selection box color is detemined by the color argument "
"(should be a brickcolor value). SelectionParent is the parent that the selection model gets placed to (optional)." .. .. "(should be a brickcolor value). SelectionParent is the parent that the selection model gets placed to (optional)."
"SelectEmptyCells is bool, when true will select all cells in the " .. .. "SelectEmptyCells is bool, when true will select all cells in the "
"region, otherwise we only select non-empty cells. Returns a function that can update the selection," .. .. "region, otherwise we only select non-empty cells. Returns a function that can update the selection,"
"arguments to said function are a new region3 to select, and the adornment color (color arg is optional). " .. .. "arguments to said function are a new region3 to select, and the adornment color (color arg is optional). "
"Also returns a second function that takes no arguments and destroys the selection" .. "Also returns a second function that takes no arguments and destroys the selection"
end end
if funcNameOrFunc == "CreateSignal" or funcNameOrFunc == t.CreateSignal then if funcNameOrFunc == "CreateSignal" or funcNameOrFunc == t.CreateSignal then
return "Function CreateSignal. ".. return "Function CreateSignal. "
"Arguments: None. ".. .. "Arguments: None. "
"Returns: The newly created Signal object. This object is identical to the RBXScriptSignal class ".. .. "Returns: The newly created Signal object. This object is identical to the RBXScriptSignal class "
"used for events in Objects, but is a Lua-side object so it can be used to create custom events in".. .. "used for events in Objects, but is a Lua-side object so it can be used to create custom events in"
"Lua code. ".. .. "Lua code. "
"Methods of the Signal object: :connect, :wait, :fire, :disconnect. ".. .. "Methods of the Signal object: :connect, :wait, :fire, :disconnect. "
"For more info you can pass the method name to the Help function, or view the wiki page ".. .. "For more info you can pass the method name to the Help function, or view the wiki page "
"for this library. EG: Help('Signal:connect')." .. "for this library. EG: Help('Signal:connect')."
end end
if funcNameOrFunc == "Signal:connect" then if funcNameOrFunc == "Signal:connect" then
return "Method Signal:connect. ".. return "Method Signal:connect. "
"Arguments: (function handler). ".. .. "Arguments: (function handler). "
"Return: A connection object which can be used to disconnect the connection to this handler. ".. .. "Return: A connection object which can be used to disconnect the connection to this handler. "
"Description: Connectes a handler function to this Signal, so that when |fire| is called the ".. .. "Description: Connectes a handler function to this Signal, so that when |fire| is called the "
"handler function will be called with the arguments passed to |fire|." .. "handler function will be called with the arguments passed to |fire|."
end end
if funcNameOrFunc == "Signal:wait" then if funcNameOrFunc == "Signal:wait" then
return "Method Signal:wait. ".. return "Method Signal:wait. "
"Arguments: None. ".. .. "Arguments: None. "
"Returns: The arguments passed to the next call to |fire|. ".. .. "Returns: The arguments passed to the next call to |fire|. "
"Description: This call does not return until the next call to |fire| is made, at which point it ".. .. "Description: This call does not return until the next call to |fire| is made, at which point it "
"will return the values which were passed as arguments to that |fire| call." .. "will return the values which were passed as arguments to that |fire| call."
end end
if funcNameOrFunc == "Signal:fire" then if funcNameOrFunc == "Signal:fire" then
return "Method Signal:fire. ".. return "Method Signal:fire. "
"Arguments: Any number of arguments of any type. ".. .. "Arguments: Any number of arguments of any type. "
"Returns: None. ".. .. "Returns: None. "
"Description: This call will invoke any connected handler functions, and notify any waiting code ".. .. "Description: This call will invoke any connected handler functions, and notify any waiting code "
"attached to this Signal to continue, with the arguments passed to this function. Note: The calls ".. .. "attached to this Signal to continue, with the arguments passed to this function. Note: The calls "
"to handlers are made asynchronously, so this call will return immediately regardless of how long ".. .. "to handlers are made asynchronously, so this call will return immediately regardless of how long "
"it takes the connected handler functions to complete." .. "it takes the connected handler functions to complete."
end end
if funcNameOrFunc == "Signal:disconnect" then if funcNameOrFunc == "Signal:disconnect" then
return "Method Signal:disconnect. ".. return "Method Signal:disconnect. "
"Arguments: None. ".. .. "Arguments: None. "
"Returns: None. ".. .. "Returns: None. "
"Description: This call disconnects all handlers attacched to this function, note however, it ".. .. "Description: This call disconnects all handlers attacched to this function, note however, it "
"does NOT make waiting code continue, as is the behavior of normal Roblox events. This method ".. .. "does NOT make waiting code continue, as is the behavior of normal Roblox events. This method "
"can also be called on the connection object which is returned from Signal:connect to only ".. .. "can also be called on the connection object which is returned from Signal:connect to only "
"disconnect a single handler, as opposed to this method, which will disconnect all handlers." .. "disconnect a single handler, as opposed to this method, which will disconnect all handlers."
end end
if funcNameOrFunc == "Create" then if funcNameOrFunc == "Create" then
return "Function Create. ".. return "Function Create. "
"Arguments: A table containing information about how to construct a collection of objects. ".. .. "Arguments: A table containing information about how to construct a collection of objects. "
"Returns: The constructed objects. ".. .. "Returns: The constructed objects. "
"Descrition: Create is a very powerfull function, whose description is too long to fit here, and ".. .. "Descrition: Create is a very powerfull function, whose description is too long to fit here, and "
"is best described via example, please see the wiki page for a description of how to use it." .. "is best described via example, please see the wiki page for a description of how to use it."
end
end end
end
--------------------------------------------Documentation Ends---------------------------------------------------------- --------------------------------------------Documentation Ends----------------------------------------------------------
return t return t

View File

@ -3,12 +3,12 @@
-- access to all of the libraries (otherwise only local scripts do) -- access to all of the libraries (otherwise only local scripts do)
local deepakTestingPlace = 3569749 local deepakTestingPlace = 3569749
local sc = game:GetService("ScriptContext") local sc = game:GetService "ScriptContext"
local tries = 0 local tries = 0
while not sc and tries < 3 do while not sc and tries < 3 do
tries = tries + 1 tries = tries + 1
sc = game:GetService("ScriptContext") sc = game:GetService "ScriptContext"
wait(0.2) wait(0.2)
end end
@ -22,5 +22,5 @@ if sc then
sc:RegisterLibrary("Libraries/RbxStamper", "73157242") sc:RegisterLibrary("Libraries/RbxStamper", "73157242")
sc:LibraryRegistrationComplete() sc:LibraryRegistrationComplete()
else else
print("failed to find script context, libraries did not load") print "failed to find script context, libraries did not load"
end end

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ local function waitForChild(instance, name)
assert(instance) assert(instance)
assert(name) assert(name)
while not instance:FindFirstChild(name) do while not instance:FindFirstChild(name) do
print('Waiting for ...', instance, name) print("Waiting for ...", instance, name)
instance.ChildAdded:wait() instance.ChildAdded:wait()
end end
return instance:FindFirstChild(name) return instance:FindFirstChild(name)
@ -18,23 +18,26 @@ end
local function IsTouchDevice() local function IsTouchDevice()
local touchEnabled = false local touchEnabled = false
pcall(function() touchEnabled = Game:GetService('UserInputService').TouchEnabled end) pcall(function()
touchEnabled = Game:GetService("UserInputService").TouchEnabled
end)
return touchEnabled return touchEnabled
end end
waitForChild(game, "Players")
waitForChild(game,"Players") waitForProperty(game.Players, "LocalPlayer")
waitForProperty(game.Players,"LocalPlayer")
local player = game.Players.LocalPlayer local player = game.Players.LocalPlayer
local RbxGui, msg = LoadLibrary("RbxGui") local RbxGui, _ = LoadLibrary "RbxGui"
if not RbxGui then print("could not find RbxGui!") return end if not RbxGui then
print "could not find RbxGui!"
return
end
--- Begin Locals --- Begin Locals
local StaticTabName = "gear" local StaticTabName = "gear"
local backpack = script.Parent local backpack = script.Parent
local screen = script.Parent.Parent
local backpackItems = {} local backpackItems = {}
local buttons = {} local buttons = {}
@ -49,67 +52,67 @@ local characterChildAddedCon = nil
local characterChildRemovedCon = nil local characterChildRemovedCon = nil
local backpackAddCon = nil local backpackAddCon = nil
local playerBackpack = waitForChild(player,"Backpack") local playerBackpack = waitForChild(player, "Backpack")
waitForChild(backpack,"Tabs") waitForChild(backpack, "Tabs")
waitForChild(backpack,"Gear") waitForChild(backpack, "Gear")
local gearPreview = waitForChild(backpack.Gear,"GearPreview") local gearPreview = waitForChild(backpack.Gear, "GearPreview")
local scroller = waitForChild(backpack.Gear,"GearGridScrollingArea") local scroller = waitForChild(backpack.Gear, "GearGridScrollingArea")
local currentLoadout = waitForChild(backpack.Parent,"CurrentLoadout") local currentLoadout = waitForChild(backpack.Parent, "CurrentLoadout")
local grid = waitForChild(backpack.Gear,"GearGrid") local grid = waitForChild(backpack.Gear, "GearGrid")
local gearButton = waitForChild(grid,"GearButton") local gearButton = waitForChild(grid, "GearButton")
local swapSlot = waitForChild(script.Parent,"SwapSlot") local swapSlot = waitForChild(script.Parent, "SwapSlot")
local backpackManager = waitForChild(script.Parent,"CoreScripts/BackpackScripts/BackpackManager") local backpackManager = waitForChild(script.Parent, "CoreScripts/BackpackScripts/BackpackManager")
local backpackOpenEvent = waitForChild(backpackManager,"BackpackOpenEvent") local backpackOpenEvent = waitForChild(backpackManager, "BackpackOpenEvent")
local backpackCloseEvent = waitForChild(backpackManager,"BackpackCloseEvent") local backpackCloseEvent = waitForChild(backpackManager, "BackpackCloseEvent")
local tabClickedEvent = waitForChild(backpackManager,"TabClickedEvent") local tabClickedEvent = waitForChild(backpackManager, "TabClickedEvent")
local resizeEvent = waitForChild(backpackManager,"ResizeEvent") local resizeEvent = waitForChild(backpackManager, "ResizeEvent")
local searchRequestedEvent = waitForChild(backpackManager,"SearchRequestedEvent") local searchRequestedEvent = waitForChild(backpackManager, "SearchRequestedEvent")
local tellBackpackReadyFunc = waitForChild(backpackManager,"BackpackReady") local tellBackpackReadyFunc = waitForChild(backpackManager, "BackpackReady")
-- creating scroll bar early as to make sure items get placed correctly -- creating scroll bar early as to make sure items get placed correctly
local scrollFrame, scrollUp, scrollDown, recalculateScroll = RbxGui.CreateScrollingFrame(nil, "grid", Vector2.new(6, 6)) local scrollFrame, scrollUp, scrollDown, recalculateScroll = RbxGui.CreateScrollingFrame(nil, "grid", Vector2.new(6, 6))
scrollFrame.Position = UDim2.new(0,0,0,30) scrollFrame.Position = UDim2.new(0, 0, 0, 30)
scrollFrame.Size = UDim2.new(1,0,1,-30) scrollFrame.Size = UDim2.new(1, 0, 1, -30)
scrollFrame.Parent = backpack.Gear.GearGrid scrollFrame.Parent = backpack.Gear.GearGrid
local scrollBar = Instance.new("Frame") local scrollBar = Instance.new "Frame"
scrollBar.Name = "ScrollBar" scrollBar.Name = "ScrollBar"
scrollBar.BackgroundTransparency = 0.9 scrollBar.BackgroundTransparency = 0.9
scrollBar.BackgroundColor3 = Color3.new(1,1,1) scrollBar.BackgroundColor3 = Color3.new(1, 1, 1)
scrollBar.BorderSizePixel = 0 scrollBar.BorderSizePixel = 0
scrollBar.Size = UDim2.new(0, 17, 1, -36) scrollBar.Size = UDim2.new(0, 17, 1, -36)
scrollBar.Position = UDim2.new(0,0,0,18) scrollBar.Position = UDim2.new(0, 0, 0, 18)
scrollBar.Parent = scroller scrollBar.Parent = scroller
scrollDown.Position = UDim2.new(0,0,1,-17) scrollDown.Position = UDim2.new(0, 0, 1, -17)
scrollUp.Parent = scroller scrollUp.Parent = scroller
scrollDown.Parent = scroller scrollDown.Parent = scroller
local scrollFrameLoadout, scrollUpLoadout, scrollDownLoadout, recalculateScrollLoadout = RbxGui.CreateScrollingFrame() local scrollFrameLoadout, scrollUpLoadout, scrollDownLoadout, recalculateScrollLoadout = RbxGui.CreateScrollingFrame()
scrollFrameLoadout.Position = UDim2.new(0,0,0,0) scrollFrameLoadout.Position = UDim2.new(0, 0, 0, 0)
scrollFrameLoadout.Size = UDim2.new(1,0,1,0) scrollFrameLoadout.Size = UDim2.new(1, 0, 1, 0)
scrollFrameLoadout.Parent = backpack.Gear.GearLoadouts.LoadoutsList scrollFrameLoadout.Parent = backpack.Gear.GearLoadouts.LoadoutsList
local LoadoutButton = Instance.new("TextButton") local LoadoutButton = Instance.new "TextButton"
LoadoutButton.RobloxLocked = true LoadoutButton.RobloxLocked = true
LoadoutButton.Name = "LoadoutButton" LoadoutButton.Name = "LoadoutButton"
LoadoutButton.Font = Enum.Font.ArialBold LoadoutButton.Font = Enum.Font.ArialBold
LoadoutButton.FontSize = Enum.FontSize.Size14 LoadoutButton.FontSize = Enum.FontSize.Size14
LoadoutButton.Position = UDim2.new(0,0,0,0) LoadoutButton.Position = UDim2.new(0, 0, 0, 0)
LoadoutButton.Size = UDim2.new(1,0,0,32) LoadoutButton.Size = UDim2.new(1, 0, 0, 32)
LoadoutButton.Style = Enum.ButtonStyle.RobloxButton LoadoutButton.Style = Enum.ButtonStyle.RobloxButton
LoadoutButton.Text = "Loadout #1" LoadoutButton.Text = "Loadout #1"
LoadoutButton.TextColor3 = Color3.new(1,1,1) LoadoutButton.TextColor3 = Color3.new(1, 1, 1)
LoadoutButton.Parent = scrollFrameLoadout LoadoutButton.Parent = scrollFrameLoadout
local LoadoutButtonTwo = LoadoutButton:clone() local LoadoutButtonTwo = LoadoutButton:clone()
@ -124,26 +127,25 @@ local LoadoutButtonFour = LoadoutButton:clone()
LoadoutButtonFour.Text = "Loadout #4" LoadoutButtonFour.Text = "Loadout #4"
LoadoutButtonFour.Parent = scrollFrameLoadout LoadoutButtonFour.Parent = scrollFrameLoadout
local scrollBarLoadout = Instance.new("Frame") local scrollBarLoadout = Instance.new "Frame"
scrollBarLoadout.Name = "ScrollBarLoadout" scrollBarLoadout.Name = "ScrollBarLoadout"
scrollBarLoadout.BackgroundTransparency = 0.9 scrollBarLoadout.BackgroundTransparency = 0.9
scrollBarLoadout.BackgroundColor3 = Color3.new(1,1,1) scrollBarLoadout.BackgroundColor3 = Color3.new(1, 1, 1)
scrollBarLoadout.BorderSizePixel = 0 scrollBarLoadout.BorderSizePixel = 0
scrollBarLoadout.Size = UDim2.new(0, 17, 1, -36) scrollBarLoadout.Size = UDim2.new(0, 17, 1, -36)
scrollBarLoadout.Position = UDim2.new(0,0,0,18) scrollBarLoadout.Position = UDim2.new(0, 0, 0, 18)
scrollBarLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea scrollBarLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea
scrollDownLoadout.Position = UDim2.new(0,0,1,-17) scrollDownLoadout.Position = UDim2.new(0, 0, 1, -17)
scrollUpLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea scrollUpLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea
scrollDownLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea scrollDownLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea
-- Begin Functions -- Begin Functions
function removeFromMap(map,object) function removeFromMap(map, object)
for i = 1, #map do for i = 1, #map do
if map[i] == object then if map[i] == object then
table.remove(map,i) table.remove(map, i)
break break
end end
end end
@ -153,7 +155,7 @@ function robloxLock(instance)
instance.RobloxLocked = true instance.RobloxLocked = true
children = instance:GetChildren() children = instance:GetChildren()
if children then if children then
for i, child in ipairs(children) do for _, child in ipairs(children) do
robloxLock(child) robloxLock(child)
end end
end end
@ -167,26 +169,30 @@ function resize()
size = gearPreview.AbsoluteSize.Y * 0.75 size = gearPreview.AbsoluteSize.Y * 0.75
end end
waitForChild(gearPreview,"GearImage") waitForChild(gearPreview, "GearImage")
gearPreview.GearImage.Size = UDim2.new(0,size,0,size) gearPreview.GearImage.Size = UDim2.new(0, size, 0, size)
gearPreview.GearImage.Position = UDim2.new(0,gearPreview.AbsoluteSize.X/2 - size/2,0.75,-size) gearPreview.GearImage.Position = UDim2.new(0, gearPreview.AbsoluteSize.X / 2 - size / 2, 0.75, -size)
resizeGrid() resizeGrid()
end end
function addToGrid(child) function addToGrid(child)
if not child:IsA("Tool") then if not child:IsA "Tool" then
if not child:IsA("HopperBin") then if not child:IsA "HopperBin" then
return return
end end
end end
if child:FindFirstChild("RobloxBuildTool") then return end if child:FindFirstChild "RobloxBuildTool" then
return
for i,v in pairs(backpackItems) do -- check to see if we already have this gear registered
if v == child then return end
end end
table.insert(backpackItems,child) for i, v in pairs(backpackItems) do -- check to see if we already have this gear registered
if v == child then
return
end
end
table.insert(backpackItems, child)
local changeCon = child.Changed:connect(function(prop) local changeCon = child.Changed:connect(function(prop)
if prop == "Name" then if prop == "Name" then
@ -198,32 +204,40 @@ function addToGrid(child)
end end
end) end)
local ancestryCon = nil local ancestryCon = nil
ancestryCon = child.AncestryChanged:connect(function(theChild,theParent) ancestryCon = child.AncestryChanged:connect(function(theChild, theParent)
local thisObject = nil local thisObject = nil
for k,v in pairs(backpackItems) do for k, v in pairs(backpackItems) do
if v == child then if v == child then
thisObject = v thisObject = v
break break
end end
end end
waitForProperty(player,"Character") waitForProperty(player, "Character")
waitForChild(player,"Backpack") waitForChild(player, "Backpack")
if (child.Parent ~= player.Backpack and child.Parent ~= player.Character) then if child.Parent ~= player.Backpack and child.Parent ~= player.Character then
if ancestryCon then ancestryCon:disconnect() end if ancestryCon then
if changeCon then changeCon:disconnect() end ancestryCon:disconnect()
end
if changeCon then
changeCon:disconnect()
end
for k,v in pairs(backpackItems) do for k, v in pairs(backpackItems) do
if v == thisObject then if v == thisObject then
if mouseEnterCons[buttons[v]] then mouseEnterCons[buttons[v]]:disconnect() end if mouseEnterCons[buttons[v]] then
if mouseClickCons[buttons[v]] then mouseClickCons[buttons[v]]:disconnect() end mouseEnterCons[buttons[v]]:disconnect()
end
if mouseClickCons[buttons[v]] then
mouseClickCons[buttons[v]]:disconnect()
end
buttons[v].Parent = nil buttons[v].Parent = nil
buttons[v] = nil buttons[v] = nil
break break
end end
end end
removeFromMap(backpackItems,thisObject) removeFromMap(backpackItems, thisObject)
resizeGrid() resizeGrid()
else else
@ -235,7 +249,7 @@ function addToGrid(child)
end end
function buttonClick(button) function buttonClick(button)
if button:FindFirstChild("UnequipContextMenu") and not button.Active then if button:FindFirstChild "UnequipContextMenu" and not button.Active then
button.UnequipContextMenu.Visible = true button.UnequipContextMenu.Visible = true
browsingMenu = true browsingMenu = true
end end
@ -253,26 +267,36 @@ function findEmptySlot()
local smallestNum = nil local smallestNum = nil
local loadout = currentLoadout:GetChildren() local loadout = currentLoadout:GetChildren()
for i = 1, #loadout do for i = 1, #loadout do
if loadout[i]:IsA("Frame") and #loadout[i]:GetChildren() <= 0 then if loadout[i]:IsA "Frame" and #loadout[i]:GetChildren() <= 0 then
local frameNum = tonumber(string.sub(loadout[i].Name,5)) local frameNum = tonumber(string.sub(loadout[i].Name, 5))
if frameNum == 0 then frameNum = 10 end if frameNum == 0 then
frameNum = 10
end
if not smallestNum or (smallestNum > frameNum) then if not smallestNum or (smallestNum > frameNum) then
smallestNum = frameNum smallestNum = frameNum
end end
end end
end end
if smallestNum == 10 then smallestNum = 0 end if smallestNum == 10 then
smallestNum = 0
end
return smallestNum return smallestNum
end end
function checkForSwap(button,x,y) function checkForSwap(button, x, y)
local loadoutChildren = currentLoadout:GetChildren() local loadoutChildren = currentLoadout:GetChildren()
for i = 1, #loadoutChildren do for i = 1, #loadoutChildren do
if loadoutChildren[i]:IsA("Frame") and string.find(loadoutChildren[i].Name,"Slot") then if loadoutChildren[i]:IsA "Frame" and string.find(loadoutChildren[i].Name, "Slot") then
if x >= loadoutChildren[i].AbsolutePosition.x and x <= (loadoutChildren[i].AbsolutePosition.x + loadoutChildren[i].AbsoluteSize.x) then if
if y >= loadoutChildren[i].AbsolutePosition.y and y <= (loadoutChildren[i].AbsolutePosition.y + loadoutChildren[i].AbsoluteSize.y) then x >= loadoutChildren[i].AbsolutePosition.x
local slot = tonumber(string.sub(loadoutChildren[i].Name,5)) and x <= (loadoutChildren[i].AbsolutePosition.x + loadoutChildren[i].AbsoluteSize.x)
swapGearSlot(slot,button) then
if
y >= loadoutChildren[i].AbsolutePosition.y
and y <= (loadoutChildren[i].AbsolutePosition.y + loadoutChildren[i].AbsoluteSize.y)
then
local slot = tonumber(string.sub(loadoutChildren[i].Name, 5))
swapGearSlot(slot, button)
return true return true
end end
end end
@ -282,8 +306,8 @@ function checkForSwap(button,x,y)
end end
function resizeGrid() function resizeGrid()
for k,v in pairs(backpackItems) do for k, v in pairs(backpackItems) do
if not v:FindFirstChild("RobloxBuildTool") then if not v:FindFirstChild "RobloxBuildTool" then
if not buttons[v] then if not buttons[v] then
local buttonClone = gearButton:clone() local buttonClone = gearButton:clone()
buttonClone.Parent = grid.ScrollingFrame buttonClone.Parent = grid.ScrollingFrame
@ -297,31 +321,35 @@ function resizeGrid()
buttonClone.Draggable = true buttonClone.Draggable = true
buttons[v] = buttonClone buttons[v] = buttonClone
if not IsTouchDevice() then if not IsTouchDevice() then
local unequipMenu = getGearContextMenu() local unequipMenu = getGearContextMenu()
unequipMenu.Visible = false unequipMenu.Visible = false
unequipMenu.Parent = buttonClone unequipMenu.Parent = buttonClone
end end
local beginPos = nil local beginPos = nil
buttonClone.DragBegin:connect(function(value) buttonClone.DragBegin:connect(function(value)
waitForChild(buttonClone, 'Background') waitForChild(buttonClone, "Background")
buttonClone['Background'].ZIndex = 10 buttonClone["Background"].ZIndex = 10
buttonClone.ZIndex = 10 buttonClone.ZIndex = 10
beginPos = value beginPos = value
end) end)
buttonClone.DragStopped:connect(function(x,y) buttonClone.DragStopped:connect(function(x, y)
waitForChild(buttonClone, 'Background') waitForChild(buttonClone, "Background")
buttonClone['Background'].ZIndex = 1.0 buttonClone["Background"].ZIndex = 1
buttonClone.ZIndex = 2 buttonClone.ZIndex = 2
if beginPos ~= buttonClone.Position then if beginPos ~= buttonClone.Position then
if not checkForSwap(buttonClone,x,y) then if not checkForSwap(buttonClone, x, y) then
buttonClone:TweenPosition(beginPos,Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.5, true) buttonClone:TweenPosition(
beginPos,
Enum.EasingDirection.Out,
Enum.EasingStyle.Quad,
0.5,
true
)
buttonClone.Draggable = false buttonClone.Draggable = false
delay(0.5,function() delay(0.5, function()
buttonClone.Draggable = true buttonClone.Draggable = true
end) end)
else else
@ -330,14 +358,16 @@ function resizeGrid()
end end
end) end)
local clickTime = tick() local clickTime = tick()
mouseEnterCons[buttonClone] = buttonClone.MouseEnter:connect(function() previewGear(buttonClone) end) mouseEnterCons[buttonClone] = buttonClone.MouseEnter:connect(function()
previewGear(buttonClone)
end)
mouseClickCons[buttonClone] = buttonClone.MouseButton1Click:connect(function() mouseClickCons[buttonClone] = buttonClone.MouseButton1Click:connect(function()
local newClickTime = tick() local newClickTime = tick()
if buttonClone.Active and (newClickTime - clickTime) < 0.5 then if buttonClone.Active and (newClickTime - clickTime) < 0.5 then
local slot = findEmptySlot() local slot = findEmptySlot()
if slot then if slot then
buttonClone.ZIndex = 1 buttonClone.ZIndex = 1
swapGearSlot(slot,buttonClone) swapGearSlot(slot, buttonClone)
end end
else else
buttonClick(buttonClone) buttonClick(buttonClone)
@ -351,11 +381,11 @@ function resizeGrid()
end end
function showPartialGrid(subset) function showPartialGrid(subset)
for k,v in pairs(buttons) do for _, v in pairs(buttons) do
v.Parent = nil v.Parent = nil
end end
if subset then if subset then
for k,v in pairs(subset) do for _, v in pairs(subset) do
v.Parent = grid.ScrollingFrame v.Parent = grid.ScrollingFrame
end end
end end
@ -363,7 +393,7 @@ function showPartialGrid(subset)
end end
function showEntireGrid() function showEntireGrid()
for k,v in pairs(buttons) do for _, v in pairs(buttons) do
v.Parent = grid.ScrollingFrame v.Parent = grid.ScrollingFrame
end end
recalculateScroll() recalculateScroll()
@ -372,7 +402,7 @@ end
function inLoadout(gear) function inLoadout(gear)
local children = currentLoadout:GetChildren() local children = currentLoadout:GetChildren()
for i = 1, #children do for i = 1, #children do
if children[i]:IsA("Frame") then if children[i]:IsA "Frame" then
local button = children[i]:GetChildren() local button = children[i]:GetChildren()
if #button > 0 then if #button > 0 then
if button[1].GearReference.Value and button[1].GearReference.Value == gear then if button[1].GearReference.Value and button[1].GearReference.Value == gear then
@ -385,16 +415,16 @@ function inLoadout(gear)
end end
function updateGridActive() function updateGridActive()
for k,v in pairs(backpackItems) do for _, v in pairs(backpackItems) do
if buttons[v] then if buttons[v] then
local gear = nil local gear = nil
local gearRef = buttons[v]:FindFirstChild("GearReference") local gearRef = buttons[v]:FindFirstChild "GearReference"
if gearRef then gear = gearRef.Value end if gearRef then
gear = gearRef.Value
end
if not gear then if (not gear) or inLoadout(gear) then
buttons[v].Active = false
elseif inLoadout(gear) then
buttons[v].Active = false buttons[v].Active = false
else else
buttons[v].Active = true buttons[v].Active = true
@ -407,7 +437,7 @@ function centerGear(loadoutChildren)
local gearButtons = {} local gearButtons = {}
local lastSlotAdd = nil local lastSlotAdd = nil
for i = 1, #loadoutChildren do for i = 1, #loadoutChildren do
if loadoutChildren[i]:IsA("Frame") and #loadoutChildren[i]:GetChildren() > 0 then if loadoutChildren[i]:IsA "Frame" and #loadoutChildren[i]:GetChildren() > 0 then
if loadoutChildren[i].Name == "Slot0" then if loadoutChildren[i].Name == "Slot0" then
lastSlotAdd = loadoutChildren[i] lastSlotAdd = loadoutChildren[i]
else else
@ -415,11 +445,19 @@ function centerGear(loadoutChildren)
end end
end end
end end
if lastSlotAdd then table.insert(gearButtons,lastSlotAdd) end if lastSlotAdd then
table.insert(gearButtons, lastSlotAdd)
end
local startPos = ( 1 - (#gearButtons * 0.1) ) / 2 local startPos = (1 - (#gearButtons * 0.1)) / 2
for i = 1, #gearButtons do for i = 1, #gearButtons do
gearButtons[i]:TweenPosition(UDim2.new(startPos + ((i - 1) * 0.1),0,0,0), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.25, true) gearButtons[i]:TweenPosition(
UDim2.new(startPos + ((i - 1) * 0.1), 0, 0, 0),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quad,
0.25,
true
)
end end
end end
@ -459,10 +497,12 @@ function backpackCloseHandler(currentTab)
end end
function loadoutCheck(child, selectState) function loadoutCheck(child, selectState)
if not child:IsA("ImageButton") then return end if not child:IsA "ImageButton" then
for k,v in pairs(backpackItems) do return
end
for k, v in pairs(backpackItems) do
if buttons[v] then if buttons[v] then
if child:FindFirstChild("GearReference") and buttons[v]:FindFirstChild("GearReference") then if child:FindFirstChild "GearReference" and buttons[v]:FindFirstChild "GearReference" then
if buttons[v].GearReference.Value == child.GearReference.Value then if buttons[v].GearReference.Value == child.GearReference.Value then
buttons[v].Active = selectState buttons[v].Active = selectState
break break
@ -480,7 +520,7 @@ end
function removeAllEquippedGear(physGear) function removeAllEquippedGear(physGear)
local stuff = player.Character:GetChildren() local stuff = player.Character:GetChildren()
for i = 1, #stuff do for i = 1, #stuff do
if ( stuff[i]:IsA("Tool") or stuff[i]:IsA("HopperBin") ) and stuff[i] ~= physGear then if (stuff[i]:IsA "Tool" or stuff[i]:IsA "HopperBin") and stuff[i] ~= physGear then
stuff[i].Parent = playerBackpack stuff[i].Parent = playerBackpack
end end
end end
@ -498,15 +538,15 @@ function unequipGear(physGear)
end end
function highlight(button) function highlight(button)
button.TextColor3 = Color3.new(0,0,0) button.TextColor3 = Color3.new(0, 0, 0)
button.BackgroundColor3 = Color3.new(0.8,0.8,0.8) button.BackgroundColor3 = Color3.new(0.8, 0.8, 0.8)
end end
function clearHighlight(button) function clearHighlight(button)
button.TextColor3 = Color3.new(1,1,1) button.TextColor3 = Color3.new(1, 1, 1)
button.BackgroundColor3 = Color3.new(0,0,0) button.BackgroundColor3 = Color3.new(0, 0, 0)
end end
function swapGearSlot(slot,gearButton) function swapGearSlot(slot, gearButton)
if not swapSlot.Value then -- signal loadout to swap a gear out if not swapSlot.Value then -- signal loadout to swap a gear out
swapSlot.Slot.Value = slot swapSlot.Slot.Value = slot
swapSlot.GearButton.Value = gearButton swapSlot.GearButton.Value = gearButton
@ -515,9 +555,10 @@ function swapGearSlot(slot,gearButton)
end end
end end
local UnequipGearMenuClick = function(element, menu) local UnequipGearMenuClick = function(element, menu)
if type(element.Action) ~= "number" then return end if type(element.Action) ~= "number" then
return
end
local num = element.Action local num = element.Action
if num == 1 then -- remove from loadout if num == 1 then -- remove from loadout
unequipGear(menu.Parent.GearReference.Value) unequipGear(menu.Parent.GearReference.Value)
@ -526,7 +567,7 @@ local UnequipGearMenuClick = function(element, menu)
local loadoutChildren = currentLoadout:GetChildren() local loadoutChildren = currentLoadout:GetChildren()
local slot = -1 local slot = -1
for i = 1, #loadoutChildren do for i = 1, #loadoutChildren do
if loadoutChildren[i]:IsA("Frame") then if loadoutChildren[i]:IsA "Frame" then
local button = loadoutChildren[i]:GetChildren() local button = loadoutChildren[i]:GetChildren()
if button[1] and button[1].GearReference.Value == gearToUnequip then if button[1] and button[1].GearReference.Value == gearToUnequip then
slot = button[1].SlotNumber.Text slot = button[1].SlotNumber.Text
@ -534,14 +575,17 @@ local UnequipGearMenuClick = function(element, menu)
end end
end end
end end
swapGearSlot(slot,nil) swapGearSlot(slot, nil)
end end
end end
function setupCharacterConnections() function setupCharacterConnections()
if backpackAddCon then
if backpackAddCon then backpackAddCon:disconnect() end backpackAddCon:disconnect()
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) addToGrid(child) end) end
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child)
addToGrid(child)
end)
-- make sure we get all the children -- make sure we get all the children
local backpackChildren = game.Players.LocalPlayer.Backpack:GetChildren() local backpackChildren = game.Players.LocalPlayer.Backpack:GetChildren()
@ -549,16 +593,18 @@ function setupCharacterConnections()
addToGrid(backpackChildren[i]) addToGrid(backpackChildren[i])
end end
if characterChildAddedCon then characterChildAddedCon:disconnect() end if characterChildAddedCon then
characterChildAddedCon = characterChildAddedCon:disconnect()
game.Players.LocalPlayer.Character.ChildAdded:connect(function(child) end
characterChildAddedCon = game.Players.LocalPlayer.Character.ChildAdded:connect(function(child)
addToGrid(child) addToGrid(child)
updateGridActive() updateGridActive()
end) end)
if characterChildRemovedCon then characterChildRemovedCon:disconnect() end if characterChildRemovedCon then
characterChildRemovedCon = characterChildRemovedCon:disconnect()
game.Players.LocalPlayer.Character.ChildRemoved:connect(function(child) end
characterChildRemovedCon = game.Players.LocalPlayer.Character.ChildRemoved:connect(function(_)
updateGridActive() updateGridActive()
end) end)
@ -567,9 +613,15 @@ function setupCharacterConnections()
end end
function removeCharacterConnections() function removeCharacterConnections()
if characterChildAddedCon then characterChildAddedCon:disconnect() end if characterChildAddedCon then
if characterChildRemovedCon then characterChildRemovedCon:disconnect() end characterChildAddedCon:disconnect()
if backpackAddCon then backpackAddCon:disconnect() end end
if characterChildRemovedCon then
characterChildRemovedCon:disconnect()
end
if backpackAddCon then
backpackAddCon:disconnect()
end
end end
function trim(s) function trim(s)
@ -578,13 +630,13 @@ end
function filterGear(terms) function filterGear(terms)
local filteredGear = {} local filteredGear = {}
for k,v in pairs(backpackItems) do for k, v in pairs(backpackItems) do
if buttons[v] then if buttons[v] then
local gearString = string.lower(buttons[v].GearReference.Value.Name) local gearString = string.lower(buttons[v].GearReference.Value.Name)
gearString = trim(gearString) gearString = trim(gearString)
for i = 1, #terms do for i = 1, #terms do
if string.match(gearString,terms[i]) then if string.match(gearString, terms[i]) then
table.insert(filteredGear,buttons[v]) table.insert(filteredGear, buttons[v])
break break
end end
end end
@ -594,18 +646,22 @@ function filterGear(terms)
return filteredGear return filteredGear
end end
function splitByWhitespace(text) function splitByWhitespace(text)
if type(text) ~= "string" then return nil end if type(text) ~= "string" then
return nil
end
local terms = {} local terms = {}
for token in string.gmatch(text, "[^%s]+") do for token in string.gmatch(text, "[^%s]+") do
if string.len(token) > 0 then if string.len(token) > 0 then
table.insert(terms,token) table.insert(terms, token)
end end
end end
return terms return terms
end end
function showSearchGear(searchTerms) function showSearchGear(searchTerms)
if not backpack.Gear.Visible then return end -- currently not active tab if not backpack.Gear.Visible then
return
end -- currently not active tab
local searchTermTable = splitByWhitespace(searchTerms) local searchTermTable = splitByWhitespace(searchTerms)
if searchTermTable and (#searchTermTable > 0) then if searchTermTable and (#searchTermTable > 0) then
@ -639,15 +695,15 @@ function nukeBackpack()
end end
function getGearContextMenu() function getGearContextMenu()
local gearContextMenu = Instance.new("Frame") local gearContextMenu = Instance.new "Frame"
gearContextMenu.Active = true gearContextMenu.Active = true
gearContextMenu.Name = "UnequipContextMenu" gearContextMenu.Name = "UnequipContextMenu"
gearContextMenu.Size = UDim2.new(0,115,0,70) gearContextMenu.Size = UDim2.new(0, 115, 0, 70)
gearContextMenu.Position = UDim2.new(0,-16,0,-16) gearContextMenu.Position = UDim2.new(0, -16, 0, -16)
gearContextMenu.BackgroundTransparency = 1 gearContextMenu.BackgroundTransparency = 1
gearContextMenu.Visible = false gearContextMenu.Visible = false
local gearContextMenuButton = Instance.new("TextButton") local gearContextMenuButton = Instance.new "TextButton"
gearContextMenuButton.Name = "UnequipContextMenuButton" gearContextMenuButton.Name = "UnequipContextMenuButton"
gearContextMenuButton.Text = "" gearContextMenuButton.Text = ""
gearContextMenuButton.Style = Enum.ButtonStyle.RobloxButtonDefault gearContextMenuButton.Style = Enum.ButtonStyle.RobloxButtonDefault
@ -659,7 +715,7 @@ function getGearContextMenu()
local elementHeight = 12 local elementHeight = 12
local contextMenuElements = {} local contextMenuElements = {}
local contextMenuElementsName = {"Remove Hotkey"} local contextMenuElementsName = { "Remove Hotkey" }
for i = 1, #contextMenuElementsName do for i = 1, #contextMenuElementsName do
local element = {} local element = {}
@ -667,31 +723,32 @@ function getGearContextMenu()
element.Text = contextMenuElementsName[i] element.Text = contextMenuElementsName[i]
element.Action = i element.Action = i
element.DoIt = UnequipGearMenuClick element.DoIt = UnequipGearMenuClick
table.insert(contextMenuElements,element) table.insert(contextMenuElements, element)
end end
for i, contextElement in ipairs(contextMenuElements) do for i, contextElement in ipairs(contextMenuElements) do
local element = contextElement local element = contextElement
if element.Type == "Button" then if element.Type == "Button" then
local button = Instance.new("TextButton") local button = Instance.new "TextButton"
button.Name = "UnequipContextButton" .. i button.Name = "UnequipContextButton" .. i
button.BackgroundColor3 = Color3.new(0,0,0) button.BackgroundColor3 = Color3.new(0, 0, 0)
button.BorderSizePixel = 0 button.BorderSizePixel = 0
button.TextXAlignment = Enum.TextXAlignment.Left button.TextXAlignment = Enum.TextXAlignment.Left
button.Text = " " .. contextElement.Text button.Text = " " .. contextElement.Text
button.Font = Enum.Font.Arial button.Font = Enum.Font.Arial
button.FontSize = Enum.FontSize.Size14 button.FontSize = Enum.FontSize.Size14
button.Size = UDim2.new(1, 8, 0, elementHeight) button.Size = UDim2.new(1, 8, 0, elementHeight)
button.Position = UDim2.new(0,0,0,elementHeight * i) button.Position = UDim2.new(0, 0, 0, elementHeight * i)
button.TextColor3 = Color3.new(1,1,1) button.TextColor3 = Color3.new(1, 1, 1)
button.ZIndex = 9 button.ZIndex = 9
button.Parent = gearContextMenuButton button.Parent = gearContextMenuButton
if not IsTouchDevice() then if not IsTouchDevice() then
button.MouseButton1Click:connect(function() button.MouseButton1Click:connect(function()
if button.Active and not gearContextMenu.Parent.Active then if button.Active and not gearContextMenu.Parent.Active then
local success, result = pcall(function() element.DoIt(element, gearContextMenu) end) pcall(function()
element.DoIt(element, gearContextMenu)
end)
browsingMenu = false browsingMenu = false
gearContextMenu.Visible = false gearContextMenu.Visible = false
clearHighlight(button) clearHighlight(button)
@ -714,38 +771,38 @@ function getGearContextMenu()
contextElement.Button = button contextElement.Button = button
contextElement.Element = button contextElement.Element = button
elseif element.Type == "Label" then elseif element.Type == "Label" then
local frame = Instance.new("Frame") local frame = Instance.new "Frame"
frame.Name = "ContextLabel" .. i frame.Name = "ContextLabel" .. i
frame.BackgroundTransparency = 1 frame.BackgroundTransparency = 1
frame.Size = UDim2.new(1, 8, 0, elementHeight) frame.Size = UDim2.new(1, 8, 0, elementHeight)
local label = Instance.new("TextLabel") local label = Instance.new "TextLabel"
label.Name = "Text1" label.Name = "Text1"
label.BackgroundTransparency = 1 label.BackgroundTransparency = 1
label.BackgroundColor3 = Color3.new(1,1,1) label.BackgroundColor3 = Color3.new(1, 1, 1)
label.BorderSizePixel = 0 label.BorderSizePixel = 0
label.TextXAlignment = Enum.TextXAlignment.Left label.TextXAlignment = Enum.TextXAlignment.Left
label.Font = Enum.Font.ArialBold label.Font = Enum.Font.ArialBold
label.FontSize = Enum.FontSize.Size14 label.FontSize = Enum.FontSize.Size14
label.Position = UDim2.new(0.0, 0, 0, 0) label.Position = UDim2.new(0, 0, 0, 0)
label.Size = UDim2.new(0.5, 0, 1, 0) label.Size = UDim2.new(0.5, 0, 1, 0)
label.TextColor3 = Color3.new(1,1,1) label.TextColor3 = Color3.new(1, 1, 1)
label.ZIndex = 9 label.ZIndex = 9
label.Parent = frame label.Parent = frame
element.Label1 = label element.Label1 = label
if element.GetText2 then if element.GetText2 then
label = Instance.new("TextLabel") label = Instance.new "TextLabel"
label.Name = "Text2" label.Name = "Text2"
label.BackgroundTransparency = 1 label.BackgroundTransparency = 1
label.BackgroundColor3 = Color3.new(1,1,1) label.BackgroundColor3 = Color3.new(1, 1, 1)
label.BorderSizePixel = 0 label.BorderSizePixel = 0
label.TextXAlignment = Enum.TextXAlignment.Right label.TextXAlignment = Enum.TextXAlignment.Right
label.Font = Enum.Font.Arial label.Font = Enum.Font.Arial
label.FontSize = Enum.FontSize.Size14 label.FontSize = Enum.FontSize.Size14
label.Position = UDim2.new(0.5, 0, 0, 0) label.Position = UDim2.new(0.5, 0, 0, 0)
label.Size = UDim2.new(0.5, 0, 1, 0) label.Size = UDim2.new(0.5, 0, 1, 0)
label.TextColor3 = Color3.new(1,1,1) label.TextColor3 = Color3.new(1, 1, 1)
label.ZIndex = 9 label.ZIndex = 9
label.Parent = frame label.Parent = frame
element.Label2 = label element.Label2 = label
@ -767,7 +824,7 @@ function getGearContextMenu()
return gearContextMenu return gearContextMenu
end end
function coreGuiChanged(coreGuiType,enabled) function coreGuiChanged(coreGuiType, enabled)
if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then
if not enabled then if not enabled then
backpack.Gear.Visible = false backpack.Gear.Visible = false
@ -775,7 +832,6 @@ function coreGuiChanged(coreGuiType,enabled)
end end
end end
local backpackChildren = player.Backpack:GetChildren() local backpackChildren = player.Backpack:GetChildren()
for i = 1, #backpackChildren do for i = 1, #backpackChildren do
addToGrid(backpackChildren[i]) addToGrid(backpackChildren[i])
@ -783,9 +839,10 @@ end
------------------------- Start Lifelong Connections ----------------------- ------------------------- Start Lifelong Connections -----------------------
resizeEvent.Event:connect(function(_)
resizeEvent.Event:connect(function(absSize) if debounce then
if debounce then return end return
end
debounce = true debounce = true
wait() wait()
@ -794,35 +851,49 @@ resizeEvent.Event:connect(function(absSize)
debounce = false debounce = false
end) end)
currentLoadout.ChildAdded:connect(function(child) loadoutCheck(child, false) end) currentLoadout.ChildAdded:connect(function(child)
currentLoadout.ChildRemoved:connect(function(child) loadoutCheck(child, true) end) loadoutCheck(child, false)
end)
currentLoadout.ChildRemoved:connect(function(child)
loadoutCheck(child, true)
end)
currentLoadout.DescendantAdded:connect(function(descendant) currentLoadout.DescendantAdded:connect(function(descendant)
if not backpack.Visible and ( descendant:IsA("ImageButton") or descendant:IsA("TextButton") ) then if not backpack.Visible and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") then
centerGear(currentLoadout:GetChildren()) centerGear(currentLoadout:GetChildren())
end end
end) end)
currentLoadout.DescendantRemoving:connect(function(descendant) currentLoadout.DescendantRemoving:connect(function(descendant)
if not backpack.Visible and ( descendant:IsA("ImageButton") or descendant:IsA("TextButton") ) then if not backpack.Visible and (descendant:IsA "ImageButton" or descendant:IsA "TextButton") then
wait() wait()
centerGear(currentLoadout:GetChildren()) centerGear(currentLoadout:GetChildren())
end end
end) end)
grid.MouseEnter:connect(function() clearPreview() end) grid.MouseEnter:connect(function()
grid.MouseLeave:connect(function() clearPreview() end) clearPreview()
end)
grid.MouseLeave:connect(function()
clearPreview()
end)
player.CharacterRemoving:connect(function() player.CharacterRemoving:connect(function()
removeCharacterConnections() removeCharacterConnections()
nukeBackpack() nukeBackpack()
end) end)
player.CharacterAdded:connect(function() setupCharacterConnections() end) player.CharacterAdded:connect(function()
setupCharacterConnections()
end)
player.ChildAdded:connect(function(child) player.ChildAdded:connect(function(child)
if child:IsA("Backpack") then if child:IsA "Backpack" then
playerBackpack = child playerBackpack = child
if backpackAddCon then backpackAddCon:disconnect() end if backpackAddCon then
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) addToGrid(child) end) backpackAddCon:disconnect()
end
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child)
addToGrid(child)
end)
end end
end) end)
@ -834,7 +905,7 @@ end)
local loadoutChildren = currentLoadout:GetChildren() local loadoutChildren = currentLoadout:GetChildren()
for i = 1, #loadoutChildren do for i = 1, #loadoutChildren do
if loadoutChildren[i]:IsA("Frame") and string.find(loadoutChildren[i].Name,"Slot") then if loadoutChildren[i]:IsA "Frame" and string.find(loadoutChildren[i].Name, "Slot") then
loadoutChildren[i].ChildRemoved:connect(function() loadoutChildren[i].ChildRemoved:connect(function()
updateGridActive() updateGridActive()
end) end)
@ -858,14 +929,18 @@ local loadoutChildren = currentLoadout:GetChildren()
for i = 1, #loadoutChildren do for i = 1, #loadoutChildren do
loadoutCheck(loadoutChildren[i], false) loadoutCheck(loadoutChildren[i], false)
end end
if not backpack.Visible then centerGear(currentLoadout:GetChildren()) end if not backpack.Visible then
centerGear(currentLoadout:GetChildren())
end
-- make sure that inventory is listening to gear reparenting -- make sure that inventory is listening to gear reparenting
if characterChildAddedCon == nil and game.Players.LocalPlayer["Character"] then if characterChildAddedCon == nil and game.Players.LocalPlayer["Character"] then
setupCharacterConnections() setupCharacterConnections()
end end
if not backpackAddCon then if not backpackAddCon then
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) addToGrid(child) end) backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child)
addToGrid(child)
end)
end end
backpackOpenEvent.Event:connect(backpackOpenHandler) backpackOpenEvent.Event:connect(backpackOpenHandler)

View File

@ -1,5 +1,7 @@
-- 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) -- 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)
if game.CoreGui.Version < 7 then return end -- peace out if we aren't using the right client if game.CoreGui.Version < 7 then
return
end -- peace out if we aren't using the right client
-- basic functions -- basic functions
local function waitForChild(instance, name) local function waitForChild(instance, name)
@ -15,23 +17,21 @@ local function waitForProperty(instance, property)
end end
-- don't do anything if we are in an empty game -- don't do anything if we are in an empty game
waitForChild(game,"Players") waitForChild(game, "Players")
if #game.Players:GetChildren() < 1 then if #game.Players:GetChildren() < 1 then
game.Players.ChildAdded:wait() game.Players.ChildAdded:wait()
end end
-- make sure everything is loaded in before we do anything -- make sure everything is loaded in before we do anything
-- get our local player -- get our local player
waitForProperty(game.Players,"LocalPlayer") waitForProperty(game.Players, "LocalPlayer")
local player = game.Players.LocalPlayer local player = game.Players.LocalPlayer
------------------------ Locals ------------------------------ ------------------------ Locals ------------------------------
local backpack = script.Parent local backpack = script.Parent
waitForChild(backpack,"Gear") waitForChild(backpack, "Gear")
local screen = script.Parent.Parent local screen = script.Parent.Parent
assert(screen:IsA("ScreenGui")) assert(screen:IsA "ScreenGui")
waitForChild(backpack, "Tabs") waitForChild(backpack, "Tabs")
waitForChild(backpack.Tabs, "CloseButton") waitForChild(backpack.Tabs, "CloseButton")
@ -43,19 +43,19 @@ if game.CoreGui.Version >= 8 then
waitForChild(backpack.Tabs, "WardrobeButton") waitForChild(backpack.Tabs, "WardrobeButton")
local wardrobeButton = backpack.Tabs.WardrobeButton local wardrobeButton = backpack.Tabs.WardrobeButton
end end
waitForChild(backpack.Parent,"ControlFrame") waitForChild(backpack.Parent, "ControlFrame")
local backpackButton = waitForChild(backpack.Parent.ControlFrame,"BackpackButton") local backpackButton = waitForChild(backpack.Parent.ControlFrame, "BackpackButton")
local currentTab = "gear" local currentTab = "gear"
local searchFrame = waitForChild(backpack,"SearchFrame") local searchFrame = waitForChild(backpack, "SearchFrame")
waitForChild(backpack.SearchFrame,"SearchBoxFrame") waitForChild(backpack.SearchFrame, "SearchBoxFrame")
local searchBox = waitForChild(backpack.SearchFrame.SearchBoxFrame,"SearchBox") local searchBox = waitForChild(backpack.SearchFrame.SearchBoxFrame, "SearchBox")
local searchButton = waitForChild(backpack.SearchFrame,"SearchButton") local searchButton = waitForChild(backpack.SearchFrame, "SearchButton")
local resetButton = waitForChild(backpack.SearchFrame,"ResetButton") local resetButton = waitForChild(backpack.SearchFrame, "ResetButton")
local robloxGui = waitForChild(Game.CoreGui, 'RobloxGui') local robloxGui = waitForChild(Game.CoreGui, "RobloxGui")
local currentLoadout = waitForChild(robloxGui, 'CurrentLoadout') local currentLoadout = waitForChild(robloxGui, "CurrentLoadout")
local loadoutBackground = waitForChild(currentLoadout, 'Background') local loadoutBackground = waitForChild(currentLoadout, "Background")
local canToggle = true local canToggle = true
local readyForNextEvent = true local readyForNextEvent = true
@ -79,17 +79,15 @@ if robloxGui.AbsoluteSize.Y <= 320 then
backpackSize = UDim2.new(0, 200, 0, 140) backpackSize = UDim2.new(0, 200, 0, 140)
end end
------------------------ End Locals --------------------------- ------------------------ End Locals ---------------------------
---------------------------------------- Public Event Setup ---------------------------------------- ---------------------------------------- Public Event Setup ----------------------------------------
function createPublicEvent(eventName) function createPublicEvent(eventName)
assert(eventName, "eventName is nil") assert(eventName, "eventName is nil")
assert(tostring(eventName),"eventName is not a string") assert(tostring(eventName), "eventName is not a string")
local newEvent = Instance.new("BindableEvent") local newEvent = Instance.new "BindableEvent"
newEvent.Name = tostring(eventName) newEvent.Name = tostring(eventName)
newEvent.Parent = script newEvent.Parent = script
@ -102,7 +100,7 @@ function createPublicFunction(funcName, invokeFunc)
assert(invokeFunc, "invokeFunc is nil") assert(invokeFunc, "invokeFunc is nil")
assert(type(invokeFunc) == "function", "invokeFunc should be of type 'function'") assert(type(invokeFunc) == "function", "invokeFunc should be of type 'function'")
local newFunction = Instance.new("BindableFunction") local newFunction = Instance.new "BindableFunction"
newFunction.Name = tostring(funcName) newFunction.Name = tostring(funcName)
newFunction.OnInvoke = invokeFunc newFunction.OnInvoke = invokeFunc
newFunction.Parent = script newFunction.Parent = script
@ -111,15 +109,13 @@ function createPublicFunction(funcName, invokeFunc)
end end
-- Events -- Events
local resizeEvent = createPublicEvent("ResizeEvent") local resizeEvent = createPublicEvent "ResizeEvent"
local backpackOpenEvent = createPublicEvent("BackpackOpenEvent") local backpackOpenEvent = createPublicEvent "BackpackOpenEvent"
local backpackCloseEvent = createPublicEvent("BackpackCloseEvent") local backpackCloseEvent = createPublicEvent "BackpackCloseEvent"
local tabClickedEvent = createPublicEvent("TabClickedEvent") local tabClickedEvent = createPublicEvent "TabClickedEvent"
local searchRequestedEvent = createPublicEvent("SearchRequestedEvent") local searchRequestedEvent = createPublicEvent "SearchRequestedEvent"
---------------------------------------- End Public Event Setup ---------------------------------------- ---------------------------------------- End Public Event Setup ----------------------------------------
--------------------------- Internal Functions ---------------------------------------- --------------------------- Internal Functions ----------------------------------------
function deactivateBackpack() function deactivateBackpack()
@ -140,8 +136,8 @@ function initHumanoidDiedConnections()
if humanoidDiedCon then if humanoidDiedCon then
humanoidDiedCon:disconnect() humanoidDiedCon:disconnect()
end end
waitForProperty(game.Players.LocalPlayer,"Character") waitForProperty(game.Players.LocalPlayer, "Character")
waitForChild(game.Players.LocalPlayer.Character,"Humanoid") waitForChild(game.Players.LocalPlayer.Character, "Humanoid")
humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect(deactivateBackpack) humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect(deactivateBackpack)
end end
@ -153,13 +149,20 @@ local hideBackpack = function()
backpackCloseEvent:Fire(currentTab) backpackCloseEvent:Fire(currentTab)
backpack.Tabs.Visible = false backpack.Tabs.Visible = false
searchFrame.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, 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() function()
game.GuiService:RemoveCenterDialog(backpack) game.GuiService:RemoveCenterDialog(backpack)
backpack.Visible = false backpack.Visible = false
backpackButton.Selected = false backpackButton.Selected = false
end) end
delay(guiTweenSpeed,function() )
delay(guiTweenSpeed, function()
game.GuiService:RemoveCenterDialog(backpack) game.GuiService:RemoveCenterDialog(backpack)
backpack.Visible = false backpack.Visible = false
backpackButton.Selected = false backpackButton.Selected = false
@ -169,41 +172,54 @@ local hideBackpack = function()
end end
function showBackpack() function showBackpack()
game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, function()
function()
backpack.Visible = true backpack.Visible = true
backpackButton.Selected = true backpackButton.Selected = true
end, end, function()
function()
backpack.Visible = false backpack.Visible = false
backpackButton.Selected = false backpackButton.Selected = false
end) end)
backpack.Visible = true backpack.Visible = true
backpackButton.Selected = 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) backpack:TweenSizeAndPosition(
delay(guiTweenSpeed,function() backpackSize,
UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -backpackSize.Y.Offset - 88),
Enum.EasingDirection.Out,
Enum.EasingStyle.Quad,
guiTweenSpeed,
true
)
delay(guiTweenSpeed, function()
backpack.Tabs.Visible = false backpack.Tabs.Visible = false
searchFrame.Visible = true searchFrame.Visible = true
backpackOpenEvent:Fire(currentTab) backpackOpenEvent:Fire(currentTab)
canToggle = true canToggle = true
readyForNextEvent = true readyForNextEvent = true
backpackButton.Image = 'http://www.roblox.com/asset/?id=97644093' backpackButton.Image = "http://www.roblox.com/asset/?id=97644093"
backpackButton.Position = UDim2.new(0.5, -60, 1, -backpackSize.Y.Offset - 103) backpackButton.Position = UDim2.new(0.5, -60, 1, -backpackSize.Y.Offset - 103)
end) end)
end end
function toggleBackpack() function toggleBackpack()
if not game.Players.LocalPlayer then return end if not game.Players.LocalPlayer then
if not game.Players.LocalPlayer["Character"] then return end return
if not canToggle then return end end
if not readyForNextEvent 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 readyForNextEvent = false
canToggle = false canToggle = false
backpackIsOpen = not backpackIsOpen backpackIsOpen = not backpackIsOpen
if backpackIsOpen then if backpackIsOpen then
loadoutBackground.Image = 'http://www.roblox.com/asset/?id=97623721' loadoutBackground.Image = "http://www.roblox.com/asset/?id=97623721"
loadoutBackground.Position = UDim2.new(-0.03, 0, -0.17, 0) loadoutBackground.Position = UDim2.new(-0.03, 0, -0.17, 0)
loadoutBackground.Size = UDim2.new(1.05, 0, 1.25, 0) loadoutBackground.Size = UDim2.new(1.05, 0, 1.25, 0)
loadoutBackground.ZIndex = 2.0 loadoutBackground.ZIndex = 2.0
@ -214,21 +230,20 @@ function toggleBackpack()
loadoutBackground.Visible = false loadoutBackground.Visible = false
backpackButton.Selected = false backpackButton.Selected = false
backpackButton.Image = "http://www.roblox.com/asset/?id=97617958" backpackButton.Image = "http://www.roblox.com/asset/?id=97617958"
loadoutBackground.Image = 'http://www.roblox.com/asset/?id=96536002' loadoutBackground.Image = "http://www.roblox.com/asset/?id=96536002"
loadoutBackground.Position = UDim2.new(-0.1, 0, -0.1, 0) loadoutBackground.Position = UDim2.new(-0.1, 0, -0.1, 0)
loadoutBackground.Size = UDim2.new(1.2, 0, 1.2, 0) loadoutBackground.Size = UDim2.new(1.2, 0, 1.2, 0)
hideBackpack() hideBackpack()
local clChildren = currentLoadout:GetChildren() local clChildren = currentLoadout:GetChildren()
for i = 1, #clChildren do for i = 1, #clChildren do
if clChildren[i] and clChildren[i]:IsA('Frame') then if clChildren[i] and clChildren[i]:IsA "Frame" then
local frame = clChildren[i] local frame = clChildren[i]
if #frame:GetChildren() > 0 then if #frame:GetChildren() > 0 then
backpackButton.Position = UDim2.new(0.5, -60, 1, -108) backpackButton.Position = UDim2.new(0.5, -60, 1, -108)
backpackButton.Visible = true backpackButton.Visible = true
loadoutBackground.Visible = true loadoutBackground.Visible = true
if frame:GetChildren()[1]:IsA('ImageButton') then if frame:GetChildren()[1]:IsA "ImageButton" then
local imgButton = frame:GetChildren()[1] local imgButton = frame:GetChildren()[1]
imgButton.Active = true imgButton.Active = true
imgButton.Draggable = false imgButton.Draggable = false
@ -236,7 +251,6 @@ function toggleBackpack()
end end
end end
end end
end end
end end
@ -248,20 +262,20 @@ end
function setSelected(tab) function setSelected(tab)
assert(tab) assert(tab)
assert(tab:IsA("TextButton")) assert(tab:IsA "TextButton")
tab.BackgroundColor3 = Color3.new(1,1,1) tab.BackgroundColor3 = Color3.new(1, 1, 1)
tab.TextColor3 = Color3.new(0,0,0) tab.TextColor3 = Color3.new(0, 0, 0)
tab.Selected = true tab.Selected = true
tab.ZIndex = 3 tab.ZIndex = 3
end end
function setUnselected(tab) function setUnselected(tab)
assert(tab) assert(tab)
assert(tab:IsA("TextButton")) assert(tab:IsA "TextButton")
tab.BackgroundColor3 = Color3.new(0,0,0) tab.BackgroundColor3 = Color3.new(0, 0, 0)
tab.TextColor3 = Color3.new(1,1,1) tab.TextColor3 = Color3.new(1, 1, 1)
tab.Selected = false tab.Selected = false
tab.ZIndex = 1 tab.ZIndex = 1
end end
@ -280,20 +294,24 @@ end
function mouseLeaveTab(button) function mouseLeaveTab(button)
assert(button) assert(button)
assert(button:IsA("TextButton")) assert(button:IsA "TextButton")
if button.Selected then return end if button.Selected then
return
end
button.BackgroundColor3 = Color3.new(0,0,0) button.BackgroundColor3 = Color3.new(0, 0, 0)
end end
function mouseOverTab(button) function mouseOverTab(button)
assert(button) assert(button)
assert(button:IsA("TextButton")) assert(button:IsA "TextButton")
if button.Selected then return end if button.Selected then
return
end
button.BackgroundColor3 = Color3.new(39/255,39/255,39/255) button.BackgroundColor3 = Color3.new(39 / 255, 39 / 255, 39 / 255)
end end
function newTabClicked(tabName) function newTabClicked(tabName)
@ -311,12 +329,14 @@ function trim(s)
end end
function splitByWhitespace(text) function splitByWhitespace(text)
if type(text) ~= "string" then return nil end if type(text) ~= "string" then
return nil
end
local terms = {} local terms = {}
for token in string.gmatch(text, "[^%s]+") do for token in string.gmatch(text, "[^%s]+") do
if string.len(token) > 0 then if string.len(token) > 0 then
table.insert(terms,token) table.insert(terms, token)
end end
end end
return terms return terms
@ -348,7 +368,7 @@ local backpackReady = function()
readyForNextEvent = true readyForNextEvent = true
end end
function coreGuiChanged(coreGuiType,enabled) function coreGuiChanged(coreGuiType, enabled)
if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then
active = enabled active = enabled
disabledByDeveloper = not enabled disabledByDeveloper = not enabled
@ -374,13 +394,11 @@ end
--------------------------- End Internal Functions ------------------------------------- --------------------------- End Internal Functions -------------------------------------
------------------------------ Public Functions Setup ------------------------------------- ------------------------------ Public Functions Setup -------------------------------------
createPublicFunction("CloseBackpack", hideBackpack) createPublicFunction("CloseBackpack", hideBackpack)
createPublicFunction("BackpackReady", backpackReady) createPublicFunction("BackpackReady", backpackReady)
------------------------------ End Public Functions Setup --------------------------------- ------------------------------ End Public Functions Setup ---------------------------------
------------------------ Connections/Script Main ------------------------------------------- ------------------------ Connections/Script Main -------------------------------------------
pcall(function() pcall(function()
@ -388,14 +406,26 @@ pcall(function()
Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged) Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged)
end) end)
inventoryButton.MouseButton1Click:connect(function() newTabClicked("gear") end) inventoryButton.MouseButton1Click:connect(function()
inventoryButton.MouseEnter:connect(function() mouseOverTab(inventoryButton) end) newTabClicked "gear"
inventoryButton.MouseLeave:connect(function() mouseLeaveTab(inventoryButton) end) end)
inventoryButton.MouseEnter:connect(function()
mouseOverTab(inventoryButton)
end)
inventoryButton.MouseLeave:connect(function()
mouseLeaveTab(inventoryButton)
end)
if game.CoreGui.Version >= 8 then if game.CoreGui.Version >= 8 then
wardrobeButton.MouseButton1Click:connect(function() newTabClicked("wardrobe") end) wardrobeButton.MouseButton1Click:connect(function()
wardrobeButton.MouseEnter:connect(function() mouseOverTab(wardrobeButton) end) newTabClicked "wardrobe"
wardrobeButton.MouseLeave:connect(function() mouseLeaveTab(wardrobeButton) end) end)
wardrobeButton.MouseEnter:connect(function()
mouseOverTab(wardrobeButton)
end)
wardrobeButton.MouseLeave:connect(function()
mouseLeaveTab(wardrobeButton)
end)
end end
closeButton.MouseButton1Click:connect(closeBackpack) closeButton.MouseButton1Click:connect(closeBackpack)
@ -410,13 +440,17 @@ end)
game:GetService("GuiService"):AddKey(tilde) game:GetService("GuiService"):AddKey(tilde)
game:GetService("GuiService"):AddKey(backquote) game:GetService("GuiService"):AddKey(backquote)
game:GetService("GuiService").KeyPressed:connect(function(key) game:GetService("GuiService").KeyPressed:connect(function(key)
if not active or disabledByDeveloper then return end if not active or disabledByDeveloper then
return
end
if key == tilde or key == backquote then if key == tilde or key == backquote then
toggleBackpack() toggleBackpack()
end end
end) end)
backpackButton.MouseButton1Click:connect(function() backpackButton.MouseButton1Click:connect(function()
if not active or disabledByDeveloper then return end if not active or disabledByDeveloper then
return
end
toggleBackpack() toggleBackpack()
end) end)

File diff suppressed because it is too large Load Diff

9505
mercury.yml Normal file

File diff suppressed because it is too large Load Diff

1
selene.toml Normal file
View File

@ -0,0 +1 @@
std = "mercury"

6
stylua.toml Normal file
View File

@ -0,0 +1,6 @@
column_width = 120
line_endings = "Unix"
indent_type = "Tabs"
indent_width = 4
quote_style = "AutoPreferDouble"
call_parentheses = "None"