I'm creating a tool to place blocks. I started by creating a preview of the block. When I finished, I noticed that the preview was a bit buried, so I tried to fix it. But then when I made the changes, the block would fly towards the camera. How do I fix this problem, while making the preview entirely above ground?
------------------
--[DECLARATIONS]--
------------------
----/[SERVICES]\----
----/[MAIN]\----
local plr = game.Players
local tool = script.Parent
----/[VARIABLES]\----
local ghostBlock
----/[CONSTANTS]\----
local CELL_SIZE = 1
local CON_NAME = "[".. plr.Name .."/BuildTool/Local]"
----/[BLOCKS]\----
local woodBlock1 = {
Size = Vector3.new(4,1,4),
Color = BrickColor.new("CGA brown"),
Material = "WoodPlanks",
Transparency = 0,
Reflectance = 0,
}
--------------------
--[INITIALIZATION]--
--------------------
---------------
--[FUNCTIONS]--
---------------
--Snaps the position to the grid
function SnapPosToGrid(rawPos, size)
--Gets the raw position and snaps it to the grid defined by the cell size
local snappedPos = CFrame.new( rawPos.X - rawPos.X % CELL_SIZE,
(rawPos.Y - rawPos.Y % CELL_SIZE) + size.Y/2,
rawPos.Z - rawPos.Z % CELL_SIZE)
--Return the position
return snappedPos
end
--Create ghost
function CreateGhostBlock(block)
--Create part and customize it
local ghost = Instance.new("Part",workspace)
ghost.Size = block.Size
ghost.BrickColor = block.Color
ghost.Material = block.Material
ghost.Transparency = .5
ghost.Anchored = true
ghost.CanCollide = false
ghost.Locked = true
ghost.Name = "Ghost"
--Return the created part
return ghost
end
--The mouse has moved, create a ghost block
function MouseMoved(mouse)
--If the target of the mouse is not permited, don't do anything
--if mouse.Target.Name == "Ghost" then return end
--Get the position of the mouse and snap it to the grid
local mouseHit = mouse.Hit.p
local gridCFrame = SnapPosToGrid(mouseHit,woodBlock1.Size)
--Create a ghost part if it doesn't exist and change the position of it
if not ghostBlock then
ghostBlock = CreateGhostBlock(woodBlock1)
end
ghostBlock.CFrame = gridCFrame
end
------------------
--[SCRIPT LOGIC]--
------------------
--The tool has been equipped
tool.Equipped:Connect(function(mouse)
--Mouse has not been found for some reason
if not mouse then warn(CON_NAME..": Mouse has not been found!") return end
local mouseMoved = mouse.Move:Connect(function() MouseMoved(mouse) end)
--Tool has been unequipped
tool.Unequipped:Connect(function()
--Disconnect Events
if mouseMoved then mouseMoved:Disconnect() end
end)
end)
