local StarterGui = game:GetService("StarterGui") StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false) local frame = script.Parent frame.Visible = true local input = game:GetService("UserInputService") local player = game.Players.LocalPlayer local backpack = player.Backpack local stroke = script:WaitForChild("UIStroke") local currentTool = nil local tools = {} local frames = {} local function isToolRegistered(tool) return tools[tool] end local function getToolFrame(tool) return frames[tool] end local function stockTool(tool) tool.Parent = backpack stroke.Parent = script stroke.Transparency = 1 frames[tool].Deselected:Fire() end local index = 0 local function setTool(tool) if currentTool then stockTool(currentTool) end -- If there is already a tool equipped, dequip it if currentTool == tool then currentTool = nil return end -- If this tool is already equipped, remove it and stop if tonumber(tool.Name) then index = tonumber(tool.Name) end frames[tool].Selected:Fire() tool.Parent = player.Character -- Equip the new tool stroke.Parent = frames[tool] stroke.Transparency = 0.2 currentTool = tool end local nameToInteger = { ["One"] = 1, ["Two"] = 2, ["Three"] = 3, ["Four"] = 4, ["Five"] = 5, ["Six"] = 6, ["Seven"] = 7, ["Eight"] = 8, ["Nine"] = 9 } input.InputBegan:Connect(function(input,irrelevant) if not irrelevant then local tools = 0 for _,item in pairs(frame.ScrollingFrame:GetChildren()) do if item:FindFirstChild("ToolReference") then tools = tools + 1 end end local inputted = false if input.UserInputType == Enum.UserInputType.Keyboard then local number = nameToInteger[input.KeyCode.Name] if number then inputted = true index = number end elseif input.KeyCode == Enum.KeyCode.ButtonR1 then inputted = true index = index + 1 elseif input.KeyCode == Enum.KeyCode.ButtonL1 then inputted = true index = index - 1 end index = math.clamp(index,0,tools+1) if not inputted then return end local toolFrame = frame.ScrollingFrame:FindFirstChild(tostring(index)) if toolFrame then setTool(toolFrame.ToolReference.Value) else if currentTool then stockTool(currentTool) currentTool = nil end end end end) local function createToolFrame(tool) local toolFrame = frame.ScrollingFrame.Template.Tool:Clone() toolFrame.ToolReference.Value = tool local layout = tool:WaitForChild("LayoutOrderValue",1) if layout then layout = layout.Value else layout = #frames end toolFrame.LayoutOrder = layout frames[tool] = toolFrame tools[tool] = tool local clone = tool:Clone() for _,child in pairs(clone:GetChildren()) do if child:IsA("Script") then child:Destroy() end end toolFrame.Parent = frame.ScrollingFrame toolFrame.Visible = true toolFrame.Name = tostring(toolFrame.LayoutOrder) local viewport = toolFrame.ViewportFrame viewport.Name = clone.Name clone.Parent = viewport local camera = Instance.new("Camera") viewport.CurrentCamera = camera camera.Parent = viewport local label = toolFrame.TextLabel label.Text = tool.Name local cframe,size = clone:GetBoundingBox() local cameraRotation = 45 local distance = size.Magnitude local function rotateCamera() -- To constantly spin the tool view camera.CFrame = CFrame.new(cframe.Position) * CFrame.fromEulerAnglesYXZ(-0.3,math.rad(cameraRotation),0) camera.CFrame = camera.CFrame + camera.CFrame.LookVector * -(distance/1.2) end rotateCamera() -- To initialise the camera CFrame once local mouseInside = 0 -- Rotate camera while the mouse is inside the tool local mouseEnter = function(no_back) mouseInside = mouseInside + 1 if not no_back then toolFrame.BackgroundColor3 = Color3.new(0.75,0.75,0.75) end if mouseInside == 1 then while wait() and mouseInside > 0 do cameraRotation = cameraRotation + 1.5 * mouseInside rotateCamera() end end end local mouseLeave = function(no_back) mouseInside = mouseInside - 1 if not no_back then toolFrame.BackgroundColor3 = Color3.new(1,1,1) end end viewport.MouseEnter:Connect(mouseEnter) viewport.MouseLeave:Connect(mouseLeave) toolFrame.Selected.Event:Connect(mouseEnter) toolFrame.Deselected.Event:Connect(mouseLeave) return toolFrame end local function unregisterTool(tool) --print(tool:GetFullName()) if currentTool == tool then stroke.Parent = script currentTool = nil end if frames[tool] then frames[tool]:Destroy() end frames[tool] = nil tools[tool] = nil end local function registerTool(tool) if isToolRegistered(tool) then return end -- Don't register an existing tool tool.AncestryChanged:Connect(function(tool,parent) -- Event for when parent changes if not (parent == player.Character or parent == backpack) then -- If the tool is not a parent of the character or backpack, it is dropped unregisterTool(tool) end end) createToolFrame(tool) -- todo: save me frames[tool].InputEnded:Connect(function(inputObject) -- When the mouse button or touch is clicked (XBOX + VR CONTROL NEEDED) if inputObject.UserInputType == Enum.UserInputType.MouseButton1 or inputObject.UserInputType == Enum.UserInputType.Touch then setTool(tool) end end) --[[frames[tool].TouchTap:Connect(function() setTool(tool) end)]] end game.Players.LocalPlayer.ChildAdded:Connect(function(child) if currentTool then unregisterTool(currentTool) end if child:IsA("Backpack") then backpack = child end backpack.ChildAdded:Connect(registerTool) backpack.ChildRemoved:Connect(registerTool) end) for _,tool in pairs(backpack:GetChildren()) do registerTool(tool) end