I've read the description on the wiki of the Mouse.Hit Property and I understand it perfectly.
However, after reading the description of the Origin I didn't quite understand what it was saying.
I created this code as an attempt to understand it but I still didn't get it.
script.Parent.Equipped:connect(function(M)
M.Move:connect(function()
print(M.Origin.X)
print(M.Hit.X)
wait(5)
end)
end)
This is inside a local script within a tool.
My overall intent is to create a BASIC dropper tool that only works over a given base. This is what I have so far.
--Sets up the array for taken spaces
avaliableSpaces = {}
for avSet=0,15 do
avaliableSpaces[avSet] = {}
end
--Sets all values on the board to zero
for row=0,14 do
for column=0,14 do
avaliableSpaces[row][column] = 0
end
end
--Used to check and see if a space is taken
function checkAvaliablity(x,z)
--Gets area code for x and z values
x = math.floor((x + 30)/4)
z = math.floor((z + 30)/4)
if(avaliableSpaces[x][z] == 0) then
return true
end
return false
end
script.Parent.Equipped:connect(function(M)
--Creating the invisible brick
xy = Instance.new("Part", game.Workspace)
xy.Size = Vector3.new(4,4,4)
xy.Anchored = true
xy.CanCollide = false
xy.Transparency = 0.5
xy.Name = game.Players.LocalPlayer.Name.."Brick"
xy.CFrame = game.Workspace.Base.CFrame:toWorldSpace(CFrame.new(0,2.5,0))
yx = Instance.new("SelectionBox",xy)
yx.Adornee = xy
yx.Color = BrickColor.new("Dark stone grey")
M.Move:connect(function()
if M.Target == game.Workspace.Base then
--Now we need to find the x coordinates
xValue = game.Workspace.Base.CFrame:toObjectSpace(M.Hit).X
local xRoundValue = xValue%4
if xRoundValue == 3 or xRoundValue == 2 then
xValue = math.ceil(xValue/4)*4
else
xValue = math.floor(xValue/4)*4
end
--We also need to find our z coodinates
zValue = game.Workspace.Base.CFrame:toObjectSpace(M.Hit).Z
local zRoundValue = zValue%4
if zRoundValue == 3 or zRoundValue == 2 then
zValue = math.ceil(zValue/4)*4
else
zValue = math.floor(zValue/4)*4
end
--Now it is time to actually move the brick
if checkAvaliablity(xValue,zValue) then
xy.CFrame = game.Workspace.Base.CFrame:toWorldSpace(CFrame.new(xValue,2.5,zValue))--2.5 will never change as long as the base and brick is the same
end
end
end)
--This actually creates the brick
M.Button1Down:connect(function()
--Put the brick down
local brk = Instance.new("Part", game.Workspace)
brk.Size = Vector3.new(4,4,4)
brk.Anchored = true
brk.CFrame = xy.CFrame
--Lock the space
local x = math.floor((xValue + 30)/4)
local z = math.floor((zValue + 30)/4)
avaliableSpaces[x][z] = 1
--Move the invisible brick away
xy.CFrame = CFrame.new(0,0,0)
end)
end)
--Destory the brick when the tool is unequipped
script.Parent.Unequipped:connect(function()
game.Workspace:FindFirstChild(game.Players.LocalPlayer.Name.."Brick"):Destroy()
end)
It doesn't work for anything except one level above the base. It isn't stackable yet. Currently it decides if a space is open by checking a preset database at the top. I don't like this but I haven't found a way around it yet.
It moves in a 4x4 grid. The base is a 60x60 stud brick.
I am open to any suggestions.

1 comment
mouse.Hit is the place the mouse hits in workspace. mouse.Origin is the player's camera cframe, pointed at that position. You can do the same with CFrame.new(workspace.CurrentCamera.CFrame.p,mouse.Hit.p). It's really specific and I don't know when it would be useful.