From 957f05860bfa44a5c99ae0a493aebe1ba33d5af3 Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 4 Nov 2014 21:01:20 -0800 Subject: [PATCH] Small changes to encounter stuff --- zone/lua_general.cpp | 103 ++++++++++++++++++++++++++++++++++++------- zone/lua_parser.cpp | 4 +- zone/questmgr.cpp | 14 +++++- zone/questmgr.h | 4 +- 4 files changed, 105 insertions(+), 20 deletions(-) diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 686466b1f..f0d374870 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -32,20 +32,34 @@ struct lua_registered_event { }; extern std::map> lua_encounter_events_registered; +extern std::map lua_encounters_loaded; extern void MapOpcodes(); extern void ClearMappedOpcode(EmuOpcode op); +void unregister_event(std::string package_name, std::string name, int evt); + void load_encounter(std::string name) { + if(lua_encounters_loaded.count(name) > 0) + return; + + lua_encounters_loaded[name] = true; parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, 0); } void load_encounter_with_data(std::string name, std::string info_str) { + if(lua_encounters_loaded.count(name) > 0) + return; + + lua_encounters_loaded[name] = true; std::vector info_ptrs; info_ptrs.push_back(&info_str); parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, 0, &info_ptrs); } void unload_encounter(std::string name) { + if(lua_encounters_loaded.count(name) == 0) + return; + auto liter = lua_encounter_events_registered.begin(); while(liter != lua_encounter_events_registered.end()) { std::list &elist = liter->second; @@ -65,10 +79,13 @@ void unload_encounter(std::string name) { } } + lua_encounters_loaded.erase(name); parse->EventEncounter(EVENT_ENCOUNTER_UNLOAD, name, 0); } void unload_encounter_with_data(std::string name, std::string info_str) { + if(lua_encounters_loaded.count(name) == 0) + return; auto liter = lua_encounter_events_registered.begin(); while(liter != lua_encounter_events_registered.end()) { @@ -91,12 +108,18 @@ void unload_encounter_with_data(std::string name, std::string info_str) { } } + lua_encounters_loaded.erase(name); std::vector info_ptrs; info_ptrs.push_back(&info_str); parse->EventEncounter(EVENT_ENCOUNTER_UNLOAD, name, 0, &info_ptrs); } void register_event(std::string package_name, std::string name, int evt, luabind::adl::object func) { + if(lua_encounters_loaded.count(name) == 0) + return; + + unregister_event(package_name, name, evt); + lua_registered_event e; e.encounter_name = name; e.lua_reference = func; @@ -109,15 +132,6 @@ void register_event(std::string package_name, std::string name, int evt, luabind lua_encounter_events_registered[package_name] = elist; } else { std::list &elist = liter->second; - auto iter = elist.begin(); - while(iter != elist.end()) { - if(iter->event_id == evt && iter->encounter_name.compare(name) == 0) { - //already registered this event for this encounter - return; - } - ++iter; - } - elist.push_back(e); } } @@ -130,6 +144,7 @@ void unregister_event(std::string package_name, std::string name, int evt) { while(iter != elist.end()) { if(iter->event_id == evt && iter->encounter_name.compare(name) == 0) { iter = elist.erase(iter); + break; } } lua_encounter_events_registered[package_name] = elist; @@ -145,6 +160,11 @@ void register_npc_event(std::string name, int evt, int npc_id, luabind::adl::obj } } +void register_npc_event(int evt, int npc_id, luabind::adl::object func) { + std::string name = quest_manager.GetEncounter(); + register_npc_event(name, evt, npc_id, func); +} + void unregister_npc_event(std::string name, int evt, int npc_id) { std::stringstream package_name; package_name << "npc_" << npc_id; @@ -152,16 +172,31 @@ void unregister_npc_event(std::string name, int evt, int npc_id) { unregister_event(package_name.str(), name, evt); } +void unregister_npc_event(int evt, int npc_id) { + std::string name = quest_manager.GetEncounter(); + unregister_npc_event(name, evt, npc_id); +} + void register_player_event(std::string name, int evt, luabind::adl::object func) { if(luabind::type(func) == LUA_TFUNCTION) { register_event("player", name, evt, func); } } +void register_player_event(int evt, luabind::adl::object func) { + std::string name = quest_manager.GetEncounter(); + register_player_event(name, evt, func); +} + void unregister_player_event(std::string name, int evt) { unregister_event("player", name, evt); } +void unregister_player_event(int evt) { + std::string name = quest_manager.GetEncounter(); + unregister_player_event(name, evt); +} + void register_item_event(std::string name, int evt, int item_id, luabind::adl::object func) { std::string package_name = "item_"; package_name += std::to_string(static_cast(item_id)); @@ -171,6 +206,11 @@ void register_item_event(std::string name, int evt, int item_id, luabind::adl::o } } +void register_item_event(int evt, int item_id, luabind::adl::object func) { + std::string name = quest_manager.GetEncounter(); + register_item_event(name, evt, item_id, func); +} + void unregister_item_event(std::string name, int evt, int item_id) { std::string package_name = "item_"; package_name += std::to_string(static_cast(item_id)); @@ -178,6 +218,11 @@ void unregister_item_event(std::string name, int evt, int item_id) { unregister_event(package_name, name, evt); } +void unregister_item_event(int evt, int item_id) { + std::string name = quest_manager.GetEncounter(); + unregister_item_event(name, evt, item_id); +} + void register_spell_event(std::string name, int evt, int spell_id, luabind::adl::object func) { if(luabind::type(func) == LUA_TFUNCTION) { std::stringstream package_name; @@ -187,6 +232,11 @@ void register_spell_event(std::string name, int evt, int spell_id, luabind::adl: } } +void register_spell_event(int evt, int spell_id, luabind::adl::object func) { + std::string name = quest_manager.GetEncounter(); + register_spell_event(name, evt, spell_id, func); +} + void unregister_spell_event(std::string name, int evt, int spell_id) { std::stringstream package_name; package_name << "spell_" << spell_id; @@ -194,6 +244,11 @@ void unregister_spell_event(std::string name, int evt, int spell_id) { unregister_event(package_name.str(), name, evt); } +void unregister_spell_event(int evt, int spell_id) { + std::string name = quest_manager.GetEncounter(); + unregister_spell_event(name, evt, spell_id); +} + Lua_Mob lua_spawn2(int npc_type, int grid, int unused, double x, double y, double z, double heading) { return Lua_Mob(quest_manager.spawn2(npc_type, grid, unused, static_cast(x), static_cast(y), static_cast(z), static_cast(heading))); @@ -1161,6 +1216,11 @@ Lua_ItemInst lua_get_quest_item() { return quest_manager.GetQuestItem(); } +std::string lua_get_encounter() { + return quest_manager.GetEncounter(); +} + + void lua_map_opcodes() { MapOpcodes(); } @@ -1195,14 +1255,22 @@ luabind::scope lua_register_general() { luabind::def("unload_encounter", &unload_encounter), luabind::def("load_encounter_with_data", &load_encounter_with_data), luabind::def("unload_encounter_with_data", &unload_encounter_with_data), - luabind::def("register_npc_event", ®ister_npc_event), - luabind::def("unregister_npc_event", &unregister_npc_event), - luabind::def("register_player_event", ®ister_player_event), - luabind::def("unregister_player_event", &unregister_player_event), - luabind::def("register_item_event", ®ister_item_event), - luabind::def("unregister_item_event", &unregister_item_event), - luabind::def("register_spell_event", ®ister_spell_event), - luabind::def("unregister_spell_event", &unregister_spell_event), + luabind::def("register_npc_event", (void(*)(std::string, int, int, luabind::adl::object))®ister_npc_event), + luabind::def("register_npc_event", (void(*)(int, int, luabind::adl::object))®ister_npc_event), + luabind::def("unregister_npc_event", (void(*)(std::string, int, int))&unregister_npc_event), + luabind::def("unregister_npc_event", (void(*)(int, int))&unregister_npc_event), + luabind::def("register_player_event", (void(*)(std::string, int, luabind::adl::object))®ister_player_event), + luabind::def("register_player_event", (void(*)(int, luabind::adl::object))®ister_player_event), + luabind::def("unregister_player_event", (void(*)(std::string, int))&unregister_player_event), + luabind::def("unregister_player_event", (void(*)(int))&unregister_player_event), + luabind::def("register_item_event", (void(*)(std::string, int, int, luabind::adl::object))®ister_item_event), + luabind::def("register_item_event", (void(*)(int, int, luabind::adl::object))®ister_item_event), + luabind::def("unregister_item_event", (void(*)(std::string, int, int))&unregister_item_event), + luabind::def("unregister_item_event", (void(*)(int, int))&unregister_item_event), + luabind::def("register_spell_event", (void(*)(std::string, int, int, luabind::adl::object func))®ister_spell_event), + luabind::def("register_spell_event", (void(*)(int, int, luabind::adl::object func))®ister_spell_event), + luabind::def("unregister_spell_event", (void(*)(std::string, int, int))&unregister_spell_event), + luabind::def("unregister_spell_event", (void(*)(int, int))&unregister_spell_event), luabind::def("spawn2", (Lua_Mob(*)(int,int,int,double,double,double,double))&lua_spawn2), luabind::def("unique_spawn", (Lua_Mob(*)(int,int,int,double,double,double))&lua_unique_spawn), luabind::def("unique_spawn", (Lua_Mob(*)(int,int,int,double,double,double,double))&lua_unique_spawn), @@ -1360,6 +1428,7 @@ luabind::scope lua_register_general() { luabind::def("get_initiator", &lua_get_initiator), luabind::def("get_owner", &lua_get_owner), luabind::def("get_quest_item", &lua_get_quest_item), + luabind::def("get_encounter", &lua_get_encounter), luabind::def("map_opcodes", &lua_map_opcodes), luabind::def("clear_opcode", &lua_clear_opcode), luabind::def("enable_recipe", &lua_enable_recipe), diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp index 6f44d4fb8..dce88d5e6 100644 --- a/zone/lua_parser.cpp +++ b/zone/lua_parser.cpp @@ -126,6 +126,7 @@ struct lua_registered_event { }; std::map> lua_encounter_events_registered; +std::map lua_encounters_loaded; LuaParser::LuaParser() { for(int i = 0; i < _LargestEventID; ++i) { @@ -607,7 +608,7 @@ int LuaParser::_EventEncounter(std::string package_name, QuestEventID evt, std:: lua_setfield(L, -2, "data"); } - quest_manager.StartQuest(nullptr, nullptr, nullptr); + quest_manager.StartQuest(nullptr, nullptr, nullptr, encounter_name); if(lua_pcall(L, 1, 1, 0)) { std::string error = lua_tostring(L, -1); AddError(error); @@ -776,6 +777,7 @@ void LuaParser::ReloadQuests() { loaded_.clear(); errors_.clear(); lua_encounter_events_registered.clear(); + lua_encounters_loaded.clear(); if(L) { lua_close(L); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 7757d0a70..259630c48 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -95,6 +95,7 @@ QuestManager quest_manager; Client *initiator = nullptr; \ ItemInst* questitem = nullptr; \ bool depop_npc = false; \ + std::string encounter; \ do { \ if(!quests_running_.empty()) { \ running_quest e = quests_running_.top(); \ @@ -102,6 +103,7 @@ QuestManager quest_manager; initiator = e.initiator; \ questitem = e.questitem; \ depop_npc = e.depop_npc; \ + encounter = e.encounter; \ } \ } while(0) @@ -151,12 +153,13 @@ void QuestManager::Process() { } } -void QuestManager::StartQuest(Mob *_owner, Client *_initiator, ItemInst* _questitem) { +void QuestManager::StartQuest(Mob *_owner, Client *_initiator, ItemInst* _questitem, std::string encounter) { running_quest run; run.owner = _owner; run.initiator = _initiator; run.questitem = _questitem; run.depop_npc = false; + run.encounter = encounter; quests_running_.push(run); } @@ -3014,3 +3017,12 @@ ItemInst *QuestManager::GetQuestItem() const { return nullptr; } + +std::string QuestManager::GetEncounter() const { + if(!quests_running_.empty()) { + running_quest e = quests_running_.top(); + return e.encounter; + } + + return ""; +} diff --git a/zone/questmgr.h b/zone/questmgr.h index 2d1184942..6b47bab04 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -34,12 +34,13 @@ class QuestManager { Client *initiator; ItemInst* questitem; bool depop_npc; + std::string encounter; }; public: QuestManager(); virtual ~QuestManager(); - void StartQuest(Mob *_owner, Client *_initiator = nullptr, ItemInst* _questitem = nullptr); + void StartQuest(Mob *_owner, Client *_initiator = nullptr, ItemInst* _questitem = nullptr, std::string encounter = ""); void EndQuest(); bool QuestsRunning() { return !quests_running_.empty(); } @@ -252,6 +253,7 @@ public: NPC *GetNPC() const; Mob *GetOwner() const; ItemInst *GetQuestItem() const; + std::string GetEncounter() const; inline bool ProximitySayInUse() { return HaveProximitySays; } #ifdef BOTS