syntaxwebsite/app/files/CoreGui/36051740

707 lines
22 KiB
Plaintext

--[[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