115 lines
4.7 KiB
Lua
115 lines
4.7 KiB
Lua
function OnPlayerPlacingBlock(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ, BlockType)
|
|
-- Direction is air check
|
|
if (BlockFace == -1) then
|
|
return false
|
|
end
|
|
|
|
if( Player:HasPermission("core.build") == false ) then
|
|
return true
|
|
else
|
|
if Player:HasPermission("core.spawnprotect.bypass") == false and SPAWNPROTECT == true then
|
|
local World = Player:GetWorld()
|
|
local xcoord = World:GetSpawnX()
|
|
local ycoord = World:GetSpawnY()
|
|
local zcoord = World:GetSpawnZ()
|
|
|
|
if not ((BlockX <= (xcoord + PROTECTRADIUS)) and (BlockX >= (xcoord - PROTECTRADIUS))) then
|
|
return false -- Not in spawn area.
|
|
end
|
|
if not ((BlockY <= (ycoord + PROTECTRADIUS)) and (BlockY >= (ycoord - PROTECTRADIUS))) then
|
|
return false -- Not in spawn area.
|
|
end
|
|
if not ((BlockZ <= (zcoord + PROTECTRADIUS)) and (BlockZ >= (zcoord - PROTECTRADIUS))) then
|
|
return false -- Not in spawn area.
|
|
end
|
|
|
|
--WriteLog(1, BlockX, BlockY, BlockZ, Player:GetName(), id, meta)
|
|
|
|
WarnPlayer(Player)
|
|
|
|
return true
|
|
else
|
|
if BlockType == "50" or BlockType == "76" then
|
|
local X = BlockX
|
|
local Y = BlockY
|
|
local Z = BlockZ
|
|
X, Y, Z = AddFaceDirection(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)
|
|
|
|
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
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function OnPlayerBreakingBlock(Player, BlockX, BlockY, BlockZ, BlockFace, Status, OldBlockType, OldBlockMeta)
|
|
-- dont check if the direction is in the air
|
|
if (BlockFace ~= -1) then
|
|
|
|
if (Player:HasPermission("core.build") == false) then
|
|
return true
|
|
else
|
|
if Player:HasPermission("core.spawnprotect.bypass") == false and SPAWNPROTECT == true then
|
|
local World = Player:GetWorld()
|
|
local xcoord = World:GetSpawnX()
|
|
local ycoord = World:GetSpawnY()
|
|
local zcoord = World:GetSpawnZ()
|
|
|
|
if not ((BlockX <= (xcoord + PROTECTRADIUS)) and (BlockX >= (xcoord - PROTECTRADIUS))) then
|
|
return false -- Not in spawn area.
|
|
end
|
|
if not ((BlockY <= (ycoord + PROTECTRADIUS)) and (BlockY >= (ycoord - PROTECTRADIUS))) then
|
|
return false -- Not in spawn area.
|
|
end
|
|
if not ((BlockZ <= (zcoord + PROTECTRADIUS)) and (BlockZ >= (zcoord - PROTECTRADIUS))) then
|
|
return false -- Not in spawn area.
|
|
end
|
|
|
|
--WriteLog(0, BlockX, BlockY, BlockZ, Player:GetName(), id, meta)
|
|
|
|
WarnPlayer(Player)
|
|
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
return false
|
|
end |