Skip to content

Commit 21cd9be

Browse files
committed
Separate methods per state
1 parent 922302c commit 21cd9be

File tree

2 files changed

+113
-40
lines changed

2 files changed

+113
-40
lines changed

src/LuaEngine/ALETemplate.h

Lines changed: 77 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,32 @@ extern "C"
1818
#include "ALEUtility.h"
1919
#include "SharedDefines.h"
2020

21+
enum MethodRegisterState
22+
{
23+
METHOD_REG_MAP = 0,
24+
METHOD_REG_WORLD = 1,
25+
METHOD_REG_ALL = 2
26+
};
27+
28+
struct ALEGlobalRegister
29+
{
30+
const char* name;
31+
int(*func)(lua_State*);
32+
MethodRegisterState regState;
33+
34+
ALEGlobalRegister(const char* name, int(*f)(lua_State*), MethodRegisterState state = METHOD_REG_ALL)
35+
: name(name), func(f), regState(state) {}
36+
37+
ALEGlobalRegister(const char* name, MethodRegisterState state = METHOD_REG_ALL)
38+
: name(name), func(nullptr), regState(state) {}
39+
};
40+
2141
class ALEGlobal
2242
{
2343
public:
2444
static int thunk(lua_State* L)
2545
{
26-
luaL_Reg* l = static_cast<luaL_Reg*>(lua_touserdata(L, lua_upvalueindex(1)));
46+
ALEGlobalRegister* l = static_cast<ALEGlobalRegister*>(lua_touserdata(L, lua_upvalueindex(1)));
2747
int top = lua_gettop(L);
2848
int expected = l->func(L);
2949
int args = lua_gettop(L) - top;
@@ -36,15 +56,38 @@ class ALEGlobal
3656
return expected;
3757
}
3858

39-
static void SetMethods(ALE* E, luaL_Reg* methodTable)
59+
static int MethodWrongState(lua_State* L)
60+
{
61+
luaL_error(L, "attempt to call method '%s' that is not available in this state", lua_tostring(L, lua_upvalueindex(1)));
62+
return 0;
63+
}
64+
65+
static void SetMethods(ALE* E, ALEGlobalRegister* methodTable)
4066
{
4167
ASSERT(E);
4268
ASSERT(methodTable);
4369

4470
lua_pushglobaltable(E->L);
4571

46-
for (; methodTable && methodTable->name && methodTable->func; ++methodTable)
72+
for (; methodTable && methodTable->name; ++methodTable)
4773
{
74+
if (methodTable->regState != METHOD_REG_ALL)
75+
{
76+
bool isMapState = (E->GetStateMapId() != ALE_GLOBAL_STATE);
77+
if ((!isMapState && methodTable->regState == METHOD_REG_MAP) ||
78+
(isMapState && methodTable->regState == METHOD_REG_WORLD))
79+
{
80+
lua_pushstring(E->L, methodTable->name);
81+
lua_pushstring(E->L, methodTable->name);
82+
lua_pushcclosure(E->L, MethodWrongState, 1);
83+
lua_rawset(E->L, -3);
84+
continue;
85+
}
86+
}
87+
88+
if (!methodTable->func)
89+
continue;
90+
4891
lua_pushstring(E->L, methodTable->name);
4992
lua_pushlightuserdata(E->L, (void*)methodTable);
5093
lua_pushcclosure(E->L, thunk, 1);
@@ -117,6 +160,13 @@ struct ALERegister
117160
{
118161
const char* name;
119162
int(*mfunc)(lua_State*, T*);
163+
MethodRegisterState regState;
164+
165+
ALERegister(const char* name, int(*func)(lua_State*, T*), MethodRegisterState state = METHOD_REG_ALL)
166+
: name(name), mfunc(func), regState(state) {}
167+
168+
ALERegister(const char* name, MethodRegisterState state = METHOD_REG_ALL)
169+
: name(name), mfunc(nullptr), regState(state) {}
120170
};
121171

122172
template<typename T>
@@ -241,8 +291,25 @@ class ALETemplate
241291
lua_rawget(E->L, LUA_REGISTRYINDEX);
242292
ASSERT(lua_istable(E->L, -1));
243293

244-
for (; methodTable && methodTable->name && methodTable->mfunc; ++methodTable)
294+
for (; methodTable && methodTable->name; ++methodTable)
245295
{
296+
if (methodTable->regState != METHOD_REG_ALL)
297+
{
298+
bool isMapState = (E->GetStateMapId() != ALE_GLOBAL_STATE);
299+
if ((!isMapState && methodTable->regState == METHOD_REG_MAP) ||
300+
(isMapState && methodTable->regState == METHOD_REG_WORLD))
301+
{
302+
lua_pushstring(E->L, methodTable->name);
303+
lua_pushstring(E->L, methodTable->name);
304+
lua_pushcclosure(E->L, MethodWrongState, 1);
305+
lua_rawset(E->L, -3);
306+
continue;
307+
}
308+
}
309+
310+
if (!methodTable->mfunc)
311+
continue;
312+
246313
lua_pushstring(E->L, methodTable->name);
247314
lua_pushlightuserdata(E->L, (void*)methodTable);
248315
lua_pushcclosure(E->L, CallMethod, 1);
@@ -322,6 +389,12 @@ class ALETemplate
322389
return 0;
323390
}
324391

392+
static int MethodWrongState(lua_State* L)
393+
{
394+
luaL_error(L, "attempt to call method '%s' that is not available in this state", lua_tostring(L, lua_upvalueindex(1)));
395+
return 0;
396+
}
397+
325398
static int CallMethod(lua_State* L)
326399
{
327400
T* obj = ALE::CHECKOBJ<T>(L, 1); // get self

src/LuaEngine/LuaFunctions.cpp

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ extern "C"
5050
#include "GemPropertiesEntryMethods.h"
5151
#include "SpellEntryMethods.h"
5252

53-
luaL_Reg GlobalMethods[] =
53+
ALEGlobalRegister GlobalMethods[] =
5454
{
5555
// Hooks
5656
{ "RegisterPacketEvent", &LuaGlobalFunctions::RegisterPacketEvent },
@@ -101,14 +101,14 @@ luaL_Reg GlobalMethods[] =
101101
{ "GetRealmID", &LuaGlobalFunctions::GetRealmID },
102102
{ "GetCoreVersion", &LuaGlobalFunctions::GetCoreVersion },
103103
{ "GetCoreExpansion", &LuaGlobalFunctions::GetCoreExpansion },
104-
{ "GetStateMap", &LuaGlobalFunctions::GetStateMap },
104+
{ "GetStateMap", &LuaGlobalFunctions::GetStateMap, METHOD_REG_MAP }, // Map state method only in multistate
105105
{ "GetStateMapId", &LuaGlobalFunctions::GetStateMapId },
106106
{ "GetStateInstanceId", &LuaGlobalFunctions::GetStateInstanceId },
107107
{ "GetQuest", &LuaGlobalFunctions::GetQuest },
108-
{ "GetPlayerByGUID", &LuaGlobalFunctions::GetPlayerByGUID },
109-
{ "GetPlayerByName", &LuaGlobalFunctions::GetPlayerByName },
108+
{ "GetPlayerByGUID", &LuaGlobalFunctions::GetPlayerByGUID, METHOD_REG_WORLD }, // World state method only in multistate
109+
{ "GetPlayerByName", &LuaGlobalFunctions::GetPlayerByName, METHOD_REG_WORLD }, // World state method only in multistate
110110
{ "GetGameTime", &LuaGlobalFunctions::GetGameTime },
111-
{ "GetPlayersInWorld", &LuaGlobalFunctions::GetPlayersInWorld },
111+
{ "GetPlayersInWorld", &LuaGlobalFunctions::GetPlayersInWorld, METHOD_REG_WORLD }, // World state method only in multistate
112112
{ "GetGuildByName", &LuaGlobalFunctions::GetGuildByName },
113113
{ "GetGuildByLeaderGUID", &LuaGlobalFunctions::GetGuildByLeaderGUID },
114114
{ "GetPlayerCount", &LuaGlobalFunctions::GetPlayerCount },
@@ -130,7 +130,7 @@ luaL_Reg GlobalMethods[] =
130130
{ "bit_or", &LuaGlobalFunctions::bit_or },
131131
{ "bit_and", &LuaGlobalFunctions::bit_and },
132132
{ "GetItemLink", &LuaGlobalFunctions::GetItemLink },
133-
{ "GetMapById", &LuaGlobalFunctions::GetMapById },
133+
{ "GetMapById", &LuaGlobalFunctions::GetMapById, METHOD_REG_WORLD }, // World state method only in multistate
134134
{ "GetCurrTime", &LuaGlobalFunctions::GetCurrTime },
135135
{ "GetTimeDiff", &LuaGlobalFunctions::GetTimeDiff },
136136
{ "PrintInfo", &LuaGlobalFunctions::PrintInfo },
@@ -180,7 +180,7 @@ luaL_Reg GlobalMethods[] =
180180
{ "StartGameEvent", &LuaGlobalFunctions::StartGameEvent },
181181
{ "StopGameEvent", &LuaGlobalFunctions::StopGameEvent },
182182
{ "HttpRequest", &LuaGlobalFunctions::HttpRequest },
183-
{ "SetOwnerHalaa", &LuaGlobalFunctions::SetOwnerHalaa },
183+
{ "SetOwnerHalaa", &LuaGlobalFunctions::SetOwnerHalaa, METHOD_REG_WORLD }, // World state method only in multistate
184184
{ "LookupEntry", &LuaGlobalFunctions::LookupEntry },
185185

186186
{ NULL, NULL }
@@ -278,9 +278,9 @@ ALERegister<WorldObject> WorldObjectMethods[] =
278278
{ "SummonGameObject", &LuaWorldObject::SummonGameObject },
279279
{ "SpawnCreature", &LuaWorldObject::SpawnCreature },
280280
{ "SendPacket", &LuaWorldObject::SendPacket },
281-
{ "RegisterEvent", &LuaWorldObject::RegisterEvent },
282-
{ "RemoveEventById", &LuaWorldObject::RemoveEventById },
283-
{ "RemoveEvents", &LuaWorldObject::RemoveEvents },
281+
{ "RegisterEvent", &LuaWorldObject::RegisterEvent, METHOD_REG_MAP }, // Map state method only in multistate
282+
{ "RemoveEventById", &LuaWorldObject::RemoveEventById, METHOD_REG_MAP }, // Map state method only in multistate
283+
{ "RemoveEvents", &LuaWorldObject::RemoveEvents, METHOD_REG_MAP }, // Map state method only in multistate
284284
{ "PlayMusic", &LuaWorldObject::PlayMusic },
285285
{ "PlayDirectSound", &LuaWorldObject::PlayDirectSound },
286286
{ "PlayDistanceSound", &LuaWorldObject::PlayDistanceSound },
@@ -813,8 +813,8 @@ ALERegister<Player> PlayerMethods[] =
813813
{ "Mute", &LuaPlayer::Mute },
814814
{ "SummonPlayer", &LuaPlayer::SummonPlayer },
815815
{ "SaveToDB", &LuaPlayer::SaveToDB },
816-
{ "GroupInvite", &LuaPlayer::GroupInvite },
817-
{ "GroupCreate", &LuaPlayer::GroupCreate },
816+
{ "GroupInvite", &LuaPlayer::GroupInvite, METHOD_REG_WORLD }, // World state method only in multistate
817+
{ "GroupCreate", &LuaPlayer::GroupCreate, METHOD_REG_WORLD }, // World state method only in multistate
818818
{ "SendCinematicStart", &LuaPlayer::SendCinematicStart },
819819
{ "SendMovieStart", &LuaPlayer::SendMovieStart },
820820
{ "UpdatePlayerSetting", &LuaPlayer::UpdatePlayerSetting },
@@ -1149,7 +1149,7 @@ ALERegister<Quest> QuestMethods[] =
11491149
ALERegister<Group> GroupMethods[] =
11501150
{
11511151
// Getters
1152-
{ "GetMembers", &LuaGroup::GetMembers },
1152+
{ "GetMembers", &LuaGroup::GetMembers, METHOD_REG_WORLD }, // World state method only in multistate
11531153
{ "GetLeaderGUID", &LuaGroup::GetLeaderGUID },
11541154
{ "GetGUID", &LuaGroup::GetGUID },
11551155
{ "GetMemberGroup", &LuaGroup::GetMemberGroup },
@@ -1158,16 +1158,16 @@ ALERegister<Group> GroupMethods[] =
11581158
{ "GetGroupType", &LuaGroup::GetGroupType },
11591159

11601160
// Setters
1161-
{ "SetLeader", &LuaGroup::SetLeader },
1162-
{ "SetMembersGroup", &LuaGroup::SetMembersGroup },
1163-
{ "SetTargetIcon", &LuaGroup::SetTargetIcon },
1164-
{ "SetMemberFlag", &LuaGroup::SetMemberFlag },
1161+
{ "SetLeader", &LuaGroup::SetLeader, METHOD_REG_WORLD }, // World state method only in multistate
1162+
{ "SetMembersGroup", &LuaGroup::SetMembersGroup, METHOD_REG_WORLD }, // World state method only in multistate
1163+
{ "SetTargetIcon", &LuaGroup::SetTargetIcon, METHOD_REG_WORLD }, // World state method only in multistate
1164+
{ "SetMemberFlag", &LuaGroup::SetMemberFlag, METHOD_REG_WORLD }, // World state method only in multistate
11651165

11661166
// Boolean
11671167
{ "IsLeader", &LuaGroup::IsLeader },
1168-
{ "AddMember", &LuaGroup::AddMember },
1169-
{ "RemoveMember", &LuaGroup::RemoveMember },
1170-
{ "Disband", &LuaGroup::Disband },
1168+
{ "AddMember", &LuaGroup::AddMember, METHOD_REG_WORLD }, // World state method only in multistate
1169+
{ "RemoveMember", &LuaGroup::RemoveMember, METHOD_REG_WORLD }, // World state method only in multistate
1170+
{ "Disband", &LuaGroup::Disband, METHOD_REG_WORLD }, // World state method only in multistate
11711171
{ "IsFull", &LuaGroup::IsFull },
11721172
{ "IsLFGGroup", &LuaGroup::IsLFGGroup },
11731173
{ "IsRaidGroup", &LuaGroup::IsRaidGroup },
@@ -1181,16 +1181,16 @@ ALERegister<Group> GroupMethods[] =
11811181
// Other
11821182
{ "SendPacket", &LuaGroup::SendPacket },
11831183
// {"ConvertToLFG", &LuaGroup::ConvertToLFG}, // :ConvertToLFG() - UNDOCUMENTED - Converts the group to an LFG group
1184-
{ "ConvertToRaid", &LuaGroup::ConvertToRaid },
1184+
{ "ConvertToRaid", &LuaGroup::ConvertToRaid, METHOD_REG_WORLD }, // World state method only in multistate
11851185

11861186
{ NULL, NULL }
11871187
};
11881188

11891189
ALERegister<Guild> GuildMethods[] =
11901190
{
11911191
// Getters
1192-
{ "GetMembers", &LuaGuild::GetMembers },
1193-
{ "GetLeader", &LuaGuild::GetLeader },
1192+
{ "GetMembers", &LuaGuild::GetMembers, METHOD_REG_WORLD }, // World state method only in multistate
1193+
{ "GetLeader", &LuaGuild::GetLeader, METHOD_REG_WORLD }, // World state method only in multistate
11941194
{ "GetLeaderGUID", &LuaGuild::GetLeaderGUID },
11951195
{ "GetId", &LuaGuild::GetId },
11961196
{ "GetName", &LuaGuild::GetName },
@@ -1201,24 +1201,24 @@ ALERegister<Guild> GuildMethods[] =
12011201
{ "GetTotalBankMoney", &LuaGuild::GetTotalBankMoney },
12021202

12031203
// Setters
1204-
{ "SetBankTabText", &LuaGuild::SetBankTabText },
1205-
{ "SetMemberRank", &LuaGuild::SetMemberRank },
1206-
{ "SetLeader", &LuaGuild::SetLeader },
1207-
{ "SetName", &LuaGuild::SetName },
1204+
{ "SetBankTabText", &LuaGuild::SetBankTabText, METHOD_REG_WORLD }, // World state method only in multistate
1205+
{ "SetMemberRank", &LuaGuild::SetMemberRank, METHOD_REG_WORLD }, // World state method only in multistate
1206+
{ "SetLeader", &LuaGuild::SetLeader, METHOD_REG_WORLD }, // World state method only in multistate
1207+
{ "SetName", &LuaGuild::SetName, METHOD_REG_WORLD }, // World state method only in multistate
12081208

12091209
// Other
12101210
{ "SendPacket", &LuaGuild::SendPacket },
12111211
{ "SendPacketToRanked", &LuaGuild::SendPacketToRanked },
1212-
{ "Disband", &LuaGuild::Disband },
1213-
{ "AddMember", &LuaGuild::AddMember },
1214-
{ "DeleteMember", &LuaGuild::DeleteMember },
1212+
{ "Disband", &LuaGuild::Disband, METHOD_REG_WORLD }, // World state method only in multistate
1213+
{ "AddMember", &LuaGuild::AddMember, METHOD_REG_WORLD }, // World state method only in multistate
1214+
{ "DeleteMember", &LuaGuild::DeleteMember, METHOD_REG_WORLD }, // World state method only in multistate
12151215
{ "SendMessage", &LuaGuild::SendMessage },
1216-
{ "UpdateMemberData", &LuaGuild::UpdateMemberData },
1217-
{ "MassInviteToEvent", &LuaGuild::MassInviteToEvent },
1218-
{ "SwapItems", &LuaGuild::SwapItems },
1219-
{ "SwapItemsWithInventory", &LuaGuild::SwapItemsWithInventory },
1220-
{ "ResetTimes", &LuaGuild::ResetTimes },
1221-
{ "ModifyBankMoney", &LuaGuild::ModifyBankMoney },
1216+
{ "UpdateMemberData", &LuaGuild::UpdateMemberData, METHOD_REG_WORLD }, // World state method only in multistate
1217+
{ "MassInviteToEvent", &LuaGuild::MassInviteToEvent, METHOD_REG_WORLD }, // World state method only in multistate
1218+
{ "SwapItems", &LuaGuild::SwapItems, METHOD_REG_WORLD }, // World state method only in multistate
1219+
{ "SwapItemsWithInventory", &LuaGuild::SwapItemsWithInventory, METHOD_REG_WORLD }, // World state method only in multistate
1220+
{ "ResetTimes", &LuaGuild::ResetTimes, METHOD_REG_WORLD }, // World state method only in multistate
1221+
{ "ModifyBankMoney", &LuaGuild::ModifyBankMoney, METHOD_REG_WORLD }, // World state method only in multistate
12221222

12231223
{ NULL, NULL }
12241224
};

0 commit comments

Comments
 (0)