diff --git a/zone/QuestInterface.h b/zone/QuestInterface.h index b2c4acfb2..8e3e3a93e 100644 --- a/zone/QuestInterface.h +++ b/zone/QuestInterface.h @@ -59,14 +59,14 @@ public: virtual void LoadSpellScript(std::string filename, uint32 spell_id) { } virtual void LoadEncounterScript(std::string filename, std::string encounter_name) { } - virtual void DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { } - virtual void DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { } - virtual void DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { } - virtual void DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { } + virtual int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, + std::vector *extra_pointers) { return 0; } + virtual int DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, + std::vector *extra_pointers) { return 0; } + virtual int DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { return 0; } + virtual int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, + std::vector *extra_pointers) { return 0; } virtual void AddVar(std::string name, std::string val) { } virtual std::string GetVar(std::string name) { return std::string(); } diff --git a/zone/QuestParserCollection.cpp b/zone/QuestParserCollection.cpp index b08dd29a8..d11f8c988 100644 --- a/zone/QuestParserCollection.cpp +++ b/zone/QuestParserCollection.cpp @@ -227,16 +227,18 @@ bool QuestParserCollection::ItemHasQuestSub(ItemInst *itm, QuestEventID evt) { int QuestParserCollection::EventNPC(QuestEventID evt, NPC *npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers) { - DispatchEventNPC(evt, npc, init, data, extra_data, extra_pointers); + int rd = DispatchEventNPC(evt, npc, init, data, extra_data, extra_pointers); int rl = EventNPCLocal(evt, npc, init, data, extra_data, extra_pointers); int rg = EventNPCGlobal(evt, npc, init, data, extra_data, extra_pointers); //Local quests returning non-default values have priority over global quests - if(rl != 0) { + if(rl != 0) { return rl; } else if(rg != 0) { return rg; - } + } else if(rd != 0) { + return rd; + } return 0; } @@ -285,7 +287,7 @@ int QuestParserCollection::EventNPCGlobal(QuestEventID evt, NPC* npc, Mob *init, int QuestParserCollection::EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers) { - DispatchEventPlayer(evt, client, data, extra_data, extra_pointers); + int rd = DispatchEventPlayer(evt, client, data, extra_data, extra_pointers); int rl = EventPlayerLocal(evt, client, data, extra_data, extra_pointers); int rg = EventPlayerGlobal(evt, client, data, extra_data, extra_pointers); @@ -294,7 +296,9 @@ int QuestParserCollection::EventPlayer(QuestEventID evt, Client *client, std::st return rl; } else if(rg != 0) { return rg; - } + } else if(rd != 0) { + return rd; + } return 0; } @@ -355,23 +359,29 @@ int QuestParserCollection::EventItem(QuestEventID evt, Client *client, ItemInst //loaded or failed to load if(iter->second != QuestFailedToLoad) { std::map::iterator qiter = _interfaces.find(iter->second); - DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); - auto ret = qiter->second->EventItem(evt, client, item, mob, data, extra_data, extra_pointers); + int ret = DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); + int i = qiter->second->EventItem(evt, client, item, mob, data, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } return ret; } - DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); + return DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); } else { std::string filename; QuestInterface *qi = GetQIByItemQuest(item_script, filename); if(qi) { _item_quest_status[item_id] = qi->GetIdentifier(); qi->LoadItemScript(filename, item); - DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); - auto ret = qi->EventItem(evt, client, item, mob, data, extra_data, extra_pointers); + int ret = DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); + int i = qi->EventItem(evt, client, item, mob, data, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } return ret; } else { _item_quest_status[item_id] = QuestFailedToLoad; - DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); + return DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); } } return 0; @@ -384,23 +394,29 @@ int QuestParserCollection::EventSpell(QuestEventID evt, NPC* npc, Client *client //loaded or failed to load if(iter->second != QuestFailedToLoad) { std::map::iterator qiter = _interfaces.find(iter->second); - DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); - auto ret = qiter->second->EventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + int ret = DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + int i = qiter->second->EventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } return ret; } - DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + return DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); } else { std::string filename; QuestInterface *qi = GetQIBySpellQuest(spell_id, filename); if(qi) { _spell_quest_status[spell_id] = qi->GetIdentifier(); qi->LoadSpellScript(filename, spell_id); - DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); - auto ret = qi->EventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + int ret = DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + int i = qi->EventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } return ret; } else { _spell_quest_status[spell_id] = QuestFailedToLoad; - DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + return DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); } } return 0; @@ -950,38 +966,58 @@ void QuestParserCollection::GetErrors(std::list &err) { } } -void QuestParserCollection::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, +int QuestParserCollection::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers) { + int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { - (*iter)->DispatchEventNPC(evt, npc, init, data, extra_data, extra_pointers); + int i = (*iter)->DispatchEventNPC(evt, npc, init, data, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } ++iter; } + return ret; } -void QuestParserCollection::DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, +int QuestParserCollection::DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers) { + int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { - (*iter)->DispatchEventPlayer(evt, client, data, extra_data, extra_pointers); + int i = (*iter)->DispatchEventPlayer(evt, client, data, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } ++iter; } + return ret; } -void QuestParserCollection::DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, +int QuestParserCollection::DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, std::vector *extra_pointers) { + int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { - (*iter)->DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); + int i = (*iter)->DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } ++iter; } + return ret; } -void QuestParserCollection::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, +int QuestParserCollection::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, std::vector *extra_pointers) { + int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { - (*iter)->DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + int i = (*iter)->DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers); + if(i != 0) { + ret = i; + } ++iter; } + return ret; } diff --git a/zone/QuestParserCollection.h b/zone/QuestParserCollection.h index f37beed42..e8a930b64 100644 --- a/zone/QuestParserCollection.h +++ b/zone/QuestParserCollection.h @@ -81,13 +81,13 @@ private: QuestInterface *GetQIByItemQuest(std::string item_script, std::string &filename); QuestInterface *GetQIByEncounterQuest(std::string encounter_name, std::string &filename); - void DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, + int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers); - void DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, + int DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers); - void DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, + int DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, std::vector *extra_pointers); - void DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, + int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, std::vector *extra_pointers); std::map _interfaces; diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 64e826611..abd0f3107 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -10471,7 +10471,7 @@ void Client::Handle_OP_Translocate(const EQApplicationPacket *app) { int SpellID = PendingTranslocateData.SpellID; int i = parse->EventSpell(EVENT_SPELL_EFFECT_TRANSLOCATE_COMPLETE, nullptr, this, SpellID, 0); - if(i != 0) + if(i == 0) { // If the spell has a translocate to bind effect, AND we are already in the zone the client // is bound in, use the GoToBind method. If we send OP_Translocate in this case, the client moves itself diff --git a/zone/embparser.cpp b/zone/embparser.cpp index 0cca50623..e5176c498 100644 --- a/zone/embparser.cpp +++ b/zone/embparser.cpp @@ -380,7 +380,10 @@ void PerlembParser::LoadNPCScript(std::string filename, int npc_id) { } catch(const char *err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); + std::string error = "Error compiling quest file " + filename; + error += ": "; + error += err; + AddError(error); npc_quest_status_[npc_id] = questFailedToLoad; return; } @@ -406,7 +409,10 @@ void PerlembParser::LoadGlobalNPCScript(std::string filename) { } catch(const char *err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); + std::string error = "Error compiling quest file " + filename; + error += ": "; + error += err; + AddError(error); global_npc_quest_status_ = questFailedToLoad; return; } @@ -432,7 +438,10 @@ void PerlembParser::LoadPlayerScript(std::string filename) { } catch(const char *err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); + std::string error = "Error compiling quest file " + filename; + error += ": "; + error += err; + AddError(error); player_quest_status_ = questFailedToLoad; return; } @@ -458,7 +467,10 @@ void PerlembParser::LoadGlobalPlayerScript(std::string filename) { } catch(const char *err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); + std::string error = "Error compiling quest file " + filename; + error += ": "; + error += err; + AddError(error); global_player_quest_status_ = questFailedToLoad; return; } @@ -488,7 +500,10 @@ void PerlembParser::LoadItemScript(std::string filename, ItemInst *item) { } catch(const char *err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); + std::string error = "Error compiling quest file " + filename; + error += ": "; + error += err; + AddError(error); item_quest_status_[item->GetID()] = questFailedToLoad; return; } @@ -518,7 +533,10 @@ void PerlembParser::LoadSpellScript(std::string filename, uint32 spell_id) { } catch(const char *err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); + std::string error = "Error compiling quest file " + filename; + error += ": "; + error += err; + AddError(error); spell_quest_status_[spell_id] = questFailedToLoad; return; } @@ -551,11 +569,13 @@ void PerlembParser::ExportHash(const char *pkgprefix, const char *hashname, std: vals ); } catch(const char *err) { - LogFile->write(EQEMuLog::Status, "Error exporting hash: %s", err); + std::string error = "Error exporting hash: "; + error += err; + AddError(error); } } -void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, int value) const +void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, int value) { if(!perl) @@ -565,11 +585,13 @@ void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, int perl->seti(std::string(pkgprefix).append("::").append(varname).c_str(), value); } catch(const char * err) { - LogFile->write(EQEMuLog::Status, "Error exporting var: %s", err); + std::string error = "Error exporting var: "; + error += err; + AddError(error); } } -void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, unsigned int value) const +void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, unsigned int value) { if(!perl) @@ -579,11 +601,13 @@ void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, unsi perl->seti(std::string(pkgprefix).append("::").append(varname).c_str(), value); } catch(const char * err) { - LogFile->write(EQEMuLog::Status, "Error exporting var: %s", err); + std::string error = "Error exporting var: "; + error += err; + AddError(error); } } -void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, float value) const +void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, float value) { if(!perl) @@ -592,11 +616,13 @@ void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, floa try { perl->setd(std::string(pkgprefix).append("::").append(varname).c_str(), value); } catch(const char * err) { - LogFile->write(EQEMuLog::Status, "Error exporting var: %s", err); + std::string error = "Error exporting var: "; + error += err; + AddError(error); } } -void PerlembParser::ExportVarComplex(const char * pkgprefix, const char *varname, const char *value) const +void PerlembParser::ExportVarComplex(const char * pkgprefix, const char *varname, const char *value) { if(!perl) @@ -607,11 +633,13 @@ void PerlembParser::ExportVarComplex(const char * pkgprefix, const char *varname } catch(const char * err) { - LogFile->write(EQEMuLog::Status, "Error exporting var: %s", err); + std::string error = "Error exporting var: "; + error += err; + AddError(error); } } -void PerlembParser::ExportVar(const char *pkgprefix, const char *varname, const char *value) const +void PerlembParser::ExportVar(const char *pkgprefix, const char *varname, const char *value) { if(!perl) return; @@ -622,7 +650,9 @@ void PerlembParser::ExportVar(const char *pkgprefix, const char *varname, const } catch(const char * err) { - LogFile->write(EQEMuLog::Status, "Error exporting var: %s", err); + std::string error = "Error exporting var: "; + error += err; + AddError(error); } } @@ -690,8 +720,15 @@ void PerlembParser::SendCommands(const char *pkgprefix, const char *event, uint3 //try to reduce some of the console spam... //todo: tweak this to be more accurate at deciding what to filter (we don't want to gag legit errors) - if(!strstr(err,"Undefined subroutine")) - LogFile->write(EQEMuLog::Status, "Script error: %s::%s - %s", pkgprefix, event, err); + if(!strstr(err,"Undefined subroutine")) { + std::string error = "Script error: "; + error += pkgprefix; + error += "::"; + error += event; + error += " - "; + error += err; + AddError(error); + } } quest_manager.EndQuest(); @@ -1115,7 +1152,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID for(size_t i = 0; i < extra_pointers->size(); ++i) { ItemInst *inst = reinterpret_cast(extra_pointers->at(i)); std::string var_name = "item"; - var_name += std::to_string(i + 1); + var_name += std::to_string(static_cast(i + 1)); if(inst) { ExportVar(package_name.c_str(), var_name.c_str(), inst->GetItem()->ID); diff --git a/zone/embparser.h b/zone/embparser.h index 8402307e3..3e429c243 100644 --- a/zone/embparser.h +++ b/zone/embparser.h @@ -91,11 +91,11 @@ private: Embperl *perl; void ExportHash(const char *pkgprefix, const char *hashname, std::map &vals); - void ExportVar(const char *pkgprefix, const char *varname, const char *value) const; - void ExportVar(const char *pkgprefix, const char *varname, int32 value) const; - void ExportVar(const char *pkgprefix, const char *varname, uint32 value) const; - void ExportVar(const char *pkgprefix, const char *varname, float value) const; - void ExportVarComplex(const char *pkgprefix, const char *varname, const char *value) const; + void ExportVar(const char *pkgprefix, const char *varname, const char *value); + void ExportVar(const char *pkgprefix, const char *varname, int32 value); + void ExportVar(const char *pkgprefix, const char *varname, uint32 value); + void ExportVar(const char *pkgprefix, const char *varname, float value); + void ExportVarComplex(const char *pkgprefix, const char *varname, const char *value); void EventCommon(QuestEventID event, uint32 objid, const char * data, NPC* npcmob, ItemInst* iteminst, Mob* mob, uint32 extradata, bool global, std::vector *extra_pointers); diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp index b755459b1..662df844b 100644 --- a/zone/lua_parser.cpp +++ b/zone/lua_parser.cpp @@ -932,17 +932,18 @@ void LuaParser::MapFunctions(lua_State *L) { } } -void LuaParser::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, +int LuaParser::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { - return; + return 0; } if(!npc) - return; + return 0; std::string package_name = "npc_" + std::to_string(static_cast(npc->GetNPCTypeID())); + int ret = 0; auto iter = lua_encounter_events_registered.find(package_name); if(iter != lua_encounter_events_registered.end()) { @@ -950,7 +951,9 @@ void LuaParser::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::str while(riter != iter->second.end()) { if(riter->event_id == evt) { std::string package_name = "encounter_" + riter->encounter_name; - _EventNPC(package_name, evt, npc, init, data, extra_data, extra_pointers, &riter->lua_reference); + int i = _EventNPC(package_name, evt, npc, init, data, extra_data, extra_pointers, &riter->lua_reference); + if(i != 0) + ret = i; } ++riter; } @@ -958,55 +961,65 @@ void LuaParser::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::str iter = lua_encounter_events_registered.find("npc_-1"); if(iter == lua_encounter_events_registered.end()) { - return; + return ret; } auto riter = iter->second.begin(); while(riter != iter->second.end()) { if(riter->event_id == evt) { std::string package_name = "encounter_" + riter->encounter_name; - _EventNPC(package_name, evt, npc, init, data, extra_data, extra_pointers, &riter->lua_reference); + int i = _EventNPC(package_name, evt, npc, init, data, extra_data, extra_pointers, &riter->lua_reference); + if(i != 0) + ret = i; } ++riter; } + + return ret; } -void LuaParser::DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, +int LuaParser::DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { - return; + return 0; } std::string package_name = "player"; auto iter = lua_encounter_events_registered.find(package_name); if(iter == lua_encounter_events_registered.end()) { - return; + return 0; } + int ret = 0; auto riter = iter->second.begin(); while(riter != iter->second.end()) { if(riter->event_id == evt) { std::string package_name = "encounter_" + riter->encounter_name; - _EventPlayer(package_name, evt, client, data, extra_data, extra_pointers, &riter->lua_reference); + int i = _EventPlayer(package_name, evt, client, data, extra_data, extra_pointers, &riter->lua_reference); + if(i != 0) + ret = i; } ++riter; } + + return ret; } -void LuaParser::DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, +int LuaParser::DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { - return; + return 0; } if(!item) - return; + return 0; std::string package_name = "item_"; package_name += std::to_string(static_cast(item->GetID())); + int ret = 0; auto iter = lua_encounter_events_registered.find(package_name); if(iter != lua_encounter_events_registered.end()) { @@ -1014,7 +1027,9 @@ void LuaParser::DispatchEventItem(QuestEventID evt, Client *client, ItemInst *it while(riter != iter->second.end()) { if(riter->event_id == evt) { std::string package_name = "encounter_" + riter->encounter_name; - _EventItem(package_name, evt, client, item, mob, data, extra_data, extra_pointers, &riter->lua_reference); + int i = _EventItem(package_name, evt, client, item, mob, data, extra_data, extra_pointers, &riter->lua_reference); + if(i != 0) + ret = i; } ++riter; } @@ -1022,35 +1037,42 @@ void LuaParser::DispatchEventItem(QuestEventID evt, Client *client, ItemInst *it iter = lua_encounter_events_registered.find("item_-1"); if(iter == lua_encounter_events_registered.end()) { - return; + return ret; } auto riter = iter->second.begin(); while(riter != iter->second.end()) { if(riter->event_id == evt) { std::string package_name = "encounter_" + riter->encounter_name; - _EventItem(package_name, evt, client, item, mob, data, extra_data, extra_pointers, &riter->lua_reference); + int i = _EventItem(package_name, evt, client, item, mob, data, extra_data, extra_pointers, &riter->lua_reference); + if(i != 0) + ret = i; } ++riter; } + return ret; } -void LuaParser::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, +int LuaParser::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { - return; + return 0; } std::string package_name = "spell_" + std::to_string(static_cast(spell_id)); + int ret = 0; auto iter = lua_encounter_events_registered.find(package_name); if(iter != lua_encounter_events_registered.end()) { - auto riter = iter->second.begin(); + auto riter = iter->second.begin(); while(riter != iter->second.end()) { if(riter->event_id == evt) { std::string package_name = "encounter_" + riter->encounter_name; - _EventSpell(package_name, evt, npc, client, spell_id, extra_data, extra_pointers, &riter->lua_reference); + int i = _EventSpell(package_name, evt, npc, client, spell_id, extra_data, extra_pointers, &riter->lua_reference); + if(i != 0) { + ret = i; + } } ++riter; } @@ -1058,17 +1080,20 @@ void LuaParser::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, u iter = lua_encounter_events_registered.find("spell_-1"); if(iter == lua_encounter_events_registered.end()) { - return; + return ret; } auto riter = iter->second.begin(); while(riter != iter->second.end()) { if(riter->event_id == evt) { std::string package_name = "encounter_" + riter->encounter_name; - _EventSpell(package_name, evt, npc, client, spell_id, extra_data, extra_pointers, &riter->lua_reference); + int i = _EventSpell(package_name, evt, npc, client, spell_id, extra_data, extra_pointers, &riter->lua_reference); + if(i != 0) + ret = i; } ++riter; } + return ret; } QuestEventID LuaParser::ConvertLuaEvent(QuestEventID evt) { diff --git a/zone/lua_parser.h b/zone/lua_parser.h index 331fb57be..7c4843ccd 100644 --- a/zone/lua_parser.h +++ b/zone/lua_parser.h @@ -62,13 +62,13 @@ public: virtual void ReloadQuests(); virtual uint32 GetIdentifier() { return 0xb0712acc; } - virtual void DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, + virtual int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers); - virtual void DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, + virtual int DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers); - virtual void DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, + virtual int DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data, std::vector *extra_pointers); - virtual void DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, + virtual int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, std::vector *extra_pointers); private: diff --git a/zone/lua_parser_events.cpp b/zone/lua_parser_events.cpp index 922cccdeb..57f7bb21f 100644 --- a/zone/lua_parser_events.cpp +++ b/zone/lua_parser_events.cpp @@ -53,7 +53,7 @@ void handle_npc_event_trade(QuestInterface *parse, lua_State* L, NPC* npc, Mob * if(extra_pointers) { for(size_t i = 0; i < extra_pointers->size(); ++i) { - std::string prefix = "item" + std::to_string(i + 1); + std::string prefix = "item" + std::to_string(static_cast(i + 1)); Lua_ItemInst l_inst = reinterpret_cast(extra_pointers->at(i)); luabind::object l_inst_o = luabind::object(L, l_inst); l_inst_o.push(L);