--[[if game.Players.LocalPlayer.Name == "Player" then return end]] -- Script Globals local buildDeleteID = 36738185 local buildStamperID = 87198196 local buildGroupDraggerID = 36334760 local buildConfigID = 87240571 local buildRotateID = 0 local buildTools = {} local player = nil local backpack = nil -- Functions local function waitForProperty(instance, name) while not instance[name] do instance.Changed:wait() end end local function waitForChild(instance, name) while not instance:FindFirstChild(name) do instance.ChildAdded:wait() end end function getLatestPlayer() waitForProperty(game.Players,"LocalPlayer") player = game.Players.LocalPlayer waitForChild(player,"Backpack") backpack = player.Backpack end function backpackHasTool(tool) local backpackChildren = backpack:GetChildren() for i = 1, #backpackChildren do if backpackChildren[i] == tool then return true end end return false end function getToolAssetID(assetID,toolName) local newTool = game:GetService("InsertService"):LoadAsset(assetID) newTool = newTool:FindFirstChild(toolName) return newTool end function giveAssetId(assetID,toolName) local theTool = getToolAssetID(assetID,toolName) if theTool and not backpackHasTool(theTool) then theTool.Parent = backpack table.insert(buildTools,theTool) end end function givePlayerBuildTools() getLatestPlayer() giveAssetId(buildStamperID,"StamperTool") giveAssetId(buildDeleteID,"BuildDelete") giveAssetId(buildGroupDraggerID,"BuildGroupDragger") giveAssetId(buildRotateID,"BuildRotate") giveAssetId(buildConfigID,"BuildConfiguration") end function takePlayerBuildTools() for k,v in ipairs(buildTools) do v.Parent = nil end buildTools = {} end print("start script") -- Start Script if game.CoreGui.RobloxGui.ControlFrame.BottomLeftControl:FindFirstChild("ToolButton") then -- we are still using old build tools (TODO: remove this when new tools are good enough) print("old tools") local localAssetBase = "rbxasset://textures/ui/" local control = script.Parent:FindFirstChild("ControlFrame") local bottomLeftControls local buildTools if control then bottomLeftControls = control.BottomLeftControl buildTools = control.BuildTools else bottomLeftControls = script.Parent.BottomLeftControl buildTools = script.Parent.BuildTools end buildToolsVisible = false -- used right now to push build tools down a bit (should change in client) buildTools.Frame.Position = UDim2.new(-0.15,0,0.3,0) bottomLeftControls.ToolButton.Image = localAssetBase .. "ToolButton.png" local prevObject = nil local tryCount = 0 local location = 0 local name local buttons = {} local value local player local backpack local resetCon local equippedTool local selectedButton -- the build tools local buildResize local buildClone local buildInsert local buildDragger local buildColor local buildGroupDragger local buildSurface local buildMaterial local buildConfiguration local buildDelete -- the build tools asset ids local buildResizeID = 36738142 local buildCloneID = 36017373 local buildInsertID = 36431591 local buildDraggerID = 36068233 local buildColorID = 35205409 local buildGroupDraggerID = 36334760 local buildSurfaceID = 35226945 local buildMaterialID = 35223828 local buildConfigurationID = 36270159 local buildDeleteID = 36738185 function waitForProperty(instance, name) while not instance[name] do instance.Changed:wait() end end function waitForChild(instance, name) while not instance:FindFirstChild(name) do instance.ChildAdded:wait() end end function setPlayerAndBackpack() waitForProperty(game.Players,"LocalPlayer") player = game.Players.LocalPlayer backpack = player.Backpack end setPlayerAndBackpack() function playerReset() loadTools() local prevObject = nil local equippedTool = nil setPlayerAndBackpack() resetCon:disconnect() resetCon = game.Players.LocalPlayer.CharacterAdded:connect(playerReset) end resetCon = game.Players.LocalPlayer.CharacterAdded:connect(playerReset) function giveSelectedValue(tool) if tool:FindFirstChild("SelectedButton") == nil then local selected = Instance.new("ObjectValue") selected.Name = "SelectedButton" selected.RobloxLocked = true if tool.Name == "BuildConfiguration" then selected.Value = buildTools.Frame.MiscTools.PropertyTool elseif tool.Name == "BuildInsert" then selected.Value = buildTools.Frame end selected.Parent = tool end end function loadTools() -- load in all tools to decrease issues with loading, also don't have to keep reloading assets buildResize = game:GetService("InsertService"):LoadAsset(buildResizeID) buildResize = buildResize:FindFirstChild("BuildResize") giveSelectedValue(buildResize) buildResize.Parent = backpack buildClone = game:GetService("InsertService"):LoadAsset(buildCloneID) buildClone = buildClone:FindFirstChild("BuildClone") giveSelectedValue(buildClone) buildClone.Parent = backpack buildInsert = game:GetService("InsertService"):LoadAsset(buildInsertID) buildInsert = buildInsert:FindFirstChild("BuildInsert") giveSelectedValue(buildInsert) buildInsert.Parent = backpack buildDragger = game:GetService("InsertService"):LoadAsset(buildDraggerID) buildDragger = buildDragger:FindFirstChild("BuildDragger") giveSelectedValue(buildDragger) buildDragger.Parent = backpack buildColor = game:GetService("InsertService"):LoadAsset(buildColorID) buildColor = buildColor:FindFirstChild("BuildColorTester") giveSelectedValue(buildColor) buildColor.Parent = backpack buildGroupDragger = game:GetService("InsertService"):LoadAsset(buildGroupDraggerID) buildGroupDragger = buildGroupDragger:FindFirstChild("BuildGroupDragger") giveSelectedValue(buildGroupDragger) buildGroupDragger.Parent = backpack buildSurface = game:GetService("InsertService"):LoadAsset(buildSurfaceID) buildSurface = buildSurface:FindFirstChild("BuildSurfaceTest") giveSelectedValue(buildSurface) buildSurface.Parent = backpack buildMaterial = game:GetService("InsertService"):LoadAsset(buildMaterialID) buildMaterial = buildMaterial:FindFirstChild("BuildMaterialTest") giveSelectedValue(buildMaterial) buildMaterial.Parent = backpack buildConfiguration = game:GetService("InsertService"):LoadAsset(buildConfigurationID) buildConfiguration = buildConfiguration:FindFirstChild("BuildConfiguration") giveSelectedValue(buildConfiguration) buildConfiguration.Parent = backpack buildDelete = game:GetService("InsertService"):LoadAsset(buildDeleteID) buildDelete = buildDelete:FindFirstChild("BuildDelete") giveSelectedValue(buildDelete) buildDelete.Parent = backpack end loadTools() waitForChild(buildTools,"SelectedButton") buildTools.SelectedButton.Changed:connect(function(property) if value == buildTools.SelectedButton.Value then return end value = buildTools.SelectedButton.Value selectedButton = buildTools.SelectedButton.Value if equippedTool then equippedTool.SelectedButton.Value = selectedButton end end) local frames = buildTools.Frame:GetChildren() for i = 1, #frames do if frames[i]:IsA("Frame") and frames[i].Name ~= "Divs" then local buttonSubSet = frames[i]:GetChildren() for j = 1, #buttonSubSet do table.insert(buttons,buttonSubSet[j]) end end end function unEquipAnyItems() playerItems = player.Character:GetChildren() for i = 1, #playerItems do if playerItems[i]:isA("Tool") or playerItems[i]:isA("HopperBin") then playerItems[i].Parent = backpack return end end end unEquipAnyItems() --------------------- Build Bar Tool Tip Code ----------------------------- function setUpText(toolTip) local name = toolTip.Parent.Name if name == "CloneObject" then toolTip.Text = "Copy Part" elseif name == "DeleteObject" then toolTip.Text = "Delete Part" elseif name == "InsertObject" then toolTip.Text = "Insert Part" elseif name == "PropertyTool" then toolTip.Text = "Edit Part" elseif name == "GroupMove" then toolTip.Text = "Move Models and Parts" elseif name == "PartMove" then toolTip.Text = "Move Parts" elseif name == "ScaleObject" then toolTip.Text = "Resize a part" elseif name == "InputSelector" then toolTip.Text = "Change Surface" elseif name == "MaterialSelector" then toolTip.Text = "Change Material" elseif name == "PaintTool" then toolTip.Text = "Change Color" end end local fadeSpeed = 0.1 function buildToolsTips() local frame = Instance.new("TextLabel") frame.Name = "ToolTip" frame.Text = "Hi! I'm a ToolTip!" frame.ZIndex = 10 frame.Size = UDim2.new(2,0,1,0) frame.Position = UDim2.new(1,0,0,0) frame.BackgroundColor3 = Color3.new(1,1,153/255) frame.BackgroundTransparency = 1 frame.TextTransparency = 1 frame.TextWrap = true for i = 1, #buttons do local tip = frame:Clone() tip.RobloxLocked = true tip.Parent = buttons[i] setUpText(tip) local inside = Instance.new("BoolValue") inside.Value = false inside.RobloxLocked = true tip.Parent.MouseEnter:connect(function() inside.Value = true wait(1.2) if inside.Value then while inside.Value and tip.BackgroundTransparency > 0 do tip.BackgroundTransparency = tip.BackgroundTransparency - fadeSpeed tip.TextTransparency = tip.TextTransparency - fadeSpeed wait() end end end) tip.Parent.MouseLeave:connect(function() inside.Value = false tip.BackgroundTransparency = 1 tip.TextTransparency = 1 end) tip.Parent.MouseButton1Click:connect(function() inside.Value = false tip.BackgroundTransparency = 1 tip.TextTransparency = 1 end) end end --------------------- End Build Bar Tool Tip Code -------------------------- ----------------------------- Reset Button Code ---------------------------- function reset(subset) local buttons = subset:GetChildren() if subset.Name == "AddDeleteTools" then for i = 1, #buttons do buttons[i].Selected = false if buttons[i].Name == "CloneObject" then buttons[i].Image = localAssetBase .. "CloneButton.png" elseif buttons[i].Name == "DeleteObject" then buttons[i].Image = localAssetBase .. "DeleteButton.png" elseif buttons[i].Name == "InsertObject" then buttons[i].Image = localAssetBase .. "InsertButton.png" end end elseif subset.Name == "MiscTools" then for i = 1, #buttons do buttons[i].Selected = false if buttons[i].Name == "PropertyTool" then buttons[i].Image = localAssetBase .. "PropertyButton.png" end end elseif subset.Name == "PhysicalTools" then for i = 1, #buttons do buttons[i].Selected = false if buttons[i].Name == "GroupMove" then buttons[i].Image = localAssetBase .. "GroupMoveButton.png" elseif buttons[i].Name == "PartMove" then buttons[i].Image = localAssetBase .."PartMoveButton.png" elseif buttons[i].Name == "ScaleObject" then buttons[i].Image = localAssetBase .. "ScaleButton.png" end end elseif subset.Name == "PropertyTools" then for i = 1, #buttons do buttons[i].Selected = false if buttons[i].Name == "InputSelector" then buttons[i].Image = localAssetBase .. "SurfaceButton.png" elseif buttons[i].Name == "MaterialSelector" then buttons[i].Image = localAssetBase .. "MaterialButton.png" elseif buttons[i].Name == "PaintTool" then buttons[i].Image = localAssetBase .. "PaintButton.png" end end end end function resetAllButtons() local categories = buildTools.Frame:GetChildren() for i = 1, #categories do reset(categories[i]) end end ----------------------------- End Reset Button Code ------------------------- resetAllButtons() -- sets button to active image function setButtonStateActive(Object, Name) if Name == "BuildInsert" then Object.Image = localAssetBase .. "InsertButton_dn.png" Object.Selected = true elseif Name == "BuildDelete" then Object.Image = localAssetBase .. "DeleteButton_dn.png" Object.Selected = true elseif Name == "BuildClone" then Object.Image = localAssetBase .. "CloneButton_dn.png" Object.Selected = true elseif Name == "BuildConfiguration" then Object.Image = localAssetBase .. "PropertyButton_dn.png" Object.Selected = true elseif Name == "BuildDragger" then Object.Image = localAssetBase .. "PartMoveButton_dn.png" Object.Selected = true elseif Name == "BuildGroupDragger" then Object.Image = localAssetBase .. "GroupMoveButton_dn.png" Object.Selected = true elseif Name == "BuildResize" then Object.Image = localAssetBase .. "ScaleButton_dn.png" Object.Selected = true elseif Name == "BuildSurfaceTest" then Object.Image = localAssetBase .. "SurfaceButton_dn.png" Object.Selected = true elseif Name == "BuildMaterialTest" then Object.Image = localAssetBase .. "MaterialButton_dn.png" Object.Selected = true elseif Name == "BuildColorTester" then Object.Image = localAssetBase .. "PaintButton_dn.png" Object.Selected = true end end function removeTool(tool, Object) playerItems = player.Characer:GetChildren() for i = 1, #playerItems do if playerItems[i].Name == tool and playerItems[i]:isA("Tool") then playerItems[i].Parent = backpack playerItems[i]:remove() return end end backpackStuff = backpack:GetChildren() for i = 1, #backpackStuff do if backpackStuff[i].Name == tool then backpackStuff[i].Parent = nil backpackStuff[i]:remove() return end end end function getTool(tool) playerItems = player.Character:GetChildren() for i = 1, #playerItems do if playerItems[i].Name == tool then if playerItems[i]:isA("Tool") then return playerItems[i], true end end end backpackStuff = backpack:GetChildren() for i = 1, #backpackStuff do if backpackStuff[i].Name == tool then return backpackStuff[i], false end end end function toolDeselection(Name,Object,id) local hasTool, equipped = getTool(Name) if equipped then resetAllButtons() unEquipAnyItems() hasTool.Parent = nil hasTool:remove() if equippedTool then equippedTool.Parent = nil equippedTool:remove() equippedTool = nil end end end -- Used to find allocated tool that we got at beginning of script function getToolLocal(Name) if Name == "BuildInsert" then return buildInsert elseif Name == "BuildDelete" then return buildDelete elseif Name == "BuildClone" then return buildClone elseif Name == "BuildConfiguration" then return buildConfiguration elseif Name == "BuildDragger" then return buildDragger elseif Name == "BuildGroupDragger" then return buildGroupDragger elseif Name == "BuildResize" then return buildResize elseif Name == "BuildSurfaceTest" then return buildSurface elseif Name == "BuildMaterialTest" then return buildMaterial elseif Name == "BuildColorTester" then return buildColor end end function assureTool(tool, id, Name) if tool == nil or type(tool) ~= "userdata" or tool:FindFirstChild("Handle") == nil then tool = game:GetService("InsertService"):LoadAsset(id) local instances = tool:GetChildren() if #instances == 0 then tool:Remove() return nil end tool = tool:FindFirstChild(Name) tool.Parent = backpack end end -- general function to get tool when button is clicked function toolSelection(Name,Object,id) local tool = nil local hasTool, equipped = getTool(Name) if equipped then if hasTool:FindFirstChild("SelectedButton") == false then giveSelectedValue(hasTool) end resetAllButtons() unEquipAnyItems() hasTool.Parent = nil if equippedTool ~= nil then equippedTool.Parent = backpack end elseif hasTool then -- failsafe to make sure we load in tool, no matter what assureTool(hasTool,id, Name) if hasTool == nil then return nil end unEquipAnyItems() Object.Selected = true hasTool.Parent = player.Character equippedTool = hasTool hasTool.Unequipped:connect(function() resetAllButtons() end) setButtonStateActive(Object, Name) else -- first try to find tool we already loaded in tool = getToolLocal(Name) -- failsafe to make sure we load in tool, no matter what assureTool(tool,id, Name) if tool == nil then return nil end if tool then if tool:FindFirstChild("SelectedButton") == nil then local selected = Instance.new("ObjectValue") selected.Name = "SelectedButton" selected.RobloxLocked = true if Name == "BuildConfiguration" then selected.Value = buildTools.Frame.MiscTools.PropertyTool elseif Name == "BuildInsert" then selected.Value = buildTools.Frame end selected.Parent = tool end unEquipAnyItems() if equippedTool ~= nil then if prevObject then resetAllButtons() end equippedTool.Parent = backpack end equippedTool = tool equippedTool.Parent = player.Character Object.Selected = true equippedTool.Unequipped:connect(function() resetAllButtons() end) setButtonStateActive(Object, Name) end end prevObject = Object end -- used to animate the tool bar open/close local scrollSpeed = 0.01 function openCloseTools() buildToolsVisible = not buildToolsVisible if buildToolsVisible then bottomLeftControls.ToolButton.Image = localAssetBase .. "ToolButton_dn.png" buildTools.Frame.CloseButton.Image = localAssetBase .. "CloseButton.png" buildTools.Frame.Size = UDim2.new(0.15,0,0.57,0) buildTools.Frame.Position = UDim2.new(-0.1, 0,buildTools.Frame.Position.Y.Scale,0) while buildTools.Frame.Position.X.Scale < -0.01 and buildToolsVisible do buildTools.Frame.Position = UDim2.new(buildTools.Frame.Position.X.Scale + scrollSpeed, 0,buildTools.Frame.Position.Y.Scale,0) wait() end buildTools.Frame.Position = UDim2.new(0, 0,buildTools.Frame.Position.Y.Scale,0) else bottomLeftControls.ToolButton.Image = localAssetBase .. "ToolButton.png" while buildTools.Frame.AbsolutePosition.X + buildTools.Frame.AbsoluteSize.X > 0 and not buildToolsVisible do buildTools.Frame.Position = UDim2.new(buildTools.Frame.Position.X.Scale - scrollSpeed, 0,buildTools.Frame.Position.Y.Scale,0) wait() end buildTools.Frame.Size = UDim2.new(0,buildTools.Frame.AbsoluteSize.X,buildTools.Frame.Size.Y.Scale,buildTools.Frame.Size.Y.Offset) buildTools.Frame.Position = UDim2.new(0,-buildTools.Frame.AbsoluteSize.X,buildTools.Frame.Position.Y.Scale,buildTools.Frame.Position.Y.Offset) end end -- setup tool button listeners bottomLeftControls.ToolButton.MouseButton1Click:connect(openCloseTools) bottomLeftControls.ToolButton.MouseEnter:connect(function() if not buildToolsVisible then bottomLeftControls.ToolButton.Image = localAssetBase .. "ToolButton_dn.png" end end) bottomLeftControls.ToolButton.MouseLeave:connect(function() if not buildToolsVisible then bottomLeftControls.ToolButton.Image = localAssetBase .. "ToolButton.png" end end) -- close button on build tools buildTools.Frame.CloseButton.MouseButton1Click:connect(openCloseTools) buildTools.Frame.CloseButton.MouseEnter:connect(function() buildTools.Frame.CloseButton.Image = localAssetBase .. "CloseButton_dn.png" end) buildTools.Frame.CloseButton.MouseLeave:connect(function() buildTools.Frame.CloseButton.Image = localAssetBase .. "CloseButton.png" end) buildToolsTips() -- Add/Delete Tools buildTools.Frame.AddDeleteTools.DeleteObject.MouseButton1Click:connect(function() toolSelection("BuildDelete", buildTools.Frame.AddDeleteTools.DeleteObject,buildDeleteID) end) buildTools.Frame.AddDeleteTools.CloneObject.MouseButton1Click:connect(function() toolSelection("BuildClone",buildTools.Frame.AddDeleteTools.CloneObject,buildCloneID) end) buildTools.Frame.AddDeleteTools.InsertObject.MouseButton1Click:connect(function() toolSelection("BuildInsert",buildTools.Frame.AddDeleteTools.InsertObject,buildInsertID) if(buildTools.Frame:FindFirstChild("InsertToolboxMain")) then buildTools.Frame.InsertToolboxMain.InsertMainDialog.InsertTab.CloseButton.ClosedState.Changed:connect(function(value) if value == true then toolSelection("BuildInsert",buildTools.Frame.AddDeleteTools.InsertObject,buildInsertID) if(buildTools.Frame:FindFirstChild("InsertToolboxMain")) then buildTools.Frame.InsertToolboxMain.InsertMainDialog.InsertTab.CloseButton.ClosedState.Value = false end end end) end end) -- Physical Tools buildTools.Frame.PhysicalTools.ScaleObject.MouseButton1Click:connect(function() toolSelection("BuildResize",buildTools.Frame.PhysicalTools.ScaleObject, buildResizeID) end) --[[buildTools.Frame.PhysicalTools.PartMove.MouseButton1Click:connect(function() toolSelection("BuildDragger",buildTools.Frame.PhysicalTools.PartMove,buildDraggerID) end)]] buildTools.Frame.PhysicalTools.GroupMove.MouseButton1Click:connect(function() toolSelection("BuildGroupDragger",buildTools.Frame.PhysicalTools.GroupMove,buildGroupDraggerID) end) -- Property Tools buildTools.Frame.PropertyTools.MaterialSelector.MouseButton1Click:connect(function() toolSelection("BuildMaterialTest",buildTools.Frame.PropertyTools.MaterialSelector,buildMaterialID) end) buildTools.Frame.PropertyTools.MaterialSelector.MaterialMenu.CloseButton.ClosedState.Changed:connect(function(value) if value == true then toolSelection("BuildMaterialTest",buildTools.Frame.PropertyTools.MaterialSelector,buildMaterialID) buildTools.Frame.PropertyTools.MaterialSelector.MaterialMenu.CloseButton.ClosedState.Value = false end end) buildTools.Frame.PropertyTools.PaintTool.MouseButton1Click:connect(function() toolSelection("BuildColorTester",buildTools.Frame.PropertyTools.PaintTool, buildColorID) end) buildTools.Frame.PropertyTools.PaintTool.PaintMenu.CloseButton.ClosedState.Changed:connect(function(value) if value == true then toolSelection("BuildColorTester",buildTools.Frame.PropertyTools.PaintTool,buildColorID) buildTools.Frame.PropertyTools.PaintTool.PaintMenu.CloseButton.ClosedState.Value = false end end) buildTools.Frame.PropertyTools.InputSelector.MouseButton1Click:connect(function() toolSelection("BuildSurfaceTest",buildTools.Frame.PropertyTools.InputSelector, buildSurfaceID) end) buildTools.Frame.PropertyTools.InputSelector.SurfaceMenu.CloseButton.ClosedState.Changed:connect(function(value) if value == true then toolSelection("BuildSurfaceTest",buildTools.Frame.PropertyTools.InputSelector,buildSurfaceID) buildTools.Frame.PropertyTools.InputSelector.SurfaceMenu.CloseButton.ClosedState.Value = false end end) -- Misc Tools buildTools.Frame.MiscTools.PropertyTool.MouseButton1Click:connect(function() toolSelection("BuildConfiguration",buildTools.Frame.MiscTools.PropertyTool, buildConfigurationID) end) else -- we are using new build tools getLatestPlayer() givePlayerBuildTools() -- If player dies, we make sure to give them build tools again player.CharacterAdded:connect(function() takePlayerBuildTools() givePlayerBuildTools() end) end