summaryrefslogtreecommitdiffstats
path: root/MCServer/Plugins/Core/onbreakplaceblock.lua
blob: 49b3226c2197eb9bc92f5d7a411e8070a3a398be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
function OnPlayerPlacingBlock(Player, BlockX, BlockY, BlockZ, BlockFace, CursorX, CursorY, CursorZ, BlockType)
	-- Direction is air check
	if (BlockFace == -1) then
		return false
	end

    local PROTECTRADIUS = WorldsSpawnProtect[Player:GetWorld():GetName()];

	if not (Player:HasPermission("core.build")) then
		return true
	else
        if not (Player:HasPermission("core.spawnprotect.bypass")) and not (PROTECTRADIUS == 0) 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

    local PROTECTRADIUS = WorldsSpawnProtect[Player:GetWorld():GetName()];

		if not (Player:HasPermission("core.build")) then
			return true
		else
            if not (Player:HasPermission("core.spawnprotect.bypass")) and not (PROTECTRADIUS == 0) 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