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
|
||||
|
||||
-- Variables
|
||||
local contextActionService = Game:GetService("ContextActionService")
|
||||
local contextActionService = Game:GetService "ContextActionService"
|
||||
local isTouchDevice = Game:GetService("UserInputService").TouchEnabled
|
||||
local functionTable = {}
|
||||
local buttonVector = {}
|
||||
|
|
@ -17,14 +17,14 @@ local ContextUpImage = "http://www.banland.xyz/asset/?id=97166444"
|
|||
local oldTouches = {}
|
||||
|
||||
local buttonPositionTable = {
|
||||
[1] = UDim2.new(0,123,0,70),
|
||||
[2] = UDim2.new(0,30,0,60),
|
||||
[3] = UDim2.new(0,180,0,160),
|
||||
[4] = UDim2.new(0,85,0,-25),
|
||||
[5] = UDim2.new(0,185,0,-25),
|
||||
[6] = UDim2.new(0,185,0,260),
|
||||
[7] = UDim2.new(0,216,0,65)
|
||||
}
|
||||
[1] = UDim2.new(0, 123, 0, 70),
|
||||
[2] = UDim2.new(0, 30, 0, 60),
|
||||
[3] = UDim2.new(0, 180, 0, 160),
|
||||
[4] = UDim2.new(0, 85, 0, -25),
|
||||
[5] = UDim2.new(0, 185, 0, -25),
|
||||
[6] = UDim2.new(0, 185, 0, 260),
|
||||
[7] = UDim2.new(0, 216, 0, 65),
|
||||
}
|
||||
local maxButtons = #buttonPositionTable
|
||||
|
||||
-- Preload images
|
||||
|
|
@ -41,13 +41,13 @@ end
|
|||
|
||||
function createContextActionGui()
|
||||
if not buttonScreenGui and isTouchDevice then
|
||||
buttonScreenGui = Instance.new("ScreenGui")
|
||||
buttonScreenGui = Instance.new "ScreenGui"
|
||||
buttonScreenGui.Name = "ContextActionGui"
|
||||
|
||||
buttonFrame = Instance.new("Frame")
|
||||
buttonFrame = Instance.new "Frame"
|
||||
buttonFrame.BackgroundTransparency = 1
|
||||
buttonFrame.Size = UDim2.new(0.3,0,0.5,0)
|
||||
buttonFrame.Position = UDim2.new(0.7,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.Name = "ContextButtonFrame"
|
||||
buttonFrame.Parent = buttonScreenGui
|
||||
end
|
||||
|
|
@ -66,7 +66,7 @@ function setButtonSizeAndPosition(object)
|
|||
xOffset = 40
|
||||
end
|
||||
|
||||
object.Size = UDim2.new(0,buttonSize,0,buttonSize)
|
||||
object.Size = UDim2.new(0, buttonSize, 0, buttonSize)
|
||||
end
|
||||
|
||||
function contextButtonDown(button, inputObject, actionName)
|
||||
|
|
@ -85,7 +85,10 @@ end
|
|||
|
||||
function contextButtonUp(button, inputObject, actionName)
|
||||
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)
|
||||
end
|
||||
end
|
||||
|
|
@ -94,26 +97,27 @@ function isSmallScreenDevice()
|
|||
return Game:GetService("GuiService"):GetScreenResolution().y <= 320
|
||||
end
|
||||
|
||||
|
||||
function createNewButton(actionName, functionInfoTable)
|
||||
local contextButton = Instance.new("ImageButton")
|
||||
local contextButton = Instance.new "ImageButton"
|
||||
contextButton.Name = "ContextActionButton"
|
||||
contextButton.BackgroundTransparency = 1
|
||||
contextButton.Size = UDim2.new(0,90,0,90)
|
||||
contextButton.Size = UDim2.new(0, 90, 0, 90)
|
||||
contextButton.Active = true
|
||||
if isSmallScreenDevice() then
|
||||
contextButton.Size = UDim2.new(0,70,0,70)
|
||||
contextButton.Size = UDim2.new(0, 70, 0, 70)
|
||||
end
|
||||
contextButton.Image = ContextUpImage
|
||||
contextButton.Parent = buttonFrame
|
||||
|
||||
local currentButtonTouch = nil
|
||||
|
||||
Game:GetService("UserInputService").InputEnded:connect(function ( inputObject )
|
||||
Game:GetService("UserInputService").InputEnded:connect(function(inputObject)
|
||||
oldTouches[inputObject] = nil
|
||||
end)
|
||||
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
|
||||
currentButtonTouch = inputObject
|
||||
|
|
@ -121,21 +125,29 @@ function createNewButton(actionName, functionInfoTable)
|
|||
end
|
||||
end)
|
||||
contextButton.InputChanged:connect(function(inputObject)
|
||||
if oldTouches[inputObject] then return end
|
||||
if currentButtonTouch ~= inputObject then return end
|
||||
if oldTouches[inputObject] then
|
||||
return
|
||||
end
|
||||
if currentButtonTouch ~= inputObject then
|
||||
return
|
||||
end
|
||||
|
||||
contextButtonMoved(contextButton, inputObject, actionName)
|
||||
end)
|
||||
contextButton.InputEnded:connect(function(inputObject)
|
||||
if oldTouches[inputObject] then return end
|
||||
if currentButtonTouch ~= inputObject then return end
|
||||
if oldTouches[inputObject] then
|
||||
return
|
||||
end
|
||||
if currentButtonTouch ~= inputObject then
|
||||
return
|
||||
end
|
||||
|
||||
currentButtonTouch = nil
|
||||
oldTouches[inputObject] = true
|
||||
contextButtonUp(contextButton, inputObject, actionName)
|
||||
end)
|
||||
|
||||
local actionIcon = Instance.new("ImageLabel")
|
||||
local actionIcon = Instance.new "ImageLabel"
|
||||
actionIcon.Name = "ActionIcon"
|
||||
actionIcon.Position = UDim2.new(0.175, 0, 0.175, 0)
|
||||
actionIcon.Size = UDim2.new(0.65, 0, 0.65, 0)
|
||||
|
|
@ -145,12 +157,12 @@ function createNewButton(actionName, functionInfoTable)
|
|||
end
|
||||
actionIcon.Parent = contextButton
|
||||
|
||||
local actionTitle = Instance.new("TextLabel")
|
||||
local actionTitle = Instance.new "TextLabel"
|
||||
actionTitle.Name = "ActionTitle"
|
||||
actionTitle.Size = UDim2.new(1,0,1,0)
|
||||
actionTitle.Size = UDim2.new(1, 0, 1, 0)
|
||||
actionTitle.BackgroundTransparency = 1
|
||||
actionTitle.Font = Enum.Font.SourceSansBold
|
||||
actionTitle.TextColor3 = Color3.new(1,1,1)
|
||||
actionTitle.TextColor3 = Color3.new(1, 1, 1)
|
||||
actionTitle.TextStrokeTransparency = 0
|
||||
actionTitle.FontSize = Enum.FontSize.Size18
|
||||
actionTitle.TextWrapped = true
|
||||
|
|
@ -163,11 +175,11 @@ function createNewButton(actionName, functionInfoTable)
|
|||
return contextButton
|
||||
end
|
||||
|
||||
function createButton( actionName, functionInfoTable )
|
||||
function createButton(actionName, functionInfoTable)
|
||||
local button = createNewButton(actionName, functionInfoTable)
|
||||
|
||||
local position = nil
|
||||
for i = 1,#buttonVector do
|
||||
for i = 1, #buttonVector do
|
||||
if buttonVector[i] == "empty" then
|
||||
position = i
|
||||
break
|
||||
|
|
@ -194,14 +206,16 @@ function createButton( actionName, functionInfoTable )
|
|||
end
|
||||
|
||||
function removeAction(actionName)
|
||||
if not functionTable[actionName] then return end
|
||||
if not functionTable[actionName] then
|
||||
return
|
||||
end
|
||||
|
||||
local actionButton = functionTable[actionName]["button"]
|
||||
|
||||
if actionButton then
|
||||
actionButton.Parent = nil
|
||||
|
||||
for i = 1,#buttonVector do
|
||||
for i = 1, #buttonVector do
|
||||
if buttonVector[i] == actionButton then
|
||||
buttonVector[i] = "empty"
|
||||
break
|
||||
|
|
@ -214,11 +228,11 @@ function removeAction(actionName)
|
|||
functionTable[actionName] = nil
|
||||
end
|
||||
|
||||
function addAction(actionName,createTouchButton,functionInfoTable)
|
||||
function addAction(actionName, createTouchButton, functionInfoTable)
|
||||
if functionTable[actionName] then
|
||||
removeAction(actionName)
|
||||
end
|
||||
functionTable[actionName] = {functionInfoTable}
|
||||
functionTable[actionName] = { functionInfoTable }
|
||||
if createTouchButton and isTouchDevice then
|
||||
createContextActionGui()
|
||||
createButton(actionName, functionInfoTable)
|
||||
|
|
@ -226,7 +240,7 @@ function addAction(actionName,createTouchButton,functionInfoTable)
|
|||
end
|
||||
|
||||
-- Connections
|
||||
contextActionService.BoundActionChanged:connect( function(actionName, changeName, changeTable)
|
||||
contextActionService.BoundActionChanged:connect(function(actionName, changeName, changeTable)
|
||||
if functionTable[actionName] and changeTable then
|
||||
local button = functionTable[actionName]["button"]
|
||||
if button then
|
||||
|
|
@ -243,15 +257,15 @@ contextActionService.BoundActionChanged:connect( function(actionName, changeName
|
|||
end
|
||||
end)
|
||||
|
||||
contextActionService.BoundActionAdded:connect( function(actionName, createTouchButton, functionInfoTable)
|
||||
contextActionService.BoundActionAdded:connect(function(actionName, createTouchButton, functionInfoTable)
|
||||
addAction(actionName, createTouchButton, functionInfoTable)
|
||||
end)
|
||||
|
||||
contextActionService.BoundActionRemoved:connect( function(actionName, functionInfoTable)
|
||||
contextActionService.BoundActionRemoved:connect(function(actionName, functionInfoTable)
|
||||
removeAction(actionName)
|
||||
end)
|
||||
|
||||
contextActionService.GetActionButtonEvent:connect( function(actionName)
|
||||
contextActionService.GetActionButtonEvent:connect(function(actionName)
|
||||
if functionTable[actionName] then
|
||||
contextActionService:FireActionButtonFoundSignal(actionName, functionTable[actionName]["button"])
|
||||
end
|
||||
|
|
@ -260,5 +274,5 @@ end)
|
|||
-- make sure any bound data before we setup connections is handled
|
||||
local boundActions = contextActionService:GetAllBoundActionInfo()
|
||||
for actionName, actionData in pairs(boundActions) do
|
||||
addAction(actionName,actionData["createTouchButton"],actionData)
|
||||
addAction(actionName, actionData["createTouchButton"], actionData)
|
||||
end
|
||||
|
|
|
|||
307
153556783.lua
307
153556783.lua
|
|
@ -6,21 +6,23 @@
|
|||
while not Game do
|
||||
wait()
|
||||
end
|
||||
while not Game:FindFirstChild("Players") do
|
||||
while not Game:FindFirstChild "Players" do
|
||||
wait()
|
||||
end
|
||||
while not Game.Players.LocalPlayer do
|
||||
wait()
|
||||
end
|
||||
while not Game:FindFirstChild("CoreGui") do
|
||||
while not Game:FindFirstChild "CoreGui" do
|
||||
wait()
|
||||
end
|
||||
while not Game.CoreGui:FindFirstChild("RobloxGui") do
|
||||
while not Game.CoreGui:FindFirstChild "RobloxGui" do
|
||||
wait()
|
||||
end
|
||||
|
||||
local userInputService = Game:GetService("UserInputService")
|
||||
local success = pcall(function() userInputService:IsLuaTouchControls() end)
|
||||
local userInputService = Game:GetService "UserInputService"
|
||||
local success = pcall(function()
|
||||
userInputService:IsLuaTouchControls()
|
||||
end)
|
||||
if not success then
|
||||
script:Destroy()
|
||||
end
|
||||
|
|
@ -34,7 +36,6 @@ function isSmallScreenDevice()
|
|||
end
|
||||
|
||||
local localPlayer = Game.Players.LocalPlayer
|
||||
local thumbstickInactiveAlpha = 0.3
|
||||
local thumbstickSize = 120
|
||||
if isSmallScreenDevice() then
|
||||
thumbstickSize = 70
|
||||
|
|
@ -58,7 +59,6 @@ local CameraZoomSensitivity = 0.03
|
|||
local PinchZoomDelay = 0.2
|
||||
local cameraTouch = nil
|
||||
|
||||
|
||||
-- make sure all of our images are good to go
|
||||
Game:GetService("ContentProvider"):Preload(touchControlsSheet)
|
||||
|
||||
|
|
@ -69,11 +69,16 @@ Game:GetService("ContentProvider"):Preload(touchControlsSheet)
|
|||
function DistanceBetweenTwoPoints(point1, point2)
|
||||
local dx = point2.x - point1.x
|
||||
local dy = point2.y - point1.y
|
||||
return math.sqrt( (dx*dx) + (dy*dy) )
|
||||
return math.sqrt((dx * dx) + (dy * dy))
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
function rotatePointAboutLocation(pointToRotate, pointToRotateAbout, radians)
|
||||
|
|
@ -95,106 +100,148 @@ function rotatePointAboutLocation(pointToRotate, pointToRotateAbout, radians)
|
|||
return transformedPoint
|
||||
end
|
||||
|
||||
function dotProduct(v1,v2)
|
||||
return ((v1.x*v2.x) + (v1.y*v2.y))
|
||||
function dotProduct(v1, v2)
|
||||
return ((v1.x * v2.x) + (v1.y * v2.y))
|
||||
end
|
||||
|
||||
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)
|
||||
|
||||
-- thumbstick is moving outside our region, need to cap its distance
|
||||
if centerDiff > (thumbstickSize/2) then
|
||||
local thumbVector = Vector2.new(touchLocation.x - thumbstickOuterCenterPosition.x,touchLocation.y - thumbstickOuterCenterPosition.y);
|
||||
if centerDiff > (thumbstickSize / 2) then
|
||||
local thumbVector = Vector2.new(
|
||||
touchLocation.x - thumbstickOuterCenterPosition.x,
|
||||
touchLocation.y - thumbstickOuterCenterPosition.y
|
||||
)
|
||||
local normal = thumbVector.unit
|
||||
if normal.x == math.nan or normal.x == math.inf then
|
||||
normal = Vector2.new(0,normal.y)
|
||||
normal = Vector2.new(0, normal.y)
|
||||
end
|
||||
if normal.y == math.nan or normal.y == math.inf then
|
||||
normal = Vector2.new(normal.x,0)
|
||||
normal = Vector2.new(normal.x, 0)
|
||||
end
|
||||
|
||||
local newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize/2))
|
||||
local newThumbstickInnerPosition = thumbstickOuterCenterPosition + (normal * (thumbstickSize / 2))
|
||||
thumbstickFrame.Position = transformFromCenterToTopLeft(newThumbstickInnerPosition, thumbstickFrame)
|
||||
else
|
||||
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation,thumbstickFrame)
|
||||
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame)
|
||||
end
|
||||
|
||||
return Vector2.new(thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset)
|
||||
return Vector2.new(
|
||||
thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,
|
||||
thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset
|
||||
)
|
||||
end
|
||||
|
||||
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)
|
||||
if DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) > thumbstickSize/2 then
|
||||
local thumbstickInnerCenter = Vector2.new(thumbstickFrame.Position.X.Offset + thumbstickFrame.AbsoluteSize.x/2, thumbstickFrame.Position.Y.Offset + thumbstickFrame.AbsoluteSize.y/2)
|
||||
local movementVectorUnit = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit
|
||||
if DistanceBetweenTwoPoints(touchLocation, thumbstickOuterCenter) > thumbstickSize / 2 then
|
||||
local thumbstickInnerCenter = Vector2.new(
|
||||
thumbstickFrame.Position.X.Offset + thumbstickFrame.AbsoluteSize.x / 2,
|
||||
thumbstickFrame.Position.Y.Offset + thumbstickFrame.AbsoluteSize.y / 2
|
||||
)
|
||||
local movementVectorUnit =
|
||||
Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y).unit
|
||||
|
||||
local outerToInnerVectorCurrent = Vector2.new(thumbstickInnerCenter.x - thumbstickOuterCenter.x, thumbstickInnerCenter.y - thumbstickOuterCenter.y)
|
||||
local outerToInnerVectorCurrent = Vector2.new(
|
||||
thumbstickInnerCenter.x - thumbstickOuterCenter.x,
|
||||
thumbstickInnerCenter.y - thumbstickOuterCenter.y
|
||||
)
|
||||
local outerToInnerVectorCurrentUnit = outerToInnerVectorCurrent.unit
|
||||
local movementVector = Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y)
|
||||
local movementVector =
|
||||
Vector2.new(touchLocation.x - thumbstickInnerCenter.x, touchLocation.y - thumbstickInnerCenter.y)
|
||||
|
||||
-- First, find the angle between the new thumbstick movement vector,
|
||||
-- and the vector between thumbstick inner and thumbstick outer.
|
||||
-- We will use this to pivot thumbstick outer around thumbstick inner, gives a nice joystick feel
|
||||
local crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y) - (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x)
|
||||
local angle = math.atan2(crossOuterToInnerWithMovement, dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit))
|
||||
local anglePercent = angle * math.min( (movementVector.magnitude)/(outerToInnerVectorCurrent.magnitude), 1.0);
|
||||
local crossOuterToInnerWithMovement = (outerToInnerVectorCurrentUnit.x * movementVectorUnit.y)
|
||||
- (outerToInnerVectorCurrentUnit.y * movementVectorUnit.x)
|
||||
local angle =
|
||||
math.atan2(crossOuterToInnerWithMovement, dotProduct(outerToInnerVectorCurrentUnit, movementVectorUnit))
|
||||
local anglePercent = angle * math.min(movementVector.magnitude / outerToInnerVectorCurrent.magnitude, 1.0)
|
||||
|
||||
-- If angle is significant, rotate about the inner thumbsticks current center
|
||||
if math.abs(anglePercent) > 0.00001 then
|
||||
local outerThumbCenter = rotatePointAboutLocation(thumbstickOuterCenter, thumbstickInnerCenter, anglePercent)
|
||||
thumbstickOuter.Position = transformFromCenterToTopLeft(Vector2.new(outerThumbCenter.x,outerThumbCenter.y), thumbstickOuter)
|
||||
local outerThumbCenter =
|
||||
rotatePointAboutLocation(thumbstickOuterCenter, thumbstickInnerCenter, anglePercent)
|
||||
thumbstickOuter.Position =
|
||||
transformFromCenterToTopLeft(Vector2.new(outerThumbCenter.x, outerThumbCenter.y), thumbstickOuter)
|
||||
end
|
||||
|
||||
-- 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
|
||||
|
||||
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation,thumbstickFrame)
|
||||
thumbstickFrame.Position = transformFromCenterToTopLeft(touchLocation, thumbstickFrame)
|
||||
|
||||
-- a bit of error checking to make sure thumbsticks stay close to eachother
|
||||
thumbstickFramePosition = Vector2.new(thumbstickFrame.Position.X.Offset,thumbstickFrame.Position.Y.Offset)
|
||||
thumbstickOuterPosition = Vector2.new(thumbstickOuter.Position.X.Offset,thumbstickOuter.Position.Y.Offset)
|
||||
if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize/2 then
|
||||
local vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize/2
|
||||
thumbstickOuter.Position = UDim2.new(0,thumbstickFramePosition.x + vectorWithLength.x,0,thumbstickFramePosition.y + vectorWithLength.y)
|
||||
thumbstickFramePosition = Vector2.new(thumbstickFrame.Position.X.Offset, thumbstickFrame.Position.Y.Offset)
|
||||
thumbstickOuterPosition = Vector2.new(thumbstickOuter.Position.X.Offset, thumbstickOuter.Position.Y.Offset)
|
||||
if DistanceBetweenTwoPoints(thumbstickFramePosition, thumbstickOuterPosition) > thumbstickSize / 2 then
|
||||
local vectorWithLength = (thumbstickOuterPosition - thumbstickFramePosition).unit * thumbstickSize / 2
|
||||
thumbstickOuter.Position = UDim2.new(
|
||||
0,
|
||||
thumbstickFramePosition.x + vectorWithLength.x,
|
||||
0,
|
||||
thumbstickFramePosition.y + vectorWithLength.y
|
||||
)
|
||||
end
|
||||
|
||||
return Vector2.new(thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset)
|
||||
return Vector2.new(
|
||||
thumbstickFrame.Position.X.Offset - thumbstickOuter.Position.X.Offset,
|
||||
thumbstickFrame.Position.Y.Offset - thumbstickOuter.Position.Y.Offset
|
||||
)
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThumbstick)
|
||||
local thumbstickFrame = Instance.new("Frame")
|
||||
local thumbstickFrame = Instance.new "Frame"
|
||||
thumbstickFrame.Name = "ThumbstickFrame"
|
||||
thumbstickFrame.Active = true
|
||||
thumbstickFrame.Size = UDim2.new(0,thumbstickSize,0,thumbstickSize)
|
||||
thumbstickFrame.Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize)
|
||||
thumbstickFrame.Position = defaultThumbstickPos
|
||||
thumbstickFrame.BackgroundTransparency = 1
|
||||
|
||||
local outerThumbstick = Instance.new("ImageLabel")
|
||||
local outerThumbstick = Instance.new "ImageLabel"
|
||||
outerThumbstick.Name = "OuterThumbstick"
|
||||
outerThumbstick.Image = touchControlsSheet
|
||||
outerThumbstick.ImageRectOffset = Vector2.new(0,0)
|
||||
outerThumbstick.ImageRectSize = Vector2.new(220,220)
|
||||
outerThumbstick.ImageRectOffset = Vector2.new(0, 0)
|
||||
outerThumbstick.ImageRectSize = Vector2.new(220, 220)
|
||||
outerThumbstick.BackgroundTransparency = 1
|
||||
outerThumbstick.Size = UDim2.new(0,thumbstickSize,0,thumbstickSize)
|
||||
outerThumbstick.Size = UDim2.new(0, thumbstickSize, 0, thumbstickSize)
|
||||
outerThumbstick.Position = defaultThumbstickPos
|
||||
outerThumbstick.Parent = Game.CoreGui.RobloxGui
|
||||
|
||||
local innerThumbstick = Instance.new("ImageLabel")
|
||||
local innerThumbstick = Instance.new "ImageLabel"
|
||||
innerThumbstick.Name = "InnerThumbstick"
|
||||
innerThumbstick.Image = touchControlsSheet
|
||||
innerThumbstick.ImageRectOffset = Vector2.new(220,0)
|
||||
innerThumbstick.ImageRectSize = Vector2.new(111,111)
|
||||
innerThumbstick.ImageRectOffset = Vector2.new(220, 0)
|
||||
innerThumbstick.ImageRectSize = Vector2.new(111, 111)
|
||||
innerThumbstick.BackgroundTransparency = 1
|
||||
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.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.Parent = thumbstickFrame
|
||||
innerThumbstick.ZIndex = 2
|
||||
|
||||
|
|
@ -203,35 +250,51 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu
|
|||
local userInputSeviceTouchEndedCon = nil
|
||||
|
||||
local startInputTracking = function(inputObject)
|
||||
if thumbstickTouch then return end
|
||||
if inputObject == cameraTouch then return end
|
||||
if inputObject == currentJumpTouch then return end
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end
|
||||
if thumbstickTouch then
|
||||
return
|
||||
end
|
||||
if inputObject == cameraTouch then
|
||||
return
|
||||
end
|
||||
if inputObject == currentJumpTouch then
|
||||
return
|
||||
end
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
|
||||
return
|
||||
end
|
||||
|
||||
thumbstickTouch = inputObject
|
||||
table.insert(thumbstickTouches,thumbstickTouch)
|
||||
table.insert(thumbstickTouches, thumbstickTouch)
|
||||
|
||||
thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position,thumbstickFrame)
|
||||
thumbstickFrame.Position = transformFromCenterToTopLeft(thumbstickTouch.Position, thumbstickFrame)
|
||||
outerThumbstick.Position = thumbstickFrame.Position
|
||||
|
||||
userInputServiceTouchMovedCon = userInputService.TouchMoved:connect(function(movedInput)
|
||||
if movedInput == thumbstickTouch then
|
||||
local movementVector = nil
|
||||
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
|
||||
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
|
||||
|
||||
if updateFunction then
|
||||
updateFunction(movementVector,outerThumbstick.Size.X.Offset/2)
|
||||
updateFunction(movementVector, outerThumbstick.Size.X.Offset / 2)
|
||||
end
|
||||
end
|
||||
end)
|
||||
userInputSeviceTouchEndedCon = userInputService.TouchEnded:connect(function(endedInput)
|
||||
if endedInput == thumbstickTouch then
|
||||
if updateFunction then
|
||||
updateFunction(Vector2.new(0,0),1)
|
||||
updateFunction(Vector2.new(0, 0), 1)
|
||||
end
|
||||
|
||||
userInputSeviceTouchEndedCon:disconnect()
|
||||
|
|
@ -242,7 +305,7 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu
|
|||
|
||||
for i, object in pairs(thumbstickTouches) do
|
||||
if object == thumbstickTouch then
|
||||
table.remove(thumbstickTouches,i)
|
||||
table.remove(thumbstickTouches, i)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
|
@ -262,31 +325,31 @@ function constructThumbstick(defaultThumbstickPos, updateFunction, stationaryThu
|
|||
return thumbstickFrame
|
||||
end
|
||||
|
||||
function setupCharacterMovement( parentFrame )
|
||||
function setupCharacterMovement(parentFrame)
|
||||
local lastMovementVector, lastMaxMovement = nil
|
||||
local moveCharacterFunc = localPlayer.MoveCharacter
|
||||
local moveCharacterFunction = function ( movementVector, maxMovement )
|
||||
local moveCharacterFunction = function(movementVector, maxMovement)
|
||||
if localPlayer then
|
||||
if movementOutsideDeadZone(movementVector) then
|
||||
lastMovementVector = movementVector
|
||||
lastMaxMovement = maxMovement
|
||||
-- sometimes rounding error will not allow us to go max speed at some
|
||||
-- thumbstick angles, fix this with a bit of fudging near 100% throttle
|
||||
if movementVector.magnitude/maxMovement > ThumbstickMaxPercentGive then
|
||||
if movementVector.magnitude / maxMovement > ThumbstickMaxPercentGive then
|
||||
maxMovement = movementVector.magnitude - 1
|
||||
end
|
||||
moveCharacterFunc(localPlayer, movementVector, maxMovement)
|
||||
else
|
||||
lastMovementVector = Vector2.new(0,0)
|
||||
lastMovementVector = Vector2.new(0, 0)
|
||||
lastMaxMovement = 1
|
||||
moveCharacterFunc(localPlayer, lastMovementVector, lastMaxMovement)
|
||||
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
|
||||
thumbstickPos = UDim2.new(0,(thumbstickSize/2) - 10,1,-thumbstickSize - 20)
|
||||
thumbstickPos = UDim2.new(0, (thumbstickSize / 2) - 10, 1, -thumbstickSize - 20)
|
||||
end
|
||||
local characterThumbstick = constructThumbstick(thumbstickPos, moveCharacterFunction, false)
|
||||
characterThumbstick.Name = "CharacterThumbstick"
|
||||
|
|
@ -300,36 +363,41 @@ function setupCharacterMovement( parentFrame )
|
|||
return refreshCharacterMovement
|
||||
end
|
||||
|
||||
|
||||
function setupJumpButton( parentFrame )
|
||||
local jumpButton = Instance.new("ImageButton")
|
||||
function setupJumpButton(parentFrame)
|
||||
local jumpButton = Instance.new "ImageButton"
|
||||
jumpButton.Name = "JumpButton"
|
||||
jumpButton.BackgroundTransparency = 1
|
||||
jumpButton.Image = touchControlsSheet
|
||||
jumpButton.ImageRectOffset = Vector2.new(176,222)
|
||||
jumpButton.ImageRectSize = Vector2.new(174,174)
|
||||
jumpButton.Size = UDim2.new(0,jumpButtonSize,0,jumpButtonSize)
|
||||
jumpButton.ImageRectOffset = Vector2.new(176, 222)
|
||||
jumpButton.ImageRectSize = Vector2.new(174, 174)
|
||||
jumpButton.Size = UDim2.new(0, jumpButtonSize, 0, jumpButtonSize)
|
||||
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
|
||||
jumpButton.Position = UDim2.new(1, -(jumpButtonSize*2.75), 1, -jumpButtonSize - 120)
|
||||
jumpButton.Position = UDim2.new(1, -(jumpButtonSize * 2.75), 1, -jumpButtonSize - 120)
|
||||
end
|
||||
|
||||
local playerJumpFunc = localPlayer.JumpCharacter
|
||||
|
||||
local doJumpLoop = function ()
|
||||
local doJumpLoop = function()
|
||||
while currentJumpTouch do
|
||||
if localPlayer then
|
||||
playerJumpFunc(localPlayer)
|
||||
end
|
||||
wait(1/60)
|
||||
wait(1 / 60)
|
||||
end
|
||||
end
|
||||
|
||||
jumpButton.InputBegan:connect(function(inputObject)
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end
|
||||
if currentJumpTouch then return end
|
||||
if inputObject == cameraTouch then return end
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
|
||||
return
|
||||
end
|
||||
if currentJumpTouch then
|
||||
return
|
||||
end
|
||||
if inputObject == cameraTouch then
|
||||
return
|
||||
end
|
||||
for i, touch in pairs(oldJumpTouches) do
|
||||
if touch == inputObject then
|
||||
return
|
||||
|
|
@ -337,25 +405,27 @@ function setupJumpButton( parentFrame )
|
|||
end
|
||||
|
||||
currentJumpTouch = inputObject
|
||||
jumpButton.ImageRectOffset = Vector2.new(0,222)
|
||||
jumpButton.ImageRectSize = Vector2.new(174,174)
|
||||
jumpButton.ImageRectOffset = Vector2.new(0, 222)
|
||||
jumpButton.ImageRectSize = Vector2.new(174, 174)
|
||||
doJumpLoop()
|
||||
end)
|
||||
jumpButton.InputEnded:connect(function (inputObject)
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end
|
||||
jumpButton.InputEnded:connect(function(inputObject)
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
|
||||
return
|
||||
end
|
||||
|
||||
jumpButton.ImageRectOffset = Vector2.new(176,222)
|
||||
jumpButton.ImageRectSize = Vector2.new(174,174)
|
||||
jumpButton.ImageRectOffset = Vector2.new(176, 222)
|
||||
jumpButton.ImageRectSize = Vector2.new(174, 174)
|
||||
|
||||
if inputObject == currentJumpTouch then
|
||||
table.insert(oldJumpTouches,currentJumpTouch)
|
||||
table.insert(oldJumpTouches, currentJumpTouch)
|
||||
currentJumpTouch = nil
|
||||
end
|
||||
end)
|
||||
userInputService.InputEnded:connect(function ( globalInputObject )
|
||||
userInputService.InputEnded:connect(function(globalInputObject)
|
||||
for i, touch in pairs(oldJumpTouches) do
|
||||
if touch == globalInputObject then
|
||||
table.remove(oldJumpTouches,i)
|
||||
table.remove(oldJumpTouches, i)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
|
@ -370,8 +440,10 @@ function setupJumpButton( parentFrame )
|
|||
jumpButton.Parent = parentFrame
|
||||
end
|
||||
|
||||
function isTouchUsedByJumpButton( touch )
|
||||
if touch == currentJumpTouch then return true end
|
||||
function isTouchUsedByJumpButton(touch)
|
||||
if touch == currentJumpTouch then
|
||||
return true
|
||||
end
|
||||
for i, touchToCompare in pairs(oldJumpTouches) do
|
||||
if touch == touchToCompare then
|
||||
return true
|
||||
|
|
@ -409,7 +481,7 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
|
|||
lastPos = nil
|
||||
end
|
||||
|
||||
local resetPinchState = function ()
|
||||
local resetPinchState = function()
|
||||
pinchTouches = {}
|
||||
lastPinchScale = nil
|
||||
shouldPinch = false
|
||||
|
|
@ -419,12 +491,14 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
|
|||
|
||||
local startPinch = function(firstTouch, secondTouch)
|
||||
-- track pinching in new frame
|
||||
if pinchFrame then pinchFrame:Destroy() end -- make sure we didn't track in any mud
|
||||
pinchFrame = Instance.new("Frame")
|
||||
if pinchFrame then
|
||||
pinchFrame:Destroy()
|
||||
end -- make sure we didn't track in any mud
|
||||
pinchFrame = Instance.new "Frame"
|
||||
pinchFrame.Name = "PinchFrame"
|
||||
pinchFrame.BackgroundTransparency = 1
|
||||
pinchFrame.Parent = parentFrame
|
||||
pinchFrame.Size = UDim2.new(1,0,1,0)
|
||||
pinchFrame.Size = UDim2.new(1, 0, 1, 0)
|
||||
|
||||
pinchFrame.InputChanged:connect(function(inputObject)
|
||||
if not shouldPinch then
|
||||
|
|
@ -468,14 +542,14 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
|
|||
|
||||
local pinchGestureReceivedTouch = function(inputObject)
|
||||
if #pinchTouches < 1 then
|
||||
table.insert(pinchTouches,inputObject)
|
||||
table.insert(pinchTouches, inputObject)
|
||||
pinchTime = tick()
|
||||
shouldPinch = false
|
||||
elseif #pinchTouches == 1 then
|
||||
shouldPinch = ( (tick() - pinchTime) <= PinchZoomDelay )
|
||||
shouldPinch = ((tick() - pinchTime) <= PinchZoomDelay)
|
||||
|
||||
if shouldPinch then
|
||||
table.insert(pinchTouches,inputObject)
|
||||
table.insert(pinchTouches, inputObject)
|
||||
startPinch(pinchTouches[1], pinchTouches[2])
|
||||
else -- shouldn't ever get here, but just in case
|
||||
pinchTouches = {}
|
||||
|
|
@ -483,9 +557,13 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
|
|||
end
|
||||
end
|
||||
|
||||
parentFrame.InputBegan:connect(function (inputObject)
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end
|
||||
if isTouchUsedByJumpButton(inputObject) then return end
|
||||
parentFrame.InputBegan:connect(function(inputObject)
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
|
||||
return
|
||||
end
|
||||
if isTouchUsedByJumpButton(inputObject) then
|
||||
return
|
||||
end
|
||||
|
||||
local usedByThumbstick = isTouchUsedByThumbstick(inputObject)
|
||||
if not usedByThumbstick then
|
||||
|
|
@ -494,15 +572,19 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
|
|||
|
||||
if cameraTouch == nil and not usedByThumbstick then
|
||||
cameraTouch = inputObject
|
||||
lastPos = Vector2.new(cameraTouch.Position.x,cameraTouch.Position.y)
|
||||
lastPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y)
|
||||
lastTick = tick()
|
||||
end
|
||||
end)
|
||||
userInputService.InputChanged:connect(function (inputObject)
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then return end
|
||||
if cameraTouch ~= inputObject then return end
|
||||
userInputService.InputChanged:connect(function(inputObject)
|
||||
if inputObject.UserInputType ~= Enum.UserInputType.Touch then
|
||||
return
|
||||
end
|
||||
if cameraTouch ~= inputObject then
|
||||
return
|
||||
end
|
||||
|
||||
local newPos = Vector2.new(cameraTouch.Position.x,cameraTouch.Position.y)
|
||||
local newPos = Vector2.new(cameraTouch.Position.x, cameraTouch.Position.y)
|
||||
local touchDiff = (lastPos - newPos) * CameraRotateSensitivity
|
||||
|
||||
-- first time rotating outside deadzone, just setup for next changed event
|
||||
|
|
@ -518,23 +600,23 @@ function setupCameraControl(parentFrame, refreshCharacterMoveFunc)
|
|||
lastPos = newPos
|
||||
end
|
||||
end)
|
||||
userInputService.InputEnded:connect(function (inputObject)
|
||||
userInputService.InputEnded:connect(function(inputObject)
|
||||
if cameraTouch == inputObject or cameraTouch == nil then
|
||||
resetCameraRotateState()
|
||||
end
|
||||
|
||||
for i, touch in pairs(pinchTouches) do
|
||||
if touch == inputObject then
|
||||
table.remove(pinchTouches,i)
|
||||
table.remove(pinchTouches, i)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function setupTouchControls()
|
||||
local touchControlFrame = Instance.new("Frame")
|
||||
local touchControlFrame = Instance.new "Frame"
|
||||
touchControlFrame.Name = "TouchControlFrame"
|
||||
touchControlFrame.Size = UDim2.new(1,0,1,0)
|
||||
touchControlFrame.Size = UDim2.new(1, 0, 1, 0)
|
||||
touchControlFrame.BackgroundTransparency = 1
|
||||
touchControlFrame.Parent = Game.CoreGui.RobloxGui
|
||||
|
||||
|
|
@ -543,7 +625,9 @@ function setupTouchControls()
|
|||
setupCameraControl(touchControlFrame, refreshCharacterMoveFunc)
|
||||
|
||||
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
|
||||
if inputObject == cameraTouch and inputObject.UserInputState == Enum.UserInputState.Begin then
|
||||
|
|
@ -552,7 +636,6 @@ function setupTouchControls()
|
|||
end)
|
||||
end
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
----------------------------------------------------------------------------
|
||||
-- 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 bottomRightControl = controlFrame:FindFirstChild("BottomRightControl")
|
||||
local bottomLeftControl = controlFrame:FindFirstChild "BottomLeftControl"
|
||||
local bottomRightControl = controlFrame:FindFirstChild "BottomRightControl"
|
||||
|
||||
|
||||
local frameTip = Instance.new("TextLabel")
|
||||
local frameTip = Instance.new "TextLabel"
|
||||
frameTip.Name = "ToolTip"
|
||||
frameTip.Text = ""
|
||||
frameTip.Font = Enum.Font.ArialBold
|
||||
frameTip.FontSize = Enum.FontSize.Size12
|
||||
frameTip.TextColor3 = Color3.new(1,1,1)
|
||||
frameTip.TextColor3 = Color3.new(1, 1, 1)
|
||||
frameTip.BorderSizePixel = 0
|
||||
frameTip.ZIndex = 10
|
||||
frameTip.Size = UDim2.new(2,0,1,0)
|
||||
frameTip.Position = UDim2.new(1,0,0,0)
|
||||
frameTip.BackgroundColor3 = Color3.new(0,0,0)
|
||||
frameTip.Size = UDim2.new(2, 0, 1, 0)
|
||||
frameTip.Position = UDim2.new(1, 0, 0, 0)
|
||||
frameTip.BackgroundColor3 = Color3.new(0, 0, 0)
|
||||
frameTip.BackgroundTransparency = 1
|
||||
frameTip.TextTransparency = 1
|
||||
frameTip.TextWrap = true
|
||||
|
||||
local inside = Instance.new("BoolValue")
|
||||
local inside = Instance.new "BoolValue"
|
||||
inside.Name = "inside"
|
||||
inside.Value = false
|
||||
inside.Parent = frameTip
|
||||
|
|
@ -30,7 +30,7 @@ inside.Parent = frameTip
|
|||
function setUpListeners(frameToListen)
|
||||
local fadeSpeed = 0.1
|
||||
frameToListen.Parent.MouseEnter:connect(function()
|
||||
if frameToListen:FindFirstChild("inside") then
|
||||
if frameToListen:FindFirstChild "inside" then
|
||||
frameToListen.inside.Value = true
|
||||
wait(1.2)
|
||||
if frameToListen.inside.Value then
|
||||
|
|
@ -47,20 +47,24 @@ function setUpListeners(frameToListen)
|
|||
killFrame.BackgroundTransparency = 1
|
||||
killFrame.TextTransparency = 1
|
||||
end
|
||||
frameToListen.Parent.MouseLeave:connect(function() killTip(frameToListen) end)
|
||||
frameToListen.Parent.MouseButton1Click:connect(function() killTip(frameToListen) end)
|
||||
frameToListen.Parent.MouseLeave:connect(function()
|
||||
killTip(frameToListen)
|
||||
end)
|
||||
frameToListen.Parent.MouseButton1Click:connect(function()
|
||||
killTip(frameToListen)
|
||||
end)
|
||||
end
|
||||
|
||||
function createSettingsButtonTip(parent)
|
||||
if parent == nil then
|
||||
parent = bottomLeftControl:FindFirstChild("SettingsButton")
|
||||
parent = bottomLeftControl:FindFirstChild "SettingsButton"
|
||||
end
|
||||
|
||||
local toolTip = frameTip:clone()
|
||||
toolTip.RobloxLocked = true
|
||||
toolTip.Text = "Settings/Leave Game"
|
||||
toolTip.Position = UDim2.new(0,0,0,-18)
|
||||
toolTip.Size = UDim2.new(0,120,0,20)
|
||||
toolTip.Position = UDim2.new(0, 0, 0, -18)
|
||||
toolTip.Size = UDim2.new(0, 120, 0, 20)
|
||||
toolTip.Parent = parent
|
||||
setUpListeners(toolTip)
|
||||
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 -------------------------
|
||||
|
||||
local bottomLeftChildren = bottomLeftControl:GetChildren()
|
||||
local hasSettingsTip = false
|
||||
|
||||
for i = 1, #bottomLeftChildren do
|
||||
|
||||
if bottomLeftChildren[i].Name == "Exit" then
|
||||
local exitTip = frameTip:clone()
|
||||
exitTip.RobloxLocked = true
|
||||
exitTip.Text = "Leave Place"
|
||||
exitTip.Position = UDim2.new(0,0,-1,0)
|
||||
exitTip.Size = UDim2.new(1,0,1,0)
|
||||
exitTip.Position = UDim2.new(0, 0, -1, 0)
|
||||
exitTip.Size = UDim2.new(1, 0, 1, 0)
|
||||
exitTip.Parent = bottomLeftChildren[i]
|
||||
setUpListeners(exitTip)
|
||||
elseif bottomLeftChildren[i].Name == "SettingsButton" then
|
||||
|
|
@ -93,16 +95,16 @@ end
|
|||
local bottomRightChildren = bottomRightControl:GetChildren()
|
||||
|
||||
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()
|
||||
cameraTip.RobloxLocked = true
|
||||
cameraTip.Text = "Camera View"
|
||||
if bottomRightChildren[i].Name:find("Zoom") then
|
||||
cameraTip.Position = UDim2.new(-1,0,-1.5)
|
||||
if bottomRightChildren[i].Name:find "Zoom" then
|
||||
cameraTip.Position = UDim2.new(-1, 0, -1.5)
|
||||
else
|
||||
cameraTip.Position = UDim2.new(0,0,-1.5,0)
|
||||
cameraTip.Position = UDim2.new(0, 0, -1.5, 0)
|
||||
end
|
||||
cameraTip.Size = UDim2.new(2,0,1.25,0)
|
||||
cameraTip.Size = UDim2.new(2, 0, 1.25, 0)
|
||||
cameraTip.Parent = bottomRightChildren[i]
|
||||
setUpListeners(cameraTip)
|
||||
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
|
||||
-- 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
|
||||
local scriptContext = game:GetService("ScriptContext")
|
||||
local scriptContext = game:GetService "ScriptContext"
|
||||
local touchEnabled = false
|
||||
pcall(function() touchEnabled = game:GetService("UserInputService").TouchEnabled end)
|
||||
pcall(function()
|
||||
touchEnabled = game:GetService("UserInputService").TouchEnabled
|
||||
end)
|
||||
|
||||
-- library registration
|
||||
scriptContext:AddCoreScript(60595695, scriptContext,"/Libraries/LibraryRegistration/LibraryRegistration")
|
||||
scriptContext:AddCoreScript(60595695, scriptContext, "/Libraries/LibraryRegistration/LibraryRegistration")
|
||||
|
||||
local function waitForChild(instance, name)
|
||||
while not instance:FindFirstChild(name) do
|
||||
|
|
@ -21,90 +22,87 @@ local function waitForProperty(instance, property)
|
|||
end
|
||||
|
||||
-- Responsible for tracking logging items
|
||||
local scriptContext = game:GetService("ScriptContext")
|
||||
local scriptContext = game:GetService "ScriptContext"
|
||||
scriptContext:AddCoreScript(59002209, scriptContext, "CoreScripts/Sections")
|
||||
|
||||
waitForChild(game:GetService("CoreGui"),"RobloxGui")
|
||||
local screenGui = game:GetService("CoreGui"):FindFirstChild("RobloxGui")
|
||||
waitForChild(game:GetService "CoreGui", "RobloxGui")
|
||||
local screenGui = game:GetService("CoreGui"):FindFirstChild "RobloxGui"
|
||||
|
||||
if not touchEnabled then
|
||||
-- ToolTipper (creates tool tips for gui)
|
||||
scriptContext:AddCoreScript(36868950,screenGui,"CoreScripts/ToolTip")
|
||||
scriptContext:AddCoreScript(36868950, screenGui, "CoreScripts/ToolTip")
|
||||
-- SettingsScript
|
||||
scriptContext:AddCoreScript(46295863,screenGui,"CoreScripts/Settings")
|
||||
scriptContext:AddCoreScript(46295863, screenGui, "CoreScripts/Settings")
|
||||
else
|
||||
scriptContext:AddCoreScript(153556783,screenGui,"CoreScripts/TouchControls")
|
||||
scriptContext:AddCoreScript(153556783, screenGui, "CoreScripts/TouchControls")
|
||||
end
|
||||
|
||||
-- MainBotChatScript
|
||||
scriptContext:AddCoreScript(39250920,screenGui,"CoreScripts/MainBotChatScript")
|
||||
scriptContext:AddCoreScript(39250920, screenGui, "CoreScripts/MainBotChatScript")
|
||||
|
||||
-- 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)
|
||||
scriptContext:AddCoreScript(48488398,screenGui,"CoreScripts/NotificationScript")
|
||||
scriptContext:AddCoreScript(48488398, screenGui, "CoreScripts/NotificationScript")
|
||||
-- Chat script
|
||||
scriptContext:AddCoreScript(97188756, screenGui, "CoreScripts/ChatScript")
|
||||
-- Purchase Prompt Script
|
||||
scriptContext:AddCoreScript(107893730, screenGui, "CoreScripts/PurchasePromptScript")
|
||||
|
||||
if not touchEnabled then
|
||||
if not touchEnabled or screenGui.AbsoluteSize.Y > 600 then
|
||||
-- New Player List
|
||||
scriptContext:AddCoreScript(48488235,screenGui,"CoreScripts/PlayerListScript")
|
||||
elseif screenGui.AbsoluteSize.Y > 600 then
|
||||
-- New Player List
|
||||
scriptContext:AddCoreScript(48488235,screenGui,"CoreScripts/PlayerListScript")
|
||||
scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript")
|
||||
else
|
||||
delay(5, function()
|
||||
if screenGui.AbsoluteSize.Y >= 600 then
|
||||
-- New Player List
|
||||
scriptContext:AddCoreScript(48488235,screenGui,"CoreScripts/PlayerListScript")
|
||||
scriptContext:AddCoreScript(48488235, screenGui, "CoreScripts/PlayerListScript")
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
if game.CoreGui.Version >= 3 and game.PlaceId ~= 130815926 then --todo: remove placeid hack for halloween
|
||||
-- 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,"Backpack")
|
||||
waitForChild(screenGui, "CurrentLoadout")
|
||||
waitForChild(screenGui, "Backpack")
|
||||
local Backpack = screenGui.Backpack
|
||||
|
||||
-- Manager handles all big backpack state changes, other scripts subscribe to this and do things accordingly
|
||||
if game.CoreGui.Version >= 7 then
|
||||
scriptContext:AddCoreScript(89449093,Backpack,"CoreScripts/BackpackScripts/BackpackManager")
|
||||
scriptContext:AddCoreScript(89449093, Backpack, "CoreScripts/BackpackScripts/BackpackManager")
|
||||
end
|
||||
|
||||
-- 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
|
||||
scriptContext:AddCoreScript(53878057,screenGui.CurrentLoadout,"CoreScripts/BackpackScripts/LoadoutScript")
|
||||
scriptContext:AddCoreScript(53878057, screenGui.CurrentLoadout, "CoreScripts/BackpackScripts/LoadoutScript")
|
||||
if game.CoreGui.Version >= 8 then
|
||||
-- Wardrobe script handles all character dressing operations
|
||||
scriptContext:AddCoreScript(-1,Backpack,"CoreScripts/BackpackScripts/BackpackWardrobe")
|
||||
scriptContext:AddCoreScript(-1, Backpack, "CoreScripts/BackpackScripts/BackpackWardrobe")
|
||||
end
|
||||
end
|
||||
|
||||
local IsPersonalServer = not not game.Workspace:FindFirstChild("PSVariable")
|
||||
local IsPersonalServer = not not game.Workspace:FindFirstChild "PSVariable"
|
||||
if IsPersonalServer then
|
||||
game:GetService("ScriptContext"):AddCoreScript(64164692,game.Players.LocalPlayer,"BuildToolManager")
|
||||
game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager")
|
||||
end
|
||||
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
|
||||
game:GetService("ScriptContext"):AddCoreScript(64164692,game.Players.LocalPlayer,"BuildToolManager")
|
||||
game:GetService("ScriptContext"):AddCoreScript(64164692, game.Players.LocalPlayer, "BuildToolManager")
|
||||
end
|
||||
end)
|
||||
|
||||
if touchEnabled then -- touch devices don't use same control frame
|
||||
-- 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, 'BottomLeftControl')
|
||||
waitForChild(screenGui, "ControlFrame")
|
||||
waitForChild(screenGui.ControlFrame, "BottomLeftControl")
|
||||
screenGui.ControlFrame.BottomLeftControl.Visible = false
|
||||
|
||||
waitForChild(screenGui.ControlFrame, 'TopLeftControl')
|
||||
waitForChild(screenGui.ControlFrame, "TopLeftControl")
|
||||
screenGui.ControlFrame.TopLeftControl.Visible = false
|
||||
end
|
||||
143
38037565.lua
143
38037565.lua
|
|
@ -1,52 +1,52 @@
|
|||
local damageGuiWidth = 5.0
|
||||
local damageGuiHeight = 5.0
|
||||
|
||||
|
||||
function waitForChild(parent, childName)
|
||||
local child = parent:findFirstChild(childName)
|
||||
if child then return child end
|
||||
if child then
|
||||
return child
|
||||
end
|
||||
while true do
|
||||
child = parent.ChildAdded:wait()
|
||||
if child.Name==childName then return child end
|
||||
if child.Name == childName then
|
||||
return child
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- declarations
|
||||
local Figure = script.Parent
|
||||
local Head = waitForChild(Figure, "Head")
|
||||
local Humanoid = waitForChild(Figure, "Humanoid")
|
||||
local walkSpeed = Humanoid.WalkSpeed
|
||||
local Torso = waitForChild(Figure, "Torso")
|
||||
local Humanoid = waitForChild(Figure, "Humanoid")
|
||||
local Torso = waitForChild(Figure, "Torso")
|
||||
|
||||
local config = Figure:FindFirstChild("PlayerStats")
|
||||
local config = Figure:FindFirstChild "PlayerStats"
|
||||
|
||||
local inCharTag = Instance.new("BoolValue")
|
||||
inCharTag.Name = "InCharTag"
|
||||
local inCharTag = Instance.new "BoolValue"
|
||||
inCharTag.Name = "InCharTag"
|
||||
|
||||
local hider = Instance.new("BoolValue")
|
||||
hider.Name = "RobloxBuildTool"
|
||||
local hider = Instance.new "BoolValue"
|
||||
hider.Name = "RobloxBuildTool"
|
||||
|
||||
local currentChildren
|
||||
local backpackTools
|
||||
|
||||
if config == nil then
|
||||
config = Instance.new("Configuration")
|
||||
config = Instance.new "Configuration"
|
||||
config.Parent = Figure
|
||||
config.Name = "PlayerStats"
|
||||
config.Name = "PlayerStats"
|
||||
end
|
||||
|
||||
local myHealth = config:FindFirstChild("MaxHealth")
|
||||
local myHealth = config:FindFirstChild "MaxHealth"
|
||||
if myHealth == nil then
|
||||
myHealth = Instance.new("NumberValue")
|
||||
myHealth = Instance.new "NumberValue"
|
||||
myHealth.Parent = config
|
||||
myHealth.Value = 100
|
||||
myHealth.Name = "MaxHealth"
|
||||
myHealth.Name = "MaxHealth"
|
||||
end
|
||||
|
||||
Humanoid.MaxHealth = myHealth.Value
|
||||
Humanoid.Health = myHealth.Value
|
||||
|
||||
|
||||
function onMaxHealthChange()
|
||||
Humanoid.MaxHealth = myHealth.Value
|
||||
Humanoid.Health = myHealth.Value
|
||||
|
|
@ -54,39 +54,43 @@ end
|
|||
|
||||
myHealth.Changed:connect(onMaxHealthChange)
|
||||
|
||||
|
||||
--Humanoid.MaxHealth = myHealth.Value
|
||||
--Humanoid.Health = Humanoid.MaxHealth
|
||||
|
||||
local vPlayer = game.Players:GetPlayerFromCharacter(script.Parent)
|
||||
local dotGui = vPlayer.PlayerGui:FindFirstChild("DamageOverTimeGui")
|
||||
local dotGui = vPlayer.PlayerGui:FindFirstChild "DamageOverTimeGui"
|
||||
if dotGui == nil then
|
||||
dotGui = Instance.new("BillboardGui")
|
||||
dotGui.Name = "DamageOverTimeGui"
|
||||
dotGui = Instance.new "BillboardGui"
|
||||
dotGui.Name = "DamageOverTimeGui"
|
||||
dotGui.Parent = vPlayer.PlayerGui
|
||||
dotGui.Adornee = script.Parent:FindFirstChild("Head")
|
||||
dotGui.Adornee = script.Parent:FindFirstChild "Head"
|
||||
dotGui.Active = true
|
||||
dotGui.size = UDim2.new(damageGuiWidth, 0.0, damageGuiHeight, 0.0)
|
||||
dotGui.StudsOffset = Vector3.new(0.0, 2.0, 0.0)
|
||||
dotGui.size = UDim2.new(damageGuiWidth, 0, damageGuiHeight, 0.0)
|
||||
dotGui.StudsOffset = Vector3.new(0, 2.0, 0.0)
|
||||
end
|
||||
|
||||
print("newHealth declarations finished")
|
||||
print "newHealth declarations finished"
|
||||
|
||||
function billboardHealthChange(dmg)
|
||||
local textLabel = Instance.new("TextLabel")
|
||||
if dmg > 0 then textLabel.Text = tostring(dmg) 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, 0.0, 1.0, 0.0)
|
||||
local textLabel = Instance.new "TextLabel"
|
||||
if dmg > 0 then
|
||||
textLabel.Text = tostring(dmg)
|
||||
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.FontSize = 6
|
||||
textLabel.BackgroundTransparency = 1
|
||||
textLabel.Parent = dotGui
|
||||
|
||||
for t = 1, 10 do
|
||||
wait(.1)
|
||||
textLabel.TextTransparency = t/10
|
||||
textLabel.Position = UDim2.new(0, 0, 0, -t*5)
|
||||
textLabel.FontSize = 6-t*.6
|
||||
wait(0.1)
|
||||
textLabel.TextTransparency = t / 10
|
||||
textLabel.Position = UDim2.new(0, 0, 0, -t * 5)
|
||||
textLabel.FontSize = 6 - t * 0.6
|
||||
end
|
||||
|
||||
textLabel:remove()
|
||||
|
|
@ -94,10 +98,10 @@ end
|
|||
|
||||
function setMaxHealth()
|
||||
--print(Humanoid.Health)
|
||||
if myHealth.Value >=0 then
|
||||
if myHealth.Value >= 0 then
|
||||
Humanoid.MaxHealth = myHealth.Value
|
||||
print(Humanoid.MaxHealth)
|
||||
if Humanoid.Health > Humanoid.MaxHealth then
|
||||
if Humanoid.Health > Humanoid.MaxHealth then
|
||||
Humanoid.Health = Humanoid.MaxHealth
|
||||
end
|
||||
end
|
||||
|
|
@ -107,43 +111,50 @@ myHealth.Changed:connect(setMaxHealth)
|
|||
|
||||
-- Visual Effects --
|
||||
|
||||
fireEffect = Instance.new("Fire")
|
||||
fireEffect = Instance.new "Fire"
|
||||
fireEffect.Heat = 0.1
|
||||
fireEffect.Size = 3.0
|
||||
fireEffect.Name = "FireEffect"
|
||||
fireEffect.Name = "FireEffect"
|
||||
fireEffect.Enabled = false
|
||||
--
|
||||
|
||||
|
||||
-- regeneration
|
||||
while true do
|
||||
-- regeneration
|
||||
while true do
|
||||
local s = wait(1)
|
||||
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
|
||||
if config then
|
||||
regen = config:FindFirstChild("Regen")
|
||||
poison = config:FindFirstChild("Poison")
|
||||
ice = config:FindFirstChild("Ice")
|
||||
fire = config:FindFirstChild("Fire")
|
||||
stun = config:FindFirstChild("Stun")
|
||||
regen = config:FindFirstChild "Regen"
|
||||
poison = config:FindFirstChild "Poison"
|
||||
ice = config:FindFirstChild "Ice"
|
||||
fire = config:FindFirstChild "Fire"
|
||||
stun = config:FindFirstChild "Stun"
|
||||
if regen then
|
||||
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?
|
||||
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
|
||||
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?
|
||||
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
|
||||
if poison then
|
||||
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)
|
||||
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
|
||||
if poison.Value.Y >= 0 then
|
||||
poison.Value = Vector3.new(poison.Value.X + poison.Value.Z, poison.Value.Y - s, poison.Value.Z)
|
||||
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
|
||||
|
||||
if ice then
|
||||
--print("IN ICE")
|
||||
--print("IN ICE")
|
||||
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)
|
||||
else
|
||||
ice:remove()
|
||||
|
|
@ -154,7 +165,7 @@ fireEffect.Enabled = false
|
|||
fireEffect.Enabled = true
|
||||
fireEffect.Parent = Figure.Torso
|
||||
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)
|
||||
else
|
||||
fire:remove()
|
||||
|
|
@ -164,19 +175,19 @@ fireEffect.Enabled = false
|
|||
end
|
||||
|
||||
if stun then
|
||||
if stun.Value > 0 then
|
||||
if stun.Value > 0 then
|
||||
Torso.Anchored = true
|
||||
currentChildren = script.Parent:GetChildren()
|
||||
backpackTools = game.Players:GetPlayerFromCharacter(script.Parent).Backpack:GetChildren()
|
||||
for i = 1, #currentChildren do
|
||||
if currentChildren[i].className == "Tool" then
|
||||
if currentChildren[i].className == "Tool" then
|
||||
inCharTag:Clone().Parent = currentChildren[i]
|
||||
print(backpackTools)
|
||||
table.insert(backpackTools, currentChildren[i])
|
||||
end
|
||||
end
|
||||
for i = 1, #backpackTools do
|
||||
if backpackTools[i]:FindFirstChild("RobloxBuildTool") == nil then
|
||||
if backpackTools[i]:FindFirstChild "RobloxBuildTool" == nil then
|
||||
hider:Clone().Parent = backpackTools[i]
|
||||
backpackTools[i].Parent = game.Lighting
|
||||
end
|
||||
|
|
@ -189,13 +200,15 @@ fireEffect.Enabled = false
|
|||
else
|
||||
Torso.Anchored = false
|
||||
for i = 1, #backpackTools do
|
||||
rbTool = backpackTools[i]:FindFirstChild("RobloxBuildTool")
|
||||
if rbTool then rbTool:Remove() end
|
||||
rbTool = backpackTools[i]:FindFirstChild "RobloxBuildTool"
|
||||
if rbTool then
|
||||
rbTool:Remove()
|
||||
end
|
||||
backpackTools[i].Parent = game.Lighting
|
||||
end
|
||||
wait(0.2)
|
||||
for i = 1, #backpackTools do
|
||||
wasInCharacter = backpackTools[i]:FindFirstChild("InCharTag")
|
||||
wasInCharacter = backpackTools[i]:FindFirstChild "InCharTag"
|
||||
if wasInChar then
|
||||
wasInChar:Remove()
|
||||
backpackTools[i].Parent = script.Parent
|
||||
|
|
@ -216,12 +229,12 @@ fireEffect.Enabled = false
|
|||
--health = health + delta * s * Humanoid.MaxHealth
|
||||
|
||||
health = Humanoid.Health + delta * s
|
||||
if health * 1.01 < Humanoid.MaxHealth then
|
||||
if health * 1.01 < Humanoid.MaxHealth then
|
||||
Humanoid.Health = health
|
||||
--myHealth.Value = math.floor(Humanoid.Health)
|
||||
elseif delta > 0 then
|
||||
elseif delta > 0 then
|
||||
Humanoid.Health = Humanoid.MaxHealth
|
||||
--myHealth.Value = Humanoid.Health
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
188
39250920.lua
188
39250920.lua
|
|
@ -10,7 +10,6 @@ function waitForChild(instance, name)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
local mainFrame
|
||||
local choices = {}
|
||||
local lastChoice
|
||||
|
|
@ -27,7 +26,6 @@ local conversationTimedOut = "Chat ended because you didn't reply"
|
|||
local conversationTimedOutSize = 350
|
||||
|
||||
local player
|
||||
local screenGui
|
||||
local chatNotificationGui
|
||||
local messageDialog
|
||||
local timeoutScript
|
||||
|
|
@ -36,9 +34,9 @@ local dialogMap = {}
|
|||
local dialogConnections = {}
|
||||
|
||||
local gui = nil
|
||||
waitForChild(game,"CoreGui")
|
||||
waitForChild(game.CoreGui,"RobloxGui")
|
||||
if game.CoreGui.RobloxGui:FindFirstChild("ControlFrame") then
|
||||
waitForChild(game, "CoreGui")
|
||||
waitForChild(game.CoreGui, "RobloxGui")
|
||||
if game.CoreGui.RobloxGui:FindFirstChild "ControlFrame" then
|
||||
gui = game.CoreGui.RobloxGui.ControlFrame
|
||||
else
|
||||
gui = game.CoreGui.RobloxGui
|
||||
|
|
@ -52,30 +50,28 @@ function currentTone()
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
function createChatNotificationGui()
|
||||
chatNotificationGui = Instance.new("BillboardGui")
|
||||
chatNotificationGui = Instance.new "BillboardGui"
|
||||
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.SizeOffset = Vector2.new(0,0)
|
||||
chatNotificationGui.SizeOffset = Vector2.new(0, 0)
|
||||
chatNotificationGui.StudsOffset = Vector3.new(0.4, 4.3, 0)
|
||||
chatNotificationGui.Enabled = true
|
||||
chatNotificationGui.RobloxLocked = true
|
||||
chatNotificationGui.Active = true
|
||||
|
||||
local image = Instance.new("ImageLabel")
|
||||
local image = Instance.new "ImageLabel"
|
||||
image.Name = "Image"
|
||||
image.Active = false
|
||||
image.BackgroundTransparency = 1
|
||||
image.Position = UDim2.new(0,0,0,0)
|
||||
image.Size = UDim2.new(1.0,0,1.0,0)
|
||||
image.Position = UDim2.new(0, 0, 0, 0)
|
||||
image.Size = UDim2.new(1, 0, 1, 0)
|
||||
image.Image = ""
|
||||
image.RobloxLocked = true
|
||||
image.Parent = chatNotificationGui
|
||||
|
||||
|
||||
local button = Instance.new("ImageButton")
|
||||
local button = Instance.new "ImageButton"
|
||||
button.Name = "Button"
|
||||
button.AutoButtonColor = false
|
||||
button.Position = UDim2.new(0.0879999995, 0, 0.0529999994, 0)
|
||||
|
|
@ -97,7 +93,7 @@ function getChatColor(tone)
|
|||
end
|
||||
|
||||
function styleChoices(tone)
|
||||
for i, obj in pairs(choices) do
|
||||
for _, obj in pairs(choices) do
|
||||
resetColor(obj, tone)
|
||||
end
|
||||
resetColor(lastChoice, tone)
|
||||
|
|
@ -135,26 +131,26 @@ function setChatNotificationTone(gui, purpose, tone)
|
|||
end
|
||||
|
||||
function createMessageDialog()
|
||||
messageDialog = Instance.new("Frame");
|
||||
messageDialog = Instance.new "Frame"
|
||||
messageDialog.Name = "DialogScriptMessage"
|
||||
messageDialog.Style = Enum.FrameStyle.RobloxRound
|
||||
messageDialog.Visible = false
|
||||
|
||||
local text = Instance.new("TextLabel")
|
||||
local text = Instance.new "TextLabel"
|
||||
text.Name = "Text"
|
||||
text.Position = UDim2.new(0,0,0,-1)
|
||||
text.Size = UDim2.new(1,0,1,0)
|
||||
text.Position = UDim2.new(0, 0, 0, -1)
|
||||
text.Size = UDim2.new(1, 0, 1, 0)
|
||||
text.FontSize = Enum.FontSize.Size14
|
||||
text.BackgroundTransparency = 1
|
||||
text.TextColor3 = Color3.new(1,1,1)
|
||||
text.TextColor3 = Color3.new(1, 1, 1)
|
||||
text.RobloxLocked = true
|
||||
text.Parent = messageDialog
|
||||
end
|
||||
|
||||
function showMessage(msg, size)
|
||||
messageDialog.Text.Text = msg
|
||||
messageDialog.Size = UDim2.new(0,size,0,40)
|
||||
messageDialog.Position = UDim2.new(0.5, -size/2, 0.5, -40)
|
||||
messageDialog.Size = UDim2.new(0, size, 0, 40)
|
||||
messageDialog.Position = UDim2.new(0.5, -size / 2, 0.5, -40)
|
||||
messageDialog.Visible = true
|
||||
wait(2)
|
||||
messageDialog.Visible = false
|
||||
|
|
@ -162,50 +158,50 @@ end
|
|||
|
||||
function variableDelay(str)
|
||||
local length = math.min(string.len(str), 100)
|
||||
wait(0.75 + ((length/75) * 1.5))
|
||||
wait(0.75 + ((length / 75) * 1.5))
|
||||
end
|
||||
|
||||
function resetColor(frame, tone)
|
||||
if tone == Enum.DialogTone.Neutral then
|
||||
frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255)
|
||||
frame.Number.TextColor3 = Color3.new(45/255, 142/255, 245/255)
|
||||
frame.BackgroundColor3 = Color3.new(0 / 255, 0 / 255, 179 / 255)
|
||||
frame.Number.TextColor3 = Color3.new(45 / 255, 142 / 255, 245 / 255)
|
||||
elseif tone == Enum.DialogTone.Friendly then
|
||||
frame.BackgroundColor3 = Color3.new(0/255, 77/255, 0/255)
|
||||
frame.Number.TextColor3 = Color3.new(0/255, 190/255, 0/255)
|
||||
frame.BackgroundColor3 = Color3.new(0 / 255, 77 / 255, 0 / 255)
|
||||
frame.Number.TextColor3 = Color3.new(0 / 255, 190 / 255, 0 / 255)
|
||||
elseif tone == Enum.DialogTone.Enemy then
|
||||
frame.BackgroundColor3 = Color3.new(140/255, 0/255, 0/255)
|
||||
frame.Number.TextColor3 = Color3.new(255/255,88/255, 79/255)
|
||||
frame.BackgroundColor3 = Color3.new(140 / 255, 0 / 255, 0 / 255)
|
||||
frame.Number.TextColor3 = Color3.new(255 / 255, 88 / 255, 79 / 255)
|
||||
end
|
||||
end
|
||||
|
||||
function highlightColor(frame, tone)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
end
|
||||
end
|
||||
|
||||
function wanderDialog()
|
||||
print("Wander")
|
||||
print "Wander"
|
||||
mainFrame.Visible = false
|
||||
endDialog()
|
||||
showMessage(characterWanderedOffMessage, characterWanderedOffSize)
|
||||
end
|
||||
|
||||
function timeoutDialog()
|
||||
print("Timeout")
|
||||
print "Timeout"
|
||||
mainFrame.Visible = false
|
||||
endDialog()
|
||||
showMessage(conversationTimedOut, conversationTimedOutSize)
|
||||
end
|
||||
function normalEndDialog()
|
||||
print("Done")
|
||||
print "Done"
|
||||
endDialog()
|
||||
end
|
||||
|
||||
|
|
@ -253,10 +249,18 @@ function selectChoice(choice)
|
|||
else
|
||||
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)
|
||||
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)
|
||||
presentDialogChoices(currentConversationPartner, dialogChoice:GetChildren())
|
||||
|
|
@ -264,36 +268,42 @@ function selectChoice(choice)
|
|||
end
|
||||
|
||||
function newChoice(numberText)
|
||||
local frame = Instance.new("TextButton")
|
||||
frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255)
|
||||
local frame = Instance.new "TextButton"
|
||||
frame.BackgroundColor3 = Color3.new(0 / 255, 0 / 255, 179 / 255)
|
||||
frame.AutoButtonColor = false
|
||||
frame.BorderSizePixel = 0
|
||||
frame.Text = ""
|
||||
frame.MouseEnter:connect(function() highlightColor(frame, currentTone()) end)
|
||||
frame.MouseLeave:connect(function() resetColor(frame, currentTone()) end)
|
||||
frame.MouseButton1Click:connect(function() selectChoice(frame) end)
|
||||
frame.MouseEnter:connect(function()
|
||||
highlightColor(frame, currentTone())
|
||||
end)
|
||||
frame.MouseLeave:connect(function()
|
||||
resetColor(frame, currentTone())
|
||||
end)
|
||||
frame.MouseButton1Click:connect(function()
|
||||
selectChoice(frame)
|
||||
end)
|
||||
frame.RobloxLocked = true
|
||||
|
||||
local number = Instance.new("TextLabel")
|
||||
local number = Instance.new "TextLabel"
|
||||
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.FontSize = Enum.FontSize.Size14
|
||||
number.BackgroundTransparency = 1
|
||||
number.Position = UDim2.new(0,4,0,2)
|
||||
number.Size = UDim2.new(0,20,0,24)
|
||||
number.Position = UDim2.new(0, 4, 0, 2)
|
||||
number.Size = UDim2.new(0, 20, 0, 24)
|
||||
number.TextXAlignment = Enum.TextXAlignment.Left
|
||||
number.TextYAlignment = Enum.TextYAlignment.Top
|
||||
number.RobloxLocked = true
|
||||
number.Parent = frame
|
||||
|
||||
local prompt = Instance.new("TextLabel")
|
||||
local prompt = Instance.new "TextLabel"
|
||||
prompt.Name = "UserPrompt"
|
||||
prompt.BackgroundTransparency = 1
|
||||
prompt.TextColor3 = Color3.new(1,1,1)
|
||||
prompt.TextColor3 = Color3.new(1, 1, 1)
|
||||
prompt.FontSize = Enum.FontSize.Size14
|
||||
prompt.Position = UDim2.new(0,28, 0, 2)
|
||||
prompt.Size = UDim2.new(1,-32, 1, -4)
|
||||
prompt.Position = UDim2.new(0, 28, 0, 2)
|
||||
prompt.Size = UDim2.new(1, -32, 1, -4)
|
||||
prompt.TextXAlignment = Enum.TextXAlignment.Left
|
||||
prompt.TextYAlignment = Enum.TextYAlignment.Top
|
||||
prompt.TextWrap = true
|
||||
|
|
@ -303,25 +313,25 @@ function newChoice(numberText)
|
|||
return frame
|
||||
end
|
||||
function initialize(parent)
|
||||
choices[1] = newChoice("1)")
|
||||
choices[2] = newChoice("2)")
|
||||
choices[3] = newChoice("3)")
|
||||
choices[4] = newChoice("4)")
|
||||
choices[1] = newChoice "1)"
|
||||
choices[2] = newChoice "2)"
|
||||
choices[3] = newChoice "3)"
|
||||
choices[4] = newChoice "4)"
|
||||
|
||||
lastChoice = newChoice("5)")
|
||||
lastChoice = newChoice "5)"
|
||||
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.Size = UDim2.new(0, 350, 0, 200)
|
||||
mainFrame.Style = Enum.FrameStyle.ChatBlue
|
||||
mainFrame.Visible = false
|
||||
|
||||
imageLabel = Instance.new("ImageLabel")
|
||||
imageLabel = Instance.new "ImageLabel"
|
||||
imageLabel.Name = "Tail"
|
||||
imageLabel.Size = UDim2.new(0,62,0,53)
|
||||
imageLabel.Position = UDim2.new(1,8,0.25)
|
||||
imageLabel.Size = UDim2.new(0, 62, 0, 53)
|
||||
imageLabel.Position = UDim2.new(1, 8, 0.25)
|
||||
imageLabel.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png"
|
||||
imageLabel.BackgroundTransparency = 1
|
||||
imageLabel.RobloxLocked = true
|
||||
|
|
@ -346,11 +356,13 @@ function presentDialogChoices(talkingPart, dialogChoices)
|
|||
currentConversationPartner = talkingPart
|
||||
sortedDialogChoices = {}
|
||||
for n, obj in pairs(dialogChoices) do
|
||||
if obj:IsA("DialogChoice") then
|
||||
if obj:IsA "DialogChoice" then
|
||||
table.insert(sortedDialogChoices, obj)
|
||||
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
|
||||
normalEndDialog()
|
||||
|
|
@ -367,9 +379,9 @@ function presentDialogChoices(talkingPart, dialogChoices)
|
|||
for n, obj in pairs(sortedDialogChoices) do
|
||||
if pos <= #choices then
|
||||
--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
|
||||
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].Size = UDim2.new(1, 0, 0, height)
|
||||
|
|
@ -382,11 +394,11 @@ function presentDialogChoices(talkingPart, dialogChoices)
|
|||
end
|
||||
end
|
||||
|
||||
lastChoice.Position = UDim2.new(0,0,0,yPosition)
|
||||
lastChoice.Position = UDim2.new(0, 0, 0, yPosition)
|
||||
lastChoice.Number.Text = pos .. ")"
|
||||
|
||||
mainFrame.Size = UDim2.new(0, 350, 0, yPosition+24+32)
|
||||
mainFrame.Position = UDim2.new(0,20,0.0, -mainFrame.Size.Y.Offset-20)
|
||||
mainFrame.Size = UDim2.new(0, 350, 0, yPosition + 24 + 32)
|
||||
mainFrame.Position = UDim2.new(0, 20, 0, -mainFrame.Size.Y.Offset - 20)
|
||||
styleMainFrame(currentTone())
|
||||
mainFrame.Visible = true
|
||||
end
|
||||
|
|
@ -425,7 +437,13 @@ end
|
|||
|
||||
function checkForLeaveArea()
|
||||
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()
|
||||
end
|
||||
wait(1)
|
||||
|
|
@ -433,7 +451,7 @@ function checkForLeaveArea()
|
|||
end
|
||||
|
||||
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
|
||||
showMessage(tooFarAwayMessage, tooFarAwaySize)
|
||||
return
|
||||
|
|
@ -465,13 +483,15 @@ end
|
|||
|
||||
function addDialog(dialog)
|
||||
if dialog.Parent then
|
||||
if dialog.Parent:IsA("BasePart") then
|
||||
if dialog.Parent:IsA "BasePart" then
|
||||
local chatGui = chatNotificationGui:clone()
|
||||
chatGui.Enabled = not dialog.InUse
|
||||
chatGui.Adornee = dialog.Parent
|
||||
chatGui.RobloxLocked = true
|
||||
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)
|
||||
|
||||
dialogMap[dialog] = chatGui
|
||||
|
|
@ -512,9 +532,9 @@ function fetchScripts()
|
|||
return
|
||||
end
|
||||
|
||||
waitForChild(model,"TimeoutScript")
|
||||
waitForChild(model, "TimeoutScript")
|
||||
timeoutScript = model.TimeoutScript
|
||||
waitForChild(model,"ReenableDialogScript")
|
||||
waitForChild(model, "ReenableDialogScript")
|
||||
reenableDialogScript = model.ReenableDialogScript
|
||||
end
|
||||
|
||||
|
|
@ -538,20 +558,28 @@ function onLoad()
|
|||
waitForChild(gui, "BottomLeftControl")
|
||||
|
||||
--print("Initializing Frame")
|
||||
local frame = Instance.new("Frame")
|
||||
local frame = Instance.new "Frame"
|
||||
frame.Name = "DialogFrame"
|
||||
frame.Position = UDim2.new(0,0,0,0)
|
||||
frame.Size = UDim2.new(0,0,0,0)
|
||||
frame.Position = UDim2.new(0, 0, 0, 0)
|
||||
frame.Size = UDim2.new(0, 0, 0, 0)
|
||||
frame.BackgroundTransparency = 1
|
||||
frame.RobloxLocked = true
|
||||
frame.Parent = gui.BottomLeftControl
|
||||
initialize(frame)
|
||||
|
||||
--print("Adding Dialogs")
|
||||
game.CollectionService.ItemAdded:connect(function(obj) if obj:IsA("Dialog") then addDialog(obj) end end)
|
||||
game.CollectionService.ItemRemoved:connect(function(obj) if obj:IsA("Dialog") then removeDialog(obj) end end)
|
||||
for i, obj in pairs(game.CollectionService:GetCollection("Dialog")) do
|
||||
if obj:IsA("Dialog") then
|
||||
game.CollectionService.ItemAdded:connect(function(obj)
|
||||
if obj:IsA "Dialog" then
|
||||
addDialog(obj)
|
||||
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)
|
||||
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 = {}
|
||||
|
||||
t.Foo =
|
||||
function()
|
||||
print("foo")
|
||||
end
|
||||
t.Foo = function()
|
||||
print "foo"
|
||||
end
|
||||
|
||||
t.Bar =
|
||||
function()
|
||||
print("bar")
|
||||
end
|
||||
t.Bar = function()
|
||||
print "bar"
|
||||
end
|
||||
|
||||
t.Help =
|
||||
function(funcNameOrFunc)
|
||||
t.Help = function(funcNameOrFunc)
|
||||
--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
|
||||
return "Function Foo. Arguments: None. Side effect: prints foo"
|
||||
elseif funcNameOrFunc == "Bar" or funcNameOrFunc == t.Bar then
|
||||
return "Function Bar. Arguments: None. Side effect: prints bar"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
waitForProperty(game.Players,"LocalPlayer")
|
||||
waitForChild(script.Parent,"Popup")
|
||||
waitForChild(script.Parent.Popup,"AcceptButton")
|
||||
waitForProperty(game.Players, "LocalPlayer")
|
||||
waitForChild(script.Parent, "Popup")
|
||||
waitForChild(script.Parent.Popup, "AcceptButton")
|
||||
script.Parent.Popup.AcceptButton.Modal = true
|
||||
|
||||
local localPlayer = game.Players.LocalPlayer
|
||||
local teleportUI = nil
|
||||
|
||||
local acceptedTeleport = Instance.new("IntValue")
|
||||
|
||||
local friendRequestBlacklist = {}
|
||||
|
||||
local teleportEnabled = true
|
||||
|
||||
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
|
||||
|
||||
function makeFriend(fromPlayer,toPlayer)
|
||||
|
||||
local popup = script.Parent:FindFirstChild("Popup")
|
||||
if popup == nil then return end -- there is no popup!
|
||||
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!
|
||||
function makeFriend(fromPlayer, toPlayer)
|
||||
local popup = script.Parent:FindFirstChild "Popup"
|
||||
if popup == nil then
|
||||
return
|
||||
end -- there is no popup!
|
||||
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.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()
|
||||
popup.Visible = true
|
||||
popup.AcceptButton.Text = "Accept"
|
||||
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
|
||||
|
||||
yesCon = popup.AcceptButton.MouseButton1Click:connect(function()
|
||||
popup.Visible = false
|
||||
toPlayer:RequestFriendship(fromPlayer)
|
||||
if yesCon then yesCon:disconnect() end
|
||||
if noCon then noCon:disconnect() end
|
||||
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible())
|
||||
if yesCon then
|
||||
yesCon:disconnect()
|
||||
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)
|
||||
|
||||
noCon = popup.DeclineButton.MouseButton1Click:connect(function()
|
||||
popup.Visible = false
|
||||
toPlayer:RevokeFriendship(fromPlayer)
|
||||
friendRequestBlacklist[fromPlayer] = true
|
||||
print("pop up blacklist")
|
||||
if yesCon then yesCon:disconnect() end
|
||||
if noCon then noCon:disconnect() end
|
||||
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible())
|
||||
print "pop up blacklist"
|
||||
if yesCon then
|
||||
yesCon:disconnect()
|
||||
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
|
||||
|
||||
|
||||
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 fromPlayer ~= localPlayer and toPlayer ~= localPlayer then return end
|
||||
if fromPlayer ~= localPlayer and toPlayer ~= localPlayer then
|
||||
return
|
||||
end
|
||||
|
||||
if fromPlayer == localPlayer then
|
||||
if event == Enum.FriendRequestEvent.Accept then
|
||||
game:GetService("GuiService"):SendNotification("You are Friends",
|
||||
game:GetService("GuiService"):SendNotification(
|
||||
"You are Friends",
|
||||
"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,
|
||||
function()
|
||||
|
||||
end)
|
||||
function() end
|
||||
)
|
||||
end
|
||||
elseif toPlayer == localPlayer then
|
||||
if event == Enum.FriendRequestEvent.Issue then
|
||||
if friendRequestBlacklist[fromPlayer] then return end -- previously cancelled friend request, we don't want it!
|
||||
game:GetService("GuiService"):SendNotification("Friend Request",
|
||||
if friendRequestBlacklist[fromPlayer] then
|
||||
return
|
||||
end -- previously cancelled friend request, we don't want it!
|
||||
game:GetService("GuiService"):SendNotification(
|
||||
"Friend Request",
|
||||
"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,
|
||||
function()
|
||||
makeFriend(fromPlayer,toPlayer)
|
||||
end)
|
||||
makeFriend(fromPlayer, toPlayer)
|
||||
end
|
||||
)
|
||||
elseif event == Enum.FriendRequestEvent.Accept then
|
||||
game:GetService("GuiService"):SendNotification("You are Friends",
|
||||
game:GetService("GuiService"):SendNotification(
|
||||
"You are Friends",
|
||||
"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,
|
||||
function()
|
||||
|
||||
end)
|
||||
function() end
|
||||
)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
function showOneButton()
|
||||
local popup = script.Parent:FindFirstChild("Popup")
|
||||
local popup = script.Parent:FindFirstChild "Popup"
|
||||
if popup then
|
||||
popup.OKButton.Visible = true
|
||||
popup.DeclineButton.Visible = false
|
||||
|
|
@ -112,7 +145,7 @@ function showOneButton()
|
|||
end
|
||||
|
||||
function showTwoButtons()
|
||||
local popup = script.Parent:FindFirstChild("Popup")
|
||||
local popup = script.Parent:FindFirstChild "Popup"
|
||||
if popup then
|
||||
popup.OKButton.Visible = false
|
||||
popup.DeclineButton.Visible = true
|
||||
|
|
@ -120,7 +153,7 @@ function showTwoButtons()
|
|||
end
|
||||
end
|
||||
|
||||
function onTeleport(teleportState, placeId, spawnName)
|
||||
function onTeleport(teleportState, _, _)
|
||||
if game:GetService("TeleportService").CustomizedTeleportUI == false then
|
||||
if teleportState == Enum.TeleportState.Started then
|
||||
showTeleportUI("Teleport started...", 0)
|
||||
|
|
@ -139,8 +172,9 @@ function showTeleportUI(message, timer)
|
|||
teleportUI:Remove()
|
||||
end
|
||||
waitForChild(localPlayer, "PlayerGui")
|
||||
teleportUI = Instance.new("Message", localPlayer.PlayerGui)
|
||||
teleportUI = Instance.new "Message"
|
||||
teleportUI.Text = message
|
||||
teleportUI.Parent = localPlayer.PlayerGui
|
||||
if timer > 0 then
|
||||
wait(timer)
|
||||
teleportUI:Remove()
|
||||
|
|
@ -148,100 +182,173 @@ function showTeleportUI(message, timer)
|
|||
end
|
||||
|
||||
if teleportEnabled then
|
||||
|
||||
localPlayer.OnTeleport:connect(onTeleport)
|
||||
|
||||
game:GetService("TeleportService").ErrorCallback = function(message)
|
||||
local popup = script.Parent:FindFirstChild("Popup")
|
||||
local popup = script.Parent:FindFirstChild "Popup"
|
||||
showOneButton()
|
||||
popup.PopupText.Text = message
|
||||
local clickCon
|
||||
clickCon = popup.OKButton.MouseButton1Click:connect(function()
|
||||
game:GetService("TeleportService"):TeleportCancel()
|
||||
if clickCon then clickCon: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())
|
||||
if clickCon then
|
||||
clickCon: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)
|
||||
game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup"), Enum.CenterDialogType.QuitDialog,
|
||||
game.GuiService:AddCenterDialog(
|
||||
script.Parent:FindFirstChild "Popup",
|
||||
Enum.CenterDialogType.QuitDialog,
|
||||
--ShowFunction
|
||||
function()
|
||||
showOneButton()
|
||||
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,
|
||||
--HideFunction
|
||||
function()
|
||||
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible())
|
||||
end)
|
||||
|
||||
popup:TweenSize(
|
||||
UDim2.new(0, 0, 0, 0),
|
||||
Enum.EasingDirection.Out,
|
||||
Enum.EasingStyle.Quart,
|
||||
1,
|
||||
true,
|
||||
makePopupInvisible()
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
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.PopupImage.Image = ""
|
||||
|
||||
local yesCon, noCon
|
||||
|
||||
local function killCons()
|
||||
if yesCon then yesCon:disconnect() end
|
||||
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())
|
||||
if yesCon then
|
||||
yesCon:disconnect()
|
||||
end
|
||||
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
|
||||
|
||||
yesCon = popup.AcceptButton.MouseButton1Click:connect(function()
|
||||
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
|
||||
showOneButton()
|
||||
popup.PopupText.Text = err
|
||||
local clickCon
|
||||
clickCon = popup.OKButton.MouseButton1Click:connect(function()
|
||||
if clickCon then clickCon: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())
|
||||
if clickCon then
|
||||
clickCon: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)
|
||||
game.GuiService:AddCenterDialog(script.Parent:FindFirstChild("Popup"), Enum.CenterDialogType.QuitDialog,
|
||||
game.GuiService:AddCenterDialog(
|
||||
script.Parent:FindFirstChild "Popup",
|
||||
Enum.CenterDialogType.QuitDialog,
|
||||
--ShowFunction
|
||||
function()
|
||||
showOneButton()
|
||||
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,
|
||||
--HideFunction
|
||||
function()
|
||||
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible())
|
||||
end)
|
||||
popup:TweenSize(
|
||||
UDim2.new(0, 0, 0, 0),
|
||||
Enum.EasingDirection.Out,
|
||||
Enum.EasingStyle.Quart,
|
||||
1,
|
||||
true,
|
||||
makePopupInvisible()
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
end)
|
||||
|
||||
noCon = popup.DeclineButton.MouseButton1Click:connect(function()
|
||||
killCons()
|
||||
local success = pcall(function() game:GetService("TeleportService"):TeleportCancel() end)
|
||||
pcall(function()
|
||||
game:GetService("TeleportService"):TeleportCancel()
|
||||
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
|
||||
function()
|
||||
showTwoButtons()
|
||||
popup.AcceptButton.Text = "Leave"
|
||||
popup.DeclineButton.Text = "Stay"
|
||||
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,
|
||||
--HideFunction
|
||||
function()
|
||||
popup:TweenSize(UDim2.new(0,0,0,0),Enum.EasingDirection.Out,Enum.EasingStyle.Quart,1,true,makePopupInvisible())
|
||||
end)
|
||||
popup:TweenSize(
|
||||
UDim2.new(0, 0, 0, 0),
|
||||
Enum.EasingDirection.Out,
|
||||
Enum.EasingStyle.Quart,
|
||||
1,
|
||||
true,
|
||||
makePopupInvisible()
|
||||
)
|
||||
end
|
||||
)
|
||||
end)
|
||||
|
||||
if centerDialogSuccess == false then
|
||||
script.Parent:FindFirstChild("Popup").Visible = true
|
||||
popup.AcceptButton.Text = "Leave"
|
||||
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
|
||||
return true
|
||||
|
||||
end
|
||||
end
|
||||
38
48488451.lua
38
48488451.lua
|
|
@ -1,8 +1,8 @@
|
|||
--build our gui
|
||||
|
||||
local popupFrame = Instance.new("Frame")
|
||||
popupFrame.Position = UDim2.new(0.5,-165,0.5,-175)
|
||||
popupFrame.Size = UDim2.new(0,330,0,350)
|
||||
local popupFrame = Instance.new "Frame"
|
||||
popupFrame.Position = UDim2.new(0.5, -165, 0.5, -175)
|
||||
popupFrame.Size = UDim2.new(0, 330, 0, 350)
|
||||
popupFrame.Style = Enum.FrameStyle.RobloxRound
|
||||
popupFrame.ZIndex = 4
|
||||
popupFrame.Name = "Popup"
|
||||
|
|
@ -10,26 +10,26 @@ popupFrame.Visible = false
|
|||
popupFrame.Parent = script.Parent
|
||||
|
||||
local darken = popupFrame:clone()
|
||||
darken.Size = UDim2.new(1,16,1,16)
|
||||
darken.Position = UDim2.new(0,-8,0,-8)
|
||||
darken.Size = UDim2.new(1, 16, 1, 16)
|
||||
darken.Position = UDim2.new(0, -8, 0, -8)
|
||||
darken.Name = "Darken"
|
||||
darken.ZIndex = 1
|
||||
darken.Parent = popupFrame
|
||||
|
||||
local acceptButton = Instance.new("TextButton")
|
||||
acceptButton.Position = UDim2.new(0,20,0,270)
|
||||
acceptButton.Size = UDim2.new(0,100,0,50)
|
||||
local acceptButton = Instance.new "TextButton"
|
||||
acceptButton.Position = UDim2.new(0, 20, 0, 270)
|
||||
acceptButton.Size = UDim2.new(0, 100, 0, 50)
|
||||
acceptButton.Font = Enum.Font.ArialBold
|
||||
acceptButton.FontSize = Enum.FontSize.Size24
|
||||
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.ZIndex = 5
|
||||
acceptButton.Name = "AcceptButton"
|
||||
acceptButton.Parent = popupFrame
|
||||
|
||||
local declineButton = acceptButton:clone()
|
||||
declineButton.Position = UDim2.new(1,-120,0,270)
|
||||
declineButton.Position = UDim2.new(1, -120, 0, 270)
|
||||
declineButton.Text = "No"
|
||||
declineButton.Name = "DeclineButton"
|
||||
declineButton.Parent = popupFrame
|
||||
|
|
@ -37,34 +37,34 @@ declineButton.Parent = popupFrame
|
|||
local okButton = acceptButton:clone()
|
||||
okButton.Name = "OKButton"
|
||||
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.Parent = popupFrame
|
||||
|
||||
local popupImage = Instance.new("ImageLabel")
|
||||
local popupImage = Instance.new "ImageLabel"
|
||||
popupImage.BackgroundTransparency = 1
|
||||
popupImage.Position = UDim2.new(0.5,-140,0,0)
|
||||
popupImage.Size = UDim2.new(0,280,0,280)
|
||||
popupImage.Position = UDim2.new(0.5, -140, 0, 0)
|
||||
popupImage.Size = UDim2.new(0, 280, 0, 280)
|
||||
popupImage.ZIndex = 3
|
||||
popupImage.Name = "PopupImage"
|
||||
popupImage.Parent = popupFrame
|
||||
|
||||
local backing = Instance.new("ImageLabel")
|
||||
local backing = Instance.new "ImageLabel"
|
||||
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.Name = "Backing"
|
||||
backing.ZIndex = 2
|
||||
backing.Parent = popupImage
|
||||
|
||||
local popupText = Instance.new("TextLabel")
|
||||
local popupText = Instance.new "TextLabel"
|
||||
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.FontSize = Enum.FontSize.Size36
|
||||
popupText.BackgroundTransparency = 1
|
||||
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.ZIndex = 5
|
||||
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 = {}
|
||||
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
@ -10,29 +8,29 @@ local t = {}
|
|||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
--JSON Encoder and Parser for Lua 5.1
|
||||
--
|
||||
--Copyright 2007 Shaun Brown (http://www.chipmunkav.com)
|
||||
--All Rights Reserved.
|
||||
--JSON Encoder and Parser for Lua 5.1
|
||||
--
|
||||
--Copyright 2007 Shaun Brown (http://www.chipmunkav.com)
|
||||
--All Rights Reserved.
|
||||
|
||||
--Permission is hereby granted, free of charge, to any person
|
||||
--obtaining a copy of this software to deal in the Software without
|
||||
--restriction, including without limitation the rights to use,
|
||||
--copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
--sell copies of the Software, and to permit persons to whom the
|
||||
--Software is furnished to do so, subject to the following conditions:
|
||||
--Permission is hereby granted, free of charge, to any person
|
||||
--obtaining a copy of this software to deal in the Software without
|
||||
--restriction, including without limitation the rights to use,
|
||||
--copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
--sell copies of the Software, and to permit persons to whom the
|
||||
--Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
--The above copyright notice and this permission notice shall be
|
||||
--included in all copies or substantial portions of the Software.
|
||||
--If you find this software useful please give www.chipmunkav.com a mention.
|
||||
--The above copyright notice and this permission notice shall be
|
||||
--included in all copies or substantial portions of the Software.
|
||||
--If you find this software useful please give www.chipmunkav.com a mention.
|
||||
|
||||
--THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
--EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
--OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
--IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
||||
--ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
--CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
--CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
--THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
--EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
--OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
--IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
||||
--ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
--CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
--CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
local string = string
|
||||
local math = math
|
||||
|
|
@ -47,9 +45,8 @@ local ipairs = ipairs
|
|||
local assert = assert
|
||||
local Chipmunk = Chipmunk
|
||||
|
||||
|
||||
local StringBuilder = {
|
||||
buffer = {}
|
||||
buffer = {},
|
||||
}
|
||||
|
||||
function StringBuilder:New()
|
||||
|
|
@ -61,7 +58,7 @@ function StringBuilder:New()
|
|||
end
|
||||
|
||||
function StringBuilder:Append(s)
|
||||
self.buffer[#self.buffer+1] = s
|
||||
self.buffer[#self.buffer + 1] = s
|
||||
end
|
||||
|
||||
function StringBuilder:ToString()
|
||||
|
|
@ -70,15 +67,15 @@ end
|
|||
|
||||
local JsonWriter = {
|
||||
backslashes = {
|
||||
['\b'] = "\\b",
|
||||
['\t'] = "\\t",
|
||||
['\n'] = "\\n",
|
||||
['\f'] = "\\f",
|
||||
['\r'] = "\\r",
|
||||
['"'] = "\\\"",
|
||||
['\\'] = "\\\\",
|
||||
['/'] = "\\/"
|
||||
}
|
||||
["\b"] = "\\b",
|
||||
["\t"] = "\\t",
|
||||
["\n"] = "\\n",
|
||||
["\f"] = "\\f",
|
||||
["\r"] = "\\r",
|
||||
['"'] = '\\"',
|
||||
["\\"] = "\\\\",
|
||||
["/"] = "\\/",
|
||||
},
|
||||
}
|
||||
|
||||
function JsonWriter:New()
|
||||
|
|
@ -119,7 +116,7 @@ function JsonWriter:Write(o)
|
|||
end
|
||||
|
||||
function JsonWriter:WriteNil()
|
||||
self:Append("null")
|
||||
self:Append "null"
|
||||
end
|
||||
|
||||
function JsonWriter:WriteString(o)
|
||||
|
|
@ -127,13 +124,15 @@ function JsonWriter:WriteString(o)
|
|||
end
|
||||
|
||||
function JsonWriter:ParseString(s)
|
||||
self:Append('"')
|
||||
self:Append(string.gsub(s, "[%z%c\\\"/]", function(n)
|
||||
self:Append '"'
|
||||
self:Append(string.gsub(s, '[%z%c\\"/]', function(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))
|
||||
end))
|
||||
self:Append('"')
|
||||
self:Append '"'
|
||||
end
|
||||
|
||||
function JsonWriter:IsArray(t)
|
||||
|
|
@ -146,14 +145,14 @@ function JsonWriter:IsArray(t)
|
|||
end
|
||||
return false
|
||||
end
|
||||
for k,v in pairs(t) do
|
||||
for k, v in pairs(t) do
|
||||
if not isindex(k) then
|
||||
return false, '{', '}'
|
||||
return false, "{", "}"
|
||||
else
|
||||
count = math.max(count, k)
|
||||
end
|
||||
end
|
||||
return true, '[', ']', count
|
||||
return true, "[", "]", count
|
||||
end
|
||||
|
||||
function JsonWriter:WriteTable(t)
|
||||
|
|
@ -163,18 +162,18 @@ function JsonWriter:WriteTable(t)
|
|||
for i = 1, n do
|
||||
self:Write(t[i])
|
||||
if i < n then
|
||||
self:Append(',')
|
||||
self:Append ","
|
||||
end
|
||||
end
|
||||
else
|
||||
local first = true;
|
||||
local first = true
|
||||
for k, v in pairs(t) do
|
||||
if not first then
|
||||
self:Append(',')
|
||||
self:Append ","
|
||||
end
|
||||
first = false;
|
||||
first = false
|
||||
self:ParseString(k)
|
||||
self:Append(':')
|
||||
self:Append ":"
|
||||
self:Write(v)
|
||||
end
|
||||
end
|
||||
|
|
@ -182,9 +181,7 @@ function JsonWriter:WriteTable(t)
|
|||
end
|
||||
|
||||
function JsonWriter:WriteError(o)
|
||||
error(string.format(
|
||||
"Encoding of %s unsupported",
|
||||
tostring(o)))
|
||||
error(string.format("Encoding of %s unsupported", tostring(o)))
|
||||
end
|
||||
|
||||
function JsonWriter:WriteFunction(o)
|
||||
|
|
@ -197,7 +194,7 @@ end
|
|||
|
||||
local StringReader = {
|
||||
s = "",
|
||||
i = 0
|
||||
i = 0,
|
||||
}
|
||||
|
||||
function StringReader:New(s)
|
||||
|
|
@ -217,7 +214,7 @@ function StringReader:Peek()
|
|||
end
|
||||
|
||||
function StringReader:Next()
|
||||
self.i = self.i+1
|
||||
self.i = self.i + 1
|
||||
if self.i <= #self.s then
|
||||
return string.sub(self.s, self.i, self.i)
|
||||
end
|
||||
|
|
@ -230,12 +227,12 @@ end
|
|||
|
||||
local JsonReader = {
|
||||
escapes = {
|
||||
['t'] = '\t',
|
||||
['n'] = '\n',
|
||||
['f'] = '\f',
|
||||
['r'] = '\r',
|
||||
['b'] = '\b',
|
||||
}
|
||||
["t"] = "\t",
|
||||
["n"] = "\n",
|
||||
["f"] = "\f",
|
||||
["r"] = "\r",
|
||||
["b"] = "\b",
|
||||
},
|
||||
}
|
||||
|
||||
function JsonReader:New(s)
|
||||
|
|
@ -243,31 +240,29 @@ function JsonReader:New(s)
|
|||
o.reader = StringReader:New(s)
|
||||
setmetatable(o, self)
|
||||
self.__index = self
|
||||
return o;
|
||||
return o
|
||||
end
|
||||
|
||||
function JsonReader:Read()
|
||||
self:SkipWhiteSpace()
|
||||
local peek = self:Peek()
|
||||
if peek == nil then
|
||||
error(string.format(
|
||||
"Nil string: '%s'",
|
||||
self:All()))
|
||||
elseif peek == '{' then
|
||||
error(string.format("Nil string: '%s'", self:All()))
|
||||
elseif peek == "{" then
|
||||
return self:ReadObject()
|
||||
elseif peek == '[' then
|
||||
elseif peek == "[" then
|
||||
return self:ReadArray()
|
||||
elseif peek == '"' then
|
||||
return self:ReadString()
|
||||
elseif string.find(peek, "[%+%-%d]") then
|
||||
return self:ReadNumber()
|
||||
elseif peek == 't' then
|
||||
elseif peek == "t" then
|
||||
return self:ReadTrue()
|
||||
elseif peek == 'f' then
|
||||
elseif peek == "f" then
|
||||
return self:ReadFalse()
|
||||
elseif peek == 'n' then
|
||||
elseif peek == "n" then
|
||||
return self:ReadNull()
|
||||
elseif peek == '/' then
|
||||
elseif peek == "/" then
|
||||
self:ReadComment()
|
||||
return self:Read()
|
||||
else
|
||||
|
|
@ -276,27 +271,24 @@ function JsonReader:Read()
|
|||
end
|
||||
|
||||
function JsonReader:ReadTrue()
|
||||
self:TestReservedWord{'t','r','u','e'}
|
||||
self:TestReservedWord { "t", "r", "u", "e" }
|
||||
return true
|
||||
end
|
||||
|
||||
function JsonReader:ReadFalse()
|
||||
self:TestReservedWord{'f','a','l','s','e'}
|
||||
self:TestReservedWord { "f", "a", "l", "s", "e" }
|
||||
return false
|
||||
end
|
||||
|
||||
function JsonReader:ReadNull()
|
||||
self:TestReservedWord{'n','u','l','l'}
|
||||
self:TestReservedWord { "n", "u", "l", "l" }
|
||||
return nil
|
||||
end
|
||||
|
||||
function JsonReader:TestReservedWord(t)
|
||||
for i, v in ipairs(t) do
|
||||
if self:Next() ~= v then
|
||||
error(string.format(
|
||||
"Error reading '%s': %s",
|
||||
table.concat(t),
|
||||
self:All()))
|
||||
error(string.format("Error reading '%s': %s", table.concat(t), self:All()))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -304,17 +296,13 @@ end
|
|||
function JsonReader:ReadNumber()
|
||||
local result = self:Next()
|
||||
local peek = self:Peek()
|
||||
while peek ~= nil and string.find(
|
||||
peek,
|
||||
"[%+%-%d%.eE]") do
|
||||
while peek ~= nil and string.find(peek, "[%+%-%d%.eE]") do
|
||||
result = result .. self:Next()
|
||||
peek = self:Peek()
|
||||
end
|
||||
result = tonumber(result)
|
||||
if result == nil then
|
||||
error(string.format(
|
||||
"Invalid number: '%s'",
|
||||
result))
|
||||
error(string.format("Invalid number: '%s'", result))
|
||||
else
|
||||
return result
|
||||
end
|
||||
|
|
@ -325,7 +313,7 @@ function JsonReader:ReadString()
|
|||
assert(self:Next() == '"')
|
||||
while self:Peek() ~= '"' do
|
||||
local ch = self:Next()
|
||||
if ch == '\\' then
|
||||
if ch == "\\" then
|
||||
ch = self:Next()
|
||||
if self.escapes[ch] then
|
||||
ch = self.escapes[ch]
|
||||
|
|
@ -337,23 +325,18 @@ function JsonReader:ReadString()
|
|||
local fromunicode = function(m)
|
||||
return string.char(tonumber(m, 16))
|
||||
end
|
||||
return string.gsub(
|
||||
result,
|
||||
"u%x%x(%x%x)",
|
||||
fromunicode)
|
||||
return string.gsub(result, "u%x%x(%x%x)", fromunicode)
|
||||
end
|
||||
|
||||
function JsonReader:ReadComment()
|
||||
assert(self:Next() == '/')
|
||||
assert(self:Next() == "/")
|
||||
local second = self:Next()
|
||||
if second == '/' then
|
||||
if second == "/" then
|
||||
self:ReadSingleLineComment()
|
||||
elseif second == '*' then
|
||||
elseif second == "*" then
|
||||
self:ReadBlockComment()
|
||||
else
|
||||
error(string.format(
|
||||
"Invalid comment: %s",
|
||||
self:All()))
|
||||
error(string.format("Invalid comment: %s", self:All()))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -361,15 +344,11 @@ function JsonReader:ReadBlockComment()
|
|||
local done = false
|
||||
while not done do
|
||||
local ch = self:Next()
|
||||
if ch == '*' and self:Peek() == '/' then
|
||||
if ch == "*" and self:Peek() == "/" then
|
||||
done = true
|
||||
end
|
||||
if not done and
|
||||
ch == '/' and
|
||||
self:Peek() == "*" then
|
||||
error(string.format(
|
||||
"Invalid comment: %s, '/*' illegal.",
|
||||
self:All()))
|
||||
if not done and ch == "/" and self:Peek() == "*" then
|
||||
error(string.format("Invalid comment: %s, '/*' illegal.", self:All()))
|
||||
end
|
||||
end
|
||||
self:Next()
|
||||
|
|
@ -377,74 +356,64 @@ end
|
|||
|
||||
function JsonReader:ReadSingleLineComment()
|
||||
local ch = self:Next()
|
||||
while ch ~= '\r' and ch ~= '\n' do
|
||||
while ch ~= "\r" and ch ~= "\n" do
|
||||
ch = self:Next()
|
||||
end
|
||||
end
|
||||
|
||||
function JsonReader:ReadArray()
|
||||
local result = {}
|
||||
assert(self:Next() == '[')
|
||||
assert(self:Next() == "[")
|
||||
local done = false
|
||||
if self:Peek() == ']' then
|
||||
done = true;
|
||||
if self:Peek() == "]" then
|
||||
done = true
|
||||
end
|
||||
while not done do
|
||||
local item = self:Read()
|
||||
result[#result+1] = item
|
||||
result[#result + 1] = item
|
||||
self:SkipWhiteSpace()
|
||||
if self:Peek() == ']' then
|
||||
if self:Peek() == "]" then
|
||||
done = true
|
||||
end
|
||||
if not done then
|
||||
local ch = self:Next()
|
||||
if ch ~= ',' then
|
||||
error(string.format(
|
||||
"Invalid array: '%s' due to: '%s'",
|
||||
self:All(), ch))
|
||||
if ch ~= "," then
|
||||
error(string.format("Invalid array: '%s' due to: '%s'", self:All(), ch))
|
||||
end
|
||||
end
|
||||
end
|
||||
assert(']' == self:Next())
|
||||
assert("]" == self:Next())
|
||||
return result
|
||||
end
|
||||
|
||||
function JsonReader:ReadObject()
|
||||
local result = {}
|
||||
assert(self:Next() == '{')
|
||||
assert(self:Next() == "{")
|
||||
local done = false
|
||||
if self:Peek() == '}' then
|
||||
if self:Peek() == "}" then
|
||||
done = true
|
||||
end
|
||||
while not done do
|
||||
local key = self:Read()
|
||||
if type(key) ~= "string" then
|
||||
error(string.format(
|
||||
"Invalid non-string object key: %s",
|
||||
key))
|
||||
error(string.format("Invalid non-string object key: %s", key))
|
||||
end
|
||||
self:SkipWhiteSpace()
|
||||
local ch = self:Next()
|
||||
if ch ~= ':' then
|
||||
error(string.format(
|
||||
"Invalid object: '%s' due to: '%s'",
|
||||
self:All(),
|
||||
ch))
|
||||
if ch ~= ":" then
|
||||
error(string.format("Invalid object: '%s' due to: '%s'", self:All(), ch))
|
||||
end
|
||||
self:SkipWhiteSpace()
|
||||
local val = self:Read()
|
||||
result[key] = val
|
||||
self:SkipWhiteSpace()
|
||||
if self:Peek() == '}' then
|
||||
if self:Peek() == "}" then
|
||||
done = true
|
||||
end
|
||||
if not done then
|
||||
ch = self:Next()
|
||||
if ch ~= ',' then
|
||||
error(string.format(
|
||||
"Invalid array: '%s' near: '%s'",
|
||||
self:All(),
|
||||
ch))
|
||||
if ch ~= "," then
|
||||
error(string.format("Invalid array: '%s' near: '%s'", self:All(), ch))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -455,7 +424,7 @@ end
|
|||
function JsonReader:SkipWhiteSpace()
|
||||
local p = self:Peek()
|
||||
while p ~= nil and string.find(p, "[%s/]") do
|
||||
if p == '/' then
|
||||
if p == "/" then
|
||||
self:ReadComment()
|
||||
else
|
||||
self:Next()
|
||||
|
|
@ -492,12 +461,11 @@ function Null()
|
|||
end
|
||||
-------------------- End JSON Parser ------------------------
|
||||
|
||||
|
||||
t.DecodeJSON = function(jsonString)
|
||||
if type(jsonString) == "string" then
|
||||
return Decode(jsonString)
|
||||
end
|
||||
print("RbxUtil.DecodeJSON expects string argument!")
|
||||
print "RbxUtil.DecodeJSON expects string argument!"
|
||||
return nil
|
||||
end
|
||||
|
||||
|
|
@ -505,13 +473,6 @@ t.EncodeJSON = function(jsonTable)
|
|||
return Encode(jsonTable)
|
||||
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
|
||||
--returns true if made a wedge, false if the cell remains a block
|
||||
t.MakeWedge = function(x, y, z, defaultmaterial)
|
||||
return game:GetService("Terrain"):AutoWedgeCell(x,y,z)
|
||||
return game:GetService("Terrain"):AutoWedgeCell(x, y, z)
|
||||
end
|
||||
|
||||
t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, selectionParent)
|
||||
local terrain = game.Workspace:FindFirstChild("Terrain")
|
||||
if not terrain then return end
|
||||
local terrain = game.Workspace:FindFirstChild "Terrain"
|
||||
if not terrain then
|
||||
return
|
||||
end
|
||||
|
||||
assert(regionToSelect)
|
||||
assert(color)
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
-- 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
|
||||
|
||||
-- container for all adornments, passed back to user
|
||||
local selectionContainer = Instance.new("Model")
|
||||
local selectionContainer = Instance.new "Model"
|
||||
selectionContainer.Name = "SelectionContainer"
|
||||
selectionContainer.Archivable = false
|
||||
if selectionParent then
|
||||
|
|
@ -563,29 +526,29 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
|
|||
local adornments = {} -- contains all adornments
|
||||
local reusableAdorns = {}
|
||||
|
||||
local selectionPart = Instance.new("Part")
|
||||
local selectionPart = Instance.new "Part"
|
||||
selectionPart.Name = "SelectionPart"
|
||||
selectionPart.Transparency = 1
|
||||
selectionPart.Anchored = true
|
||||
selectionPart.Locked = true
|
||||
selectionPart.CanCollide = false
|
||||
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
|
||||
function Region3ToRegion3int16(region3)
|
||||
local theLowVec = region3.CFrame.p - (region3.Size/2) + Vector3.new(2,2,2)
|
||||
local lowCell = WorldToCellPreferSolid(terrain,theLowVec)
|
||||
local theLowVec = region3.CFrame.p - (region3.Size / 2) + Vector3.new(2, 2, 2)
|
||||
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 highIntVec = Vector3int16.new(highCell.x,highCell.y,highCell.z)
|
||||
local lowIntVec = Vector3int16.new(lowCell.x,lowCell.y,lowCell.z)
|
||||
local highIntVec = Vector3int16.new(highCell.x, highCell.y, highCell.z)
|
||||
local lowIntVec = Vector3int16.new(lowCell.x, lowCell.y, lowCell.z)
|
||||
|
||||
return Region3int16.new(lowIntVec,highIntVec)
|
||||
return Region3int16.new(lowIntVec, highIntVec)
|
||||
end
|
||||
|
||||
-- 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
|
||||
selectionPartClone = reusableAdorns[1]["part"]
|
||||
selectionBoxClone = reusableAdorns[1]["box"]
|
||||
table.remove(reusableAdorns,1)
|
||||
table.remove(reusableAdorns, 1)
|
||||
|
||||
selectionBoxClone.Visible = true
|
||||
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
|
||||
function cleanUpAdornments()
|
||||
for cellPos, adornTable in pairs(adornments) do
|
||||
|
||||
if adornTable.KeepAlive ~= currentKeepAliveTag then -- old news, we should get rid of this
|
||||
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
|
||||
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
|
||||
function adornFullCellsInRegion(region, color)
|
||||
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 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 cellPosBegin = WorldToCellPreferSolid(terrain, regionBegin)
|
||||
local cellPosEnd = WorldToCellPreferSolid(terrain, regionEnd)
|
||||
|
|
@ -658,7 +620,7 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
|
|||
|
||||
if cellMaterial ~= emptyMaterial then
|
||||
local cframePos = CellCenterToWorld(terrain, x, y, z)
|
||||
local cellPos = Vector3int16.new(x,y,z)
|
||||
local cellPos = Vector3int16.new(x, y, z)
|
||||
|
||||
local updated = false
|
||||
for cellPosAdorn, adornTable in pairs(adornments) do
|
||||
|
|
@ -674,9 +636,13 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
|
|||
|
||||
if not updated then
|
||||
local selectionPart, selectionBox = createAdornment(color)
|
||||
selectionPart.Size = Vector3.new(4,4,4)
|
||||
selectionPart.Size = Vector3.new(4, 4, 4)
|
||||
selectionPart.CFrame = CFrame.new(cframePos)
|
||||
local adornTable = {SelectionPart = selectionPart, SelectionBox = selectionBox, KeepAlive = currentKeepAliveTag}
|
||||
local adornTable = {
|
||||
SelectionPart = selectionPart,
|
||||
SelectionBox = selectionBox,
|
||||
KeepAlive = currentKeepAliveTag,
|
||||
}
|
||||
adornments[cellPos] = adornTable
|
||||
end
|
||||
end
|
||||
|
|
@ -686,7 +652,6 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
|
|||
cleanUpAdornments()
|
||||
end
|
||||
|
||||
|
||||
------------------------------------- setup code ------------------------------
|
||||
lastRegion = regionToSelect
|
||||
|
||||
|
|
@ -699,8 +664,7 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
|
|||
adornments.SelectionPart = selectionPart
|
||||
adornments.SelectionBox = selectionBox
|
||||
|
||||
updateSelection =
|
||||
function (newRegion, color)
|
||||
updateSelection = function(newRegion, color)
|
||||
if newRegion and newRegion ~= lastRegion then
|
||||
lastRegion = newRegion
|
||||
selectionPart.Size = newRegion.Size
|
||||
|
|
@ -712,19 +676,19 @@ t.SelectTerrainRegion = function(regionToSelect, color, selectEmptyCells, select
|
|||
end
|
||||
else -- use individual cell adorns to represent the area selected
|
||||
adornFullCellsInRegion(regionToSelect, color)
|
||||
updateSelection =
|
||||
function (newRegion, color)
|
||||
updateSelection = function(newRegion, color)
|
||||
if newRegion and newRegion ~= lastRegion then
|
||||
lastRegion = newRegion
|
||||
adornFullCellsInRegion(newRegion, color)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local destroyFunc = function()
|
||||
updateSelection = nil
|
||||
if selectionContainer then selectionContainer:Destroy() end
|
||||
if selectionContainer then
|
||||
selectionContainer:Destroy()
|
||||
end
|
||||
adornments = nil
|
||||
end
|
||||
|
||||
|
|
@ -733,12 +697,6 @@ end
|
|||
|
||||
-----------------------------Terrain Utilities End-----------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
@ -777,14 +735,16 @@ Method :wait()
|
|||
function t.CreateSignal()
|
||||
local this = {}
|
||||
|
||||
local mBindableEvent = Instance.new('BindableEvent')
|
||||
local mBindableEvent = Instance.new "BindableEvent"
|
||||
local mAllCns = {} --all connection objects returned by mBindableEvent::connect
|
||||
|
||||
--main functions
|
||||
function this:connect(func)
|
||||
if self ~= this then error("connect must be called with `:`, not `.`", 2) end
|
||||
if type(func) ~= 'function' then
|
||||
error("Argument #1 of connect must be a function, got a "..type(func), 2)
|
||||
if self ~= this then
|
||||
error("connect must be called with `:`, not `.`", 2)
|
||||
end
|
||||
if type(func) ~= "function" then
|
||||
error("Argument #1 of connect must be a function, got a " .. type(func), 2)
|
||||
end
|
||||
local cn = mBindableEvent.Event:connect(func)
|
||||
mAllCns[cn] = true
|
||||
|
|
@ -796,18 +756,24 @@ function t.CreateSignal()
|
|||
return pubCn
|
||||
end
|
||||
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
|
||||
cn:disconnect()
|
||||
mAllCns[cn] = nil
|
||||
end
|
||||
end
|
||||
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()
|
||||
end
|
||||
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(...)
|
||||
end
|
||||
|
||||
|
|
@ -816,9 +782,6 @@ 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
|
||||
--will be created in several steps rather than as a single function declaration.
|
||||
local function Create_PrivImpl(objectType)
|
||||
if type(objectType) ~= 'string' then
|
||||
if type(objectType) ~= "string" then
|
||||
error("Argument of Create must be a string", 2)
|
||||
end
|
||||
--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
|
||||
--add property
|
||||
if type(k) == 'string' then
|
||||
if type(k) == "string" then
|
||||
obj[k] = v
|
||||
|
||||
|
||||
--add child
|
||||
elseif type(k) == 'number' then
|
||||
if type(v) ~= 'userdata' then
|
||||
error("Bad entry in Create body: Numeric keys must be paired with children, got a: "..type(v), 2)
|
||||
elseif type(k) == "number" then
|
||||
if type(v) ~= "userdata" then
|
||||
error("Bad entry in Create body: Numeric keys must be paired with children, got a: " .. type(v), 2)
|
||||
end
|
||||
v.Parent = obj
|
||||
|
||||
|
||||
--event connect
|
||||
elseif type(k) == 'table' and k.__eventname then
|
||||
if type(v) ~= 'function' then
|
||||
error("Bad entry in Create body: Key `[Create.E\'"..k.__eventname.."\']` must have a function value\
|
||||
got: "..tostring(v), 2)
|
||||
elseif type(k) == "table" and k.__eventname then
|
||||
if type(v) ~= "function" then
|
||||
error(
|
||||
"Bad entry in Create body: Key `[Create.E'"
|
||||
.. k.__eventname
|
||||
.. "']` must have a function value, got: "
|
||||
.. tostring(v),
|
||||
2
|
||||
)
|
||||
end
|
||||
obj[k.__eventname]:connect(v)
|
||||
|
||||
|
||||
--define constructor function
|
||||
elseif k == t.Create then
|
||||
if type(v) ~= 'function' then
|
||||
error("Bad entry in Create body: Key `[Create]` should be paired with a constructor function, \
|
||||
got: "..tostring(v), 2)
|
||||
if type(v) ~= "function" then
|
||||
error(
|
||||
"Bad entry in Create body: Key `[Create]` should be paired with a constructor function, got: "
|
||||
.. tostring(v),
|
||||
2
|
||||
)
|
||||
elseif ctor then
|
||||
--ctor already exists, only one allowed
|
||||
error("Bad entry in Create body: Only one constructor function is allowed", 2)
|
||||
end
|
||||
ctor = v
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
|
@ -981,19 +947,20 @@ local function Create_PrivImpl(objectType)
|
|||
end
|
||||
|
||||
--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
|
||||
--function can recognize as special.
|
||||
t.Create.E = function(eventName)
|
||||
return {__eventname = eventName}
|
||||
return { __eventname = eventName }
|
||||
end
|
||||
|
||||
-------------------------------------------------Create function End----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
@ -1002,114 +969,87 @@ end
|
|||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
t.Help =
|
||||
function(funcNameOrFunc)
|
||||
t.Help = function(funcNameOrFunc)
|
||||
--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
|
||||
return "Function DecodeJSON. " ..
|
||||
"Arguments: (string). " ..
|
||||
"Side effect: returns a table with all parsed JSON values"
|
||||
return "Function DecodeJSON. "
|
||||
.. "Arguments: (string). "
|
||||
.. "Side effect: returns a table with all parsed JSON values"
|
||||
end
|
||||
if funcNameOrFunc == "EncodeJSON" or funcNameOrFunc == t.EncodeJSON then
|
||||
return "Function EncodeJSON. " ..
|
||||
"Arguments: (table). " ..
|
||||
"Side effect: returns a string composed of argument table in JSON data format"
|
||||
return "Function EncodeJSON. "
|
||||
.. "Arguments: (table). "
|
||||
.. "Side effect: returns a string composed of argument table in JSON data format"
|
||||
end
|
||||
if funcNameOrFunc == "MakeWedge" or funcNameOrFunc == t.MakeWedge then
|
||||
return "Function MakeWedge. " ..
|
||||
"Arguments: (x, y, z, [default material]). " ..
|
||||
"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. "..
|
||||
"Returns true if made a wedge, false if the cell remains a block "
|
||||
return "Function MakeWedge. "
|
||||
.. "Arguments: (x, y, z, [default material]). "
|
||||
.. "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. "
|
||||
.. "Returns true if made a wedge, false if the cell remains a block "
|
||||
end
|
||||
if funcNameOrFunc == "SelectTerrainRegion" or funcNameOrFunc == t.SelectTerrainRegion then
|
||||
return "Function SelectTerrainRegion. " ..
|
||||
"Arguments: (regionToSelect, color, selectEmptyCells, selectionParent). " ..
|
||||
"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 " ..
|
||||
"(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 " ..
|
||||
"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). " ..
|
||||
"Also returns a second function that takes no arguments and destroys the selection"
|
||||
return "Function SelectTerrainRegion. "
|
||||
.. "Arguments: (regionToSelect, color, selectEmptyCells, selectionParent). "
|
||||
.. "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 "
|
||||
.. "(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 "
|
||||
.. "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). "
|
||||
.. "Also returns a second function that takes no arguments and destroys the selection"
|
||||
end
|
||||
if funcNameOrFunc == "CreateSignal" or funcNameOrFunc == t.CreateSignal then
|
||||
return "Function CreateSignal. "..
|
||||
"Arguments: None. "..
|
||||
"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"..
|
||||
"Lua code. "..
|
||||
"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 this library. EG: Help('Signal:connect')."
|
||||
return "Function CreateSignal. "
|
||||
.. "Arguments: None. "
|
||||
.. "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"
|
||||
.. "Lua code. "
|
||||
.. "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 this library. EG: Help('Signal:connect')."
|
||||
end
|
||||
if funcNameOrFunc == "Signal:connect" then
|
||||
return "Method Signal:connect. "..
|
||||
"Arguments: (function 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 "..
|
||||
"handler function will be called with the arguments passed to |fire|."
|
||||
return "Method Signal:connect. "
|
||||
.. "Arguments: (function 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 "
|
||||
.. "handler function will be called with the arguments passed to |fire|."
|
||||
end
|
||||
if funcNameOrFunc == "Signal:wait" then
|
||||
return "Method Signal:wait. "..
|
||||
"Arguments: None. "..
|
||||
"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 "..
|
||||
"will return the values which were passed as arguments to that |fire| call."
|
||||
return "Method Signal:wait. "
|
||||
.. "Arguments: None. "
|
||||
.. "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 "
|
||||
.. "will return the values which were passed as arguments to that |fire| call."
|
||||
end
|
||||
if funcNameOrFunc == "Signal:fire" then
|
||||
return "Method Signal:fire. "..
|
||||
"Arguments: Any number of arguments of any type. "..
|
||||
"Returns: None. "..
|
||||
"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 "..
|
||||
"to handlers are made asynchronously, so this call will return immediately regardless of how long "..
|
||||
"it takes the connected handler functions to complete."
|
||||
return "Method Signal:fire. "
|
||||
.. "Arguments: Any number of arguments of any type. "
|
||||
.. "Returns: None. "
|
||||
.. "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 "
|
||||
.. "to handlers are made asynchronously, so this call will return immediately regardless of how long "
|
||||
.. "it takes the connected handler functions to complete."
|
||||
end
|
||||
if funcNameOrFunc == "Signal:disconnect" then
|
||||
return "Method Signal:disconnect. "..
|
||||
"Arguments: None. "..
|
||||
"Returns: None. "..
|
||||
"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 "..
|
||||
"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."
|
||||
return "Method Signal:disconnect. "
|
||||
.. "Arguments: None. "
|
||||
.. "Returns: None. "
|
||||
.. "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 "
|
||||
.. "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."
|
||||
end
|
||||
if funcNameOrFunc == "Create" then
|
||||
return "Function Create. "..
|
||||
"Arguments: A table containing information about how to construct a collection of objects. "..
|
||||
"Returns: The constructed objects. "..
|
||||
"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."
|
||||
end
|
||||
return "Function Create. "
|
||||
.. "Arguments: A table containing information about how to construct a collection of objects. "
|
||||
.. "Returns: The constructed objects. "
|
||||
.. "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."
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------Documentation Ends----------------------------------------------------------
|
||||
|
||||
return t
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,12 +3,12 @@
|
|||
-- access to all of the libraries (otherwise only local scripts do)
|
||||
|
||||
local deepakTestingPlace = 3569749
|
||||
local sc = game:GetService("ScriptContext")
|
||||
local sc = game:GetService "ScriptContext"
|
||||
local tries = 0
|
||||
|
||||
while not sc and tries < 3 do
|
||||
tries = tries + 1
|
||||
sc = game:GetService("ScriptContext")
|
||||
sc = game:GetService "ScriptContext"
|
||||
wait(0.2)
|
||||
end
|
||||
|
||||
|
|
@ -22,5 +22,5 @@ if sc then
|
|||
sc:RegisterLibrary("Libraries/RbxStamper", "73157242")
|
||||
sc:LibraryRegistrationComplete()
|
||||
else
|
||||
print("failed to find script context, libraries did not load")
|
||||
print "failed to find script context, libraries did not load"
|
||||
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(name)
|
||||
while not instance:FindFirstChild(name) do
|
||||
print('Waiting for ...', instance, name)
|
||||
print("Waiting for ...", instance, name)
|
||||
instance.ChildAdded:wait()
|
||||
end
|
||||
return instance:FindFirstChild(name)
|
||||
|
|
@ -18,23 +18,26 @@ end
|
|||
|
||||
local function IsTouchDevice()
|
||||
local touchEnabled = false
|
||||
pcall(function() touchEnabled = Game:GetService('UserInputService').TouchEnabled end)
|
||||
pcall(function()
|
||||
touchEnabled = Game:GetService("UserInputService").TouchEnabled
|
||||
end)
|
||||
return touchEnabled
|
||||
end
|
||||
|
||||
|
||||
waitForChild(game,"Players")
|
||||
waitForProperty(game.Players,"LocalPlayer")
|
||||
waitForChild(game, "Players")
|
||||
waitForProperty(game.Players, "LocalPlayer")
|
||||
local player = game.Players.LocalPlayer
|
||||
|
||||
local RbxGui, msg = LoadLibrary("RbxGui")
|
||||
if not RbxGui then print("could not find RbxGui!") return end
|
||||
local RbxGui, _ = LoadLibrary "RbxGui"
|
||||
if not RbxGui then
|
||||
print "could not find RbxGui!"
|
||||
return
|
||||
end
|
||||
|
||||
--- Begin Locals
|
||||
local StaticTabName = "gear"
|
||||
|
||||
local backpack = script.Parent
|
||||
local screen = script.Parent.Parent
|
||||
|
||||
local backpackItems = {}
|
||||
local buttons = {}
|
||||
|
|
@ -49,67 +52,67 @@ local characterChildAddedCon = nil
|
|||
local characterChildRemovedCon = nil
|
||||
local backpackAddCon = nil
|
||||
|
||||
local playerBackpack = waitForChild(player,"Backpack")
|
||||
local playerBackpack = waitForChild(player, "Backpack")
|
||||
|
||||
waitForChild(backpack,"Tabs")
|
||||
waitForChild(backpack, "Tabs")
|
||||
|
||||
waitForChild(backpack,"Gear")
|
||||
local gearPreview = waitForChild(backpack.Gear,"GearPreview")
|
||||
waitForChild(backpack, "Gear")
|
||||
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 gearButton = waitForChild(grid,"GearButton")
|
||||
local grid = waitForChild(backpack.Gear, "GearGrid")
|
||||
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 backpackOpenEvent = waitForChild(backpackManager,"BackpackOpenEvent")
|
||||
local backpackCloseEvent = waitForChild(backpackManager,"BackpackCloseEvent")
|
||||
local tabClickedEvent = waitForChild(backpackManager,"TabClickedEvent")
|
||||
local resizeEvent = waitForChild(backpackManager,"ResizeEvent")
|
||||
local searchRequestedEvent = waitForChild(backpackManager,"SearchRequestedEvent")
|
||||
local tellBackpackReadyFunc = waitForChild(backpackManager,"BackpackReady")
|
||||
local backpackManager = waitForChild(script.Parent, "CoreScripts/BackpackScripts/BackpackManager")
|
||||
local backpackOpenEvent = waitForChild(backpackManager, "BackpackOpenEvent")
|
||||
local backpackCloseEvent = waitForChild(backpackManager, "BackpackCloseEvent")
|
||||
local tabClickedEvent = waitForChild(backpackManager, "TabClickedEvent")
|
||||
local resizeEvent = waitForChild(backpackManager, "ResizeEvent")
|
||||
local searchRequestedEvent = waitForChild(backpackManager, "SearchRequestedEvent")
|
||||
local tellBackpackReadyFunc = waitForChild(backpackManager, "BackpackReady")
|
||||
|
||||
-- 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))
|
||||
|
||||
scrollFrame.Position = UDim2.new(0,0,0,30)
|
||||
scrollFrame.Size = UDim2.new(1,0,1,-30)
|
||||
scrollFrame.Position = UDim2.new(0, 0, 0, 30)
|
||||
scrollFrame.Size = UDim2.new(1, 0, 1, -30)
|
||||
scrollFrame.Parent = backpack.Gear.GearGrid
|
||||
|
||||
local scrollBar = Instance.new("Frame")
|
||||
local scrollBar = Instance.new "Frame"
|
||||
scrollBar.Name = "ScrollBar"
|
||||
scrollBar.BackgroundTransparency = 0.9
|
||||
scrollBar.BackgroundColor3 = Color3.new(1,1,1)
|
||||
scrollBar.BackgroundColor3 = Color3.new(1, 1, 1)
|
||||
scrollBar.BorderSizePixel = 0
|
||||
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
|
||||
|
||||
scrollDown.Position = UDim2.new(0,0,1,-17)
|
||||
scrollDown.Position = UDim2.new(0, 0, 1, -17)
|
||||
|
||||
scrollUp.Parent = scroller
|
||||
scrollDown.Parent = scroller
|
||||
|
||||
local scrollFrameLoadout, scrollUpLoadout, scrollDownLoadout, recalculateScrollLoadout = RbxGui.CreateScrollingFrame()
|
||||
|
||||
scrollFrameLoadout.Position = UDim2.new(0,0,0,0)
|
||||
scrollFrameLoadout.Size = UDim2.new(1,0,1,0)
|
||||
scrollFrameLoadout.Position = UDim2.new(0, 0, 0, 0)
|
||||
scrollFrameLoadout.Size = UDim2.new(1, 0, 1, 0)
|
||||
scrollFrameLoadout.Parent = backpack.Gear.GearLoadouts.LoadoutsList
|
||||
|
||||
local LoadoutButton = Instance.new("TextButton")
|
||||
local LoadoutButton = Instance.new "TextButton"
|
||||
LoadoutButton.RobloxLocked = true
|
||||
LoadoutButton.Name = "LoadoutButton"
|
||||
LoadoutButton.Font = Enum.Font.ArialBold
|
||||
LoadoutButton.FontSize = Enum.FontSize.Size14
|
||||
LoadoutButton.Position = UDim2.new(0,0,0,0)
|
||||
LoadoutButton.Size = UDim2.new(1,0,0,32)
|
||||
LoadoutButton.Position = UDim2.new(0, 0, 0, 0)
|
||||
LoadoutButton.Size = UDim2.new(1, 0, 0, 32)
|
||||
LoadoutButton.Style = Enum.ButtonStyle.RobloxButton
|
||||
LoadoutButton.Text = "Loadout #1"
|
||||
LoadoutButton.TextColor3 = Color3.new(1,1,1)
|
||||
LoadoutButton.TextColor3 = Color3.new(1, 1, 1)
|
||||
LoadoutButton.Parent = scrollFrameLoadout
|
||||
|
||||
local LoadoutButtonTwo = LoadoutButton:clone()
|
||||
|
|
@ -124,26 +127,25 @@ local LoadoutButtonFour = LoadoutButton:clone()
|
|||
LoadoutButtonFour.Text = "Loadout #4"
|
||||
LoadoutButtonFour.Parent = scrollFrameLoadout
|
||||
|
||||
local scrollBarLoadout = Instance.new("Frame")
|
||||
local scrollBarLoadout = Instance.new "Frame"
|
||||
scrollBarLoadout.Name = "ScrollBarLoadout"
|
||||
scrollBarLoadout.BackgroundTransparency = 0.9
|
||||
scrollBarLoadout.BackgroundColor3 = Color3.new(1,1,1)
|
||||
scrollBarLoadout.BackgroundColor3 = Color3.new(1, 1, 1)
|
||||
scrollBarLoadout.BorderSizePixel = 0
|
||||
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
|
||||
|
||||
scrollDownLoadout.Position = UDim2.new(0,0,1,-17)
|
||||
scrollDownLoadout.Position = UDim2.new(0, 0, 1, -17)
|
||||
|
||||
scrollUpLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea
|
||||
scrollDownLoadout.Parent = backpack.Gear.GearLoadouts.GearLoadoutsScrollingArea
|
||||
|
||||
|
||||
-- Begin Functions
|
||||
function removeFromMap(map,object)
|
||||
function removeFromMap(map, object)
|
||||
for i = 1, #map do
|
||||
if map[i] == object then
|
||||
table.remove(map,i)
|
||||
table.remove(map, i)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
|
@ -153,7 +155,7 @@ function robloxLock(instance)
|
|||
instance.RobloxLocked = true
|
||||
children = instance:GetChildren()
|
||||
if children then
|
||||
for i, child in ipairs(children) do
|
||||
for _, child in ipairs(children) do
|
||||
robloxLock(child)
|
||||
end
|
||||
end
|
||||
|
|
@ -167,26 +169,30 @@ function resize()
|
|||
size = gearPreview.AbsoluteSize.Y * 0.75
|
||||
end
|
||||
|
||||
waitForChild(gearPreview,"GearImage")
|
||||
gearPreview.GearImage.Size = UDim2.new(0,size,0,size)
|
||||
gearPreview.GearImage.Position = UDim2.new(0,gearPreview.AbsoluteSize.X/2 - size/2,0.75,-size)
|
||||
waitForChild(gearPreview, "GearImage")
|
||||
gearPreview.GearImage.Size = UDim2.new(0, size, 0, size)
|
||||
gearPreview.GearImage.Position = UDim2.new(0, gearPreview.AbsoluteSize.X / 2 - size / 2, 0.75, -size)
|
||||
|
||||
resizeGrid()
|
||||
end
|
||||
|
||||
function addToGrid(child)
|
||||
if not child:IsA("Tool") then
|
||||
if not child:IsA("HopperBin") then
|
||||
if not child:IsA "Tool" then
|
||||
if not child:IsA "HopperBin" then
|
||||
return
|
||||
end
|
||||
end
|
||||
if child:FindFirstChild("RobloxBuildTool") then return end
|
||||
|
||||
for i,v in pairs(backpackItems) do -- check to see if we already have this gear registered
|
||||
if v == child then return end
|
||||
if child:FindFirstChild "RobloxBuildTool" then
|
||||
return
|
||||
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)
|
||||
if prop == "Name" then
|
||||
|
|
@ -198,32 +204,40 @@ function addToGrid(child)
|
|||
end
|
||||
end)
|
||||
local ancestryCon = nil
|
||||
ancestryCon = child.AncestryChanged:connect(function(theChild,theParent)
|
||||
ancestryCon = child.AncestryChanged:connect(function(theChild, theParent)
|
||||
local thisObject = nil
|
||||
for k,v in pairs(backpackItems) do
|
||||
for k, v in pairs(backpackItems) do
|
||||
if v == child then
|
||||
thisObject = v
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
waitForProperty(player,"Character")
|
||||
waitForChild(player,"Backpack")
|
||||
if (child.Parent ~= player.Backpack and child.Parent ~= player.Character) then
|
||||
if ancestryCon then ancestryCon:disconnect() end
|
||||
if changeCon then changeCon:disconnect() end
|
||||
waitForProperty(player, "Character")
|
||||
waitForChild(player, "Backpack")
|
||||
if child.Parent ~= player.Backpack and child.Parent ~= player.Character then
|
||||
if ancestryCon then
|
||||
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 mouseEnterCons[buttons[v]] then mouseEnterCons[buttons[v]]:disconnect() end
|
||||
if mouseClickCons[buttons[v]] then mouseClickCons[buttons[v]]:disconnect() end
|
||||
if mouseEnterCons[buttons[v]] then
|
||||
mouseEnterCons[buttons[v]]:disconnect()
|
||||
end
|
||||
if mouseClickCons[buttons[v]] then
|
||||
mouseClickCons[buttons[v]]:disconnect()
|
||||
end
|
||||
buttons[v].Parent = nil
|
||||
buttons[v] = nil
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
removeFromMap(backpackItems,thisObject)
|
||||
removeFromMap(backpackItems, thisObject)
|
||||
|
||||
resizeGrid()
|
||||
else
|
||||
|
|
@ -235,7 +249,7 @@ function addToGrid(child)
|
|||
end
|
||||
|
||||
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
|
||||
browsingMenu = true
|
||||
end
|
||||
|
|
@ -253,26 +267,36 @@ function findEmptySlot()
|
|||
local smallestNum = nil
|
||||
local loadout = currentLoadout:GetChildren()
|
||||
for i = 1, #loadout do
|
||||
if loadout[i]:IsA("Frame") and #loadout[i]:GetChildren() <= 0 then
|
||||
local frameNum = tonumber(string.sub(loadout[i].Name,5))
|
||||
if frameNum == 0 then frameNum = 10 end
|
||||
if loadout[i]:IsA "Frame" and #loadout[i]:GetChildren() <= 0 then
|
||||
local frameNum = tonumber(string.sub(loadout[i].Name, 5))
|
||||
if frameNum == 0 then
|
||||
frameNum = 10
|
||||
end
|
||||
if not smallestNum or (smallestNum > frameNum) then
|
||||
smallestNum = frameNum
|
||||
end
|
||||
end
|
||||
end
|
||||
if smallestNum == 10 then smallestNum = 0 end
|
||||
if smallestNum == 10 then
|
||||
smallestNum = 0
|
||||
end
|
||||
return smallestNum
|
||||
end
|
||||
|
||||
function checkForSwap(button,x,y)
|
||||
function checkForSwap(button, x, y)
|
||||
local loadoutChildren = currentLoadout:GetChildren()
|
||||
for i = 1, #loadoutChildren do
|
||||
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 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)
|
||||
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
|
||||
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
|
||||
end
|
||||
end
|
||||
|
|
@ -282,8 +306,8 @@ function checkForSwap(button,x,y)
|
|||
end
|
||||
|
||||
function resizeGrid()
|
||||
for k,v in pairs(backpackItems) do
|
||||
if not v:FindFirstChild("RobloxBuildTool") then
|
||||
for k, v in pairs(backpackItems) do
|
||||
if not v:FindFirstChild "RobloxBuildTool" then
|
||||
if not buttons[v] then
|
||||
local buttonClone = gearButton:clone()
|
||||
buttonClone.Parent = grid.ScrollingFrame
|
||||
|
|
@ -297,31 +321,35 @@ function resizeGrid()
|
|||
buttonClone.Draggable = true
|
||||
buttons[v] = buttonClone
|
||||
|
||||
|
||||
if not IsTouchDevice() then
|
||||
local unequipMenu = getGearContextMenu()
|
||||
|
||||
|
||||
unequipMenu.Visible = false
|
||||
unequipMenu.Parent = buttonClone
|
||||
end
|
||||
|
||||
local beginPos = nil
|
||||
buttonClone.DragBegin:connect(function(value)
|
||||
waitForChild(buttonClone, 'Background')
|
||||
buttonClone['Background'].ZIndex = 10
|
||||
waitForChild(buttonClone, "Background")
|
||||
buttonClone["Background"].ZIndex = 10
|
||||
buttonClone.ZIndex = 10
|
||||
beginPos = value
|
||||
end)
|
||||
buttonClone.DragStopped:connect(function(x,y)
|
||||
waitForChild(buttonClone, 'Background')
|
||||
buttonClone['Background'].ZIndex = 1.0
|
||||
buttonClone.DragStopped:connect(function(x, y)
|
||||
waitForChild(buttonClone, "Background")
|
||||
buttonClone["Background"].ZIndex = 1
|
||||
buttonClone.ZIndex = 2
|
||||
if beginPos ~= buttonClone.Position then
|
||||
if not checkForSwap(buttonClone,x,y) then
|
||||
buttonClone:TweenPosition(beginPos,Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.5, true)
|
||||
if not checkForSwap(buttonClone, x, y) then
|
||||
buttonClone:TweenPosition(
|
||||
beginPos,
|
||||
Enum.EasingDirection.Out,
|
||||
Enum.EasingStyle.Quad,
|
||||
0.5,
|
||||
true
|
||||
)
|
||||
buttonClone.Draggable = false
|
||||
delay(0.5,function()
|
||||
delay(0.5, function()
|
||||
buttonClone.Draggable = true
|
||||
end)
|
||||
else
|
||||
|
|
@ -330,14 +358,16 @@ function resizeGrid()
|
|||
end
|
||||
end)
|
||||
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()
|
||||
local newClickTime = tick()
|
||||
if buttonClone.Active and (newClickTime - clickTime) < 0.5 then
|
||||
local slot = findEmptySlot()
|
||||
if slot then
|
||||
buttonClone.ZIndex = 1
|
||||
swapGearSlot(slot,buttonClone)
|
||||
swapGearSlot(slot, buttonClone)
|
||||
end
|
||||
else
|
||||
buttonClick(buttonClone)
|
||||
|
|
@ -351,11 +381,11 @@ function resizeGrid()
|
|||
end
|
||||
|
||||
function showPartialGrid(subset)
|
||||
for k,v in pairs(buttons) do
|
||||
for _, v in pairs(buttons) do
|
||||
v.Parent = nil
|
||||
end
|
||||
if subset then
|
||||
for k,v in pairs(subset) do
|
||||
for _, v in pairs(subset) do
|
||||
v.Parent = grid.ScrollingFrame
|
||||
end
|
||||
end
|
||||
|
|
@ -363,7 +393,7 @@ function showPartialGrid(subset)
|
|||
end
|
||||
|
||||
function showEntireGrid()
|
||||
for k,v in pairs(buttons) do
|
||||
for _, v in pairs(buttons) do
|
||||
v.Parent = grid.ScrollingFrame
|
||||
end
|
||||
recalculateScroll()
|
||||
|
|
@ -372,7 +402,7 @@ end
|
|||
function inLoadout(gear)
|
||||
local children = currentLoadout:GetChildren()
|
||||
for i = 1, #children do
|
||||
if children[i]:IsA("Frame") then
|
||||
if children[i]:IsA "Frame" then
|
||||
local button = children[i]:GetChildren()
|
||||
if #button > 0 then
|
||||
if button[1].GearReference.Value and button[1].GearReference.Value == gear then
|
||||
|
|
@ -385,16 +415,16 @@ function inLoadout(gear)
|
|||
end
|
||||
|
||||
function updateGridActive()
|
||||
for k,v in pairs(backpackItems) do
|
||||
for _, v in pairs(backpackItems) do
|
||||
if buttons[v] then
|
||||
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
|
||||
buttons[v].Active = false
|
||||
elseif inLoadout(gear) then
|
||||
if (not gear) or inLoadout(gear) then
|
||||
buttons[v].Active = false
|
||||
else
|
||||
buttons[v].Active = true
|
||||
|
|
@ -407,7 +437,7 @@ function centerGear(loadoutChildren)
|
|||
local gearButtons = {}
|
||||
local lastSlotAdd = nil
|
||||
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
|
||||
lastSlotAdd = loadoutChildren[i]
|
||||
else
|
||||
|
|
@ -415,11 +445,19 @@ function centerGear(loadoutChildren)
|
|||
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
|
||||
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
|
||||
|
||||
|
|
@ -459,10 +497,12 @@ function backpackCloseHandler(currentTab)
|
|||
end
|
||||
|
||||
function loadoutCheck(child, selectState)
|
||||
if not child:IsA("ImageButton") then return end
|
||||
for k,v in pairs(backpackItems) do
|
||||
if not child:IsA "ImageButton" then
|
||||
return
|
||||
end
|
||||
for k, v in pairs(backpackItems) do
|
||||
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
|
||||
buttons[v].Active = selectState
|
||||
break
|
||||
|
|
@ -480,7 +520,7 @@ end
|
|||
function removeAllEquippedGear(physGear)
|
||||
local stuff = player.Character:GetChildren()
|
||||
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
|
||||
end
|
||||
end
|
||||
|
|
@ -498,15 +538,15 @@ function unequipGear(physGear)
|
|||
end
|
||||
|
||||
function highlight(button)
|
||||
button.TextColor3 = Color3.new(0,0,0)
|
||||
button.BackgroundColor3 = Color3.new(0.8,0.8,0.8)
|
||||
button.TextColor3 = Color3.new(0, 0, 0)
|
||||
button.BackgroundColor3 = Color3.new(0.8, 0.8, 0.8)
|
||||
end
|
||||
function clearHighlight(button)
|
||||
button.TextColor3 = Color3.new(1,1,1)
|
||||
button.BackgroundColor3 = Color3.new(0,0,0)
|
||||
button.TextColor3 = Color3.new(1, 1, 1)
|
||||
button.BackgroundColor3 = Color3.new(0, 0, 0)
|
||||
end
|
||||
|
||||
function swapGearSlot(slot,gearButton)
|
||||
function swapGearSlot(slot, gearButton)
|
||||
if not swapSlot.Value then -- signal loadout to swap a gear out
|
||||
swapSlot.Slot.Value = slot
|
||||
swapSlot.GearButton.Value = gearButton
|
||||
|
|
@ -515,9 +555,10 @@ function swapGearSlot(slot,gearButton)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
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
|
||||
if num == 1 then -- remove from loadout
|
||||
unequipGear(menu.Parent.GearReference.Value)
|
||||
|
|
@ -526,7 +567,7 @@ local UnequipGearMenuClick = function(element, menu)
|
|||
local loadoutChildren = currentLoadout:GetChildren()
|
||||
local slot = -1
|
||||
for i = 1, #loadoutChildren do
|
||||
if loadoutChildren[i]:IsA("Frame") then
|
||||
if loadoutChildren[i]:IsA "Frame" then
|
||||
local button = loadoutChildren[i]:GetChildren()
|
||||
if button[1] and button[1].GearReference.Value == gearToUnequip then
|
||||
slot = button[1].SlotNumber.Text
|
||||
|
|
@ -534,14 +575,17 @@ local UnequipGearMenuClick = function(element, menu)
|
|||
end
|
||||
end
|
||||
end
|
||||
swapGearSlot(slot,nil)
|
||||
swapGearSlot(slot, nil)
|
||||
end
|
||||
end
|
||||
|
||||
function setupCharacterConnections()
|
||||
|
||||
if backpackAddCon then backpackAddCon:disconnect() end
|
||||
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) addToGrid(child) end)
|
||||
if backpackAddCon then
|
||||
backpackAddCon:disconnect()
|
||||
end
|
||||
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child)
|
||||
addToGrid(child)
|
||||
end)
|
||||
|
||||
-- make sure we get all the children
|
||||
local backpackChildren = game.Players.LocalPlayer.Backpack:GetChildren()
|
||||
|
|
@ -549,16 +593,18 @@ function setupCharacterConnections()
|
|||
addToGrid(backpackChildren[i])
|
||||
end
|
||||
|
||||
if characterChildAddedCon then characterChildAddedCon:disconnect() end
|
||||
characterChildAddedCon =
|
||||
game.Players.LocalPlayer.Character.ChildAdded:connect(function(child)
|
||||
if characterChildAddedCon then
|
||||
characterChildAddedCon:disconnect()
|
||||
end
|
||||
characterChildAddedCon = game.Players.LocalPlayer.Character.ChildAdded:connect(function(child)
|
||||
addToGrid(child)
|
||||
updateGridActive()
|
||||
end)
|
||||
|
||||
if characterChildRemovedCon then characterChildRemovedCon:disconnect() end
|
||||
characterChildRemovedCon =
|
||||
game.Players.LocalPlayer.Character.ChildRemoved:connect(function(child)
|
||||
if characterChildRemovedCon then
|
||||
characterChildRemovedCon:disconnect()
|
||||
end
|
||||
characterChildRemovedCon = game.Players.LocalPlayer.Character.ChildRemoved:connect(function(_)
|
||||
updateGridActive()
|
||||
end)
|
||||
|
||||
|
|
@ -567,9 +613,15 @@ function setupCharacterConnections()
|
|||
end
|
||||
|
||||
function removeCharacterConnections()
|
||||
if characterChildAddedCon then characterChildAddedCon:disconnect() end
|
||||
if characterChildRemovedCon then characterChildRemovedCon:disconnect() end
|
||||
if backpackAddCon then backpackAddCon:disconnect() end
|
||||
if characterChildAddedCon then
|
||||
characterChildAddedCon:disconnect()
|
||||
end
|
||||
if characterChildRemovedCon then
|
||||
characterChildRemovedCon:disconnect()
|
||||
end
|
||||
if backpackAddCon then
|
||||
backpackAddCon:disconnect()
|
||||
end
|
||||
end
|
||||
|
||||
function trim(s)
|
||||
|
|
@ -578,13 +630,13 @@ end
|
|||
|
||||
function filterGear(terms)
|
||||
local filteredGear = {}
|
||||
for k,v in pairs(backpackItems) do
|
||||
for k, v in pairs(backpackItems) do
|
||||
if buttons[v] then
|
||||
local gearString = string.lower(buttons[v].GearReference.Value.Name)
|
||||
gearString = trim(gearString)
|
||||
for i = 1, #terms do
|
||||
if string.match(gearString,terms[i]) then
|
||||
table.insert(filteredGear,buttons[v])
|
||||
if string.match(gearString, terms[i]) then
|
||||
table.insert(filteredGear, buttons[v])
|
||||
break
|
||||
end
|
||||
end
|
||||
|
|
@ -594,18 +646,22 @@ function filterGear(terms)
|
|||
return filteredGear
|
||||
end
|
||||
function splitByWhitespace(text)
|
||||
if type(text) ~= "string" then return nil end
|
||||
if type(text) ~= "string" then
|
||||
return nil
|
||||
end
|
||||
|
||||
local terms = {}
|
||||
for token in string.gmatch(text, "[^%s]+") do
|
||||
if string.len(token) > 0 then
|
||||
table.insert(terms,token)
|
||||
table.insert(terms, token)
|
||||
end
|
||||
end
|
||||
return terms
|
||||
end
|
||||
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)
|
||||
if searchTermTable and (#searchTermTable > 0) then
|
||||
|
|
@ -639,15 +695,15 @@ function nukeBackpack()
|
|||
end
|
||||
|
||||
function getGearContextMenu()
|
||||
local gearContextMenu = Instance.new("Frame")
|
||||
local gearContextMenu = Instance.new "Frame"
|
||||
gearContextMenu.Active = true
|
||||
gearContextMenu.Name = "UnequipContextMenu"
|
||||
gearContextMenu.Size = UDim2.new(0,115,0,70)
|
||||
gearContextMenu.Position = UDim2.new(0,-16,0,-16)
|
||||
gearContextMenu.Size = UDim2.new(0, 115, 0, 70)
|
||||
gearContextMenu.Position = UDim2.new(0, -16, 0, -16)
|
||||
gearContextMenu.BackgroundTransparency = 1
|
||||
gearContextMenu.Visible = false
|
||||
|
||||
local gearContextMenuButton = Instance.new("TextButton")
|
||||
local gearContextMenuButton = Instance.new "TextButton"
|
||||
gearContextMenuButton.Name = "UnequipContextMenuButton"
|
||||
gearContextMenuButton.Text = ""
|
||||
gearContextMenuButton.Style = Enum.ButtonStyle.RobloxButtonDefault
|
||||
|
|
@ -659,7 +715,7 @@ function getGearContextMenu()
|
|||
local elementHeight = 12
|
||||
|
||||
local contextMenuElements = {}
|
||||
local contextMenuElementsName = {"Remove Hotkey"}
|
||||
local contextMenuElementsName = { "Remove Hotkey" }
|
||||
|
||||
for i = 1, #contextMenuElementsName do
|
||||
local element = {}
|
||||
|
|
@ -667,31 +723,32 @@ function getGearContextMenu()
|
|||
element.Text = contextMenuElementsName[i]
|
||||
element.Action = i
|
||||
element.DoIt = UnequipGearMenuClick
|
||||
table.insert(contextMenuElements,element)
|
||||
table.insert(contextMenuElements, element)
|
||||
end
|
||||
|
||||
for i, contextElement in ipairs(contextMenuElements) do
|
||||
local element = contextElement
|
||||
if element.Type == "Button" then
|
||||
local button = Instance.new("TextButton")
|
||||
local button = Instance.new "TextButton"
|
||||
button.Name = "UnequipContextButton" .. i
|
||||
button.BackgroundColor3 = Color3.new(0,0,0)
|
||||
button.BackgroundColor3 = Color3.new(0, 0, 0)
|
||||
button.BorderSizePixel = 0
|
||||
button.TextXAlignment = Enum.TextXAlignment.Left
|
||||
button.Text = " " .. contextElement.Text
|
||||
button.Font = Enum.Font.Arial
|
||||
button.FontSize = Enum.FontSize.Size14
|
||||
button.Size = UDim2.new(1, 8, 0, elementHeight)
|
||||
button.Position = UDim2.new(0,0,0,elementHeight * i)
|
||||
button.TextColor3 = Color3.new(1,1,1)
|
||||
button.Position = UDim2.new(0, 0, 0, elementHeight * i)
|
||||
button.TextColor3 = Color3.new(1, 1, 1)
|
||||
button.ZIndex = 9
|
||||
button.Parent = gearContextMenuButton
|
||||
|
||||
if not IsTouchDevice() then
|
||||
|
||||
button.MouseButton1Click:connect(function()
|
||||
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
|
||||
gearContextMenu.Visible = false
|
||||
clearHighlight(button)
|
||||
|
|
@ -714,38 +771,38 @@ function getGearContextMenu()
|
|||
contextElement.Button = button
|
||||
contextElement.Element = button
|
||||
elseif element.Type == "Label" then
|
||||
local frame = Instance.new("Frame")
|
||||
local frame = Instance.new "Frame"
|
||||
frame.Name = "ContextLabel" .. i
|
||||
frame.BackgroundTransparency = 1
|
||||
frame.Size = UDim2.new(1, 8, 0, elementHeight)
|
||||
|
||||
local label = Instance.new("TextLabel")
|
||||
local label = Instance.new "TextLabel"
|
||||
label.Name = "Text1"
|
||||
label.BackgroundTransparency = 1
|
||||
label.BackgroundColor3 = Color3.new(1,1,1)
|
||||
label.BackgroundColor3 = Color3.new(1, 1, 1)
|
||||
label.BorderSizePixel = 0
|
||||
label.TextXAlignment = Enum.TextXAlignment.Left
|
||||
label.Font = Enum.Font.ArialBold
|
||||
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.TextColor3 = Color3.new(1,1,1)
|
||||
label.TextColor3 = Color3.new(1, 1, 1)
|
||||
label.ZIndex = 9
|
||||
label.Parent = frame
|
||||
element.Label1 = label
|
||||
|
||||
if element.GetText2 then
|
||||
label = Instance.new("TextLabel")
|
||||
label = Instance.new "TextLabel"
|
||||
label.Name = "Text2"
|
||||
label.BackgroundTransparency = 1
|
||||
label.BackgroundColor3 = Color3.new(1,1,1)
|
||||
label.BackgroundColor3 = Color3.new(1, 1, 1)
|
||||
label.BorderSizePixel = 0
|
||||
label.TextXAlignment = Enum.TextXAlignment.Right
|
||||
label.Font = Enum.Font.Arial
|
||||
label.FontSize = Enum.FontSize.Size14
|
||||
label.Position = UDim2.new(0.5, 0, 0, 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.Parent = frame
|
||||
element.Label2 = label
|
||||
|
|
@ -767,7 +824,7 @@ function getGearContextMenu()
|
|||
return gearContextMenu
|
||||
end
|
||||
|
||||
function coreGuiChanged(coreGuiType,enabled)
|
||||
function coreGuiChanged(coreGuiType, enabled)
|
||||
if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then
|
||||
if not enabled then
|
||||
backpack.Gear.Visible = false
|
||||
|
|
@ -775,7 +832,6 @@ function coreGuiChanged(coreGuiType,enabled)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
local backpackChildren = player.Backpack:GetChildren()
|
||||
for i = 1, #backpackChildren do
|
||||
addToGrid(backpackChildren[i])
|
||||
|
|
@ -783,9 +839,10 @@ end
|
|||
|
||||
------------------------- Start Lifelong Connections -----------------------
|
||||
|
||||
|
||||
resizeEvent.Event:connect(function(absSize)
|
||||
if debounce then return end
|
||||
resizeEvent.Event:connect(function(_)
|
||||
if debounce then
|
||||
return
|
||||
end
|
||||
|
||||
debounce = true
|
||||
wait()
|
||||
|
|
@ -794,35 +851,49 @@ resizeEvent.Event:connect(function(absSize)
|
|||
debounce = false
|
||||
end)
|
||||
|
||||
currentLoadout.ChildAdded:connect(function(child) loadoutCheck(child, false) end)
|
||||
currentLoadout.ChildRemoved:connect(function(child) loadoutCheck(child, true) end)
|
||||
currentLoadout.ChildAdded:connect(function(child)
|
||||
loadoutCheck(child, false)
|
||||
end)
|
||||
currentLoadout.ChildRemoved:connect(function(child)
|
||||
loadoutCheck(child, true)
|
||||
end)
|
||||
|
||||
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())
|
||||
end
|
||||
end)
|
||||
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()
|
||||
centerGear(currentLoadout:GetChildren())
|
||||
end
|
||||
end)
|
||||
|
||||
grid.MouseEnter:connect(function() clearPreview() end)
|
||||
grid.MouseLeave:connect(function() clearPreview() end)
|
||||
grid.MouseEnter:connect(function()
|
||||
clearPreview()
|
||||
end)
|
||||
grid.MouseLeave:connect(function()
|
||||
clearPreview()
|
||||
end)
|
||||
|
||||
player.CharacterRemoving:connect(function()
|
||||
removeCharacterConnections()
|
||||
nukeBackpack()
|
||||
end)
|
||||
player.CharacterAdded:connect(function() setupCharacterConnections() end)
|
||||
player.CharacterAdded:connect(function()
|
||||
setupCharacterConnections()
|
||||
end)
|
||||
|
||||
player.ChildAdded:connect(function(child)
|
||||
if child:IsA("Backpack") then
|
||||
if child:IsA "Backpack" then
|
||||
playerBackpack = child
|
||||
if backpackAddCon then backpackAddCon:disconnect() end
|
||||
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child) addToGrid(child) end)
|
||||
if backpackAddCon then
|
||||
backpackAddCon:disconnect()
|
||||
end
|
||||
backpackAddCon = game.Players.LocalPlayer.Backpack.ChildAdded:connect(function(child)
|
||||
addToGrid(child)
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
|
|
@ -834,7 +905,7 @@ end)
|
|||
|
||||
local loadoutChildren = currentLoadout:GetChildren()
|
||||
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()
|
||||
updateGridActive()
|
||||
end)
|
||||
|
|
@ -858,14 +929,18 @@ local loadoutChildren = currentLoadout:GetChildren()
|
|||
for i = 1, #loadoutChildren do
|
||||
loadoutCheck(loadoutChildren[i], false)
|
||||
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
|
||||
if characterChildAddedCon == nil and game.Players.LocalPlayer["Character"] then
|
||||
setupCharacterConnections()
|
||||
end
|
||||
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
|
||||
|
||||
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)
|
||||
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
|
||||
local function waitForChild(instance, name)
|
||||
|
|
@ -15,23 +17,21 @@ local function waitForProperty(instance, property)
|
|||
end
|
||||
|
||||
-- don't do anything if we are in an empty game
|
||||
waitForChild(game,"Players")
|
||||
waitForChild(game, "Players")
|
||||
if #game.Players:GetChildren() < 1 then
|
||||
game.Players.ChildAdded:wait()
|
||||
end
|
||||
-- make sure everything is loaded in before we do anything
|
||||
-- get our local player
|
||||
waitForProperty(game.Players,"LocalPlayer")
|
||||
waitForProperty(game.Players, "LocalPlayer")
|
||||
local player = game.Players.LocalPlayer
|
||||
|
||||
|
||||
|
||||
------------------------ Locals ------------------------------
|
||||
local backpack = script.Parent
|
||||
waitForChild(backpack,"Gear")
|
||||
waitForChild(backpack, "Gear")
|
||||
|
||||
local screen = script.Parent.Parent
|
||||
assert(screen:IsA("ScreenGui"))
|
||||
assert(screen:IsA "ScreenGui")
|
||||
|
||||
waitForChild(backpack, "Tabs")
|
||||
waitForChild(backpack.Tabs, "CloseButton")
|
||||
|
|
@ -43,19 +43,19 @@ if game.CoreGui.Version >= 8 then
|
|||
waitForChild(backpack.Tabs, "WardrobeButton")
|
||||
local wardrobeButton = backpack.Tabs.WardrobeButton
|
||||
end
|
||||
waitForChild(backpack.Parent,"ControlFrame")
|
||||
local backpackButton = waitForChild(backpack.Parent.ControlFrame,"BackpackButton")
|
||||
waitForChild(backpack.Parent, "ControlFrame")
|
||||
local backpackButton = waitForChild(backpack.Parent.ControlFrame, "BackpackButton")
|
||||
local currentTab = "gear"
|
||||
|
||||
local searchFrame = waitForChild(backpack,"SearchFrame")
|
||||
waitForChild(backpack.SearchFrame,"SearchBoxFrame")
|
||||
local searchBox = waitForChild(backpack.SearchFrame.SearchBoxFrame,"SearchBox")
|
||||
local searchButton = waitForChild(backpack.SearchFrame,"SearchButton")
|
||||
local resetButton = waitForChild(backpack.SearchFrame,"ResetButton")
|
||||
local searchFrame = waitForChild(backpack, "SearchFrame")
|
||||
waitForChild(backpack.SearchFrame, "SearchBoxFrame")
|
||||
local searchBox = waitForChild(backpack.SearchFrame.SearchBoxFrame, "SearchBox")
|
||||
local searchButton = waitForChild(backpack.SearchFrame, "SearchButton")
|
||||
local resetButton = waitForChild(backpack.SearchFrame, "ResetButton")
|
||||
|
||||
local robloxGui = waitForChild(Game.CoreGui, 'RobloxGui')
|
||||
local currentLoadout = waitForChild(robloxGui, 'CurrentLoadout')
|
||||
local loadoutBackground = waitForChild(currentLoadout, 'Background')
|
||||
local robloxGui = waitForChild(Game.CoreGui, "RobloxGui")
|
||||
local currentLoadout = waitForChild(robloxGui, "CurrentLoadout")
|
||||
local loadoutBackground = waitForChild(currentLoadout, "Background")
|
||||
|
||||
local canToggle = true
|
||||
local readyForNextEvent = true
|
||||
|
|
@ -79,17 +79,15 @@ if robloxGui.AbsoluteSize.Y <= 320 then
|
|||
backpackSize = UDim2.new(0, 200, 0, 140)
|
||||
end
|
||||
|
||||
|
||||
------------------------ End Locals ---------------------------
|
||||
|
||||
|
||||
---------------------------------------- Public Event Setup ----------------------------------------
|
||||
|
||||
function createPublicEvent(eventName)
|
||||
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.Parent = script
|
||||
|
||||
|
|
@ -102,7 +100,7 @@ function createPublicFunction(funcName, invokeFunc)
|
|||
assert(invokeFunc, "invokeFunc is nil")
|
||||
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.OnInvoke = invokeFunc
|
||||
newFunction.Parent = script
|
||||
|
|
@ -111,15 +109,13 @@ function createPublicFunction(funcName, invokeFunc)
|
|||
end
|
||||
|
||||
-- Events
|
||||
local resizeEvent = createPublicEvent("ResizeEvent")
|
||||
local backpackOpenEvent = createPublicEvent("BackpackOpenEvent")
|
||||
local backpackCloseEvent = createPublicEvent("BackpackCloseEvent")
|
||||
local tabClickedEvent = createPublicEvent("TabClickedEvent")
|
||||
local searchRequestedEvent = createPublicEvent("SearchRequestedEvent")
|
||||
local resizeEvent = createPublicEvent "ResizeEvent"
|
||||
local backpackOpenEvent = createPublicEvent "BackpackOpenEvent"
|
||||
local backpackCloseEvent = createPublicEvent "BackpackCloseEvent"
|
||||
local tabClickedEvent = createPublicEvent "TabClickedEvent"
|
||||
local searchRequestedEvent = createPublicEvent "SearchRequestedEvent"
|
||||
---------------------------------------- End Public Event Setup ----------------------------------------
|
||||
|
||||
|
||||
|
||||
--------------------------- Internal Functions ----------------------------------------
|
||||
|
||||
function deactivateBackpack()
|
||||
|
|
@ -140,8 +136,8 @@ function initHumanoidDiedConnections()
|
|||
if humanoidDiedCon then
|
||||
humanoidDiedCon:disconnect()
|
||||
end
|
||||
waitForProperty(game.Players.LocalPlayer,"Character")
|
||||
waitForChild(game.Players.LocalPlayer.Character,"Humanoid")
|
||||
waitForProperty(game.Players.LocalPlayer, "Character")
|
||||
waitForChild(game.Players.LocalPlayer.Character, "Humanoid")
|
||||
humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect(deactivateBackpack)
|
||||
end
|
||||
|
||||
|
|
@ -153,13 +149,20 @@ local hideBackpack = function()
|
|||
backpackCloseEvent:Fire(currentTab)
|
||||
backpack.Tabs.Visible = false
|
||||
searchFrame.Visible = false
|
||||
backpack:TweenSizeAndPosition(UDim2.new(0, backpackSize.X.Offset,0, 0), UDim2.new(0.5, -backpackSize.X.Offset/2, 1, -85), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, guiTweenSpeed, true,
|
||||
backpack:TweenSizeAndPosition(
|
||||
UDim2.new(0, backpackSize.X.Offset, 0, 0),
|
||||
UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -85),
|
||||
Enum.EasingDirection.Out,
|
||||
Enum.EasingStyle.Quad,
|
||||
guiTweenSpeed,
|
||||
true,
|
||||
function()
|
||||
game.GuiService:RemoveCenterDialog(backpack)
|
||||
backpack.Visible = false
|
||||
backpackButton.Selected = false
|
||||
end)
|
||||
delay(guiTweenSpeed,function()
|
||||
end
|
||||
)
|
||||
delay(guiTweenSpeed, function()
|
||||
game.GuiService:RemoveCenterDialog(backpack)
|
||||
backpack.Visible = false
|
||||
backpackButton.Selected = false
|
||||
|
|
@ -169,41 +172,54 @@ local hideBackpack = function()
|
|||
end
|
||||
|
||||
function showBackpack()
|
||||
game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog,
|
||||
function()
|
||||
game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, function()
|
||||
backpack.Visible = true
|
||||
backpackButton.Selected = true
|
||||
end,
|
||||
function()
|
||||
end, function()
|
||||
backpack.Visible = false
|
||||
backpackButton.Selected = false
|
||||
end)
|
||||
backpack.Visible = true
|
||||
backpackButton.Selected = true
|
||||
backpack:TweenSizeAndPosition(backpackSize, UDim2.new(0.5, -backpackSize.X.Offset/2, 1, -backpackSize.Y.Offset - 88), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, guiTweenSpeed, true)
|
||||
delay(guiTweenSpeed,function()
|
||||
backpack:TweenSizeAndPosition(
|
||||
backpackSize,
|
||||
UDim2.new(0.5, -backpackSize.X.Offset / 2, 1, -backpackSize.Y.Offset - 88),
|
||||
Enum.EasingDirection.Out,
|
||||
Enum.EasingStyle.Quad,
|
||||
guiTweenSpeed,
|
||||
true
|
||||
)
|
||||
delay(guiTweenSpeed, function()
|
||||
backpack.Tabs.Visible = false
|
||||
searchFrame.Visible = true
|
||||
backpackOpenEvent:Fire(currentTab)
|
||||
canToggle = true
|
||||
readyForNextEvent = true
|
||||
backpackButton.Image = 'http://www.roblox.com/asset/?id=97644093'
|
||||
backpackButton.Image = "http://www.roblox.com/asset/?id=97644093"
|
||||
backpackButton.Position = UDim2.new(0.5, -60, 1, -backpackSize.Y.Offset - 103)
|
||||
end)
|
||||
end
|
||||
|
||||
function toggleBackpack()
|
||||
if not game.Players.LocalPlayer then return end
|
||||
if not game.Players.LocalPlayer["Character"] then return end
|
||||
if not canToggle then return end
|
||||
if not readyForNextEvent then return end
|
||||
if not game.Players.LocalPlayer then
|
||||
return
|
||||
end
|
||||
if not game.Players.LocalPlayer["Character"] then
|
||||
return
|
||||
end
|
||||
if not canToggle then
|
||||
return
|
||||
end
|
||||
if not readyForNextEvent then
|
||||
return
|
||||
end
|
||||
readyForNextEvent = false
|
||||
canToggle = false
|
||||
|
||||
backpackIsOpen = not backpackIsOpen
|
||||
|
||||
if backpackIsOpen then
|
||||
loadoutBackground.Image = 'http://www.roblox.com/asset/?id=97623721'
|
||||
loadoutBackground.Image = "http://www.roblox.com/asset/?id=97623721"
|
||||
loadoutBackground.Position = UDim2.new(-0.03, 0, -0.17, 0)
|
||||
loadoutBackground.Size = UDim2.new(1.05, 0, 1.25, 0)
|
||||
loadoutBackground.ZIndex = 2.0
|
||||
|
|
@ -214,21 +230,20 @@ function toggleBackpack()
|
|||
loadoutBackground.Visible = false
|
||||
backpackButton.Selected = false
|
||||
backpackButton.Image = "http://www.roblox.com/asset/?id=97617958"
|
||||
loadoutBackground.Image = 'http://www.roblox.com/asset/?id=96536002'
|
||||
loadoutBackground.Image = "http://www.roblox.com/asset/?id=96536002"
|
||||
loadoutBackground.Position = UDim2.new(-0.1, 0, -0.1, 0)
|
||||
loadoutBackground.Size = UDim2.new(1.2, 0, 1.2, 0)
|
||||
hideBackpack()
|
||||
|
||||
|
||||
local clChildren = currentLoadout:GetChildren()
|
||||
for i = 1, #clChildren do
|
||||
if clChildren[i] and clChildren[i]:IsA('Frame') then
|
||||
if clChildren[i] and clChildren[i]:IsA "Frame" then
|
||||
local frame = clChildren[i]
|
||||
if #frame:GetChildren() > 0 then
|
||||
backpackButton.Position = UDim2.new(0.5, -60, 1, -108)
|
||||
backpackButton.Visible = true
|
||||
loadoutBackground.Visible = true
|
||||
if frame:GetChildren()[1]:IsA('ImageButton') then
|
||||
if frame:GetChildren()[1]:IsA "ImageButton" then
|
||||
local imgButton = frame:GetChildren()[1]
|
||||
imgButton.Active = true
|
||||
imgButton.Draggable = false
|
||||
|
|
@ -236,7 +251,6 @@ function toggleBackpack()
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -248,20 +262,20 @@ end
|
|||
|
||||
function setSelected(tab)
|
||||
assert(tab)
|
||||
assert(tab:IsA("TextButton"))
|
||||
assert(tab:IsA "TextButton")
|
||||
|
||||
tab.BackgroundColor3 = Color3.new(1,1,1)
|
||||
tab.TextColor3 = Color3.new(0,0,0)
|
||||
tab.BackgroundColor3 = Color3.new(1, 1, 1)
|
||||
tab.TextColor3 = Color3.new(0, 0, 0)
|
||||
tab.Selected = true
|
||||
tab.ZIndex = 3
|
||||
end
|
||||
|
||||
function setUnselected(tab)
|
||||
assert(tab)
|
||||
assert(tab:IsA("TextButton"))
|
||||
assert(tab:IsA "TextButton")
|
||||
|
||||
tab.BackgroundColor3 = Color3.new(0,0,0)
|
||||
tab.TextColor3 = Color3.new(1,1,1)
|
||||
tab.BackgroundColor3 = Color3.new(0, 0, 0)
|
||||
tab.TextColor3 = Color3.new(1, 1, 1)
|
||||
tab.Selected = false
|
||||
tab.ZIndex = 1
|
||||
end
|
||||
|
|
@ -280,20 +294,24 @@ end
|
|||
|
||||
function mouseLeaveTab(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
|
||||
|
||||
function mouseOverTab(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
|
||||
|
||||
function newTabClicked(tabName)
|
||||
|
|
@ -311,12 +329,14 @@ function trim(s)
|
|||
end
|
||||
|
||||
function splitByWhitespace(text)
|
||||
if type(text) ~= "string" then return nil end
|
||||
if type(text) ~= "string" then
|
||||
return nil
|
||||
end
|
||||
|
||||
local terms = {}
|
||||
for token in string.gmatch(text, "[^%s]+") do
|
||||
if string.len(token) > 0 then
|
||||
table.insert(terms,token)
|
||||
table.insert(terms, token)
|
||||
end
|
||||
end
|
||||
return terms
|
||||
|
|
@ -348,7 +368,7 @@ local backpackReady = function()
|
|||
readyForNextEvent = true
|
||||
end
|
||||
|
||||
function coreGuiChanged(coreGuiType,enabled)
|
||||
function coreGuiChanged(coreGuiType, enabled)
|
||||
if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All then
|
||||
active = enabled
|
||||
disabledByDeveloper = not enabled
|
||||
|
|
@ -374,13 +394,11 @@ end
|
|||
|
||||
--------------------------- End Internal Functions -------------------------------------
|
||||
|
||||
|
||||
------------------------------ Public Functions Setup -------------------------------------
|
||||
createPublicFunction("CloseBackpack", hideBackpack)
|
||||
createPublicFunction("BackpackReady", backpackReady)
|
||||
------------------------------ End Public Functions Setup ---------------------------------
|
||||
|
||||
|
||||
------------------------ Connections/Script Main -------------------------------------------
|
||||
|
||||
pcall(function()
|
||||
|
|
@ -388,14 +406,26 @@ pcall(function()
|
|||
Game.StarterGui.CoreGuiChangedSignal:connect(coreGuiChanged)
|
||||
end)
|
||||
|
||||
inventoryButton.MouseButton1Click:connect(function() newTabClicked("gear") end)
|
||||
inventoryButton.MouseEnter:connect(function() mouseOverTab(inventoryButton) end)
|
||||
inventoryButton.MouseLeave:connect(function() mouseLeaveTab(inventoryButton) end)
|
||||
inventoryButton.MouseButton1Click:connect(function()
|
||||
newTabClicked "gear"
|
||||
end)
|
||||
inventoryButton.MouseEnter:connect(function()
|
||||
mouseOverTab(inventoryButton)
|
||||
end)
|
||||
inventoryButton.MouseLeave:connect(function()
|
||||
mouseLeaveTab(inventoryButton)
|
||||
end)
|
||||
|
||||
if game.CoreGui.Version >= 8 then
|
||||
wardrobeButton.MouseButton1Click:connect(function() newTabClicked("wardrobe") end)
|
||||
wardrobeButton.MouseEnter:connect(function() mouseOverTab(wardrobeButton) end)
|
||||
wardrobeButton.MouseLeave:connect(function() mouseLeaveTab(wardrobeButton) end)
|
||||
wardrobeButton.MouseButton1Click:connect(function()
|
||||
newTabClicked "wardrobe"
|
||||
end)
|
||||
wardrobeButton.MouseEnter:connect(function()
|
||||
mouseOverTab(wardrobeButton)
|
||||
end)
|
||||
wardrobeButton.MouseLeave:connect(function()
|
||||
mouseLeaveTab(wardrobeButton)
|
||||
end)
|
||||
end
|
||||
|
||||
closeButton.MouseButton1Click:connect(closeBackpack)
|
||||
|
|
@ -410,13 +440,17 @@ end)
|
|||
game:GetService("GuiService"):AddKey(tilde)
|
||||
game:GetService("GuiService"):AddKey(backquote)
|
||||
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
|
||||
toggleBackpack()
|
||||
end
|
||||
end)
|
||||
backpackButton.MouseButton1Click:connect(function()
|
||||
if not active or disabledByDeveloper then return end
|
||||
if not active or disabledByDeveloper then
|
||||
return
|
||||
end
|
||||
toggleBackpack()
|
||||
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