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 LoadSpellScript(std::string filename, uint32 spell_id) { }
|
||||||
virtual void LoadEncounterScript(std::string filename, std::string encounter_name) { }
|
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,
|
virtual int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data,
|
||||||
std::vector<void*> *extra_pointers) { }
|
std::vector<void*> *extra_pointers) { return 0; }
|
||||||
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) { }
|
std::vector<void*> *extra_pointers) { return 0; }
|
||||||
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) { }
|
std::vector<void*> *extra_pointers) { return 0; }
|
||||||
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) { }
|
std::vector<void*> *extra_pointers) { return 0; }
|
||||||
|
|
||||||
virtual void AddVar(std::string name, std::string val) { }
|
virtual void AddVar(std::string name, std::string val) { }
|
||||||
virtual std::string GetVar(std::string name) { return std::string(); }
|
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,
|
int QuestParserCollection::EventNPC(QuestEventID evt, NPC *npc, Mob *init, std::string data, uint32 extra_data,
|
||||||
std::vector<void*> *extra_pointers) {
|
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 rl = EventNPCLocal(evt, npc, init, data, extra_data, extra_pointers);
|
||||||
int rg = EventNPCGlobal(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
|
//Local quests returning non-default values have priority over global quests
|
||||||
if(rl != 0) {
|
if(rl != 0) {
|
||||||
return rl;
|
return rl;
|
||||||
} else if(rg != 0) {
|
} else if(rg != 0) {
|
||||||
return rg;
|
return rg;
|
||||||
}
|
} else if(rd != 0) {
|
||||||
|
return rd;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
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,
|
int QuestParserCollection::EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data,
|
||||||
std::vector<void*> *extra_pointers) {
|
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 rl = EventPlayerLocal(evt, client, data, extra_data, extra_pointers);
|
||||||
int rg = EventPlayerGlobal(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;
|
return rl;
|
||||||
} else if(rg != 0) {
|
} else if(rg != 0) {
|
||||||
return rg;
|
return rg;
|
||||||
}
|
} else if(rd != 0) {
|
||||||
|
return rd;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -355,23 +359,29 @@ int QuestParserCollection::EventItem(QuestEventID evt, Client *client, ItemInst
|
|||||||
//loaded or failed to load
|
//loaded or failed to load
|
||||||
if(iter->second != QuestFailedToLoad) {
|
if(iter->second != QuestFailedToLoad) {
|
||||||
std::map<uint32, QuestInterface*>::iterator qiter = _interfaces.find(iter->second);
|
std::map<uint32, QuestInterface*>::iterator qiter = _interfaces.find(iter->second);
|
||||||
DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers);
|
int ret = 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 i = qiter->second->EventItem(evt, client, item, mob, data, extra_data, extra_pointers);
|
||||||
|
if(i != 0) {
|
||||||
|
ret = i;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers);
|
return DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers);
|
||||||
} else {
|
} else {
|
||||||
std::string filename;
|
std::string filename;
|
||||||
QuestInterface *qi = GetQIByItemQuest(item_script, filename);
|
QuestInterface *qi = GetQIByItemQuest(item_script, filename);
|
||||||
if(qi) {
|
if(qi) {
|
||||||
_item_quest_status[item_id] = qi->GetIdentifier();
|
_item_quest_status[item_id] = qi->GetIdentifier();
|
||||||
qi->LoadItemScript(filename, item);
|
qi->LoadItemScript(filename, item);
|
||||||
DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers);
|
int ret = DispatchEventItem(evt, client, item, mob, data, extra_data, extra_pointers);
|
||||||
auto ret = qi->EventItem(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;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
_item_quest_status[item_id] = QuestFailedToLoad;
|
_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;
|
return 0;
|
||||||
@ -384,23 +394,29 @@ int QuestParserCollection::EventSpell(QuestEventID evt, NPC* npc, Client *client
|
|||||||
//loaded or failed to load
|
//loaded or failed to load
|
||||||
if(iter->second != QuestFailedToLoad) {
|
if(iter->second != QuestFailedToLoad) {
|
||||||
std::map<uint32, QuestInterface*>::iterator qiter = _interfaces.find(iter->second);
|
std::map<uint32, QuestInterface*>::iterator qiter = _interfaces.find(iter->second);
|
||||||
DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers);
|
int ret = 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 i = qiter->second->EventSpell(evt, npc, client, spell_id, extra_data, extra_pointers);
|
||||||
|
if(i != 0) {
|
||||||
|
ret = i;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers);
|
return DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers);
|
||||||
} else {
|
} else {
|
||||||
std::string filename;
|
std::string filename;
|
||||||
QuestInterface *qi = GetQIBySpellQuest(spell_id, filename);
|
QuestInterface *qi = GetQIBySpellQuest(spell_id, filename);
|
||||||
if(qi) {
|
if(qi) {
|
||||||
_spell_quest_status[spell_id] = qi->GetIdentifier();
|
_spell_quest_status[spell_id] = qi->GetIdentifier();
|
||||||
qi->LoadSpellScript(filename, spell_id);
|
qi->LoadSpellScript(filename, spell_id);
|
||||||
DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers);
|
int ret = DispatchEventSpell(evt, npc, client, spell_id, extra_data, extra_pointers);
|
||||||
auto ret = qi->EventSpell(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;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
_spell_quest_status[spell_id] = QuestFailedToLoad;
|
_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;
|
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) {
|
std::vector<void*> *extra_pointers) {
|
||||||
|
int ret = 0;
|
||||||
auto iter = _load_precedence.begin();
|
auto iter = _load_precedence.begin();
|
||||||
while(iter != _load_precedence.end()) {
|
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;
|
++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) {
|
std::vector<void*> *extra_pointers) {
|
||||||
|
int ret = 0;
|
||||||
auto iter = _load_precedence.begin();
|
auto iter = _load_precedence.begin();
|
||||||
while(iter != _load_precedence.end()) {
|
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;
|
++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) {
|
uint32 extra_data, std::vector<void*> *extra_pointers) {
|
||||||
|
int ret = 0;
|
||||||
auto iter = _load_precedence.begin();
|
auto iter = _load_precedence.begin();
|
||||||
while(iter != _load_precedence.end()) {
|
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;
|
++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) {
|
std::vector<void*> *extra_pointers) {
|
||||||
|
int ret = 0;
|
||||||
auto iter = _load_precedence.begin();
|
auto iter = _load_precedence.begin();
|
||||||
while(iter != _load_precedence.end()) {
|
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;
|
++iter;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -81,13 +81,13 @@ private:
|
|||||||
QuestInterface *GetQIByItemQuest(std::string item_script, std::string &filename);
|
QuestInterface *GetQIByItemQuest(std::string item_script, std::string &filename);
|
||||||
QuestInterface *GetQIByEncounterQuest(std::string encounter_name, 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);
|
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);
|
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);
|
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::vector<void*> *extra_pointers);
|
||||||
|
|
||||||
std::map<uint32, QuestInterface*> _interfaces;
|
std::map<uint32, QuestInterface*> _interfaces;
|
||||||
|
|||||||
@ -10471,7 +10471,7 @@ void Client::Handle_OP_Translocate(const EQApplicationPacket *app) {
|
|||||||
int SpellID = PendingTranslocateData.SpellID;
|
int SpellID = PendingTranslocateData.SpellID;
|
||||||
int i = parse->EventSpell(EVENT_SPELL_EFFECT_TRANSLOCATE_COMPLETE, nullptr, this, SpellID, 0);
|
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
|
// 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
|
// 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)
|
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;
|
npc_quest_status_[npc_id] = questFailedToLoad;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -406,7 +409,10 @@ void PerlembParser::LoadGlobalNPCScript(std::string filename) {
|
|||||||
}
|
}
|
||||||
catch(const char *err)
|
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;
|
global_npc_quest_status_ = questFailedToLoad;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -432,7 +438,10 @@ void PerlembParser::LoadPlayerScript(std::string filename) {
|
|||||||
}
|
}
|
||||||
catch(const char *err)
|
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;
|
player_quest_status_ = questFailedToLoad;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -458,7 +467,10 @@ void PerlembParser::LoadGlobalPlayerScript(std::string filename) {
|
|||||||
}
|
}
|
||||||
catch(const char *err)
|
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;
|
global_player_quest_status_ = questFailedToLoad;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -488,7 +500,10 @@ void PerlembParser::LoadItemScript(std::string filename, ItemInst *item) {
|
|||||||
}
|
}
|
||||||
catch(const char *err)
|
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;
|
item_quest_status_[item->GetID()] = questFailedToLoad;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -518,7 +533,10 @@ void PerlembParser::LoadSpellScript(std::string filename, uint32 spell_id) {
|
|||||||
}
|
}
|
||||||
catch(const char *err)
|
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;
|
spell_quest_status_[spell_id] = questFailedToLoad;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -551,11 +569,13 @@ void PerlembParser::ExportHash(const char *pkgprefix, const char *hashname, std:
|
|||||||
vals
|
vals
|
||||||
);
|
);
|
||||||
} catch(const char *err) {
|
} 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)
|
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);
|
perl->seti(std::string(pkgprefix).append("::").append(varname).c_str(), value);
|
||||||
|
|
||||||
} catch(const char * err) {
|
} 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)
|
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);
|
perl->seti(std::string(pkgprefix).append("::").append(varname).c_str(), value);
|
||||||
|
|
||||||
} catch(const char * err) {
|
} 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)
|
if(!perl)
|
||||||
@ -592,11 +616,13 @@ void PerlembParser::ExportVar(const char * pkgprefix, const char * varname, floa
|
|||||||
try {
|
try {
|
||||||
perl->setd(std::string(pkgprefix).append("::").append(varname).c_str(), value);
|
perl->setd(std::string(pkgprefix).append("::").append(varname).c_str(), value);
|
||||||
} catch(const char * err) {
|
} 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)
|
if(!perl)
|
||||||
@ -607,11 +633,13 @@ void PerlembParser::ExportVarComplex(const char * pkgprefix, const char *varname
|
|||||||
}
|
}
|
||||||
catch(const char * err)
|
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)
|
if(!perl)
|
||||||
return;
|
return;
|
||||||
@ -622,7 +650,9 @@ void PerlembParser::ExportVar(const char *pkgprefix, const char *varname, const
|
|||||||
}
|
}
|
||||||
catch(const char * err)
|
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...
|
//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)
|
//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"))
|
if(!strstr(err,"Undefined subroutine")) {
|
||||||
LogFile->write(EQEMuLog::Status, "Script error: %s::%s - %s", pkgprefix, event, err);
|
std::string error = "Script error: ";
|
||||||
|
error += pkgprefix;
|
||||||
|
error += "::";
|
||||||
|
error += event;
|
||||||
|
error += " - ";
|
||||||
|
error += err;
|
||||||
|
AddError(error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
quest_manager.EndQuest();
|
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) {
|
for(size_t i = 0; i < extra_pointers->size(); ++i) {
|
||||||
ItemInst *inst = reinterpret_cast<ItemInst*>(extra_pointers->at(i));
|
ItemInst *inst = reinterpret_cast<ItemInst*>(extra_pointers->at(i));
|
||||||
std::string var_name = "item";
|
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) {
|
if(inst) {
|
||||||
ExportVar(package_name.c_str(), var_name.c_str(), inst->GetItem()->ID);
|
ExportVar(package_name.c_str(), var_name.c_str(), inst->GetItem()->ID);
|
||||||
|
|||||||
@ -91,11 +91,11 @@ private:
|
|||||||
Embperl *perl;
|
Embperl *perl;
|
||||||
|
|
||||||
void ExportHash(const char *pkgprefix, const char *hashname, std::map<std::string, std::string> &vals);
|
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, const char *value);
|
||||||
void ExportVar(const char *pkgprefix, const char *varname, int32 value) const;
|
void ExportVar(const char *pkgprefix, const char *varname, int32 value);
|
||||||
void ExportVar(const char *pkgprefix, const char *varname, uint32 value) const;
|
void ExportVar(const char *pkgprefix, const char *varname, uint32 value);
|
||||||
void ExportVar(const char *pkgprefix, const char *varname, float value) const;
|
void ExportVar(const char *pkgprefix, const char *varname, float value);
|
||||||
void ExportVarComplex(const char *pkgprefix, const char *varname, const char *value) const;
|
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,
|
void EventCommon(QuestEventID event, uint32 objid, const char * data, NPC* npcmob, ItemInst* iteminst, Mob* mob,
|
||||||
uint32 extradata, bool global, std::vector<void*> *extra_pointers);
|
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) {
|
std::vector<void*> *extra_pointers) {
|
||||||
evt = ConvertLuaEvent(evt);
|
evt = ConvertLuaEvent(evt);
|
||||||
if(evt >= _LargestEventID) {
|
if(evt >= _LargestEventID) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!npc)
|
if(!npc)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
std::string package_name = "npc_" + std::to_string(static_cast<long long>(npc->GetNPCTypeID()));
|
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);
|
auto iter = lua_encounter_events_registered.find(package_name);
|
||||||
if(iter != lua_encounter_events_registered.end()) {
|
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()) {
|
while(riter != iter->second.end()) {
|
||||||
if(riter->event_id == evt) {
|
if(riter->event_id == evt) {
|
||||||
std::string package_name = "encounter_" + riter->encounter_name;
|
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;
|
++riter;
|
||||||
}
|
}
|
||||||
@ -958,55 +961,65 @@ void LuaParser::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::str
|
|||||||
|
|
||||||
iter = lua_encounter_events_registered.find("npc_-1");
|
iter = lua_encounter_events_registered.find("npc_-1");
|
||||||
if(iter == lua_encounter_events_registered.end()) {
|
if(iter == lua_encounter_events_registered.end()) {
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto riter = iter->second.begin();
|
auto riter = iter->second.begin();
|
||||||
while(riter != iter->second.end()) {
|
while(riter != iter->second.end()) {
|
||||||
if(riter->event_id == evt) {
|
if(riter->event_id == evt) {
|
||||||
std::string package_name = "encounter_" + riter->encounter_name;
|
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;
|
++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) {
|
std::vector<void*> *extra_pointers) {
|
||||||
evt = ConvertLuaEvent(evt);
|
evt = ConvertLuaEvent(evt);
|
||||||
if(evt >= _LargestEventID) {
|
if(evt >= _LargestEventID) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string package_name = "player";
|
std::string package_name = "player";
|
||||||
|
|
||||||
auto iter = lua_encounter_events_registered.find(package_name);
|
auto iter = lua_encounter_events_registered.find(package_name);
|
||||||
if(iter == lua_encounter_events_registered.end()) {
|
if(iter == lua_encounter_events_registered.end()) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
auto riter = iter->second.begin();
|
auto riter = iter->second.begin();
|
||||||
while(riter != iter->second.end()) {
|
while(riter != iter->second.end()) {
|
||||||
if(riter->event_id == evt) {
|
if(riter->event_id == evt) {
|
||||||
std::string package_name = "encounter_" + riter->encounter_name;
|
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;
|
++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) {
|
std::vector<void*> *extra_pointers) {
|
||||||
evt = ConvertLuaEvent(evt);
|
evt = ConvertLuaEvent(evt);
|
||||||
if(evt >= _LargestEventID) {
|
if(evt >= _LargestEventID) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!item)
|
if(!item)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
std::string package_name = "item_";
|
std::string package_name = "item_";
|
||||||
package_name += std::to_string(static_cast<long long>(item->GetID()));
|
package_name += std::to_string(static_cast<long long>(item->GetID()));
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
auto iter = lua_encounter_events_registered.find(package_name);
|
auto iter = lua_encounter_events_registered.find(package_name);
|
||||||
if(iter != lua_encounter_events_registered.end()) {
|
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()) {
|
while(riter != iter->second.end()) {
|
||||||
if(riter->event_id == evt) {
|
if(riter->event_id == evt) {
|
||||||
std::string package_name = "encounter_" + riter->encounter_name;
|
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;
|
++riter;
|
||||||
}
|
}
|
||||||
@ -1022,35 +1037,42 @@ void LuaParser::DispatchEventItem(QuestEventID evt, Client *client, ItemInst *it
|
|||||||
|
|
||||||
iter = lua_encounter_events_registered.find("item_-1");
|
iter = lua_encounter_events_registered.find("item_-1");
|
||||||
if(iter == lua_encounter_events_registered.end()) {
|
if(iter == lua_encounter_events_registered.end()) {
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto riter = iter->second.begin();
|
auto riter = iter->second.begin();
|
||||||
while(riter != iter->second.end()) {
|
while(riter != iter->second.end()) {
|
||||||
if(riter->event_id == evt) {
|
if(riter->event_id == evt) {
|
||||||
std::string package_name = "encounter_" + riter->encounter_name;
|
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;
|
++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) {
|
std::vector<void*> *extra_pointers) {
|
||||||
evt = ConvertLuaEvent(evt);
|
evt = ConvertLuaEvent(evt);
|
||||||
if(evt >= _LargestEventID) {
|
if(evt >= _LargestEventID) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string package_name = "spell_" + std::to_string(static_cast<long long>(spell_id));
|
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);
|
auto iter = lua_encounter_events_registered.find(package_name);
|
||||||
if(iter != lua_encounter_events_registered.end()) {
|
if(iter != lua_encounter_events_registered.end()) {
|
||||||
auto riter = iter->second.begin();
|
auto riter = iter->second.begin();
|
||||||
while(riter != iter->second.end()) {
|
while(riter != iter->second.end()) {
|
||||||
if(riter->event_id == evt) {
|
if(riter->event_id == evt) {
|
||||||
std::string package_name = "encounter_" + riter->encounter_name;
|
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;
|
++riter;
|
||||||
}
|
}
|
||||||
@ -1058,17 +1080,20 @@ void LuaParser::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, u
|
|||||||
|
|
||||||
iter = lua_encounter_events_registered.find("spell_-1");
|
iter = lua_encounter_events_registered.find("spell_-1");
|
||||||
if(iter == lua_encounter_events_registered.end()) {
|
if(iter == lua_encounter_events_registered.end()) {
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto riter = iter->second.begin();
|
auto riter = iter->second.begin();
|
||||||
while(riter != iter->second.end()) {
|
while(riter != iter->second.end()) {
|
||||||
if(riter->event_id == evt) {
|
if(riter->event_id == evt) {
|
||||||
std::string package_name = "encounter_" + riter->encounter_name;
|
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;
|
++riter;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
QuestEventID LuaParser::ConvertLuaEvent(QuestEventID evt) {
|
QuestEventID LuaParser::ConvertLuaEvent(QuestEventID evt) {
|
||||||
|
|||||||
@ -62,13 +62,13 @@ public:
|
|||||||
virtual void ReloadQuests();
|
virtual void ReloadQuests();
|
||||||
virtual uint32 GetIdentifier() { return 0xb0712acc; }
|
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);
|
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);
|
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);
|
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);
|
std::vector<void*> *extra_pointers);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -53,7 +53,7 @@ void handle_npc_event_trade(QuestInterface *parse, lua_State* L, NPC* npc, Mob *
|
|||||||
|
|
||||||
if(extra_pointers) {
|
if(extra_pointers) {
|
||||||
for(size_t i = 0; i < extra_pointers->size(); ++i) {
|
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));
|
Lua_ItemInst l_inst = reinterpret_cast<ItemInst*>(extra_pointers->at(i));
|
||||||
luabind::object l_inst_o = luabind::object(L, l_inst);
|
luabind::object l_inst_o = luabind::object(L, l_inst);
|
||||||
l_inst_o.push(L);
|
l_inst_o.push(L);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user