Fixed translocate, dispatch event now returns values properly, embparser now stores errors (what few it has)

This commit is contained in:
KimLS 2013-06-26 09:26:19 -07:00
parent 602b17f0e8
commit 16d3825df4
9 changed files with 188 additions and 90 deletions

View File

@ -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<void*> *extra_pointers) { }
virtual void DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data,
std::vector<void*> *extra_pointers) { }
virtual void DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data,
std::vector<void*> *extra_pointers) { }
virtual void DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data,
std::vector<void*> *extra_pointers) { }
virtual int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data,
std::vector<void*> *extra_pointers) { return 0; }
virtual int DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data,
std::vector<void*> *extra_pointers) { return 0; }
virtual int DispatchEventItem(QuestEventID evt, Client *client, ItemInst *item, Mob *mob, std::string data, uint32 extra_data,
std::vector<void*> *extra_pointers) { return 0; }
virtual int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data,
std::vector<void*> *extra_pointers) { return 0; }
virtual void AddVar(std::string name, std::string val) { }
virtual std::string GetVar(std::string name) { return std::string(); }

View File

@ -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<void*> *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<void*> *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<uint32, QuestInterface*>::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<uint32, QuestInterface*>::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<std::string> &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<void*> *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<void*> *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<void*> *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<void*> *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;
}

View File

@ -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<void*> *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<void*> *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<void*> *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<void*> *extra_pointers);
std::map<uint32, QuestInterface*> _interfaces;

View File

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

View File

@ -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<ItemInst*>(extra_pointers->at(i));
std::string var_name = "item";
var_name += std::to_string(i + 1);
var_name += std::to_string(static_cast<long long>(i + 1));
if(inst) {
ExportVar(package_name.c_str(), var_name.c_str(), inst->GetItem()->ID);

View File

@ -91,11 +91,11 @@ private:
Embperl *perl;
void ExportHash(const char *pkgprefix, const char *hashname, std::map<std::string, std::string> &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<void*> *extra_pointers);

View File

@ -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<void*> *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<long long>(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<void*> *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<void*> *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<long long>(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<void*> *extra_pointers) {
evt = ConvertLuaEvent(evt);
if(evt >= _LargestEventID) {
return;
return 0;
}
std::string package_name = "spell_" + std::to_string(static_cast<long long>(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) {

View File

@ -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<void*> *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<void*> *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<void*> *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<void*> *extra_pointers);
private:

View File

@ -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<long long>(i + 1));
Lua_ItemInst l_inst = reinterpret_cast<ItemInst*>(extra_pointers->at(i));
luabind::object l_inst_o = luabind::object(L, l_inst);
l_inst_o.push(L);