Fuck with the CoreScripts despite task telling me very clearly not to fuck with the corescripts
This commit is contained in:
parent
26dfa13ee3
commit
bb1eb0faa6
600
107893730.lua
600
107893730.lua
File diff suppressed because it is too large
Load Diff
|
|
@ -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
|
||||||
|
|
|
||||||
307
153556783.lua
307
153556783.lua
|
|
@ -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
|
||||||
|
|
|
||||||
784
157877000.lua
784
157877000.lua
File diff suppressed because it is too large
Load Diff
56
36868950.lua
56
36868950.lua
|
|
@ -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
|
||||||
|
|
|
||||||
66
37801172.lua
66
37801172.lua
|
|
@ -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
|
||||||
143
38037565.lua
143
38037565.lua
|
|
@ -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, "Head")
|
local Humanoid = waitForChild(Figure, "Humanoid")
|
||||||
local Humanoid = waitForChild(Figure, "Humanoid")
|
local Torso = waitForChild(Figure, "Torso")
|
||||||
local walkSpeed = Humanoid.WalkSpeed
|
|
||||||
local Torso = waitForChild(Figure, "Torso")
|
|
||||||
|
|
||||||
local config = Figure:FindFirstChild("PlayerStats")
|
local config = Figure:FindFirstChild "PlayerStats"
|
||||||
|
|
||||||
local inCharTag = Instance.new("BoolValue")
|
local inCharTag = Instance.new "BoolValue"
|
||||||
inCharTag.Name = "InCharTag"
|
inCharTag.Name = "InCharTag"
|
||||||
|
|
||||||
local hider = Instance.new("BoolValue")
|
local hider = Instance.new "BoolValue"
|
||||||
hider.Name = "RobloxBuildTool"
|
hider.Name = "RobloxBuildTool"
|
||||||
|
|
||||||
local currentChildren
|
local currentChildren
|
||||||
local backpackTools
|
local backpackTools
|
||||||
|
|
||||||
if config == nil then
|
if config == nil then
|
||||||
config = Instance.new("Configuration")
|
config = Instance.new "Configuration"
|
||||||
config.Parent = Figure
|
config.Parent = Figure
|
||||||
config.Name = "PlayerStats"
|
config.Name = "PlayerStats"
|
||||||
end
|
end
|
||||||
|
|
||||||
local myHealth = config:FindFirstChild("MaxHealth")
|
local myHealth = config:FindFirstChild "MaxHealth"
|
||||||
if myHealth == nil then
|
if myHealth == nil then
|
||||||
myHealth = Instance.new("NumberValue")
|
myHealth = Instance.new "NumberValue"
|
||||||
myHealth.Parent = config
|
myHealth.Parent = config
|
||||||
myHealth.Value = 100
|
myHealth.Value = 100
|
||||||
myHealth.Name = "MaxHealth"
|
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("DamageOverTimeGui")
|
local dotGui = vPlayer.PlayerGui:FindFirstChild "DamageOverTimeGui"
|
||||||
if dotGui == nil then
|
if dotGui == nil then
|
||||||
dotGui = Instance.new("BillboardGui")
|
dotGui = Instance.new "BillboardGui"
|
||||||
dotGui.Name = "DamageOverTimeGui"
|
dotGui.Name = "DamageOverTimeGui"
|
||||||
dotGui.Parent = vPlayer.PlayerGui
|
dotGui.Parent = vPlayer.PlayerGui
|
||||||
dotGui.Adornee = script.Parent:FindFirstChild("Head")
|
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("newHealth declarations finished")
|
print "newHealth declarations finished"
|
||||||
|
|
||||||
function billboardHealthChange(dmg)
|
function billboardHealthChange(dmg)
|
||||||
local textLabel = Instance.new("TextLabel")
|
local textLabel = Instance.new "TextLabel"
|
||||||
if dmg > 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 >=0 then
|
if myHealth.Value >= 0 then
|
||||||
Humanoid.MaxHealth = myHealth.Value
|
Humanoid.MaxHealth = myHealth.Value
|
||||||
print(Humanoid.MaxHealth)
|
print(Humanoid.MaxHealth)
|
||||||
if Humanoid.Health > 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("Fire")
|
fireEffect = Instance.new "Fire"
|
||||||
fireEffect.Heat = 0.1
|
fireEffect.Heat = 0.1
|
||||||
fireEffect.Size = 3.0
|
fireEffect.Size = 3.0
|
||||||
fireEffect.Name = "FireEffect"
|
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 > 0 then -- and health < 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("Regen")
|
regen = config:FindFirstChild "Regen"
|
||||||
poison = config:FindFirstChild("Poison")
|
poison = config:FindFirstChild "Poison"
|
||||||
ice = config:FindFirstChild("Ice")
|
ice = config:FindFirstChild "Ice"
|
||||||
fire = config:FindFirstChild("Fire")
|
fire = config:FindFirstChild "Fire"
|
||||||
stun = config:FindFirstChild("Stun")
|
stun = config:FindFirstChild "Stun"
|
||||||
if regen then
|
if regen then
|
||||||
delta = delta + regen.Value.X
|
delta = delta + regen.Value.X
|
||||||
if regen.Value.Y >= 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 >= 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("IN ICE")
|
--print("IN ICE")
|
||||||
delta = delta - ice.Value.X
|
delta = delta - ice.Value.X
|
||||||
if ice.Value.Y >=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 >= 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 > 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 == "Tool" 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("RobloxBuildTool") == 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("RobloxBuildTool")
|
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("InCharTag")
|
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 < 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 > 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
|
||||||
|
|
|
||||||
188
39250920.lua
188
39250920.lua
|
|
@ -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
|
||||||
|
|
|
||||||
1851
45284430.lua
1851
45284430.lua
File diff suppressed because it is too large
Load Diff
19
45374389.lua
19
45374389.lua
|
|
@ -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
|
||||||
1142
46295863.lua
1142
46295863.lua
File diff suppressed because it is too large
Load Diff
2579
48488235.lua
2579
48488235.lua
File diff suppressed because it is too large
Load Diff
255
48488398.lua
255
48488398.lua
|
|
@ -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
|
||||||
38
48488451.lua
38
48488451.lua
|
|
@ -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
|
||||||
|
|
|
||||||
1377
53878047.lua
1377
53878047.lua
File diff suppressed because it is too large
Load Diff
621
53878057.lua
621
53878057.lua
File diff suppressed because it is too large
Load Diff
|
|
@ -1 +0,0 @@
|
||||||
|
|
||||||
522
60595411.lua
522
60595411.lua
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
1131
73157242.lua
1131
73157242.lua
File diff suppressed because it is too large
Load Diff
421
89449008.lua
421
89449008.lua
|
|
@ -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)
|
||||||
|
|
|
||||||
186
89449093.lua
186
89449093.lua
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
1533
97188756.lua
1533
97188756.lua
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1 @@
|
||||||
|
std = "mercury"
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
column_width = 120
|
||||||
|
line_endings = "Unix"
|
||||||
|
indent_type = "Tabs"
|
||||||
|
indent_width = 4
|
||||||
|
quote_style = "AutoPreferDouble"
|
||||||
|
call_parentheses = "None"
|
||||||
Loading…
Reference in New Issue