1081 lines
26 KiB
Plaintext
1081 lines
26 KiB
Plaintext
import "macros" as { $ }
|
|
$load $FILE
|
|
|
|
return if game.CoreGui.Version < 3
|
|
-- peace out if we aren't using the right client
|
|
|
|
-- A couple of necessary functions
|
|
waitForChild = (instance, name) ->
|
|
until instance\FindFirstChild name
|
|
instance.ChildAdded\wait!
|
|
instance\FindFirstChild name
|
|
|
|
waitForProperty = (instance, property) ->
|
|
until instance[property]
|
|
instance.Changed\wait!
|
|
|
|
currentLoadout = script.Parent
|
|
StaticTabName = "gear"
|
|
backpackEnabled = true
|
|
|
|
robloxGui = game\GetService"CoreGui"\FindFirstChild "RobloxGui"
|
|
assert robloxGui
|
|
controlFrame = waitForChild robloxGui, "ControlFrame"
|
|
backpackButton = waitForChild controlFrame, "BackpackButton"
|
|
backpack = waitForChild robloxGui, "Backpack"
|
|
waitForChild robloxGui, "CurrentLoadout"
|
|
waitForChild robloxGui.CurrentLoadout, "TempSlot"
|
|
waitForChild robloxGui.CurrentLoadout.TempSlot, "SlotNumber"
|
|
|
|
waitForChild currentLoadout, "Background"
|
|
clBackground = currentLoadout.Background
|
|
|
|
IsTouchDevice = ->
|
|
touchEnabled = false
|
|
try
|
|
touchEnabled = Game\GetService"UserInputService".TouchEnabled
|
|
touchEnabled
|
|
|
|
|
|
moveHealthBar = (pGui) ->
|
|
waitForChild pGui, "HealthGUI"
|
|
waitForChild pGui["HealthGUI"], "tray"
|
|
tray = pGui["HealthGUI"]["tray"]
|
|
tray.Position = UDim2.new 0.5, -85, 1, -26
|
|
|
|
|
|
setHealthBarVisible = (pGui, visible) ->
|
|
waitForChild pGui, "HealthGUI"
|
|
waitForChild pGui["HealthGUI"], "tray"
|
|
tray = pGui["HealthGUI"]["tray"]
|
|
tray.Visible = visible
|
|
|
|
|
|
--- Begin Locals
|
|
waitForChild game, "Players"
|
|
waitForProperty game.Players, "LocalPlayer"
|
|
player = game.Players.LocalPlayer
|
|
|
|
waitForChild player, "PlayerGui"
|
|
Spawn ->
|
|
moveHealthBar player.PlayerGui
|
|
|
|
|
|
until player.Character?
|
|
wait 0.03
|
|
|
|
humanoid = waitForChild player.Character, "Humanoid"
|
|
humanoid.Died\connect ->
|
|
backpackButton.Visible = false
|
|
|
|
|
|
waitForChild game, "LocalBackpack"
|
|
game.LocalBackpack\SetOldSchoolBackpack false
|
|
|
|
waitForChild currentLoadout.Parent, "Backpack"
|
|
guiBackpack = currentLoadout.Parent.Backpack
|
|
|
|
backpackManager = waitForChild guiBackpack, "CoreScripts/BackpackScripts/BackpackManager"
|
|
backpackOpenEvent = waitForChild backpackManager, "BackpackOpenEvent"
|
|
backpackCloseEvent = waitForChild backpackManager, "BackpackCloseEvent"
|
|
tabClickedEvent = waitForChild backpackManager, "TabClickedEvent"
|
|
-- resizeEvent = waitForChild backpackManager, "ResizeEvent")
|
|
|
|
inGearTab = true
|
|
|
|
maxNumLoadoutItems = 10
|
|
if robloxGui.AbsoluteSize.Y <= 320
|
|
maxNumLoadoutItems = 4
|
|
|
|
local characterChildAddedCon, backpackChildCon
|
|
|
|
debounce = false
|
|
|
|
enlargeFactor = 1.18
|
|
buttonSizeEnlarge = UDim2.new 1 * enlargeFactor, 0, 1 * enlargeFactor, 0
|
|
buttonSizeNormal = UDim2.new 1, 0, 1, 0
|
|
enlargeOverride = true
|
|
guiTweenSpeed = 0.5
|
|
|
|
firstInstanceOfLoadout = false
|
|
|
|
inventory = {}
|
|
|
|
gearSlots = {}
|
|
for i = 1, maxNumLoadoutItems
|
|
gearSlots[i] = "empty"
|
|
|
|
|
|
backpackWasOpened = false
|
|
--- End Locals
|
|
|
|
-- Begin Functions
|
|
backpackIsOpen = ->
|
|
if guiBackpack
|
|
return guiBackpack.Visible
|
|
false
|
|
|
|
local reorganizeLoadout
|
|
kill = (prop, con, gear) ->
|
|
con?\disconnect!
|
|
|
|
if prop == true and gear
|
|
reorganizeLoadout gear, false
|
|
|
|
|
|
registerNumberKeys = ->
|
|
for i = 0, 9
|
|
game\GetService"GuiService"\AddKey "#{i}"
|
|
|
|
unregisterNumberKeys = ->
|
|
try
|
|
for i = 0, 9
|
|
game\GetService"GuiService"\RemoveKey "#{i}"
|
|
|
|
|
|
characterInWorkspace = ->
|
|
if game.Players["LocalPlayer"] and
|
|
game.Players.LocalPlayer["Character"] and
|
|
game.Players.LocalPlayer.Character? and
|
|
game.Players.LocalPlayer.Character.Parent?
|
|
|
|
return true
|
|
false
|
|
|
|
|
|
removeGear = (gear) ->
|
|
local emptySlot
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] == gear and gear.Parent?
|
|
emptySlot = i
|
|
break
|
|
|
|
|
|
if emptySlot
|
|
with gearSlots[emptySlot]
|
|
if .GearReference.Value
|
|
if .GearReference.Value.Parent == game.Players.LocalPlayer.Character then -- if we currently have this equipped, unequip it
|
|
.GearReference.Value.Parent = game.Players.LocalPlayer.Backpack
|
|
|
|
|
|
if .GearReference.Value\IsA"HopperBin" and
|
|
.GearReference.Value.Active
|
|
-- this is an active hopperbin
|
|
.GearReference.Value\Disable!
|
|
.GearReference.Value.Active = false
|
|
|
|
gearSlots[emptySlot] = "empty"
|
|
|
|
-- centerizeX = gear.Size.X.Scale / 2
|
|
-- centerizeY = gear.Size.Y.Scale / 2
|
|
--[[gear\TweenSizeAndPosition(UDim2.new 0,0,0,0,
|
|
UDim2.new(gear.Position.X.Scale + centerizeX,gear.Position.X.Offset,gear.Position.Y.Scale + centerizeY,gear.Position.Y.Offset),
|
|
Enum.EasingDirection.Out, Enum.EasingStyle.Quad,guiTweenSpeed/4,true)]]
|
|
delay 0, ->
|
|
gear\remove!
|
|
|
|
|
|
Spawn ->
|
|
while backpackIsOpen!
|
|
wait 0.03
|
|
|
|
waitForChild player, "Backpack"
|
|
allEmpty = true
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] ~= "empty"
|
|
allEmpty = false
|
|
|
|
if allEmpty
|
|
if #player.Backpack\GetChildren! < 1
|
|
backpackButton.Visible = false
|
|
else
|
|
backpackButton.Position = UDim2.new 0.5, -60, 1, -44
|
|
|
|
clBackground.Visible = false
|
|
|
|
|
|
insertGear = (gear, addToSlot) ->
|
|
local pos
|
|
if not addToSlot
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] == "empty"
|
|
pos = i
|
|
break
|
|
|
|
if pos == 1 and gearSlots[1] ~= "empty"
|
|
gear\remove!
|
|
return
|
|
-- we are currently full, can't add in
|
|
else
|
|
pos = addToSlot
|
|
-- push all gear down one slot
|
|
start = 1
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] == "empty"
|
|
start = i
|
|
break
|
|
|
|
|
|
for i = start, pos + 1, -1
|
|
gearSlots[i] = gearSlots[i - 1]
|
|
gearSlots[i].SlotNumber.Text = gearSlots[i].SlotNumberDownShadow.Text = gearSlots[i].SlotNumberUpShadow.Text = if i == 10
|
|
"0"
|
|
else
|
|
i
|
|
|
|
|
|
gearSlots[pos] = gear
|
|
if pos ~= maxNumLoadoutItems
|
|
if type"#{pos}" == "string"
|
|
posString = "#{pos}"
|
|
gear.SlotNumber.Text = posString
|
|
gear.SlotNumberDownShadow.Text = posString
|
|
gear.SlotNumberUpShadow.Text = posString
|
|
|
|
else -- tenth gear doesn't follow mathematical pattern :(
|
|
gear.SlotNumber.Text = "0"
|
|
gear.SlotNumberDownShadow.Text = "0"
|
|
gear.SlotNumberUpShadow.Text = "0"
|
|
|
|
gear.Visible = true
|
|
|
|
con = gear.Kill.Changed\connect (prop) ->
|
|
kill prop, con, gear
|
|
|
|
|
|
reorganizeLoadout = (gear, inserting, _, addToSlot) ->
|
|
if inserting -- add in gear
|
|
insertGear gear, addToSlot
|
|
else
|
|
removeGear gear
|
|
|
|
if gear ~= "empty"
|
|
gear.ZIndex = 1
|
|
|
|
|
|
checkToolAncestry = (child, parent) ->
|
|
if child\FindFirstChild "RobloxBuildTool"
|
|
return
|
|
-- don't show roblox build tools
|
|
if child\IsA"Tool" or child\IsA "HopperBin"
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] ~= "empty" and gearSlots[i].GearReference.Value == child
|
|
if not parent?
|
|
gearSlots[i].Kill.Value = true
|
|
return false
|
|
elseif child.Parent == player.Character
|
|
gearSlots[i].Selected = true
|
|
return true
|
|
elseif child.Parent == player.Backpack
|
|
if child\IsA"Tool" or child\IsA "HopperBin"
|
|
gearSlots[i].Selected = false
|
|
|
|
return true
|
|
|
|
|
|
gearSlots[i].Kill.Value = true
|
|
return false
|
|
|
|
|
|
removeAllEquippedGear = (physGear) ->
|
|
stuff = player.Character\GetChildren!
|
|
for i = 1, #stuff
|
|
if (stuff[i]\IsA"Tool" or stuff[i]\IsA"HopperBin") and stuff[i] ~= physGear
|
|
if stuff[i]\IsA "Tool"
|
|
stuff[i].Parent = player.Backpack
|
|
|
|
if stuff[i]\IsA "HopperBin"
|
|
stuff[i]\Disable!
|
|
|
|
normalizeButton = (button, speed) ->
|
|
return if not button
|
|
return if button.Size.Y.Scale <= 1
|
|
return if button.Selected
|
|
return if not button.Parent
|
|
|
|
moveSpeed = speed
|
|
if not moveSpeed? or type(moveSpeed) ~= "number"
|
|
moveSpeed = guiTweenSpeed / 5
|
|
|
|
if button\FindFirstChild "Highlight"
|
|
button.Highlight.Visible = false
|
|
|
|
if button\IsA"ImageButton" or button\IsA "TextButton"
|
|
button.ZIndex = 1
|
|
centerizeX = -(buttonSizeNormal.X.Scale - button.Size.X.Scale) / 2
|
|
centerizeY = -(buttonSizeNormal.Y.Scale - button.Size.Y.Scale) / 2
|
|
button\TweenSizeAndPosition(
|
|
buttonSizeNormal,
|
|
UDim2.new(
|
|
button.Position.X.Scale + centerizeX,
|
|
button.Position.X.Offset,
|
|
button.Position.Y.Scale + centerizeY,
|
|
button.Position.Y.Offset
|
|
),
|
|
Enum.EasingDirection.Out,
|
|
Enum.EasingStyle.Quad,
|
|
moveSpeed,
|
|
enlargeOverride
|
|
)
|
|
|
|
enlargeButton = (button) ->
|
|
return if button.Size.Y.Scale > 1
|
|
return if not button.Parent
|
|
return if not button.Selected
|
|
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] == "empty"
|
|
break
|
|
|
|
if gearSlots[i] ~= button
|
|
normalizeButton gearSlots[i]
|
|
|
|
return if not enlargeOverride
|
|
|
|
|
|
if button\FindFirstChild "Highlight"
|
|
button.Highlight.Visible = true
|
|
|
|
|
|
if button\IsA"ImageButton" or button\IsA "TextButton"
|
|
button.ZIndex = 5
|
|
centerizeX = -(buttonSizeEnlarge.X.Scale - button.Size.X.Scale) / 2
|
|
centerizeY = -(buttonSizeEnlarge.Y.Scale - button.Size.Y.Scale) / 2
|
|
button\TweenSizeAndPosition(
|
|
buttonSizeEnlarge,
|
|
UDim2.new(
|
|
button.Position.X.Scale + centerizeX,
|
|
button.Position.X.Offset,
|
|
button.Position.Y.Scale + centerizeY,
|
|
button.Position.Y.Offset
|
|
),
|
|
Enum.EasingDirection.Out,
|
|
Enum.EasingStyle.Quad,
|
|
guiTweenSpeed / 5,
|
|
enlargeOverride
|
|
)
|
|
|
|
hopperBinSwitcher = (numKey, physGear) ->
|
|
return if not physGear
|
|
|
|
physGear\ToggleSelect!
|
|
|
|
return if gearSlots[numKey] == "empty"
|
|
|
|
if not physGear.Active
|
|
gearSlots[numKey].Selected = false
|
|
normalizeButton gearSlots[numKey]
|
|
else
|
|
gearSlots[numKey].Selected = true
|
|
enlargeButton gearSlots[numKey]
|
|
|
|
|
|
toolSwitcher = (numKey) ->
|
|
return if not gearSlots[numKey]
|
|
|
|
physGear = gearSlots[numKey].GearReference.Value
|
|
return if not physGear?
|
|
|
|
removeAllEquippedGear physGear -- we don't remove this gear, as then we get a double switcheroo
|
|
|
|
key = numKey
|
|
if numKey == 0
|
|
key = 10
|
|
|
|
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] and gearSlots[i] ~= "empty" and i ~= key
|
|
normalizeButton gearSlots[i]
|
|
with gearSlots[i]
|
|
.Selected = false
|
|
if .GearReference and
|
|
.GearReference.Value and
|
|
.GearReference.Value\IsA"HopperBin" and
|
|
.GearReference.Value.Active
|
|
|
|
.GearReference.Value\ToggleSelect!
|
|
|
|
|
|
if physGear\IsA "HopperBin"
|
|
hopperBinSwitcher numKey, physGear
|
|
else
|
|
if physGear.Parent == player.Character
|
|
physGear.Parent = player.Backpack
|
|
|
|
if gearSlots[numKey] ~= "empty"
|
|
gearSlots[numKey].Selected = false
|
|
normalizeButton gearSlots[numKey]
|
|
|
|
else
|
|
--player.Character.Humanoid\EquipTool physGear
|
|
|
|
physGear.Parent = player.Character
|
|
gearSlots[numKey].Selected = true
|
|
|
|
enlargeButton gearSlots[numKey]
|
|
|
|
|
|
activateGear = (num) ->
|
|
local numKey
|
|
numKey = if num == "0"
|
|
10 -- why do lua indexes have to start at 1? :(
|
|
else
|
|
tonumber num
|
|
|
|
return if not numKey?
|
|
|
|
if gearSlots[numKey] ~= "empty"
|
|
toolSwitcher numKey
|
|
|
|
|
|
normalizeAllButtons = ->
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] == "empty"
|
|
break
|
|
|
|
if gearSlots[i] ~= button
|
|
normalizeButton gearSlots[i], 0.1
|
|
|
|
|
|
waitForDebounce = ->
|
|
while debounce
|
|
wait!
|
|
|
|
pointInRectangle = (point, rectTopLeft, rectSize) ->
|
|
if (point.x > rectTopLeft.x and point.x < (rectTopLeft.x + rectSize.x)) or
|
|
(point.y > rectTopLeft.y and point.y < (rectTopLeft.y + rectSize.y))
|
|
return true
|
|
false
|
|
|
|
swapGear = (gearClone, toFrame) ->
|
|
toFrameChildren = toFrame\GetChildren!
|
|
if #toFrameChildren == 1
|
|
if toFrameChildren[1]\FindFirstChild "SlotNumber"
|
|
toSlot = tonumber toFrameChildren[1].SlotNumber.Text
|
|
gearCloneSlot = tonumber gearClone.SlotNumber.Text
|
|
if toSlot == 0
|
|
toSlot = 10
|
|
|
|
if gearCloneSlot == 0
|
|
gearCloneSlot = 10
|
|
|
|
|
|
gearSlots[toSlot] = gearClone
|
|
gearSlots[gearCloneSlot] = toFrameChildren[1]
|
|
|
|
toFrameChildren[1].SlotNumber.Text = gearClone.SlotNumber.Text
|
|
toFrameChildren[1].SlotNumberDownShadow.Text = gearClone.SlotNumber.Text
|
|
toFrameChildren[1].SlotNumberUpShadow.Text = gearClone.SlotNumber.Text
|
|
|
|
subString = string.sub toFrame.Name, 5
|
|
gearClone.SlotNumber.Text = subString
|
|
gearClone.SlotNumberDownShadow.Text = subString
|
|
gearClone.SlotNumberUpShadow.Text = subString
|
|
|
|
gearClone.Position = UDim2.new gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0
|
|
toFrameChildren[1].Position = UDim2.new(
|
|
toFrameChildren[1].Position.X.Scale, 0,
|
|
toFrameChildren[1].Position.Y.Scale, 0
|
|
)
|
|
|
|
toFrameChildren[1].Parent = gearClone.Parent
|
|
gearClone.Parent = toFrame
|
|
|
|
else
|
|
slotNum = tonumber gearClone.SlotNumber.Text
|
|
if slotNum == 0
|
|
slotNum = 10
|
|
|
|
gearSlots[slotNum] = "empty" -- reset this gear slot
|
|
|
|
subString = string.sub toFrame.Name, 5
|
|
gearClone.SlotNumber.Text = subString
|
|
gearClone.SlotNumberDownShadow.Text = subString
|
|
gearClone.SlotNumberUpShadow.Text = subString
|
|
|
|
toSlotNum = tonumber gearClone.SlotNumber.Text
|
|
if toSlotNum == 0
|
|
toSlotNum = 10
|
|
|
|
gearSlots[toSlotNum] = gearClone
|
|
gearClone.Position = UDim2.new gearClone.Position.X.Scale, 0, gearClone.Position.Y.Scale, 0
|
|
gearClone.Parent = toFrame
|
|
|
|
|
|
resolveDrag = (gearClone, x, y) ->
|
|
mousePoint = Vector2.new x, y
|
|
|
|
frame = gearClone.Parent
|
|
frames = frame.Parent\GetChildren!
|
|
|
|
for i = 1, #frames
|
|
if frames[i]\IsA"Frame" and
|
|
pointInRectangle mousePoint, frames[i].AbsolutePosition, frames[i].AbsoluteSize
|
|
|
|
swapGear gearClone, frames[i]
|
|
return true
|
|
|
|
if (x < frame.AbsolutePosition.x or x > (frame.AbsolutePosition.x + frame.AbsoluteSize.x)) or
|
|
(y < frame.AbsolutePosition.y or y > (frame.AbsolutePosition.y + frame.AbsoluteSize.y))
|
|
|
|
reorganizeLoadout gearClone, false
|
|
return false
|
|
else
|
|
if dragBeginPos
|
|
gearClone.Position = dragBeginPos
|
|
|
|
return -1
|
|
|
|
|
|
unequipAllItems = (dontEquipThis) ->
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] == "empty"
|
|
break
|
|
|
|
with gearSlots[i]
|
|
if .GearReference.Value and .GearReference.Value ~= dontEquipThis
|
|
if .GearReference.Value\IsA "HopperBin"
|
|
.GearReference.Value\Disable!
|
|
elseif .GearReference.Value\IsA "Tool"
|
|
.GearReference.Value.Parent = game.Players.LocalPlayer.Backpack
|
|
|
|
.Selected = false
|
|
|
|
|
|
showToolTip = (button, tip) ->
|
|
if button and
|
|
button\FindFirstChild"ToolTipLabel" and
|
|
button.ToolTipLabel\IsA"TextLabel" and
|
|
not IsTouchDevice!
|
|
|
|
button.ToolTipLabel.Text = "#{tip}"
|
|
xSize = button.ToolTipLabel.TextBounds.X + 6
|
|
button.ToolTipLabel.Size = UDim2.new 0, xSize, 0, 20
|
|
button.ToolTipLabel.Position = UDim2.new 0.5, -xSize / 2, 0, -30
|
|
button.ToolTipLabel.Visible = true
|
|
|
|
|
|
hideToolTip = (button, _) ->
|
|
if button and button\FindFirstChild"ToolTipLabel" and button.ToolTipLabel\IsA "TextLabel"
|
|
button.ToolTipLabel.Visible = false
|
|
|
|
removeFromInventory = (child) ->
|
|
for i = 1, #inventory
|
|
if inventory[i] == child
|
|
table.remove inventory, i
|
|
inventory[i] = nil
|
|
|
|
addingPlayerChild = (child, equipped, addToSlot, inventoryGearButton) ->
|
|
waitForDebounce!
|
|
debounce = true
|
|
|
|
if child\FindFirstChild"RobloxBuildTool"
|
|
debounce = false
|
|
return
|
|
-- don't show roblox build tools
|
|
if not child\IsA"Tool" and
|
|
not child\IsA "HopperBin"
|
|
|
|
debounce = false
|
|
return -- we don't care about anything besides tools (sigh...)
|
|
|
|
|
|
if not addToSlot
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] ~= "empty" and gearSlots[i].GearReference.Value == child then -- we already have gear, do nothing
|
|
debounce = false
|
|
return
|
|
|
|
|
|
gearClone = currentLoadout.TempSlot\clone!
|
|
gearClone.Name = child.Name
|
|
gearClone.GearImage.Image = child.TextureId
|
|
if gearClone.GearImage.Image == ""
|
|
gearClone.GearText.Text = child.Name
|
|
|
|
gearClone.GearReference.Value = child
|
|
|
|
gearClone.MouseEnter\connect ->
|
|
if gearClone.GearReference and
|
|
gearClone.GearReference.Value["ToolTip"] and
|
|
gearClone.GearReference.Value.ToolTip ~= ""
|
|
|
|
showToolTip gearClone, gearClone.GearReference.Value.ToolTip
|
|
|
|
|
|
gearClone.MouseLeave\connect ->
|
|
if gearClone.GearReference and
|
|
gearClone.GearReference.Value["ToolTip"] and
|
|
gearClone.GearReference.Value.ToolTip ~= ""
|
|
|
|
hideToolTip gearClone, gearClone.GearReference.Value.ToolTip
|
|
|
|
|
|
gearClone.RobloxLocked = true
|
|
|
|
slotToMod = -1
|
|
|
|
if not addToSlot
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] == "empty"
|
|
slotToMod = i
|
|
break
|
|
|
|
else
|
|
slotToMod = addToSlot
|
|
|
|
|
|
if slotToMod == -1 -- No available slot to add in!
|
|
debounce = false
|
|
return
|
|
|
|
|
|
slotNum = slotToMod % 10
|
|
parent = currentLoadout\FindFirstChild "Slot#{slotNum}"
|
|
gearClone.Parent = parent
|
|
|
|
if inventoryGearButton
|
|
absolutePositionFinal = inventoryGearButton.AbsolutePosition
|
|
currentAbsolutePosition = gearClone.AbsolutePosition
|
|
diff = absolutePositionFinal - currentAbsolutePosition
|
|
gearClone.Position = UDim2.new gearClone.Position.X.Scale, diff.x, gearClone.Position.Y.Scale, diff.y
|
|
gearClone.ZIndex = 4
|
|
|
|
|
|
reorganizeLoadout gearClone, if addToSlot
|
|
true, equipped, addToSlot
|
|
else
|
|
true
|
|
|
|
|
|
if not gearClone.Parent?
|
|
debounce = false
|
|
return
|
|
-- couldn't fit in (hopper is full!)
|
|
|
|
if equipped
|
|
gearClone.Selected = true
|
|
unequipAllItems child
|
|
delay guiTweenSpeed + 0.01, -> -- if our gear is equipped, we will want to enlarge it when done moving
|
|
if gearClone\FindFirstChild"GearReference" and (
|
|
(gearClone.GearReference.Value\IsA"Tool" and gearClone.GearReference.Value.Parent == player.Character) or
|
|
(gearClone.GearReference.Value\IsA"HopperBin" and gearClone.GearReference.Value.Active == true)
|
|
)
|
|
|
|
enlargeButton gearClone
|
|
|
|
|
|
local dragBeginPos
|
|
local clickCon, buttonDeleteCon, mouseEnterCon, mouseLeaveCon, dragStop, dragBegin
|
|
clickCon = gearClone.MouseButton1Click\connect ->
|
|
if characterInWorkspace!
|
|
if not gearClone.Draggable
|
|
activateGear gearClone.SlotNumber.Text
|
|
|
|
|
|
mouseEnterCon = gearClone.MouseEnter\connect ->
|
|
if guiBackpack.Visible
|
|
gearClone.Draggable = true
|
|
|
|
|
|
dragBegin = gearClone.DragBegin\connect (pos) ->
|
|
dragBeginPos = pos
|
|
gearClone.ZIndex = 7
|
|
children = gearClone\GetChildren!
|
|
for i = 1, #children
|
|
if children[i]\IsA "TextLabel"
|
|
children[i].ZIndex = if string.find children[i].Name, "Shadow"
|
|
8
|
|
else
|
|
9
|
|
|
|
elseif children[i]\IsA"Frame" or children[i]\IsA "ImageLabel"
|
|
children[i].ZIndex = 7
|
|
|
|
|
|
dragStop = gearClone.DragStopped\connect (x, y) ->
|
|
gearClone.ZIndex = if gearClone.Selected
|
|
4
|
|
else
|
|
3
|
|
|
|
children = gearClone\GetChildren!
|
|
for i = 1, #children
|
|
if children[i]\IsA "TextLabel"
|
|
children[i].ZIndex = if string.find children[i].Name, "Shadow"
|
|
3
|
|
else
|
|
4
|
|
|
|
elseif children[i]\IsA"Frame" or children[i]\IsA "ImageLabel"
|
|
children[i].ZIndex = 2
|
|
|
|
resolveDrag gearClone, x, y
|
|
|
|
mouseLeaveCon = gearClone.MouseLeave\connect ->
|
|
gearClone.Draggable = false
|
|
|
|
buttonDeleteCon = gearClone.AncestryChanged\connect ->
|
|
return if gearClone.Parent and gearClone.Parent.Parent == currentLoadout
|
|
|
|
clickCon?\disconnect!
|
|
buttonDeleteCon?\disconnect!
|
|
mouseEnterCon?\disconnect!
|
|
mouseLeaveCon?\disconnect!
|
|
dragStop?\disconnect!
|
|
dragBegin?\disconnect!
|
|
-- this probably isn't necessary since objects are being deleted (probably), but this might still leak just in case
|
|
|
|
local childCon
|
|
local childChangeCon
|
|
childCon = child.AncestryChanged\connect (newChild, parent) ->
|
|
if not checkToolAncestry newChild, parent
|
|
|
|
childCon?\disconnect!
|
|
childChangeCon?\disconnect!
|
|
|
|
removeFromInventory child
|
|
elseif parent == game.Players.LocalPlayer.Backpack
|
|
normalizeButton gearClone
|
|
|
|
|
|
childChangeCon = child.Changed\connect (prop) ->
|
|
if prop == "Name"
|
|
if gearClone and gearClone.GearImage.Image == ""
|
|
gearClone.GearText.Text = child.Name
|
|
|
|
elseif prop == "Active"
|
|
if child and child\IsA "HopperBin"
|
|
if not child.Active
|
|
gearClone.Selected = false
|
|
normalizeButton gearClone
|
|
|
|
|
|
elseif prop == "TextureId"
|
|
gearClone.GearImage.Image = child.TextureId
|
|
|
|
|
|
debounce = false
|
|
|
|
Spawn ->
|
|
while backpackIsOpen!
|
|
wait 0.03
|
|
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] ~= "empty"
|
|
backpackButton.Position = UDim2.new 0.5, -60, 1, -108
|
|
if backpackEnabled
|
|
backpackButton.Visible = true
|
|
clBackground.Visible = true
|
|
|
|
|
|
addToInventory = (child) ->
|
|
return if not child\IsA"Tool" or not child\IsA "HopperBin"
|
|
|
|
local slot
|
|
for i = 1, #inventory
|
|
return if inventory[i] and inventory[i] == child
|
|
|
|
if not inventory[i]
|
|
slot = i
|
|
|
|
if slot
|
|
inventory[slot] = child
|
|
elseif #inventory < 1
|
|
inventory[1] = child
|
|
else
|
|
inventory[] = child
|
|
|
|
|
|
spreadOutGear = ->
|
|
loadoutChildren = currentLoadout\GetChildren!
|
|
|
|
for i = 1, #loadoutChildren
|
|
if loadoutChildren[i]\IsA "Frame"
|
|
loadoutChildren[i].BackgroundTransparency = 0.5
|
|
slot = tonumber string.sub loadoutChildren[i].Name, 5
|
|
if slot == 0
|
|
slot = 10
|
|
|
|
if robloxGui.AbsoluteSize.Y <= 320
|
|
loadoutChildren[i]\TweenPosition(
|
|
UDim2.new(0, (slot - 1) * 60, 0, 0),
|
|
Enum.EasingDirection.Out,
|
|
Enum.EasingStyle.Quad,
|
|
0.25,
|
|
true
|
|
)
|
|
else
|
|
loadoutChildren[i]\TweenPosition(
|
|
UDim2.new((slot - 1) / 10, 0, 0, 0),
|
|
Enum.EasingDirection.Out,
|
|
Enum.EasingStyle.Quad,
|
|
0.25,
|
|
true
|
|
)
|
|
|
|
|
|
centerGear = ->
|
|
loadoutChildren = currentLoadout\GetChildren!
|
|
gearButtons = {}
|
|
local lastSlotAdd
|
|
|
|
for i = 1, #loadoutChildren
|
|
if loadoutChildren[i]\IsA "Frame"
|
|
if #loadoutChildren[i]\GetChildren! > 0
|
|
if loadoutChildren[i].Name == "Slot0"
|
|
lastSlotAdd = loadoutChildren[i]
|
|
else
|
|
table.insert gearButtons, loadoutChildren[i]
|
|
|
|
|
|
loadoutChildren[i].BackgroundTransparency = 1
|
|
|
|
|
|
if lastSlotAdd
|
|
table.insert gearButtons, lastSlotAdd
|
|
|
|
|
|
startPos = (1 - (#gearButtons * 0.1)) / 2
|
|
for i = 1, #gearButtons
|
|
if robloxGui.AbsoluteSize.Y <= 320
|
|
startPos = 0.5 - (#gearButtons * 0.333) / 2
|
|
gearButtons[i]\TweenPosition(
|
|
UDim2.new(startPos + (i - 1) * 0.33, 0, 0, 0),
|
|
Enum.EasingDirection.Out,
|
|
Enum.EasingStyle.Quad,
|
|
0.25,
|
|
true
|
|
)
|
|
else
|
|
gearButtons[i]\TweenPosition(
|
|
UDim2.new(startPos + ((i - 1) * 0.1), 0, 0, 0),
|
|
Enum.EasingDirection.Out,
|
|
Enum.EasingStyle.Quad,
|
|
0.25,
|
|
true
|
|
)
|
|
|
|
|
|
editLoadout = ->
|
|
backpackWasOpened = true
|
|
if inGearTab
|
|
spreadOutGear!
|
|
|
|
|
|
readonlyLoadout = ->
|
|
if not inGearTab
|
|
centerGear!
|
|
|
|
|
|
setupBackpackListener = ->
|
|
backpackChildCon?\disconnect!
|
|
backpackChildCon = nil
|
|
|
|
backpackChildCon = player.Backpack.ChildAdded\connect (child) ->
|
|
if not firstInstanceOfLoadout
|
|
firstInstanceOfLoadout = true
|
|
if backpackEnabled
|
|
backpackButton.Visible = true
|
|
clBackground.Visible = true
|
|
|
|
addingPlayerChild child
|
|
addToInventory child
|
|
|
|
|
|
playerCharacterChildAdded = (child) ->
|
|
addingPlayerChild child, true
|
|
addToInventory child
|
|
|
|
|
|
activateLoadout = ->
|
|
currentLoadout.Visible = true
|
|
|
|
|
|
deactivateLoadout = ->
|
|
currentLoadout.Visible = false
|
|
|
|
|
|
tabHandler = (inFocus) ->
|
|
inGearTab = inFocus
|
|
if inFocus
|
|
editLoadout!
|
|
else
|
|
readonlyLoadout!
|
|
|
|
|
|
coreGuiChanged = (coreGuiType, enabled) ->
|
|
if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All
|
|
backpackButton.Visible = enabled
|
|
clBackground.Visible = enabled
|
|
backpackEnabled = enabled
|
|
|
|
if enabled
|
|
registerNumberKeys!
|
|
else
|
|
unregisterNumberKeys!
|
|
|
|
|
|
if coreGuiType == Enum.CoreGuiType.Health or coreGuiType == Enum.CoreGuiType.All
|
|
setHealthBarVisible game.Players.LocalPlayer.PlayerGui, enabled
|
|
|
|
|
|
-- End Functions
|
|
|
|
-- Begin Script
|
|
registerNumberKeys!
|
|
|
|
try
|
|
coreGuiChanged Enum.CoreGuiType.Backpack, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Backpack
|
|
coreGuiChanged Enum.CoreGuiType.Health, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Health
|
|
Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged
|
|
|
|
|
|
wait! -- let stuff initialize incase this is first heartbeat...
|
|
|
|
waitForChild player, "Backpack"
|
|
waitForProperty player, "Character"
|
|
|
|
-- not sure why this had no delay but the player.CharacterAdded one had one... this type of error would be easier to avoid with function reusage
|
|
delay 1, ->
|
|
backpackChildren = player.Backpack\GetChildren!
|
|
size = math.min 10, #backpackChildren
|
|
for i = 1, size
|
|
if backpackEnabled
|
|
backpackButton.Visible = true
|
|
clBackground.Visible = true
|
|
|
|
addingPlayerChild backpackChildren[i], false
|
|
|
|
setupBackpackListener!
|
|
|
|
|
|
delay 2, ->
|
|
--while true
|
|
if not backpackWasOpened
|
|
if robloxGui.AbsoluteSize.Y <= 320
|
|
cChildren = currentLoadout\GetChildren!
|
|
for i = 1, #cChildren
|
|
slotNum = tonumber string.sub cChildren[i].Name, 5, string.len cChildren[i].Name
|
|
if type(slotNum) == "number"
|
|
cChildren[i].Position = UDim2.new 0, (slotNum - 1) * 60, 0, 0
|
|
|
|
wait 0.25
|
|
|
|
|
|
player.ChildAdded\connect (child) ->
|
|
if child\IsA "PlayerGui"
|
|
moveHealthBar child
|
|
|
|
|
|
waitForProperty player, "Character"
|
|
for _, v in ipairs player.Character\GetChildren!
|
|
playerCharacterChildAdded v
|
|
|
|
characterChildAddedCon = player.Character.ChildAdded\connect (child) ->
|
|
playerCharacterChildAdded child
|
|
|
|
|
|
waitForChild player.Character, "Humanoid"
|
|
humanoidDiedCon = player.Character.Humanoid.Died\connect ->
|
|
humanoidDiedCon?\disconnect!
|
|
global humanoidDiedCon = nil
|
|
|
|
deactivateLoadout!
|
|
backpackChildCon?\disconnect!
|
|
backpackChildCon = nil
|
|
|
|
backpackWasOpened = false
|
|
|
|
|
|
player.CharacterRemoving\connect ->
|
|
for i = 1, #gearSlots
|
|
if gearSlots[i] ~= "empty"
|
|
gearSlots[i].Parent = nil
|
|
gearSlots[i] = "empty"
|
|
|
|
|
|
player.CharacterAdded\connect ->
|
|
waitForProperty game.Players, "LocalPlayer"
|
|
player = game.Players.LocalPlayer -- make sure we are still looking at the correct character
|
|
waitForChild player, "Backpack"
|
|
|
|
delay 1, ->
|
|
backpackChildren = player.Backpack\GetChildren!
|
|
size = math.min 10, #backpackChildren
|
|
for i = 1, size
|
|
if backpackEnabled
|
|
backpackButton.Visible = true
|
|
clBackground.Visible = true
|
|
|
|
addingPlayerChild backpackChildren[i], false
|
|
setupBackpackListener!
|
|
activateLoadout!
|
|
|
|
characterChildAddedCon?\disconnect!
|
|
|
|
characterChildAddedCon = player.Character.ChildAdded\connect (child) ->
|
|
addingPlayerChild child, true
|
|
|
|
|
|
waitForChild player.Character, "Humanoid"
|
|
if backpack.Visible
|
|
backpackOpenEvent\Fire!
|
|
|
|
humanoidDiedCon = player.Character.Humanoid.Died\connect ->
|
|
if backpackEnabled
|
|
backpackButton.Visible = false
|
|
clBackground.Visible = false
|
|
|
|
firstInstanceOfLoadout = false
|
|
deactivateLoadout!
|
|
|
|
humanoidDiedCon?\disconnect!
|
|
humanoidDiedCon = nil
|
|
|
|
backpackChildCon?\disconnect!
|
|
backpackChildCon = nil
|
|
|
|
|
|
waitForChild player, "PlayerGui"
|
|
moveHealthBar player.PlayerGui
|
|
delay 2, ->
|
|
--while true
|
|
if (not backpackWasOpened) and
|
|
(robloxGui.AbsoluteSize.Y <= 320)
|
|
|
|
cChildren = currentLoadout\GetChildren!
|
|
for i = 1, #cChildren
|
|
slotNum = tonumber string.sub cChildren[i].Name, 5, string.len cChildren[i].Name
|
|
if type(slotNum) == "number"
|
|
cChildren[i].Position = UDim2.new 0, (slotNum - 1) * 60, 0, 0
|
|
|
|
wait 0.25
|
|
|
|
waitForChild guiBackpack, "SwapSlot"
|
|
guiBackpack.SwapSlot.Changed\connect ->
|
|
if guiBackpack.SwapSlot.Value
|
|
swapSlot = guiBackpack.SwapSlot
|
|
pos = swapSlot.Slot.Value
|
|
if pos == 0
|
|
pos = 10
|
|
|
|
if gearSlots[pos]
|
|
reorganizeLoadout gearSlots[pos], false
|
|
|
|
if swapSlot.GearButton.Value
|
|
addingPlayerChild swapSlot.GearButton.Value.GearReference.Value, false, pos
|
|
|
|
guiBackpack.SwapSlot.Value = false
|
|
|
|
|
|
game\GetService"GuiService".KeyPressed\connect (key) ->
|
|
if characterInWorkspace!
|
|
activateGear key
|
|
|
|
|
|
backpackOpenEvent.Event\connect editLoadout
|
|
backpackCloseEvent.Event\connect centerGear
|
|
tabClickedEvent.Event\connect (tabName) ->
|
|
tabHandler tabName == StaticTabName
|