1
0

ProtectionAreas: Initial project import, skeleton code

git-svn-id: http://mc-server.googlecode.com/svn/trunk@1516 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com 2013-05-26 19:20:49 +00:00
parent 84a7e14e86
commit 89d9abf911
7 changed files with 353 additions and 0 deletions

View File

@ -0,0 +1,98 @@
-- CommandHandlers.lua
-- Defines the individual command handlers
function InitializeCommandHandlers()
local PlgMgr = cRoot:Get():GetPluginManager();
for idx, Cmd in ipairs(CommandReg()) do
PlgMgr:BindCommand(Cmd[2], Cmd[3], Cmd[1], Cmd[4]);
end
end
--- Handles the ProtAdd command
function HandleAddArea(a_Split, a_Player)
-- Command syntax: ProtAdd username1 [username2] [username3] ...
if (#a_Split < 2) then
a_Player:SendMessage("Not enough parameters. Expected a list of usernames.");
return true;
end
-- TODO: Add the area to the storage and reload all currently logged in players
return true;
end
function HandleAddAreaCoords(a_Split, a_Player)
-- TODO
end
function HandleAddAreaUser(a_Split, a_Player)
-- TODO
end
function HandleDelArea(a_Split, a_Player)
-- TODO
end
function HandleGiveWand(a_Split, a_Player)
local NumGiven = a_Player:GetInventory():AddItem(cConfig:GetWandItem());
if (NumGiven == 1) then
a_Player:SendMessage("Wand given");
else
a_Player:SendMessage("Cannot give wand, no space in your inventory");
end
return true;
end
function HandleListAreas(a_Split, a_Player)
-- TODO
end
function HandleRemoveUser(a_Split, a_Player)
-- TODO
end
function HandleRemoveUserAll(a_Split, a_Player)
-- TODO
end

View File

@ -0,0 +1,27 @@
-- CurrentLng.lua
-- This file provides all the translatable strings
-- The expectation is that the translators will create copies of this file, translate the texts and then the users will overwrite this file with a specific language version
-- Note that the individual languages must not have ".lua" extension, otherwise MCServer will load them and the plugin won't work!
-- Individual commands, and their help strings. Don't touch the first symbol on each line!
function CommandReg()
return {
-- Handler function | Command | Permission | Help text
{HandleAddArea, "/ProtAdd", "Prot.Add", "Adds a new protected area"},
{HandleAddAreaCoords, "/ProtAddCoords", "Prot.Add", "Adds a new protected area by coords"},
{HandleAddAreaUser, "/ProtAddUser", "Prot.AddUser", "Adds a new user to an existing protected area"},
{HandleDelArea, "/ProtDelID", "Prot.Del", "Deletes a protected area by ID"},
{HandleGiveWand, "/ProtWand", "Prot.Wand", "Gives you the wand used for protection"},
{HandleListAreas, "/ProtList", "Prot.List", "Lists all areas for the marked block"},
{HandleRemoveUser, "/ProtRemUser", "Prot.RemUser", "Removes a user from the protected area"},
{HandleRemoveUserAll, "/ProtRemUserAll", "Prot.RemUser", "Removes a user from all protected areas"},
};
end;

View File

@ -0,0 +1,99 @@
-- HookHandlers.lua
-- Implements the handlers for individual hooks
function InitializeHooks(a_Plugin)
local PlgMgr = cRoot:Get():GetPluginManager();
PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_DISCONNECT);
PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_PLAYER_JOINED);
PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_PLAYER_LEFT_CLICK);
PlgMgr:AddHook(a_Plugin, cPluginManager.HOOK_PLAYER_RIGHT_CLICK);
end
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:GetName()] = nil;
-- If the player is a VIP, they had a command state, remove that as well
CommandStates[a_Player:GetUniqueID()] = nil;
return false;
end;
function OnPlayerJoined(a_Player)
-- Create a new cProtectionArea for this player
g_PlayerAreas[a_Player:GetName()] = cPlayerAreas:new();
-- TODO: Load the protection areas for this player
return false;
end
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_BlockY, a_BlockZ);
a_Player:SendMessage("Coords1 set as {" .. a_BlockX .. ", " .. a_BlockY .. ", " .. a_BlockZ .."}.");
return true;
end;
-- TODO: Check the player areas to see whether to disable this action
return false;
end
function OnPlayerRightClick(a_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, a_Status)
-- If the player has rclked 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):SetCoords2(a_BlockX, a_BlockY, a_BlockZ);
a_Player:SendMessage("Coords2 set as {" .. a_BlockX .. ", " .. a_BlockY .. ", " .. a_BlockZ .."}.");
return true;
end;
-- TODO: Check the player areas to see whether to disable this action
return false;
end

View File

@ -0,0 +1,73 @@
-- PlayerAreas.lua
-- Implements the cPlayerAreas class representing the per-player area storage object
--[[
Each player instance is expected to have a separate object of type cPlayerAreas.
Each object has an array of {cuboid, IsAllowed} tables, one for each area that is "within reach"
The code can then ask each object, whether the player can interact with a certain block or not.
A player can interact with a block if either one of these is true:
1, There are no areas covering the block
2, There is at least one area covering the block with IsAllowed set to true
The OOP class implementation follows the PiL 16.1
Also, a global table g_PlayerAreas is the actual map of PlayerName -> cPlayerAreas
--]]
cPlayerAreas = {};
g_PlayerAreas = {};
function cPlayerAreas:new(obj)
obj = obj or {};
setmetatable(obj, self);
self.__index = self;
return obj;
end
-- Adds a new cuboid to the area list, where the player is either allowed or not, depending on the IsAllowed param
function cPlayerAreas:AddArea(a_Cuboid, a_IsAllowed)
table.add(self, {Cuboid = a_Cuboid, IsAllowed = a_IsAllowed});
end
--- returns true if the player owning this object can interact with the specified block
function cPlayerAreas:CanInteract(a_BlockX, a_BlockY, a_BlockZ)
-- iterate through all the stored areas:
local IsInsideAnyArea = false;
for idx, Area in ipairs(self) do
if (Area.Cuboid:IsInside(a_BlockX, a_BlockY, a_BlockZ)) then
if (Area.IsAllowed) then
return true;
end
-- The coords are inside a cuboid for which the player doesn't have access, take a note of it
IsInsideAnyArea = true;
end
end
if (IsInsideAnyArea) then
-- The specified coords are inside at least one area, but none of them allow the player to interact
return false;
end
-- The coords are not inside any area
-- TODO: Have a config saying whether a player can build in the non-areated space or not
return true;
end

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<file>
<filename>CommandHandlers.lua</filename>
</file>
<file>
<filename>CommandState.lua</filename>
</file>
<file>
<filename>Config.lua</filename>
</file>
<file>
<filename>CurrentLng.lua</filename>
</file>
<file>
<filename>HookHandlers.lua</filename>
</file>
<file>
<filename>PlayerAreas.lua</filename>
</file>
<file>
<filename>ProtectionAreas.lua</filename>
</file>
<file>
<filename>Storage.lua</filename>
</file>
</project>

View File

@ -0,0 +1,20 @@
-- ProtectionAreas.lua
-- Defines the main plugin entrypoint
function Initialize(a_Plugin)
a_Plugin:SetName("ProtectionAreas");
a_Plugin:SetVersion(1);
InitializeHooks(a_Plugin);
InitializeCommandHandlers();
-- TODO: We might be reloading, so there may be players already present in the server
-- Reload areas for all present players
return true;
end

View File

@ -0,0 +1,9 @@
-- Storage.lua
-- Implements the storage access object, shielding the rest of the code away from the DB
-- TODO