2013-01-13 06:10:26 -05:00
|
|
|
function OnPlayerPlacingBlock(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ, BlockType)
|
2012-01-26 18:10:49 -05:00
|
|
|
|
|
|
|
-- dont check if the direction is in the air
|
2012-08-18 05:56:28 -04:00
|
|
|
if (BlockFace == -1) then
|
|
|
|
return false
|
|
|
|
end
|
2012-01-26 18:10:49 -05:00
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
if( Player:HasPermission("core.build") == false ) then
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
-- TODO: If the placed block is not a block (torch etc.), allow it without checking for collisions
|
|
|
|
|
|
|
|
local X = BlockX
|
|
|
|
local Y = BlockY
|
|
|
|
local Z = BlockZ
|
2013-01-13 06:10:26 -05:00
|
|
|
X, Y, Z = AddFaceDirection(X, Y, Z, BlockFace)
|
2012-08-18 05:56:28 -04:00
|
|
|
if (Y >= 256 or Y < 0) then
|
|
|
|
return true
|
|
|
|
end
|
2012-03-19 16:30:24 -04:00
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
local CheckCollision = function(Player)
|
|
|
|
-- drop the decimals, we only care about the full block X,Y,Z
|
|
|
|
local PlayerX = math.floor(Player:GetPosX(), 0)
|
|
|
|
local PlayerY = math.floor(Player:GetPosY(), 0)
|
|
|
|
local PlayerZ = math.floor(Player:GetPosZ(), 0)
|
|
|
|
|
|
|
|
-- player height is 2 blocks, so we check the position and then offset it up one
|
|
|
|
-- so they can't place a block in anyone's face
|
|
|
|
|
|
|
|
local collision = false
|
|
|
|
if ((BlockFace == BLOCK_FACE_TOP) and (PlayerY == BlockY - 2) and (PlayerX == BlockX) and (PlayerZ == BlockZ)) then
|
|
|
|
collision = true
|
2012-01-26 18:10:49 -05:00
|
|
|
end
|
2012-02-15 08:16:42 -05:00
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
if ((BlockFace == BLOCK_FACE_BOTTOM) and (PlayerY == BlockY + 1) and (PlayerX == BlockX) and (PlayerZ == BlockZ)) then
|
|
|
|
collision = true
|
|
|
|
end
|
2012-01-26 18:10:49 -05:00
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
if ((BlockFace == BLOCK_FACE_NORTH) and (PlayerX == BlockX) and (PlayerZ == BlockZ - 1)) then
|
|
|
|
if ((PlayerY == BlockY) or (PlayerY + 1 == BlockY)) then collision = true end
|
|
|
|
end
|
2012-02-15 08:16:42 -05:00
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
if ((BlockFace == BLOCK_FACE_SOUTH) and (PlayerX == BlockX) and (PlayerZ == BlockZ + 1)) then
|
|
|
|
if ((PlayerY == BlockY) or (PlayerY + 1 == BlockY)) then collision = true end
|
|
|
|
end
|
2012-02-15 08:16:42 -05:00
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
if ((BlockFace == BLOCK_FACE_WEST) and (PlayerX == BlockX - 1) and (PlayerZ == BlockZ)) then
|
|
|
|
if ((PlayerY == BlockY) or (PlayerY + 1 == BlockY)) then collision = true end
|
|
|
|
end
|
2012-02-15 08:16:42 -05:00
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
if ((BlockFace == BLOCK_FACE_EAST) and (PlayerX == BlockX + 1) and (PlayerZ == BlockZ)) then
|
|
|
|
if ((PlayerY == BlockY) or (PlayerY + 1 == BlockY)) then collision = true end
|
2012-02-15 08:16:42 -05:00
|
|
|
end
|
|
|
|
|
2012-08-18 05:56:28 -04:00
|
|
|
return collision
|
|
|
|
end
|
|
|
|
|
|
|
|
if (Player:GetWorld():ForEachPlayer(CheckCollision) == false) then
|
|
|
|
return true
|
2012-02-14 14:14:23 -05:00
|
|
|
end
|
|
|
|
return false
|
2012-01-26 18:10:49 -05:00
|
|
|
end
|