So I've decided to try and make a minecraft-like building tool, and I've gotten pretty far. It snaps to a 4x4 grid, and for the most part, it works. But only in two directions. In two directions (South and East) it works just fine, and moves to the side of the part I'm building on. But in the other two directions (North and West) it moves inside the part I'm building on. Similarly, it works just fine if my mouse is on the top of a part, but it moves inside of the part if my mouse is on the bottom of it. I'm not sure exactly why this is happening and I'd really like it if someone could help me. Here's the script. Don't mind the PlaceBlock event firing, that just places the part where the fakepart is.

local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
local fakepart

function roundAToB(a,b)
	return(math.floor((a/b)+0.5)*b)
end

script.Parent.Equipped:Connect(function()
	fakepart = game.ReplicatedStorage.PlacedPart:Clone()
	fakepart.Parent = game.Workspace
	fakepart.Transparency = 0.6
	fakepart.CanCollide = false
	local noselecttag = Instance.new("BoolValue", fakepart)
	noselecttag.Name = "NoSelect"
	mouse.TargetFilter = fakepart
end)

script.Parent.Unequipped:Connect(function()
	if fakepart then
		fakepart:Destroy()
	end
end)

script.Parent.Activated:Connect(function()
	if fakepart then
		script.Parent.PlaceBlock:FireServer(fakepart.CFrame)
	end
end)

game:GetService("RunService").RenderStepped:Connect(function()
	if fakepart then
		local hit = mouse.Hit
		fakepart.Position = Vector3.new(math.floor(roundAToB(hit.p.x, 4)), math.floor(roundAToB(hit.p.y, 4)), math.floor(roundAToB(hit.p.z, 4)))
	end
end)