summaryrefslogtreecommitdiffstats
path: root/MCServer/Plugins/ProtectionAreas/HookHandlers.lua
blob: 8869775f7b8c677ef26c4887a37042fcf8cae218 (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140

-- HookHandlers.lua
-- Implements the handlers for individual hooks





--- Registers all the hooks that the plugin needs to know about
function InitializeHooks(a_Plugin)
	local PlgMgr = cRoot:Get():GetPluginManager();
	PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_DISCONNECT);
	PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_PLAYER_LEFT_CLICK);
	PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_PLAYER_MOVING);
	PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_PLAYER_RIGHT_CLICK);
	PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_PLAYER_SPAWNED);
end





--- Called by MCS when a player's connectino is lost - either they disconnected or timed out
function OnDisconnect(a_Player, a_Reason)
	-- Remove the player's cProtectionArea object
	-- TODO: What if there are two players with the same name? need to check
	g_PlayerAreas[a_Player:GetUniqueID()] = nil;
	
	-- If the player is a VIP, they had a command state, remove that as well
	g_CommandStates[a_Player:GetUniqueID()] = nil;
	
	return false;
end;





--- Called by MCS whenever a player enters a world (is spawned)
function OnPlayerSpawned(a_Player)
	-- Create a new cPlayerAreas object for this player
	if (g_PlayerAreas[a_Player:GetUniqueID()] == nil) then
		LoadPlayerAreas(a_Player);
	end;

	return false;
end





--- Called by MCS whenever a player is moving (at most once every tick)
function OnPlayerMoving(a_Player)
	local PlayerID = a_Player:GetUniqueID();
	
	-- If for some reason we don't have a cPlayerAreas object for this player, load it up
	local PlayerAreas = g_PlayerAreas[PlayerID];
	if (PlayerAreas == nil) then
		LoadPlayerAreas(a_Player);
		return false;
	end;
	
	-- If the player is outside their areas' safe space, reload
	if (not(PlayerAreas:IsInSafe(a_Player:GetPosX(), a_Player:GetPosZ()))) then
		LoadPlayerAreas(a_Player);
	end
	return false;
end





--- Called by MCS when a player left-clicks
function OnPlayerLeftClick(a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_Status)
	-- If the player has lclked with the wand; regardless of their permissions, let's set the coords:
	if (cConfig:IsWand(a_Player:GetEquippedItem())) then
		-- BlockFace < 0 means "use item", for which the coords are not given by the client
		if (a_BlockFace < 0) then
			return true;
		end

		-- Convert the clicked coords into the block space
		a_BlockX, a_BlockY, a_BlockZ = AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);

		-- Set the coords in the CommandState
		GetCommandStateForPlayer(a_Player):SetCoords1(a_BlockX, a_BlockZ);
		a_Player:SendMessage("Coords1 set as {" .. a_BlockX .. ", " .. a_BlockZ .."}.");
		return true;
	end;
	
	-- Check the player areas to see whether to disable this action
	local Areas = g_PlayerAreas[a_Player:GetUniqueID()];
	if not(Areas:CanInteractWithBlock(a_BlockX, a_BlockZ)) then
		a_Player:SendMessage("You are not allowed to dig here!");
		return true;
	end
	
	-- Allow interaction
	return false;
end





--- Called by MCS when a player right-clicks
function OnPlayerRightClick(a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, a_Status)

	-- BlockFace < 0 means "use item", for which the coords are not given by the client
	if (a_BlockFace < 0) then
		return true;
	end

	-- Convert the clicked coords into the block space
	a_BlockX, a_BlockY, a_BlockZ = AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
	
	-- If the player has rclked with the wand; regardless of their permissions, let's set the coords
	if (cConfig:IsWand(a_Player:GetEquippedItem())) then
		-- Set the coords in the CommandState
		GetCommandStateForPlayer(a_Player):SetCoords2(a_BlockX, a_BlockZ);
		a_Player:SendMessage("Coords2 set as {" .. a_BlockX .. ", " .. a_BlockZ .."}.");
		return true;
	end;
	
	-- Check the player areas to see whether to disable this action
	local Areas = g_PlayerAreas[a_Player:GetUniqueID()];
	if not(Areas:CanInteractWithBlock(a_BlockX, a_BlockZ)) then
		a_Player:SendMessage("You are not allowed to build here!");
		return true;
	end

	-- Allow interaction
	return false;
end