mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 16:51:29 +00:00
Fixed translocate, dispatch event now returns values properly, embparser now stores errors (what few it has)
This commit is contained in:
parent
602b17f0e8
commit
16d3825df4
@ -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(); }
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user