From 1b290b577d6ee1ed63aff9fee72709713a33d9ff Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 4 Jun 2013 16:48:32 -0700 Subject: [PATCH] Fix for potential nullptr when using base lua class constructors in debug mode, also added eq.get_qglobals and removed automatic export of them (will do this for a lot of other automatic exports) --- zone/lua_client.h | 2 +- zone/lua_corpse.h | 2 +- zone/lua_entity.h | 2 +- zone/lua_entity_list.h | 2 +- zone/lua_general.cpp | 48 +++++++++++++++++++++++++++++++++++++++--- zone/lua_group.h | 2 +- zone/lua_hate_list.h | 2 +- zone/lua_item.h | 2 +- zone/lua_iteminst.h | 2 +- zone/lua_mob.h | 2 +- zone/lua_npc.h | 2 +- zone/lua_object.h | 2 +- zone/lua_parser.cpp | 27 ------------------------ zone/lua_parser.h | 1 - zone/lua_raid.h | 2 +- zone/lua_spell.h | 2 +- 16 files changed, 58 insertions(+), 44 deletions(-) diff --git a/zone/lua_client.h b/zone/lua_client.h index 3450149de..d39a58831 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -19,7 +19,7 @@ class Lua_Client : public Lua_Mob { typedef Client NativeType; public: - Lua_Client() { } + Lua_Client() { SetLuaPtrData(nullptr); } Lua_Client(Client *d) { SetLuaPtrData(d); } virtual ~Lua_Client() { } diff --git a/zone/lua_corpse.h b/zone/lua_corpse.h index 3909cd190..3ae7a0960 100644 --- a/zone/lua_corpse.h +++ b/zone/lua_corpse.h @@ -17,7 +17,7 @@ class Lua_Corpse : public Lua_Mob { typedef Corpse NativeType; public: - Lua_Corpse() { } + Lua_Corpse() { SetLuaPtrData(nullptr); } Lua_Corpse(Corpse *d) { SetLuaPtrData(d); } virtual ~Lua_Corpse() { } diff --git a/zone/lua_entity.h b/zone/lua_entity.h index 9ca37bd3b..4270a2cd0 100644 --- a/zone/lua_entity.h +++ b/zone/lua_entity.h @@ -25,7 +25,7 @@ class Lua_Entity : public Lua_Ptr { typedef Entity NativeType; public: - Lua_Entity() { } + Lua_Entity() : Lua_Ptr(nullptr) { } Lua_Entity(Entity *d) : Lua_Ptr(d) { } virtual ~Lua_Entity() { } diff --git a/zone/lua_entity_list.h b/zone/lua_entity_list.h index f0e53cfee..4121dbc73 100644 --- a/zone/lua_entity_list.h +++ b/zone/lua_entity_list.h @@ -36,7 +36,7 @@ class Lua_EntityList : public Lua_Ptr { typedef EntityList NativeType; public: - Lua_EntityList() { } + Lua_EntityList() : Lua_Ptr(nullptr) { } Lua_EntityList(EntityList *d) : Lua_Ptr(d) { } virtual ~Lua_EntityList() { } diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 052fd4f9a..cac88c2c0 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -10,9 +10,11 @@ #include "lua_parser.h" #include "lua_item.h" #include "lua_iteminst.h" -#include "lua_mob.h" +#include "lua_client.h" +#include "lua_npc.h" #include "QuestParserCollection.h" #include "questmgr.h" +#include "QGlobals.h" struct Events { }; struct Factions { }; @@ -354,7 +356,6 @@ void lua_set_proximity(float min_x, float max_x, float min_y, float max_y, float quest_manager.set_proximity(min_x, max_x, min_y, max_y, min_z, max_z); } - void lua_clear_proximity() { quest_manager.clear_proximity(); } @@ -724,6 +725,42 @@ void lua_cross_zone_message_player_by_name(uint32 type, const char *player, cons quest_manager.CrossZoneMessagePlayerByName(type, player, message); } +luabind::object lua_get_qglobals(lua_State *L, Lua_NPC npc, Lua_Client client) { + luabind::object ret = luabind::newtable(L); + + NPC *n = npc; + Client *c = client; + + if(n && !n->GetQglobal()) { + return ret; + } + + std::list global_map; + QGlobalCache::GetQGlobals(global_map, n, c, zone); + auto iter = global_map.begin(); + while(iter != global_map.end()) { + ret[(*iter).name] = (*iter).value; + ++iter; + } + return ret; +} + +luabind::object lua_get_qglobals(lua_State *L, Lua_Client client, Lua_NPC npc) { + return lua_get_qglobals(L, npc, client); +} + +luabind::object lua_get_qglobals(lua_State *L, Lua_Client client) { + return lua_get_qglobals(L, Lua_NPC(nullptr), client); +} + +luabind::object lua_get_qglobals(lua_State *L, Lua_NPC npc) { + return lua_get_qglobals(L, npc, Lua_Client(nullptr)); +} + +luabind::object lua_get_qglobals(lua_State *L) { + return lua_get_qglobals(L, Lua_NPC(nullptr), Lua_Client(nullptr)); +} + luabind::scope lua_register_general() { return luabind::namespace_("eq") @@ -855,7 +892,12 @@ luabind::scope lua_register_general() { luabind::def("send_mail", &lua_send_mail), luabind::def("cross_zone_signal_client_by_char_id", &lua_cross_zone_signal_client_by_char_id), luabind::def("cross_zone_signal_client_by_name", &lua_cross_zone_signal_client_by_name), - luabind::def("cross_zone_message_player_by_name", &lua_cross_zone_message_player_by_name) + luabind::def("cross_zone_message_player_by_name", &lua_cross_zone_message_player_by_name), + luabind::def("get_qglobals", (luabind::object(*)(lua_State*,Lua_NPC,Lua_Client))&lua_get_qglobals), + luabind::def("get_qglobals", (luabind::object(*)(lua_State*,Lua_Client,Lua_NPC))&lua_get_qglobals), + luabind::def("get_qglobals", (luabind::object(*)(lua_State*,Lua_Client))&lua_get_qglobals), + luabind::def("get_qglobals", (luabind::object(*)(lua_State*,Lua_NPC))&lua_get_qglobals), + luabind::def("get_qglobals", (luabind::object(*)(lua_State*))&lua_get_qglobals) ]; } diff --git a/zone/lua_group.h b/zone/lua_group.h index ef4a24355..92069c7a1 100644 --- a/zone/lua_group.h +++ b/zone/lua_group.h @@ -18,7 +18,7 @@ class Lua_Group : public Lua_Ptr { typedef Group NativeType; public: - Lua_Group() { } + Lua_Group() : Lua_Ptr(nullptr) { } Lua_Group(Group *d) : Lua_Ptr(d) { } virtual ~Lua_Group() { } diff --git a/zone/lua_hate_list.h b/zone/lua_hate_list.h index d5a952fca..da5070bd1 100644 --- a/zone/lua_hate_list.h +++ b/zone/lua_hate_list.h @@ -14,7 +14,7 @@ class Lua_HateEntry : public Lua_Ptr { typedef tHateEntry NativeType; public: - Lua_HateEntry() { } + Lua_HateEntry() : Lua_Ptr(nullptr) { } Lua_HateEntry(tHateEntry *d) : Lua_Ptr(d) { } virtual ~Lua_HateEntry() { } diff --git a/zone/lua_item.h b/zone/lua_item.h index 586d74fb7..335d0bb99 100644 --- a/zone/lua_item.h +++ b/zone/lua_item.h @@ -17,7 +17,7 @@ class Lua_Item : public Lua_Ptr typedef const Item_Struct NativeType; public: Lua_Item(uint32 item_id); - Lua_Item() { } + Lua_Item() : Lua_Ptr(nullptr) { } Lua_Item(const Item_Struct *d) : Lua_Ptr(d) { } virtual ~Lua_Item() { } diff --git a/zone/lua_iteminst.h b/zone/lua_iteminst.h index 184f2331b..5b03278bc 100644 --- a/zone/lua_iteminst.h +++ b/zone/lua_iteminst.h @@ -17,7 +17,7 @@ class Lua_ItemInst : public Lua_Ptr { typedef ItemInst NativeType; public: - Lua_ItemInst() { } + Lua_ItemInst() : Lua_Ptr(nullptr) { } Lua_ItemInst(ItemInst *d) : Lua_Ptr(d) { } virtual ~Lua_ItemInst() { } diff --git a/zone/lua_mob.h b/zone/lua_mob.h index 6a87989e3..e983f5653 100644 --- a/zone/lua_mob.h +++ b/zone/lua_mob.h @@ -20,7 +20,7 @@ class Lua_Mob : public Lua_Entity { typedef Mob NativeType; public: - Lua_Mob() { } + Lua_Mob() { SetLuaPtrData(nullptr); } Lua_Mob(Mob *d) { SetLuaPtrData(d); } virtual ~Lua_Mob() { } diff --git a/zone/lua_npc.h b/zone/lua_npc.h index c60505beb..fdbc66bd1 100644 --- a/zone/lua_npc.h +++ b/zone/lua_npc.h @@ -19,7 +19,7 @@ class Lua_NPC : public Lua_Mob { typedef NPC NativeType; public: - Lua_NPC() { } + Lua_NPC() { SetLuaPtrData(nullptr); } Lua_NPC(NPC *d) { SetLuaPtrData(d); } virtual ~Lua_NPC() { } diff --git a/zone/lua_object.h b/zone/lua_object.h index c965090a1..9aa89d1da 100644 --- a/zone/lua_object.h +++ b/zone/lua_object.h @@ -16,7 +16,7 @@ class Lua_Object : public Lua_Entity { typedef Object NativeType; public: - Lua_Object() { } + Lua_Object() { SetLuaPtrData(nullptr); } Lua_Object(Object *d) { SetLuaPtrData(d); } virtual ~Lua_Object() { } diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp index a9b5f6f86..af812ba52 100644 --- a/zone/lua_parser.cpp +++ b/zone/lua_parser.cpp @@ -27,7 +27,6 @@ #include "lua_object.h" #include "lua_door.h" #include "lua_general.h" -#include "QGlobals.h" #include "questmgr.h" #include "zone.h" #include "lua_parser.h" @@ -229,7 +228,6 @@ int LuaParser::_EventNPC(std::string package_name, QuestEventID evt, NPC* npc, M arg_function(this, L, npc, init, data, extra_data); ExportZoneVariables(); Client *c = (init && init->IsClient()) ? init->CastToClient() : nullptr; - ExportQGlobals(npc, c); quest_manager.StartQuest(npc, c, nullptr); if(lua_pcall(L, 1, 1, 0)) { @@ -320,7 +318,6 @@ int LuaParser::_EventPlayer(std::string package_name, QuestEventID evt, Client * auto arg_function = PlayerArgumentDispatch[evt]; arg_function(this, L, client, data, extra_data); ExportZoneVariables(); - ExportQGlobals(nullptr, client); quest_manager.StartQuest(nullptr, client, nullptr); if(lua_pcall(L, 1, 1, 0)) { @@ -416,7 +413,6 @@ int LuaParser::_EventItem(std::string package_name, QuestEventID evt, Client *cl auto arg_function = ItemArgumentDispatch[evt]; arg_function(this, L, client, item, objid, extra_data); ExportZoneVariables(); - ExportQGlobals(nullptr, nullptr); quest_manager.StartQuest(nullptr, client, item); if(lua_pcall(L, 1, 1, 0)) { @@ -498,7 +494,6 @@ int LuaParser::_EventSpell(std::string package_name, QuestEventID evt, NPC* npc, auto arg_function = SpellArgumentDispatch[evt]; arg_function(this, L, npc, client, spell_id, extra_data); ExportZoneVariables(); - ExportQGlobals(npc, client); quest_manager.StartQuest(npc, client, nullptr); if(lua_pcall(L, 1, 1, 0)) { @@ -560,7 +555,6 @@ int LuaParser::_EventEncounter(std::string package_name, QuestEventID evt, std:: lua_setfield(L, -2, "name"); ExportZoneVariables(); - ExportQGlobals(nullptr, nullptr); quest_manager.StartQuest(nullptr, nullptr, nullptr); if(lua_pcall(L, 1, 1, 0)) { @@ -961,27 +955,6 @@ void LuaParser::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, u } } -void LuaParser::ExportQGlobals(NPC *n, Client *c) { - lua_createtable(L, 0, 0); - - if(n && !n->GetQglobal()) { - lua_setfield(L, -2, "qglobals"); - return; - } - - std::list global_map; - QGlobalCache::GetQGlobals(global_map, n, c, zone); - - auto iter = global_map.begin(); - while(iter != global_map.end()) { - lua_pushstring(L, (*iter).value.c_str()); - lua_setfield(L, -2, (*iter).name.c_str()); - ++iter; - } - - lua_setfield(L, -2, "qglobals"); -} - void LuaParser::ExportZoneVariables() { if(zone == nullptr) { return; diff --git a/zone/lua_parser.h b/zone/lua_parser.h index 98418c7f8..4219c9e2e 100644 --- a/zone/lua_parser.h +++ b/zone/lua_parser.h @@ -75,7 +75,6 @@ private: bool HasFunction(std::string function, std::string package_name); void ClearStates(); void MapFunctions(lua_State *L); - void ExportQGlobals(NPC *n, Client *c); void ExportZoneVariables(); std::map vars_; diff --git a/zone/lua_raid.h b/zone/lua_raid.h index 9485574ac..8cc8ec778 100644 --- a/zone/lua_raid.h +++ b/zone/lua_raid.h @@ -18,7 +18,7 @@ class Lua_Raid : public Lua_Ptr { typedef Raid NativeType; public: - Lua_Raid() { } + Lua_Raid() : Lua_Ptr(nullptr) { } Lua_Raid(Raid *d) : Lua_Ptr(d) { } virtual ~Lua_Raid() { } diff --git a/zone/lua_spell.h b/zone/lua_spell.h index 5b90da331..d87c3654c 100644 --- a/zone/lua_spell.h +++ b/zone/lua_spell.h @@ -16,7 +16,7 @@ class Lua_Spell : public Lua_Ptr { typedef const SPDat_Spell_Struct NativeType; public: - Lua_Spell() { } + Lua_Spell() : Lua_Ptr(nullptr) { } Lua_Spell(const SPDat_Spell_Struct *d) : Lua_Ptr(d) { } virtual ~Lua_Spell() { }