local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local player = Players.LocalPlayer local mouse = player:GetMouse() -- 💡 Auto-create BuildPart if it doesn't exist local buildPart = ReplicatedStorage:FindFirstChild("BuildPart") if not buildPart then buildPart = Instance.new("Part") buildPart.Name = "BuildPart" buildPart.Size = Vector3.new(4,1,4) buildPart.Anchored = true buildPart.Material = Enum.Material.SmoothPlastic buildPart.TopSurface = Enum.SurfaceType.Smooth buildPart.BottomSurface = Enum.SurfaceType.Smooth buildPart.BrickColor = BrickColor.Blue() buildPart.CanCollide = true buildPart.Parent = ReplicatedStorage end -- 🧰 Build Tool setup local equipped = false local tool = Instance.new("Tool") tool.Name = "Build Tool" tool.RequiresHandle = false tool.Parent = player:WaitForChild("Backpack") -- Settings local gridSize = 4 local currentColor = BrickColor.Blue() local colorOptions = { BrickColor.Blue(), BrickColor.Red(), BrickColor.Green(), BrickColor.Yellow(), BrickColor.White(), BrickColor.Black() } local colorIndex = 1 -- State local placing = true local selected local selectionBox local waitingToMove = false -- UI setup (GUI hidden at first) local gui = Instance.new("ScreenGui", player:WaitForChild("PlayerGui")) gui.Name = "BuildGui" gui.Enabled = false local function makeBtn(name, text, y) local btn = Instance.new("TextButton") btn.Name = name btn.Size = UDim2.new(0, 160, 0, 30) btn.Position = UDim2.new(0, 10, 0, y) btn.Text = text btn.BackgroundColor3 = Color3.fromRGB(50, 50, 200) btn.TextColor3 = Color3.new(1,1,1) btn.Font = Enum.Font.SourceSansBold btn.TextSize = 20 btn.Parent = gui return btn end local modeBtn = makeBtn("Mode", "Mode: Place", 10) local colorBtn = makeBtn("Color", "Color: Blue", 50) local moveBtn = makeBtn("Move", "Move", 90) local resizeBtn = makeBtn("Resize", "Resize +", 130) local deleteBtn = makeBtn("Delete", "Delete", 170) -- Tool equip / unequip logic tool.Equipped:Connect(function() equipped = true gui.Enabled = true end) tool.Unequipped:Connect(function() equipped = false gui.Enabled = false clearSelection() waitingToMove = false end) -- Helpers local function snap(pos) return Vector3.new( math.floor(pos.X / gridSize + 0.5) * gridSize, math.floor(pos.Y / gridSize + 0.5) * gridSize, math.floor(pos.Z / gridSize + 0.5) * gridSize ) end local function placePart(pos) local clone = buildPart:Clone() local p = snap(pos) clone.Position = Vector3.new(p.X, p.Y + clone.Size.Y/2, p.Z) clone.BrickColor = currentColor clone.Parent = workspace end local function selectPart(part) if selectionBox then selectionBox:Destroy() end selected = part selectionBox = Instance.new("SelectionBox") selectionBox.Adornee = part selectionBox.Color3 = Color3.new(1,1,0) selectionBox.Parent = part end local function clearSelection() if selectionBox then selectionBox:Destroy() end selected = nil end -- Mouse input mouse.Button1Down:Connect(function() if not equipped then return end local pos = mouse.Hit.Position local target = mouse.Target if waitingToMove and selected then selected.Position = Vector3.new(snap(pos).X, snap(pos).Y + selected.Size.Y/2, snap(pos).Z) waitingToMove = false return end if placing then if target then local topY = target.Position.Y + target.Size.Y / 2 local snapped = snap(Vector3.new(pos.X, topY, pos.Z)) placePart(Vector3.new(snapped.X, snapped.Y, snapped.Z)) else placePart(pos) end elseif target and target.Name == "BuildPart" then selectPart(target) end end) -- Button logic modeBtn.MouseButton1Click:Connect(function() placing = not placing modeBtn.Text = placing and "Mode: Place" or "Mode: Select" if placing then clearSelection() end end) colorBtn.MouseButton1Click:Connect(function() colorIndex += 1 if colorIndex > #colorOptions then colorIndex = 1 end currentColor = colorOptions[colorIndex] colorBtn.Text = "Color: " .. tostring(currentColor) if selected then selected.BrickColor = currentColor end end) moveBtn.MouseButton1Click:Connect(function() if selected then waitingToMove = true end end) resizeBtn.MouseButton1Click:Connect(function() if selected then selected.Size += Vector3.new(1,1,1) selected.Position += Vector3.new(0,0.5,0) end end) deleteBtn.MouseButton1Click:Connect(function() if selected then selected:Destroy() clearSelection() end end)