Run it
Copy the script and paste it into your executor.
Players = :()
RunService = :()
UserInputService = :()
TweenService = :()
ContextActionService = :()
LocalPlayer = Players.LocalPlayer
Camera = .CurrentCamera
Mouse = LocalPlayer:()
(className, props)
obj = .(className)
k,v (props {}) obj[k] = v
obj
(h) .(h%, , )
(n, a, b) (n < a a) (n > b b) n
(v, snap) .((v + (snap * )) / snap) * snap
(v, snap) .((v.X, snap), (v.Y, snap), (v.Z, snap))
clientFolderName = .. LocalPlayer.Name
clientFolder = :(clientFolderName) (, {Name = clientFolderName, Parent = })
gui = (, {Parent = LocalPlayer:(), Name = , ResetOnSpawn = })
gui.IgnoreGuiInset =
frame = (, {
Parent = gui,
AnchorPoint = .(, ),
Position = .(, -, , ),
Size = .(, , , ),
BackgroundColor3 = .(,,),
BorderSizePixel =
})
(, {Parent = frame, CornerRadius = .(, )})
stroke = (, {Parent = frame, Color = .(,,), Thickness = })
tabCol = (, {Parent = frame, Size = .(, , , ), BackgroundTransparency = })
(, {Parent = tabCol, Padding = .(, ), FillDirection = .FillDirection.Vertical})
content = (, {Parent = frame, Position = .(, , , ), Size = .(, -, , -), BackgroundTransparency = })
scroll = (, {Parent = content, Size = .(, , , ), CanvasSize = .(,), ScrollBarThickness = , BackgroundTransparency = })
listLayout = (, {Parent = scroll, Padding = .(,)})
()
_,c (scroll:())
c:() c:() c:()
c:()
(text)
lbl = (, {
Parent = scroll,
Size = .(, -, , ),
BackgroundTransparency = ,
Text = text,
TextColor3 = .(,,),
Font = .Font.GothamBold,
TextSize = ,
TextXAlignment = .TextXAlignment.Left
})
lbl
(text, callback)
b = (, {
Parent = scroll,
Size = .(, -, , ),
BackgroundColor3 = .(,,),
Text = text,
TextColor3 = .(,,),
Font = .Font.Gotham,
TextSize = ,
AutoButtonColor =
})
(, {Parent = b, CornerRadius = .(,)})
b.MouseButton1Click:(() (callback) )
b
state = {
mode = ,
ghostSize = .(,,),
ghostColor = .(,,),
snap = ,
rotSnap = ,
scaleSnap = ,
collision =
}
ghost = (, {
Name = ,
Anchored = ,
CanCollide = ,
Transparency = ,
Color = state.ghostColor,
Material = .Material.SmoothPlastic,
Size = state.ghostSize,
Parent =
})
ghostBox = (, {Parent = ghost, Adornee = ghost, LineThickness = , = .(,,)})
hue =
RunService.RenderStepped:((dt)
hue = (hue + dt * ) %
ghostBox.Color3 = (hue)
stroke.Color = ((hue + ) % )
)
rayParams = RaycastParams.()
rayParams.FilterType = .RaycastFilterType.Exclude
()
ignore = {ghost}
char = LocalPlayer.Character
char .(ignore, char)
ignore
lastNormal = .(,,)
()
rayParams.FilterDescendantsInstances = ()
origin = Camera.CFrame.Position
dir = (Mouse.Hit.Position - origin)
dir.Magnitude == dir = Camera.CFrame.LookVector *
result = :(origin, dir.Unit * , rayParams)
result
result.Position, result.Normal, result.Instance
Mouse.Hit.Position, .(,,),
()
pos, normal, hitInstance = ()
lastNormal = normal .(,,)
snapped = (pos, state.snap)
offset = lastNormal.Unit * (state.ghostSize.Y / )
hitInstance hitInstance:()
ghost.CFrame = .(snapped + offset, snapped + offset + Camera.CFrame.LookVector)
ghost.CFrame = .(snapped + offset, snapped + offset + Camera.CFrame.LookVector)
RunService.RenderStepped:(()
state.mode ==
()
)
()
block = .()
block.Size = state.ghostSize
block.Material = .Material.SmoothPlastic
block.Color = state.ghostColor
block.Anchored =
block.CanCollide = state.collision
block.Name =
block.Parent = clientFolder
block.CFrame = ghost.CFrame
sel = .()
sel.Adornee = block
sel.LineThickness =
sel.Color3 = .(,,)
sel.Parent = block
block
()
char = LocalPlayer.Character
char
hrp = char:() char:() char:()
hrp
block = .()
block.Size = .(, , )
block.Material = .Material.SmoothPlastic
block.Color = .(,,)
block.Anchored =
block.CanCollide =
block.Name =
block.Parent = clientFolder
feetY = hrp.Position.Y - (hrp.Size.Y / )
halfY = block.Size.Y /
pos = .(hrp.Position.X, feetY - halfY - , hrp.Position.Z)
block.CFrame = .(pos)
sel = .()
sel.Adornee = block
sel.LineThickness =
sel.Color3 = .(,,)
sel.Parent = block
block
selectedBlock =
()
rayParams.FilterDescendantsInstances = ()
origin = Camera.CFrame.Position
dir = (Mouse.Hit.Position - origin)
dir.Magnitude == dir = Camera.CFrame.LookVector *
result = :(origin, dir.Unit * , rayParams)
result
closest, dist = , .huge
_,p (clientFolder:())
p:()
d = (p.Position - result.Position).Magnitude
d < dist closest = p dist = d
selectedBlock = closest
selectedBlock
selectedBlock =
(delta)
selectedBlock
newPos = selectedBlock.Position + delta
newPos = (newPos, state.snap)
selectedBlock.CFrame = .(newPos, newPos + selectedBlock.CFrame.LookVector)
(axis, deg)
selectedBlock
inc = .((deg, state.rotSnap))
axis ==
selectedBlock.CFrame = selectedBlock.CFrame * .(inc, , )
axis ==
selectedBlock.CFrame = selectedBlock.CFrame * .(, inc, )
axis ==
selectedBlock.CFrame = selectedBlock.CFrame * .(, , inc)
(delta)
selectedBlock
newSize = selectedBlock.Size + delta
newSize = .(
((newSize.X, state.scaleSnap), , ),
((newSize.Y, state.scaleSnap), , ),
((newSize.Z, state.scaleSnap), , )
)
selectedBlock.Size = newSize
()
selectedBlock
selectedBlock:()
selectedBlock =
layerOffset =
()
state.mode ==
cf = ghost.CFrame
ghost.CFrame = cf + lastNormal.Unit * layerOffset
(actionName, inputState, inputObject)
inputState ~= .UserInputState.Begin
state.mode ==
()
state.mode ==
()
ContextActionService:(, onPlaceOrSelect, , .UserInputType.MouseButton1)
UserInputService.InputBegan:((input, gameProcessed)
gameProcessed
state.mode ==
input.KeyCode == .KeyCode.Q
layerOffset = layerOffset - state.snap
()
input.KeyCode == .KeyCode.E
layerOffset = layerOffset + state.snap
()
input.KeyCode == .KeyCode.R
ghost.CFrame = ghost.CFrame * .(, .(state.rotSnap), )
input.KeyCode == .KeyCode.T
ghost.CFrame = ghost.CFrame * .(, -.(state.rotSnap), )
input.KeyCode == .KeyCode.F
state.collision = state.collision
state.mode ==
step = state.snap
input.KeyCode == .KeyCode.W (Camera.CFrame.LookVector * step)
input.KeyCode == .KeyCode.S (-Camera.CFrame.LookVector * step)
input.KeyCode == .KeyCode.A (-Camera.CFrame.RightVector * step)
input.KeyCode == .KeyCode.D (Camera.CFrame.RightVector * step)
input.KeyCode == .KeyCode.PageUp (.(, step, ))
input.KeyCode == .KeyCode.PageDown (.(, -step, ))
input.KeyCode == .KeyCode.Z (, state.rotSnap)
input.KeyCode == .KeyCode.X (, state.rotSnap)
input.KeyCode == .KeyCode.C (, state.rotSnap)
input.KeyCode == .KeyCode.Equals input.KeyCode == .KeyCode.Plus (.(state.scaleSnap, state.scaleSnap, state.scaleSnap))
input.KeyCode == .KeyCode.Minus (.(-state.scaleSnap, -state.scaleSnap, -state.scaleSnap))
input.KeyCode == .KeyCode.Delete input.KeyCode == .KeyCode.Backspace ()
)
tabButtons = {}
(name)
tb = (, {
Parent = tabCol,
Size = .(, , , ),
BackgroundColor3 = .(,,),
Text = name,
TextColor3 = .(,,),
Font = .Font.Gotham,
TextSize =
})
(, {Parent = tb, CornerRadius = .(,)})
tabButtons[name] = tb
tb
(name)
k,v (tabButtons)
v.BackgroundColor3 = (k == name) .(,,) .(,,)
()
name ==
state.mode =
()
()
()
( .. .(, state.ghostSize.X, state.ghostSize.Y, state.ghostSize.Z))
(, () () )
(, () () )
(, ()
sizes = {.(,,), .(,,), .(,,)}
idx =
i,s (sizes) s == state.ghostSize idx = i
idx = (idx % #sizes) +
state.ghostSize = sizes[idx]
ghost.Size = state.ghostSize
)
(, () state.collision = state.collision )
(, () ghost.CFrame = ghost.CFrame * .(.(state.rotSnap), , ) )
(, () ghost.CFrame = ghost.CFrame * .(.(-state.rotSnap), , ) )
name ==
state.mode =
()
()
()
()
(, () () )
(, () (.(state.snap,,)) )
(, () (.(-state.snap,,)) )
(, () (.(,state.snap,)) )
(, () (.(,-state.snap,)) )
(, () (.(,,state.snap)) )
(, () (.(,,-state.snap)) )
(..state.rotSnap.., () (, state.rotSnap) )
(..state.rotSnap.., () (, -state.rotSnap) )
(, () (.(state.scaleSnap, state.scaleSnap, state.scaleSnap)) )
(, () (.(-state.scaleSnap, -state.scaleSnap, -state.scaleSnap)) )
(, () () )
name ==
()
(, () state.snap = (state.snap + , , ) )
(, () state.snap = (state.snap - , , ) )
(, () state.rotSnap = (state.rotSnap + , , ) )
(, () state.rotSnap = (state.rotSnap - , , ) )
(, () state.scaleSnap = (state.scaleSnap + , , ) )
(, () state.scaleSnap = (state.scaleSnap - , , ) )
(, ()
_,p (clientFolder:()) p:() p:()
selectedBlock =
)
(, () frame.Visible = frame.Visible )
RunService.Heartbeat:()
listLayout.AbsoluteContentSize
scroll.CanvasSize = .(,,, listLayout.AbsoluteContentSize.Y + )
buildTab = ()
editTab = ()
settingsTab = ()
buildTab.MouseButton1Click:(() () )
editTab.MouseButton1Click:(() () )
settingsTab.MouseButton1Click:(() () )
()
RunService.RenderStepped:(()
ghost.Transparency = (state.mode == )
ghost.CanCollide =
)
()
Building.

Universal