import "macros" as { $ } $load $FILE -- 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) return if game.CoreGui.Version < 7 -- peace out if we aren't using the right client -- basic functions waitForChild = (instance, name) -> until instance\FindFirstChild name instance.ChildAdded\wait! instance\FindFirstChild name waitForProperty = (instance, property) -> until instance[property] instance.Changed\wait! -- don't do anything if we are in an empty game waitForChild game, "Players" if #game.Players\GetChildren! < 1 game.Players.ChildAdded\wait! -- make sure everything is loaded in before we do anything -- get our local player waitForProperty game.Players, "LocalPlayer" ------------------------ Locals ------------------------------ backpack = script.Parent waitForChild backpack, "Gear" screen = script.Parent.Parent assert screen\IsA "ScreenGui" waitForChild backpack, "Tabs" waitForChild backpack.Tabs, "CloseButton" closeButton = backpack.Tabs.CloseButton waitForChild backpack.Tabs, "InventoryButton" inventoryButton = backpack.Tabs.InventoryButton local wardrobeButton if game.CoreGui.Version >= 8 waitForChild backpack.Tabs, "WardrobeButton" wardrobeButton = backpack.Tabs.WardrobeButton waitForChild backpack.Parent, "ControlFrame" backpackButton = waitForChild backpack.Parent.ControlFrame, "BackpackButton" currentTab = "gear" searchFrame = waitForChild backpack, "SearchFrame" waitForChild backpack.SearchFrame, "SearchBoxFrame" searchBox = waitForChild backpack.SearchFrame.SearchBoxFrame, "SearchBox" searchButton = waitForChild backpack.SearchFrame, "SearchButton" resetButton = waitForChild backpack.SearchFrame, "ResetButton" robloxGui = waitForChild Game.CoreGui, "RobloxGui" currentLoadout = waitForChild robloxGui, "CurrentLoadout" loadoutBackground = waitForChild currentLoadout, "Background" canToggle = true readyForNextEvent = true backpackIsOpen = false active = true disabledByDeveloper = false local humanoidDiedCon guiTweenSpeed = 0.25 -- how quickly we open/close the backpack searchDefaultText = "Search..." tilde = "~" backquote = "`" backpackSize = UDim2.new 0, 600, 0, 400 if robloxGui.AbsoluteSize.Y <= 320 backpackSize = UDim2.new 0, 200, 0, 140 ------------------------ End Locals --------------------------- ---------------------------------------- Public Event Setup ---------------------------------------- createPublicEvent = (eventName) -> assert eventName, "eventName is nil" assert "#{eventName}", "eventName is not a string" with Instance.new "BindableEvent" .Name = "#{eventName}" .Parent = script createPublicFunction = (funcName, invokeFunc) -> assert funcName, "funcName is nil" assert "#{funcName}", "funcName is not a string" assert invokeFunc, "invokeFunc is nil" assert type(invokeFunc) == "function", "invokeFunc should be of type 'function'" with Instance.new "BindableFunction" .Name = "#{funcName}" .OnInvoke = invokeFunc .Parent = script -- Events resizeEvent = createPublicEvent "ResizeEvent" backpackOpenEvent = createPublicEvent "BackpackOpenEvent" backpackCloseEvent = createPublicEvent "BackpackCloseEvent" tabClickedEvent = createPublicEvent "TabClickedEvent" searchRequestedEvent = createPublicEvent "SearchRequestedEvent" ---------------------------------------- End Public Event Setup ---------------------------------------- --------------------------- Internal Functions ---------------------------------------- resetSearchBoxGui = -> resetButton.Visible = false searchBox.Text = searchDefaultText resetSearch = -> resetSearchBoxGui! searchRequestedEvent\Fire! deactivateBackpack = -> backpack.Visible = false active = false initHumanoidDiedConnections = -> if humanoidDiedCon humanoidDiedCon\disconnect! waitForProperty game.Players.LocalPlayer, "Character" waitForChild game.Players.LocalPlayer.Character, "Humanoid" humanoidDiedCon = game.Players.LocalPlayer.Character.Humanoid.Died\connect deactivateBackpack hideBackpack = -> backpackIsOpen = false readyForNextEvent = false backpackButton.Selected = false resetSearch! 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, -> game.GuiService\RemoveCenterDialog backpack backpack.Visible = false backpackButton.Selected = false ) delay guiTweenSpeed, -> game.GuiService\RemoveCenterDialog backpack backpack.Visible = false backpackButton.Selected = false readyForNextEvent = true canToggle = true showBackpack = -> game.GuiService\AddCenterDialog(backpack, Enum.CenterDialogType.PlayerInitiatedDialog, -> backpack.Visible = true backpackButton.Selected = true -> backpack.Visible = false backpackButton.Selected = false ) 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, -> backpack.Tabs.Visible = false searchFrame.Visible = true backpackOpenEvent\Fire currentTab canToggle = true readyForNextEvent = true backpackButton.Image = "http://www.roblox.com/asset/?id=97644093" backpackButton.Position = UDim2.new 0.5, -60, 1, -backpackSize.Y.Offset - 103 toggleBackpack = -> return if not game.Players.LocalPlayer return if not game.Players.LocalPlayer["Character"] return if not canToggle return if not readyForNextEvent readyForNextEvent = false canToggle = false backpackIsOpen = not backpackIsOpen if backpackIsOpen with loadoutBackground .Image = "http://www.roblox.com/asset/?id=97623721" .Position = UDim2.new -0.03, 0, -0.17, 0 .Size = UDim2.new 1.05, 0, 1.25, 0 .ZIndex = 2.0 .Visible = true showBackpack! else backpackButton.Position = UDim2.new 0.5, -60, 1, -44 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.Position = UDim2.new -0.1, 0, -0.1, 0 loadoutBackground.Size = UDim2.new 1.2, 0, 1.2, 0 hideBackpack! clChildren = currentLoadout\GetChildren! for i = 1, #clChildren if clChildren[i] and clChildren[i]\IsA "Frame" frame = clChildren[i] if #frame\GetChildren! > 0 backpackButton.Position = UDim2.new 0.5, -60, 1, -108 backpackButton.Visible = true loadoutBackground.Visible = true if frame\GetChildren![1]\IsA "ImageButton" imgButton = frame\GetChildren![1] imgButton.Active = true imgButton.Draggable = false activateBackpack = -> initHumanoidDiedConnections! active = true backpack.Visible = backpackIsOpen if backpackIsOpen toggleBackpack! closeBackpack = -> if backpackIsOpen toggleBackpack! setSelected = (tab) -> assert tab with tab assert \IsA "TextButton" .BackgroundColor3 = Color3.new 1, 1, 1 .TextColor3 = Color3.new 0, 0, 0 .Selected = true .ZIndex = 3 setUnselected = (tab) -> assert tab with tab assert \IsA "TextButton" .BackgroundColor3 = Color3.new 0, 0, 0 .TextColor3 = Color3.new 1, 1, 1 .Selected = false .ZIndex = 1 updateTabGui = (selectedTab) -> assert selectedTab if selectedTab == "gear" setSelected inventoryButton setUnselected wardrobeButton elseif selectedTab == "wardrobe" setSelected wardrobeButton setUnselected inventoryButton mouseLeaveTab = (button) -> assert button assert button\IsA "TextButton" return if button.Selected button.BackgroundColor3 = Color3.new 0, 0, 0 mouseOverTab = (button) -> assert button assert button\IsA "TextButton" return if button.Selected button.BackgroundColor3 = Color3.new 39 / 255, 39 / 255, 39 / 255 newTabClicked = (tabName) -> assert tabName tabName = string.lower tabName currentTab = tabName updateTabGui tabName tabClickedEvent\Fire tabName resetSearch! trim = (s) -> s\gsub "^%s*(.-)%s*$", "%1" -- splitByWhitespace = (text) -> -- return if type(text) ~= "string" -- terms = {} -- for token in string.gmatch text, "[^%s]+" -- if string.len(token) > 0 -- table.insert terms, token -- terms doSearch = -> searchText = searchBox.Text if searchText == "" resetSearch! return searchText = trim searchText resetButton.Visible = true -- termTable = splitByWhitespace(searchText) searchRequestedEvent\Fire searchText -- todo: replace this with termtable when table passing is possible backpackReady = -> readyForNextEvent = true coreGuiChanged = (coreGuiType, enabled) -> if coreGuiType == Enum.CoreGuiType.Backpack or coreGuiType == Enum.CoreGuiType.All active = enabled disabledByDeveloper = not enabled with game\GetService "GuiService" if disabledByDeveloper try \RemoveKey tilde \RemoveKey backquote else \AddKey tilde \AddKey backquote resetSearch! searchFrame.Visible = enabled and backpackIsOpen currentLoadout.Visible = enabled backpack.Visible = enabled backpackButton.Visible = enabled --------------------------- End Internal Functions ------------------------------------- ------------------------------ Public Functions Setup ------------------------------------- createPublicFunction "CloseBackpack", hideBackpack createPublicFunction "BackpackReady", backpackReady ------------------------------ End Public Functions Setup --------------------------------- ------------------------ Connections/Script Main ------------------------------------------- try coreGuiChanged Enum.CoreGuiType.Backpack, Game.StarterGui\GetCoreGuiEnabled Enum.CoreGuiType.Backpack Game.StarterGui.CoreGuiChangedSignal\connect coreGuiChanged with inventoryButton .MouseButton1Click\connect -> newTabClicked "gear" .MouseEnter\connect -> mouseOverTab inventoryButton .MouseLeave\connect -> mouseLeaveTab inventoryButton if game.CoreGui.Version >= 8 with wardrobeButton .MouseButton1Click\connect -> newTabClicked "wardrobe" .MouseEnter\connect -> mouseOverTab wardrobeButton .MouseLeave\connect -> mouseLeaveTab wardrobeButton closeButton.MouseButton1Click\connect closeBackpack screen.Changed\connect (prop) -> if prop == "AbsoluteSize" resizeEvent\Fire screen.AbsoluteSize -- GuiService key setup with game\GetService "GuiService" \AddKey tilde \AddKey backquote .KeyPressed\connect (key) -> return if not active or disabledByDeveloper if key == tilde or key == backquote toggleBackpack! backpackButton.MouseButton1Click\connect -> return if not active or disabledByDeveloper toggleBackpack! if game.Players.LocalPlayer["Character"] activateBackpack! game.Players.LocalPlayer.CharacterAdded\connect activateBackpack -- search functions searchBox.FocusLost\connect (enterPressed) -> if enterPressed or searchBox.Text ~= "" doSearch! elseif searchBox.Text == "" resetSearch! searchButton.MouseButton1Click\connect doSearch resetButton.MouseButton1Click\connect resetSearch if searchFrame and robloxGui.AbsoluteSize.Y <= 320 searchFrame.RobloxLocked = false searchFrame\Destroy!