From 12906c026d414c752d3c0ba9481f425b24b29c67 Mon Sep 17 00:00:00 2001 From: faketruth Date: Mon, 20 Aug 2012 12:20:20 +0000 Subject: Moved files used by MCServer to a special MCServer folder git-svn-id: http://mc-server.googlecode.com/svn/trunk@763 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- MCServer/Plugins/Core/onblockplace.lua | 63 ++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 MCServer/Plugins/Core/onblockplace.lua (limited to 'MCServer/Plugins/Core/onblockplace.lua') diff --git a/MCServer/Plugins/Core/onblockplace.lua b/MCServer/Plugins/Core/onblockplace.lua new file mode 100644 index 000000000..9032f8207 --- /dev/null +++ b/MCServer/Plugins/Core/onblockplace.lua @@ -0,0 +1,63 @@ +function OnBlockPlace(Player, BlockX, BlockY, BlockZ, BlockFace, HeldItem) + + -- dont check if the direction is in the air + if (BlockFace == -1) then + return false + end + + 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 + X, Y, Z = AddDirection(X, Y, Z, BlockFace) + if (Y >= 256 or Y < 0) then + return true + end + + 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 + end + + if ((BlockFace == BLOCK_FACE_BOTTOM) and (PlayerY == BlockY + 1) and (PlayerX == BlockX) and (PlayerZ == BlockZ)) then + collision = true + end + + 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 + + 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 + + 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 + + if ((BlockFace == BLOCK_FACE_EAST) and (PlayerX == BlockX + 1) and (PlayerZ == BlockZ)) then + if ((PlayerY == BlockY) or (PlayerY + 1 == BlockY)) then collision = true end + end + + return collision + end + + if (Player:GetWorld():ForEachPlayer(CheckCollision) == false) then + return true + end + return false +end \ No newline at end of file -- cgit v1.2.3