323 lines
7.9 KiB
Lua
323 lines
7.9 KiB
Lua
|
|
-- 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(g_Msgs.ErrExpectedListOfUsernames);
|
|
return true;
|
|
end
|
|
|
|
-- Get the cuboid that the player had selected
|
|
local CmdState = GetCommandStateForPlayer(a_Player);
|
|
if (CmdState == nil) then
|
|
a_Player:SendMessage(g_Msgs.ErrCmdStateNilAddArea);
|
|
return true;
|
|
end
|
|
local Cuboid = CmdState:GetCurrentCuboid();
|
|
if (Cuboid == nil) then
|
|
a_Player:SendMessage(g_Msgs.ErrNoAreaWanded);
|
|
return true;
|
|
end
|
|
|
|
-- Put all allowed players into a table:
|
|
AllowedNames = {};
|
|
for i = 2, #a_Split do
|
|
table.insert(AllowedNames, a_Split[i]);
|
|
end
|
|
|
|
-- Add the area to the storage
|
|
local AreaID = g_Storage:AddArea(Cuboid, a_Player:GetWorld():GetName(), a_Player:GetName(), AllowedNames);
|
|
a_Player:SendMessage(string.format(g_Msgs.AreaAdded, AreaID));
|
|
|
|
-- Reload all currently logged in players
|
|
ReloadAllPlayersInWorld(a_Player:GetWorld():GetName());
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleAddAreaCoords(a_Split, a_Player)
|
|
-- Command syntax: ProtAddCoords x1 z1 x2 z2 username1 [username2] [username3] ...
|
|
if (#a_Split < 6) then
|
|
a_Player:SendMessage(g_Msgs.ErrExpectedCoordsUsernames);
|
|
return true;
|
|
end
|
|
|
|
-- Convert the coords to a cCuboid
|
|
local x1, z1 = tonumber(a_Split[2]), tonumber(a_Split[3]);
|
|
local x2, z2 = tonumber(a_Split[4]), tonumber(a_Split[5]);
|
|
if ((x1 == nil) or (z1 == nil) or (x2 == nil) or (z2 == nil)) then
|
|
a_Player:SendMessage(g_Msgs.ErrParseCoords);
|
|
return true;
|
|
end
|
|
local Cuboid = cCuboid(x1, 0, z1, x2, 255, z1);
|
|
Cuboid:Sort();
|
|
|
|
-- Put all allowed players into a table:
|
|
AllowedNames = {};
|
|
for i = 6, #a_Split do
|
|
table.insert(AllowedNames, a_Split[i]);
|
|
end
|
|
|
|
-- Add the area to the storage
|
|
local AreaID = g_Storage:AddArea(Cuboid, a_Player:GetWorld():GetName(), a_Player:GetName(), AllowedNames);
|
|
a_Player:SendMessage(string.format(g_Msgs.AreaAdded, AreaID));
|
|
|
|
-- Reload all currently logged in players
|
|
ReloadAllPlayersInWorld(a_Player:GetWorld():GetName());
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleAddAreaUser(a_Split, a_Player)
|
|
-- Command syntax: ProtAddUser AreaID username1 [username2] [username3] ...
|
|
if (#a_Split < 3) then
|
|
a_Player:SendMessage(g_Msgs.ErrExpectedAreaIDUsernames);
|
|
return true;
|
|
end
|
|
|
|
-- Put all allowed players into a table:
|
|
AllowedNames = {};
|
|
for i = 3, #a_Split do
|
|
table.insert(AllowedNames, a_Split[i]);
|
|
end
|
|
|
|
-- Add the area to the storage
|
|
if (not(g_Storage:AddAreaUsers(
|
|
tonumber(a_Split[2]), a_Player:GetWorld():GetName(), a_Player:GetName(), AllowedNames))
|
|
) then
|
|
LOGWARNING("g_Storage:AddAreaUsers failed");
|
|
a_Player:SendMessage(g_Msgs.ErrDBFailAddUsers);
|
|
return true;
|
|
end
|
|
if (#AllowedNames == 0) then
|
|
a_Player:SendMessage(g_Msgs.AllUsersAlreadyAllowed);
|
|
else
|
|
a_Player:SendMessage(string.format(g_Msgs.UsersAdded, table.concat(AllowedNames, ", ")));
|
|
end
|
|
|
|
-- Reload all currently logged in players
|
|
ReloadAllPlayersInWorld(a_Player:GetWorld():GetName());
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleDelArea(a_Split, a_Player)
|
|
-- Command syntax: ProtDelArea AreaID
|
|
if (#a_Split ~= 2) then
|
|
a_Player:SendMessage(g_Msgs.ErrExpectedAreaID);
|
|
return true;
|
|
end
|
|
|
|
-- Parse the AreaID
|
|
local AreaID = tonumber(a_Split[2]);
|
|
if (AreaID == nil) then
|
|
a_Player:SendMessage(g_Msgs.ErrParseAreaID);
|
|
return true;
|
|
end
|
|
|
|
-- Delete the area
|
|
g_Storage:DelArea(a_Player:GetWorld():GetName(), AreaID);
|
|
|
|
a_Player:SendMessage(string.format(g_Msgs.AreaDeleted, AreaID));
|
|
-- Reload all currently logged in players
|
|
ReloadAllPlayersInWorld(a_Player:GetWorld():GetName());
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleGiveWand(a_Split, a_Player)
|
|
local NumGiven = a_Player:GetInventory():AddItem(cConfig:GetWandItem());
|
|
if (NumGiven == 1) then
|
|
a_Player:SendMessage(g_Msgs.WandGiven);
|
|
else
|
|
a_Player:SendMessage(g_Msgs.ErrNoSpaceForWand);
|
|
end
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleListAreas(a_Split, a_Player)
|
|
-- Command syntax: ProtListAreas [x, z]
|
|
|
|
local x, z;
|
|
if (#a_Split == 1) then
|
|
-- Get the last "wanded" coord
|
|
local CmdState = GetCommandStateForPlayer(a_Player);
|
|
if (CmdState == nil) then
|
|
a_Player:SendMessage(g_Msgs.ErrCmdStateNilListAreas);
|
|
return true;
|
|
end
|
|
x, z = CmdState:GetLastCoords();
|
|
if ((x == nil) or (z == nil)) then
|
|
a_Player:SendMessage(g_Msgs.ErrListNotWanded);
|
|
return true;
|
|
end
|
|
elseif (#a_Split == 3) then
|
|
-- Parse the coords from the command params
|
|
x = tonumber(a_Split[2]);
|
|
z = tonumber(a_Split[3]);
|
|
if ((x == nil) or (z == nil)) then
|
|
a_Player:SendMessage(g_Msgs.ErrParseCoordsListAreas);
|
|
return true;
|
|
end
|
|
else
|
|
-- Wrong number of params, report back to the user
|
|
a_Player:SendMessage(g_Msgs.ErrSyntaxErrorListAreas);
|
|
return true;
|
|
end
|
|
|
|
a_Player:SendMessage(string.format(g_Msgs.ListAreasHeader, x, z));
|
|
|
|
-- List areas intersecting the coords
|
|
local PlayerName = a_Player:GetName();
|
|
local WorldName = a_Player:GetWorld():GetName();
|
|
g_Storage:ForEachArea(x, z, WorldName,
|
|
function(AreaID, MinX, MinZ, MaxX, MaxZ, CreatorName)
|
|
local Coords = string.format("%s: {%d, %d} - {%d, %d} ", AreaID, MinX, MinZ, MaxX, MaxZ);
|
|
local Allowance;
|
|
if (g_Storage:IsAreaAllowed(AreaID, PlayerName, WorldName)) then
|
|
Allowance = g_Msgs.AreaAllowed;
|
|
else
|
|
Allowance = g_Msgs.AreaNotAllowed;
|
|
end
|
|
a_Player:SendMessage(string.format(g_Msgs.ListAreasRow, Coords, Allowance, CreatorName));
|
|
end
|
|
);
|
|
|
|
a_Player:SendMessage(g_Msgs.ListAreasFooter);
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
--- Lists all allowed users for a particular area
|
|
function HandleListUsers(a_Split, a_Player)
|
|
-- Command syntax: ProtListUsers AreaID
|
|
if (#a_Split ~= 2) then
|
|
a_Player:SendMessage(g_Msgs.ErrExpectedAreaID);
|
|
end
|
|
|
|
-- Get the general info about the area
|
|
local AreaID = a_Split[2];
|
|
local WorldName = a_Player:GetWorld():GetName();
|
|
local MinX, MinZ, MaxX, MaxZ, CreatorName = g_Storage:GetArea(AreaID, WorldName);
|
|
if (MinX == nil) then
|
|
a_Player:SendMessage(string.format(g_Msgs.ErrNoSuchArea, AreaID));
|
|
return true;
|
|
end
|
|
|
|
-- Send the header
|
|
a_Player:SendMessage(string.format(g_Msgs.ListUsersHeader, AreaID, MinX, MinZ, MaxX, MaxZ, CreatorName));
|
|
|
|
-- List and count the allowed users
|
|
local NumUsers = 0;
|
|
g_Storage:ForEachUserInArea(AreaID, WorldName,
|
|
function(UserName)
|
|
a_Player:SendMessage(string.format(g_Msgs.ListUsersRow, UserName));
|
|
NumUsers = NumUsers + 1;
|
|
end
|
|
);
|
|
|
|
-- Send the footer
|
|
a_Player:SendMessage(string.format(g_Msgs.ListUsersFooter, AreaID, NumUsers));
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleRemoveUser(a_Split, a_Player)
|
|
-- Command syntax: ProtRemUser AreaID UserName
|
|
if (#a_Split ~= 3) then
|
|
a_Player:SendMessage(g_Msgs.ErrExpectedAreaIDUserName);
|
|
return true;
|
|
end
|
|
|
|
-- Parse the AreaID
|
|
local AreaID = tonumber(a_Split[2]);
|
|
if (AreaID == nil) then
|
|
a_Player:SendMessage(g_Msgs.ErrParseAreaID);
|
|
return true;
|
|
end
|
|
|
|
-- Remove the user from the DB
|
|
local UserName = a_Split[3];
|
|
g_Storage:RemoveUser(AreaID, UserName, a_Player:GetWorld():GetName());
|
|
|
|
-- Send confirmation
|
|
a_Player:SendMessage(string.format(g_Msgs.RemovedUser, UserName, AreaID));
|
|
|
|
-- Reload all currently logged in players
|
|
ReloadAllPlayersInWorld(a_Player:GetWorld():GetName());
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleRemoveUserAll(a_Split, a_Player)
|
|
-- Command syntax: ProtRemUserAll UserName
|
|
if (#a_Split ~= 2) then
|
|
a_Player:SendMessage(g_Msgs.ErrExpectedUserName);
|
|
return true;
|
|
end
|
|
|
|
-- Remove the user from the DB
|
|
g_Storage:RemoveUserAll(a_Split[2], a_Player:GetWorld():GetName());
|
|
|
|
-- Send confirmation
|
|
a_Player:SendMessage(string.format(g_Msgs.RemovedUserAll, UserName));
|
|
|
|
-- Reload all currently logged in players
|
|
ReloadAllPlayersInWorld(a_Player:GetWorld():GetName());
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|