2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
-- CommandState.lua
|
|
|
|
|
|
|
|
-- Implements the cCommandState class representing a command state for each VIP player
|
|
|
|
|
|
|
|
--[[
|
|
|
|
The command state holds internal info, such as the coords they selected using the wand
|
|
|
|
The command state needs to be held in a per-entity manner, so that we can support multiple logins
|
|
|
|
from the same account (just for the fun of it)
|
|
|
|
The OOP class implementation follows the PiL 16.1
|
|
|
|
|
|
|
|
Also, a global table g_CommandStates is the map of PlayerEntityID -> cCommandState
|
|
|
|
--]]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cCommandState = {
|
|
|
|
-- Default coords
|
|
|
|
m_Coords1 = {x = 0, z = 0}; -- lclk coords
|
|
|
|
m_Coords2 = {x = 0, z = 0}; -- rclk coords
|
|
|
|
m_LastCoords = 0; -- When Coords1 or Coords2 is set, this gets set to 1 or 2, signifying the last changed set of coords
|
|
|
|
m_HasCoords1 = false; -- Set to true when m_Coords1 has been set by the user
|
|
|
|
m_HasCoords2 = false; -- Set to true when m_Coords2 has been set by the user
|
|
|
|
};
|
|
|
|
|
|
|
|
g_CommandStates = {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function cCommandState:new(obj)
|
|
|
|
obj = obj or {};
|
|
|
|
setmetatable(obj, self);
|
|
|
|
self.__index = self;
|
|
|
|
return obj;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--- Returns the current coord pair as a cCuboid object
|
|
|
|
function cCommandState:GetCurrentCuboid()
|
|
|
|
if (not(self.m_HasCoords1) or not(self.m_HasCoords2)) then
|
|
|
|
-- Some of the coords haven't been set yet
|
|
|
|
return nil;
|
|
|
|
end
|
|
|
|
|
|
|
|
local res = cCuboid(
|
|
|
|
self.m_Coords1.x, 0, self.m_Coords1.z,
|
|
|
|
self.m_Coords2.x, 255, self.m_Coords2.z
|
|
|
|
);
|
|
|
|
res:Sort();
|
|
|
|
return res;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--- Returns the x, z coords that were the set last,
|
|
|
|
-- That is, either m_Coords1 or m_Coords2, based on m_LastCoords member
|
|
|
|
-- Returns nothing if no coords were set yet
|
|
|
|
function cCommandState:GetLastCoords()
|
|
|
|
if (self.m_LastCoords == 0) then
|
|
|
|
-- No coords have been set yet
|
|
|
|
return;
|
|
|
|
elseif (self.m_LastCoords == 1) then
|
|
|
|
return self.m_Coords1.x, self.m_Coords1.z;
|
|
|
|
elseif (self.m_LastCoords == 2) then
|
|
|
|
return self.m_Coords2.x, self.m_Coords2.z;
|
|
|
|
else
|
|
|
|
LOGWARNING(PluginPrefix .. "cCommandState is in an unexpected state, m_LastCoords == " .. self.m_LastCoords);
|
|
|
|
return;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--- Sets the first set of coords (upon rclk with a wand)
|
|
|
|
function cCommandState:SetCoords1(a_BlockX, a_BlockZ)
|
|
|
|
self.m_Coords1.x = a_BlockX;
|
|
|
|
self.m_Coords1.z = a_BlockZ;
|
|
|
|
self.m_LastCoords = 1;
|
|
|
|
self.m_HasCoords1 = true;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--- Sets the second set of coords (upon lclk with a wand)
|
|
|
|
function cCommandState:SetCoords2(a_BlockX, a_BlockZ)
|
|
|
|
self.m_Coords2.x = a_BlockX;
|
|
|
|
self.m_Coords2.z = a_BlockZ;
|
|
|
|
self.m_LastCoords = 2;
|
|
|
|
self.m_HasCoords2 = true;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--- Returns the cCommandState for the specified player; creates one if not existant
|
|
|
|
function GetCommandStateForPlayer(a_Player)
|
|
|
|
local res = g_CommandStates[a_Player:GetUniqueID()];
|
|
|
|
if (res == nil) then
|
|
|
|
res = cCommandState:new();
|
|
|
|
g_CommandStates[a_Player:GetUniqueID()] = res;
|
|
|
|
end
|
|
|
|
return res;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|