summaryrefslogtreecommitdiffstats
path: root/MCServer/Plugins/ProtectionAreas/CommandState.lua
blob: f6d33d356a780c9d04a8cf4590969487de22329b (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

-- 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;