361 lines
9.8 KiB
Plaintext
361 lines
9.8 KiB
Plaintext
-- 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
|
|
|
|
-- basic functions
|
|
local function waitForChild(instance, name)
|
|
while not instance:FindFirstChild(name) do
|
|
instance.ChildAdded:wait()
|
|
end
|
|
return instance:FindFirstChild(name)
|
|
end
|
|
local function waitForProperty(instance, property)
|
|
while not instance[property] do
|
|
instance.Changed:wait()
|
|
end
|
|
end
|
|
|
|
-- don't do anything if we are in an empty game
|
|
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")
|
|
local player = game.Players.LocalPlayer
|
|
|
|
|
|
|
|
------------------------ Locals ------------------------------
|
|
local backpack = script.Parent
|
|
waitForChild(backpack,"Gear")
|
|
|
|
local screen = script.Parent.Parent
|
|
assert(screen:IsA("ScreenGui"))
|
|
|
|
waitForChild(backpack, "Tabs")
|
|
waitForChild(backpack.Tabs, "CloseButton")
|
|
local closeButton = backpack.Tabs.CloseButton
|
|
|
|
waitForChild(backpack.Tabs, "InventoryButton")
|
|
local inventoryButton = backpack.Tabs.InventoryButton
|
|
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")
|
|
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 canToggle = true
|
|
local readyForNextEvent = true
|
|
local backpackIsOpen = false
|
|
local active = true
|
|
|
|
local humanoidDiedCon = nil
|
|
|
|
local guiTweenSpeed = 0.25 -- how quickly we open/close the backpack
|
|
|
|
local searchDefaultText = "Search..."
|
|
local tilde = "~"
|
|
local backquote = "`"
|
|
|
|
------------------------ End Locals ---------------------------
|
|
|
|
|
|
---------------------------------------- Public Event Setup ----------------------------------------
|
|
|
|
function createPublicEvent(eventName)
|
|
assert(eventName, "eventName is nil")
|
|
assert(tostring(eventName),"eventName is not a string")
|
|
|
|
local newEvent = Instance.new("BindableEvent")
|
|
newEvent.Name = tostring(eventName)
|
|
newEvent.Parent = script
|
|
|
|
return newEvent
|
|
end
|
|
|
|
function createPublicFunction(funcName, invokeFunc)
|
|
assert(funcName, "funcName is nil")
|
|
assert(tostring(funcName), "funcName is not a string")
|
|
assert(invokeFunc, "invokeFunc is nil")
|
|
assert(type(invokeFunc) == "function", "invokeFunc should be of type 'function'")
|
|
|
|
local newFunction = Instance.new("BindableFunction")
|
|
newFunction.Name = tostring(funcName)
|
|
newFunction.OnInvoke = invokeFunc
|
|
newFunction.Parent = script
|
|
|
|
return newFunction
|
|
end
|
|
|
|
-- Events
|
|
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()
|
|
backpack.Visible = false
|
|
active = false
|
|
end
|
|
|
|
function activateBackpack()
|
|
initHumanoidDiedConnections()
|
|
active = true
|
|
backpack.Visible = backpackIsOpen
|
|
end
|
|
|
|
function initHumanoidDiedConnections()
|
|
if humanoidDiedCon then
|
|
humanoidDiedCon:disconnect()
|
|
end
|
|
waitForProperty(game.Players.LocalPlayer,"Character")
|
|
waitForChild(game.Players.LocalPlayer.Character,"Humanoid")
|
|
humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died:connect(deactivateBackpack)
|
|
end
|
|
|
|
local hideBackpack = function()
|
|
backpackIsOpen = false
|
|
readyForNextEvent = false
|
|
backpackButton.Selected = false
|
|
resetSearch()
|
|
backpackCloseEvent:Fire(currentTab)
|
|
backpack.Tabs.Visible = false
|
|
searchFrame.Visible = false
|
|
backpack:TweenSizeAndPosition(UDim2.new(0,0,0,0),UDim2.new(0.5,0,0.5,0), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, guiTweenSpeed, true,
|
|
function()
|
|
game.GuiService:RemoveCenterDialog(backpack)
|
|
backpack.Visible = false
|
|
backpackButton.Selected = false
|
|
end)
|
|
delay(guiTweenSpeed,function()
|
|
game.GuiService:RemoveCenterDialog(backpack)
|
|
backpack.Visible = false
|
|
backpackButton.Selected = false
|
|
canToggle = true
|
|
end)
|
|
end
|
|
|
|
function showBackpack()
|
|
game.GuiService:AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog,
|
|
function()
|
|
backpack.Visible = true
|
|
backpackButton.Selected = true
|
|
end,
|
|
function()
|
|
backpack.Visible = false
|
|
backpackButton.Selected = false
|
|
end)
|
|
backpack.Visible = true
|
|
backpackButton.Selected = true
|
|
backpack:TweenSizeAndPosition(UDim2.new(0.55, 0, 0.76, 0),UDim2.new(0.225, 0, 0.09, 0), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, guiTweenSpeed, true)
|
|
delay(guiTweenSpeed,function()
|
|
backpack.Tabs.Visible = true
|
|
searchFrame.Visible = true
|
|
backpackOpenEvent:Fire(currentTab)
|
|
canToggle = true
|
|
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
|
|
readyForNextEvent = false
|
|
canToggle = false
|
|
|
|
backpackIsOpen = not backpackIsOpen
|
|
|
|
if backpackIsOpen then
|
|
showBackpack()
|
|
else
|
|
backpackButton.Selected = false
|
|
hideBackpack()
|
|
end
|
|
end
|
|
|
|
function closeBackpack()
|
|
if backpackIsOpen then
|
|
toggleBackpack()
|
|
end
|
|
end
|
|
|
|
function setSelected(tab)
|
|
assert(tab)
|
|
assert(tab:IsA("TextButton"))
|
|
|
|
tab.BackgroundColor3 = Color3.new(1,1,1)
|
|
tab.TextColor3 = Color3.new(0,0,0)
|
|
tab.Selected = true
|
|
tab.ZIndex = 3
|
|
end
|
|
|
|
function setUnselected(tab)
|
|
assert(tab)
|
|
assert(tab:IsA("TextButton"))
|
|
|
|
tab.BackgroundColor3 = Color3.new(0,0,0)
|
|
tab.TextColor3 = Color3.new(1,1,1)
|
|
tab.Selected = false
|
|
tab.ZIndex = 1
|
|
end
|
|
|
|
function updateTabGui(selectedTab)
|
|
assert(selectedTab)
|
|
|
|
if selectedTab == "gear" then
|
|
setSelected(inventoryButton)
|
|
setUnselected(wardrobeButton)
|
|
elseif selectedTab == "wardrobe" then
|
|
setSelected(wardrobeButton)
|
|
setUnselected(inventoryButton)
|
|
end
|
|
end
|
|
|
|
function mouseLeaveTab(button)
|
|
assert(button)
|
|
assert(button:IsA("TextButton"))
|
|
|
|
if button.Selected then return end
|
|
|
|
button.BackgroundColor3 = Color3.new(0,0,0)
|
|
end
|
|
|
|
function mouseOverTab(button)
|
|
assert(button)
|
|
assert(button:IsA("TextButton"))
|
|
|
|
if button.Selected then return end
|
|
|
|
button.BackgroundColor3 = Color3.new(39/255,39/255,39/255)
|
|
end
|
|
|
|
function newTabClicked(tabName)
|
|
assert(tabName)
|
|
tabName = string.lower(tabName)
|
|
currentTab = tabName
|
|
|
|
updateTabGui(tabName)
|
|
tabClickedEvent:Fire(tabName)
|
|
resetSearch()
|
|
end
|
|
|
|
function trim(s)
|
|
return (s:gsub("^%s*(.-)%s*$", "%1"))
|
|
end
|
|
|
|
function splitByWhitespace(text)
|
|
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)
|
|
end
|
|
end
|
|
return terms
|
|
end
|
|
|
|
function resetSearchBoxGui()
|
|
resetButton.Visible = false
|
|
searchBox.Text = searchDefaultText
|
|
end
|
|
|
|
function doSearch()
|
|
local searchText = searchBox.Text
|
|
if searchText == "" then
|
|
resetSearch()
|
|
return
|
|
end
|
|
searchText = trim(searchText)
|
|
resetButton.Visible = true
|
|
termTable = splitByWhitespace(searchText)
|
|
searchRequestedEvent:Fire(searchText) -- todo: replace this with termtable when table passing is possible
|
|
end
|
|
|
|
function resetSearch()
|
|
resetSearchBoxGui()
|
|
searchRequestedEvent:Fire()
|
|
end
|
|
|
|
local backpackReady = function()
|
|
readyForNextEvent = true
|
|
end
|
|
|
|
--------------------------- End Internal Functions -------------------------------------
|
|
|
|
|
|
------------------------------ Public Functions Setup -------------------------------------
|
|
createPublicFunction("CloseBackpack", hideBackpack)
|
|
createPublicFunction("BackpackReady", backpackReady)
|
|
------------------------------ End Public Functions Setup ---------------------------------
|
|
|
|
|
|
------------------------ Connections/Script Main -------------------------------------------
|
|
|
|
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)
|
|
end
|
|
|
|
closeButton.MouseButton1Click:connect(closeBackpack)
|
|
|
|
screen.Changed:connect(function(prop)
|
|
if prop == "AbsoluteSize" then
|
|
resizeEvent:Fire(screen.AbsoluteSize)
|
|
end
|
|
end)
|
|
|
|
-- GuiService key setup
|
|
game:GetService("GuiService"):AddKey(tilde)
|
|
game:GetService("GuiService"):AddKey(backquote)
|
|
game:GetService("GuiService").KeyPressed:connect(function(key)
|
|
if not active then return end
|
|
if key == tilde or key == backquote then
|
|
toggleBackpack()
|
|
end
|
|
end)
|
|
backpackButton.MouseButton1Click:connect(function()
|
|
if not active then return end
|
|
toggleBackpack()
|
|
end)
|
|
|
|
if game.Players.LocalPlayer["Character"] then
|
|
activateBackpack()
|
|
end
|
|
game.Players.LocalPlayer.CharacterAdded:connect(activateBackpack)
|
|
|
|
-- search functions
|
|
searchBox.FocusLost:connect(function(enterPressed)
|
|
if enterPressed or searchBox.Text ~= "" then
|
|
doSearch()
|
|
elseif searchBox.Text == "" then
|
|
resetSearch()
|
|
end
|
|
end)
|
|
searchButton.MouseButton1Click:connect(doSearch)
|
|
resetButton.MouseButton1Click:connect(resetSearch)
|
|
|
|
backpackButton.Visible = true
|