2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
-- 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
|
|
|
|
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(string.format(g_Msgs.Coords1Set, 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(g_Msgs.NotAllowedToDig);
|
|
|
|
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(string.format(g_Msgs.Coords2Set, 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(g_Msgs.NotAllowedToBuild);
|
|
|
|
return true;
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Allow interaction
|
|
|
|
return false;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|