From 6e9e81a8906c936973c356529ed1b0b1b0560aef Mon Sep 17 00:00:00 2001 From: KimLS Date: Sun, 5 May 2013 23:36:15 -0700 Subject: [PATCH] Working on fixing up QuestInterface to make multiple parsers work together in harmony, need to fix up Embperl parser next --- CMakeLists.txt | 11 + zone/CMakeLists.txt | 6 +- zone/QuestInterface.h | 7 + zone/QuestParserCollection.cpp | 166 +++--- zone/QuestParserCollection.h | 12 +- zone/embparser.cpp | 1006 ++++++++++++++++---------------- zone/embparser.h | 19 +- zone/lua_parser.cpp | 4 + zone/lua_parser.h | 40 ++ zone/net.cpp | 12 + 10 files changed, 678 insertions(+), 605 deletions(-) create mode 100644 zone/lua_parser.cpp create mode 100644 zone/lua_parser.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 312095f08..0314a9be7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,6 +113,7 @@ OPTION(EQEMU_BUILD_LOGIN "Build the login server." OFF) OPTION(EQEMU_BUILD_AZONE "Build azone utility." OFF) OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF) OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON) +OPTION(EQEMU_BUILD_LUA "Build Lua parser." OFF) #C++11 stuff IF(NOT MSVC) @@ -133,6 +134,10 @@ IF(EQEMU_BUILD_PERL) ADD_DEFINITIONS(-DEMBPERL) ADD_DEFINITIONS(-DEMBPERL_PLUGIN) ENDIF(EQEMU_BUILD_PERL) +IF(EQEMU_BUILD_LUA) + ADD_DEFINITIONS(-DLUA_EQEMU) +ENDIF(EQEMU_BUILD_LUA) + ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL}) ADD_DEFINITIONS(-DINVERSEXY) ADD_DEFINITIONS(-DFIELD_ITEMS) @@ -145,6 +150,12 @@ IF(EQEMU_BUILD_PERL) FIND_PACKAGE(PerlLibs REQUIRED) INCLUDE_DIRECTORIES("${PERL_INCLUDE_PATH}") ENDIF(EQEMU_BUILD_PERL) + +IF(EQEMU_BUILD_LUA) + FIND_PACKAGE(Lua51 REQUIRED) + INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}") +ENDIF(EQEMU_BUILD_LUA) + INCLUDE_DIRECTORIES("${ZLIB_INCLUDE_DIRS}" "${MySQL_INCLUDE_DIR}") IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS) diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 7079942ab..93158cb1c 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -30,6 +30,7 @@ SET(zone_sources horse.cpp inventory.cpp loottables.cpp + lua_parser.cpp Map.cpp merc.cpp mob.cpp @@ -109,6 +110,7 @@ SET(zone_headers guild_mgr.h hate_list.h horse.h + lua_parser.h map.h masterentity.h maxskill.h @@ -155,7 +157,7 @@ ADD_EXECUTABLE(zone ${zone_sources} ${zone_headers}) ADD_DEFINITIONS(-DZONE) -TARGET_LINK_LIBRARIES(zone Common ${PERL_LIBRARY} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY}) +TARGET_LINK_LIBRARIES(zone Common ${PERL_LIBRARY} debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY} ${LUA_LIBRARY}) IF(MSVC) SET_TARGET_PROPERTIES(zone PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") @@ -175,6 +177,4 @@ IF(UNIX) ADD_DEFINITIONS(-fPIC) ENDIF(UNIX) -INCLUDE_DIRECTORIES(${VLD_INCLUDE_DIR}) - SET(EXECUTABLE_OUTPUT_PATH ../Bin) diff --git a/zone/QuestInterface.h b/zone/QuestInterface.h index 32ef9b2a8..481f563be 100644 --- a/zone/QuestInterface.h +++ b/zone/QuestInterface.h @@ -24,6 +24,13 @@ public: virtual bool SpellHasQuestSub(uint32 spell_id, const char *subname) { return false; } virtual bool ItemHasQuestSub(ItemInst *itm, const char *subname) { return false; } + virtual void LoadNPCScript(std::string filename, int npc_id) { } + //virtual void LoadGlobalNPCScript(std::string filename) { } + virtual void LoadPlayerScript(std::string filename) { } + //virtual void LoadGlobalPlayerScript(std::string filename) { } + virtual void LoadItemScript(std::string filename, std::string item_script) { } + virtual void LoadSpellScript(std::string filename, uint32 spell_id) { } + virtual void AddVar(std::string name, std::string val) { } virtual void ReloadQuests(bool reset_timers = true) { } virtual uint32 GetIdentifier() { return 0; } diff --git a/zone/QuestParserCollection.cpp b/zone/QuestParserCollection.cpp index e2a09075a..d75c3e71b 100644 --- a/zone/QuestParserCollection.cpp +++ b/zone/QuestParserCollection.cpp @@ -14,8 +14,8 @@ extern Zone* zone; QuestParserCollection::QuestParserCollection() { _player_quest_status = QuestUnloaded; - _global_player_quest_status = QuestUnloaded; - _global_npc_quest_status = QuestUnloaded; + //_global_player_quest_status = QuestUnloaded; + //_global_npc_quest_status = QuestUnloaded; } QuestParserCollection::~QuestParserCollection() { @@ -38,8 +38,8 @@ void QuestParserCollection::AddVar(std::string name, std::string val) { void QuestParserCollection::ReloadQuests(bool reset_timers) { _npc_quest_status.clear(); _player_quest_status = QuestUnloaded; - _global_player_quest_status = QuestUnloaded; - _global_npc_quest_status = QuestUnloaded; + //_global_player_quest_status = QuestUnloaded; + //_global_npc_quest_status = QuestUnloaded; _spell_quest_status.clear(); _item_quest_status.clear(); std::list::iterator iter = _load_precedence.begin(); @@ -61,9 +61,12 @@ bool QuestParserCollection::HasQuestSub(uint32 npcid, const char *subname) { } } } else { - QuestInterface *qi = GetQIByNPCQuest(npcid); + std::string filename; + QuestInterface *qi = GetQIByNPCQuest(npcid, filename); if(qi) { _npc_quest_status[npcid] = qi->GetIdentifier(); + + qi->LoadNPCScript(filename, npcid); if(qi->HasQuestSub(npcid, subname)) { return true; } @@ -72,40 +75,45 @@ bool QuestParserCollection::HasQuestSub(uint32 npcid, const char *subname) { } } - if(_global_npc_quest_status == QuestUnloaded){ - QuestInterface *qi = GetQIByGlobalNPCQuest(); - if(qi) { - _global_npc_quest_status = qi->GetIdentifier(); - if(qi->HasGlobalQuestSub(subname)) { - return true; - } - } - } else { - if(_global_npc_quest_status != QuestFailedToLoad) { - std::map::iterator qiter = _interfaces.find(_global_npc_quest_status); - if(qiter->second->HasGlobalQuestSub(subname)) { - return true; - } - } - } + //if(_global_npc_quest_status == QuestUnloaded){ + // std::string filename; + // QuestInterface *qi = GetQIByGlobalNPCQuest(filename); + // if(qi) { + // qi->LoadGlobalNPCScript(filename); + // _global_npc_quest_status = qi->GetIdentifier(); + // if(qi->HasGlobalQuestSub(subname)) { + // return true; + // } + // } + //} else { + // if(_global_npc_quest_status != QuestFailedToLoad) { + // std::map::iterator qiter = _interfaces.find(_global_npc_quest_status); + // if(qiter->second->HasGlobalQuestSub(subname)) { + // return true; + // } + // } + //} return false; } bool QuestParserCollection::PlayerHasQuestSub(const char *subname) { if(_player_quest_status == QuestUnloaded) { - QuestInterface *qi = GetQIByGlobalPlayerQuest(); - if(qi) { - _global_player_quest_status = qi->GetIdentifier(); - } + std::string filename; + //QuestInterface *qi = GetQIByGlobalPlayerQuest(filename); + //if(qi) { + // _global_player_quest_status = qi->GetIdentifier(); + // qi->LoadGlobalPlayerScript(filename); + //} - qi = GetQIByPlayerQuest(); + QuestInterface *qi = GetQIByPlayerQuest(filename); if(qi) { _player_quest_status = qi->GetIdentifier(); - return qi->PlayerHasQuestSub(subname) || qi->GlobalPlayerHasQuestSub(subname); + qi->LoadPlayerScript(filename); + return qi->PlayerHasQuestSub(subname); // || qi->GlobalPlayerHasQuestSub(subname); } } else if(_player_quest_status != QuestFailedToLoad) { std::map::iterator iter = _interfaces.find(_player_quest_status); - return iter->second->PlayerHasQuestSub(subname) || iter->second->GlobalPlayerHasQuestSub(subname); + return iter->second->PlayerHasQuestSub(subname); // || iter->second->GlobalPlayerHasQuestSub(subname); } return false; } @@ -119,9 +127,11 @@ bool QuestParserCollection::SpellHasQuestSub(uint32 spell_id, const char *subnam return qiter->second->SpellHasQuestSub(spell_id, subname); } } else { - QuestInterface *qi = GetQIBySpellQuest(spell_id); + std::string filename; + QuestInterface *qi = GetQIBySpellQuest(spell_id, filename); if(qi) { _spell_quest_status[spell_id] = qi->GetIdentifier(); + qi->LoadSpellScript(filename, spell_id); return qi->SpellHasQuestSub(spell_id, subname); } else { _spell_quest_status[spell_id] = QuestFailedToLoad; @@ -149,9 +159,11 @@ bool QuestParserCollection::ItemHasQuestSub(ItemInst *itm, const char *subname) return qiter->second->ItemHasQuestSub(itm, subname); } } else { - QuestInterface *qi = GetQIByItemQuest(item_script); + std::string filename; + QuestInterface *qi = GetQIByItemQuest(item_script, filename); if(qi) { _item_quest_status[item_script] = qi->GetIdentifier(); + qi->LoadItemScript(filename, item_script); return qi->ItemHasQuestSub(itm, subname); } else { _item_quest_status[item_script] = QuestFailedToLoad; @@ -169,50 +181,58 @@ void QuestParserCollection::EventNPC(QuestEventID evt, NPC* npc, Mob *init, std: qiter->second->EventNPC(evt, npc, init, data, extra_data); } } else { - QuestInterface *qi = GetQIByNPCQuest(npc->GetNPCTypeID()); + std::string filename; + QuestInterface *qi = GetQIByNPCQuest(npc->GetNPCTypeID(), filename); if(qi) { _npc_quest_status[npc->GetNPCTypeID()] = qi->GetIdentifier(); + qi->LoadNPCScript(filename, npc->GetNPCTypeID()); qi->EventNPC(evt, npc, init, data, extra_data); } else { _npc_quest_status[npc->GetNPCTypeID()] = QuestFailedToLoad; } } - // K, lets also parse templates/global_npc.pl - if(_global_npc_quest_status != QuestUnloaded && _global_npc_quest_status != QuestFailedToLoad) { - std::map::iterator qiter = _interfaces.find(_global_npc_quest_status); - qiter->second->EventGlobalNPC(evt, npc, init, data, extra_data); - } else { - QuestInterface *qi = GetQIByGlobalNPCQuest(); - if(qi) { - _global_npc_quest_status = qi->GetIdentifier(); - qi->EventGlobalNPC(evt, npc, init, data, extra_data); - } else { - _global_npc_quest_status = QuestFailedToLoad; - } - } + //// K, lets also parse templates/global_npc.pl + //if(_global_npc_quest_status != QuestUnloaded && _global_npc_quest_status != QuestFailedToLoad) { + // std::map::iterator qiter = _interfaces.find(_global_npc_quest_status); + // qiter->second->EventGlobalNPC(evt, npc, init, data, extra_data); + //} else { + // std::string filename; + // QuestInterface *qi = GetQIByGlobalNPCQuest(filename); + // if(qi) { + // _global_npc_quest_status = qi->GetIdentifier(); + // qi->LoadGlobalNPCScript(filename); + // qi->EventGlobalNPC(evt, npc, init, data, extra_data); + // } else { + // _global_npc_quest_status = QuestFailedToLoad; + // } + //} } void QuestParserCollection::EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data) { if(_player_quest_status == QuestUnloaded) { - QuestInterface *qi = GetQIByGlobalPlayerQuest(); - if(qi) { - _global_player_quest_status = qi->GetIdentifier(); - qi->EventGlobalPlayer(evt, client, data, extra_data); - } + std::string filename; + //QuestInterface *qi = GetQIByGlobalPlayerQuest(filename); + //if(qi) { + // _global_player_quest_status = qi->GetIdentifier(); + // qi->LoadGlobalPlayerScript(filename); + // qi->EventGlobalPlayer(evt, client, data, extra_data); + //} - qi = GetQIByPlayerQuest(); + QuestInterface *qi = GetQIByPlayerQuest(filename); if(qi) { _player_quest_status = qi->GetIdentifier(); + qi->LoadPlayerScript(filename); qi->EventPlayer(evt, client, data, extra_data); } } else { - if(_global_player_quest_status != QuestFailedToLoad) { - std::map::iterator iter = _interfaces.find(_global_player_quest_status); - if(iter != _interfaces.end()) - iter->second->EventGlobalPlayer(evt, client, data, extra_data); - } + //if(_global_player_quest_status != QuestFailedToLoad) { + // std::map::iterator iter = _interfaces.find(_global_player_quest_status); + // if(iter != _interfaces.end()) + // iter->second->EventGlobalPlayer(evt, client, data, extra_data); + //} + if(_player_quest_status != QuestFailedToLoad) { std::map::iterator iter = _interfaces.find(_player_quest_status); iter->second->EventPlayer(evt, client, data, extra_data); @@ -239,9 +259,11 @@ void QuestParserCollection::EventItem(QuestEventID evt, Client *client, ItemInst qiter->second->EventItem(evt, client, item, objid, extra_data); } } else { - QuestInterface *qi = GetQIByItemQuest(item_script); + std::string filename; + QuestInterface *qi = GetQIByItemQuest(item_script, filename); if(qi) { _item_quest_status[item_script] = qi->GetIdentifier(); + qi->LoadItemScript(filename, item_script); qi->EventItem(evt, client, item, objid, extra_data); } else { _item_quest_status[item_script] = QuestFailedToLoad; @@ -258,9 +280,11 @@ void QuestParserCollection::EventSpell(QuestEventID evt, NPC* npc, Client *clien qiter->second->EventSpell(evt, npc, client, spell_id, extra_data); } } else { - QuestInterface *qi = GetQIBySpellQuest(spell_id); + std::string filename; + QuestInterface *qi = GetQIBySpellQuest(spell_id, filename); if(qi) { _spell_quest_status[spell_id] = qi->GetIdentifier(); + qi->LoadSpellScript(filename, spell_id); qi->EventSpell(evt, npc, client, spell_id, extra_data); } else { _spell_quest_status[spell_id] = QuestFailedToLoad; @@ -268,9 +292,9 @@ void QuestParserCollection::EventSpell(QuestEventID evt, NPC* npc, Client *clien } } -QuestInterface *QuestParserCollection::GetQIByNPCQuest(uint32 npcid) { +QuestInterface *QuestParserCollection::GetQIByNPCQuest(uint32 npcid, std::string &filename) { //first look for /quests/zone/npcid.ext (precedence) - std::string filename = "quests/"; + filename = "quests/"; filename += zone->GetShortName(); filename += "/"; filename += itoa(npcid); @@ -408,13 +432,13 @@ QuestInterface *QuestParserCollection::GetQIByNPCQuest(uint32 npcid) { return NULL; } -QuestInterface *QuestParserCollection::GetQIByPlayerQuest() { +QuestInterface *QuestParserCollection::GetQIByPlayerQuest(std::string &filename) { if(!zone) return NULL; //first look for /quests/zone/player_v[instance_version].ext (precedence) - std::string filename = "quests/"; + filename = "quests/"; filename += zone->GetShortName(); filename += "/"; filename += "player_v"; @@ -481,9 +505,9 @@ QuestInterface *QuestParserCollection::GetQIByPlayerQuest() { return NULL; } -QuestInterface *QuestParserCollection::GetQIByGlobalNPCQuest(){ +QuestInterface *QuestParserCollection::GetQIByGlobalNPCQuest(std::string &filename) { // simply look for templates/global_npc.pl - std::string filename = "quests/"; + filename = "quests/"; filename += QUEST_TEMPLATES_DIRECTORY; filename += "/"; filename += "global_npc"; @@ -508,9 +532,9 @@ QuestInterface *QuestParserCollection::GetQIByGlobalNPCQuest(){ return NULL; } -QuestInterface *QuestParserCollection::GetQIByGlobalPlayerQuest() { +QuestInterface *QuestParserCollection::GetQIByGlobalPlayerQuest(std::string &filename) { //first look for /quests/templates/player.ext (precedence) - std::string filename = "quests/"; + filename = "quests/"; filename += QUEST_TEMPLATES_DIRECTORY; filename += "/"; filename += "global_player"; @@ -535,9 +559,9 @@ QuestInterface *QuestParserCollection::GetQIByGlobalPlayerQuest() { return NULL; } -QuestInterface *QuestParserCollection::GetQIBySpellQuest(uint32 spell_id) { +QuestInterface *QuestParserCollection::GetQIBySpellQuest(uint32 spell_id, std::string &filename) { //first look for /quests/spells/spell_id.ext (precedence) - std::string filename = "quests/spells/"; + filename = "quests/spells/"; filename += itoa(spell_id); std::string tmp; FILE *f = NULL; @@ -560,9 +584,9 @@ QuestInterface *QuestParserCollection::GetQIBySpellQuest(uint32 spell_id) { return NULL; } -QuestInterface *QuestParserCollection::GetQIByItemQuest(std::string item_script) { +QuestInterface *QuestParserCollection::GetQIByItemQuest(std::string item_script, std::string &filename) { //first look for /quests/items/item_script.ext (precedence) - std::string filename = "quests/items/"; + filename = "quests/items/"; filename += item_script; std::string tmp; FILE *f = NULL; @@ -580,7 +604,7 @@ QuestInterface *QuestParserCollection::GetQIByItemQuest(std::string item_script) } iter++; - } + } return NULL; -} \ No newline at end of file +} diff --git a/zone/QuestParserCollection.h b/zone/QuestParserCollection.h index 640a1557b..23d4760a8 100644 --- a/zone/QuestParserCollection.h +++ b/zone/QuestParserCollection.h @@ -35,12 +35,12 @@ public: void EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data); private: - QuestInterface *GetQIByNPCQuest(uint32 npcid); - QuestInterface *GetQIByGlobalNPCQuest(); - QuestInterface *GetQIByPlayerQuest(); - QuestInterface *GetQIByGlobalPlayerQuest(); - QuestInterface *GetQIBySpellQuest(uint32 spell_id); - QuestInterface *GetQIByItemQuest(std::string item_script); + QuestInterface *GetQIByNPCQuest(uint32 npcid, std::string &filename); + QuestInterface *GetQIByGlobalNPCQuest(std::string &filename); + QuestInterface *GetQIByPlayerQuest(std::string &filename); + QuestInterface *GetQIByGlobalPlayerQuest(std::string &filename); + QuestInterface *GetQIBySpellQuest(uint32 spell_id, std::string &filename); + QuestInterface *GetQIByItemQuest(std::string item_script, std::string &filename); std::map _interfaces; std::map _extensions; diff --git a/zone/embparser.cpp b/zone/embparser.cpp index dc77b4e75..0bebc9ea6 100644 --- a/zone/embparser.cpp +++ b/zone/embparser.cpp @@ -274,15 +274,9 @@ void PerlembParser::EventCommon(QuestEventID event, uint32 objid, const char * d if(global){ isGlobalNPC = true; packagename = "global_npc"; - LoadGlobalNPCScript(); - }else{ + } else { packagename = GetPkgPrefix(objid); - - if(!isloaded(packagename.c_str())) - { - LoadScript(objid, zone->GetShortName()); - } } } else if(isItemQuest) { @@ -291,22 +285,14 @@ void PerlembParser::EventCommon(QuestEventID event, uint32 objid, const char * d if (event == EVENT_SCALE_CALC || event == EVENT_ITEM_ENTERZONE) { packagename = item->CharmFile; - if(!isloaded(packagename.c_str())) { - LoadItemScript(iteminst, packagename, itemQuestScale); - } } else if (event == EVENT_ITEM_CLICK || event == EVENT_ITEM_CLICK_CAST) { packagename = "script_"; packagename += itoa(item->ScriptFileID); - if(!isloaded(packagename.c_str())) { - LoadItemScript(iteminst, packagename, itemScriptFileID); - } } else { packagename = "item_"; packagename += itoa(objid); - if(!isloaded(packagename.c_str())) - LoadItemScript(iteminst, packagename, itemQuestID); } } else if(isPlayerQuest) { @@ -315,28 +301,14 @@ void PerlembParser::EventCommon(QuestEventID event, uint32 objid, const char * d packagename = "player"; packagename += "_"; packagename += zone->GetShortName(); - - if(!isloaded(packagename.c_str())) - { - LoadPlayerScript(zone->GetShortName()); - } } else if(isGlobalPlayerQuest) { packagename = "global_player"; - - if(!isloaded(packagename.c_str())) - { - LoadGlobalPlayerScript(); - } } else { packagename = "spell_effect_"; packagename += data; - if(!isloaded(packagename.c_str())) - { - LoadSpellScript(atoi(data)); - } } const char *sub_name = QuestEventSubroutines[event]; @@ -887,12 +859,6 @@ void PerlembParser::ReloadQuests(bool with_timers) { LogFile->write(EQEMuLog::Status, "Error re-initializing perlembed: %s", e.what()); throw e.what(); } - try { - LoadScript(0, NULL); - } - catch(const char * err) { - LogFile->write(EQEMuLog::Status, "Error loading default script: %s", err); - } hasQuests.clear(); playerQuestLoaded.clear(); @@ -902,482 +868,509 @@ void PerlembParser::ReloadQuests(bool with_timers) { spellQuestLoaded.clear(); } -int PerlembParser::LoadScript(int npcid, const char * zone, Mob* activater) -{ +void PerlembParser::LoadNPCScript(std::string filename, int npc_id) { if(!perl) { - return(0); + return; } - //we have already tried to load this quest... - if(hasQuests.count(npcid) == 1) + if(hasQuests.count(npc_id) == 1) { - return(1); + return; } - - string filename = "quests/", packagename = GetPkgPrefix(npcid); - //each package name is of the form qstxxxx where xxxx = npcid (since numbers alone are not valid package names) - questMode curmode = questDefault; - FILE *tmpf; - //LogFile->write(EQEMuLog::Debug, "LoadScript(%d, %s):\n", npcid, zone); - if(!npcid || !zone) - { - //Load quests/default.pl - filename += DEFAULT_QUEST_PREFIX; - filename += ".pl"; - curmode = questDefault; - } - else - { - filename += zone; - filename += "/"; -#ifdef QUEST_SCRIPTS_BYNAME - string bnfilename = filename; -#endif - filename += itoa(npcid); - filename += ".pl"; - curmode = questByID; - -#ifdef QUEST_SCRIPTS_BYNAME - //assuming name limit stays 64 chars. - char tmpname[64]; - int count0 = 0; - bool filefound = false; - tmpf = fopen(filename.c_str(), "r"); - if(tmpf != NULL) - { - fclose(tmpf); - filefound = true; - } - //LogFile->write(EQEMuLog::Debug, " tried '%s': %d", filename.c_str(), filefound); - - tmpname[0] = 0; - //if there is no file for the NPC's ID, try for the NPC's name - if(!filefound) - { - //revert to just path - filename = bnfilename; - const NPCType *npct = database.GetNPCType(npcid); - if(npct == NULL) - { - //LogFile->write(EQEMuLog::Debug, " no npc type"); - //revert and go on with life - filename += itoa(npcid); - filename += ".pl"; - curmode = questByID; - } - else - { - //trace out the ` characters, turn into - - int nlen = strlen(npct->name); - //just to make sure - if(nlen < 64) - { - int r; - //this should get our NULL as well.. - for(r = 0; r <= nlen; r++) - { - tmpname[r] = npct->name[r]; - - //watch for 00 delimiter - if(tmpname[r] == '0') - { - count0++; - //second '0' - if(count0 > 1) - { - //stop before previous 0 - tmpname[r-1] = '\0'; - break; - } - } - else - { - count0 = 0; - } - - //rewrite ` to be more file name friendly - if(tmpname[r] == '`') - { - tmpname[r] = '-'; - } - - } - filename += tmpname; - filename += ".pl"; - curmode = questByName; - } - else - { - //LogFile->write(EQEMuLog::Debug, " namelen too long"); - //revert and go on with life, again - filename += itoa(npcid); - filename += ".pl"; - curmode = questByID; - } - } - } - -#ifdef QUEST_TEMPLATES_BYNAME - - tmpf = fopen(filename.c_str(), "r"); - if(tmpf != NULL) - { - fclose(tmpf); - filefound = true; - } - - - //LogFile->write(EQEMuLog::Debug, " tried '%s': %d", filename.c_str(), filefound2); - - //if there is no file for the NPC's ID or name, - //try for the NPC's name in the templates directory - //only works if we have gotten the NPC's name above - if(!filefound) - { - if(tmpname[0] != 0) - { - //revert to just path - filename = "quests/"; - filename += QUEST_TEMPLATES_DIRECTORY; - filename += "/"; - filename += tmpname; - filename += ".pl"; - curmode = questTemplate; - //LogFile->write(EQEMuLog::Debug, " template '%s'", filename.c_str(), filefound2); - } - else - { - //LogFile->write(EQEMuLog::Debug, " no template name"); - filename = "quests/"; - filename += QUEST_TEMPLATES_DIRECTORY; - filename += "/"; - filename += itoa(npcid); - filename += ".pl"; - curmode = questTemplateByID; - } - } - -#endif //QUEST_TEMPLATES_BYNAME - -#endif //QUEST_SCRIPTS_BYNAME - - tmpf = fopen(filename.c_str(), "r"); - if(tmpf != NULL) - { - fclose(tmpf); - filefound = true; - } - - // If by ID, Name or Template wasn't found, load /quests/zone/default.pl - if(!filefound) - { - //Load Default Quests Per Zone quests/zonename/default.pl - filename = bnfilename; - filename += "default.pl"; - curmode = questDefaultByZone; - //LogFile->write(EQEMuLog::Debug, "LoadScript(%s)", filename.c_str()); - } - - tmpf = fopen(filename.c_str(), "r"); - if(tmpf != NULL) - { - fclose(tmpf); - filefound = true; - } - - // If zone template isn't found look for it globally /quests/template/default.pl - if(!filefound) - { - //Load Default Quests Globally - //filename = bnfilename; - filename = "quests/"; - filename += QUEST_TEMPLATES_DIRECTORY; - filename += "/"; - filename += "default.pl"; - curmode = questDefaultByZone; - //LogFile->write(EQEMuLog::Debug, "LoadScript(%s)", filename.c_str()); - } - } - - //check for existance of quest file before trying to make perl load it. - tmpf = fopen(filename.c_str(), "r"); - if(tmpf == NULL) - { - //the npc has no qst file, attach the defaults - std::string setdefcmd = "$"; - setdefcmd += packagename; - setdefcmd += "::isdefault = 1;"; - perl->eval(setdefcmd.c_str()); - setdefcmd = "$"; - setdefcmd += packagename; - setdefcmd += "::isloaded = 1;"; - perl->eval(setdefcmd.c_str()); - hasQuests[npcid] = questDefault; - return(1); - } - else - { - fclose(tmpf); - } - - //LogFile->write(EQEMuLog::Debug, " finally settling on '%s'", filename.c_str()); - // LogFile->write(EQEMuLog::Status, "Looking for quest file: '%s'", filename.c_str()); - - // todo: decide whether or not to delete the package to allow for script refreshes w/o restarting the server - // remember to guard against deleting the default package, on a similar note... consider deleting packages upon zone change - // try { perl->eval(std::string("delete_package(\"").append(packagename).append("\");").c_str()); } - // catch(...) {/*perl balked at us trynig to delete a non-existant package... no big deal.*/} - - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char * err) - { - //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,"No such file or directory")) - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s (reverting to default questfile)", filename.c_str(), err); - } - //todo: change this to just read eval_file's %cache - duh! - if(!isloaded(packagename.c_str())) - { - //the npc has no qst file, attach the defaults - std::string setdefcmd = "$"; - setdefcmd += packagename; - setdefcmd += "::isdefault = 1;"; - perl->eval(setdefcmd.c_str()); - setdefcmd = "$"; - setdefcmd += packagename; - setdefcmd += "::isloaded = 1;"; - perl->eval(setdefcmd.c_str()); - curmode = questDefault; - } - - hasQuests[npcid] = curmode; - return(1); } -int PerlembParser::LoadGlobalNPCScript() -{ - if(!perl) - return 0; - - if(perl->InUse()) - { - return 0; - } - - if(globalNPCQuestLoaded != nQuestReadyToLoad) { - return 1; - } - - string filename = "quests/"; - filename += QUEST_TEMPLATES_DIRECTORY; - filename += "/global_npc.pl"; - string packagename = "global_npc"; - - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char * err) - { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); - } - - globalNPCQuestLoaded = nQuestLoaded; - - return 1; +void PerlembParser::LoadGlobalNPCScript(std::string filename) { } -int PerlembParser::LoadPlayerScript(const char *zone_name) -{ - if(!perl) - return 0; - - if(perl->InUse()) - { - return 0; - } - - if(playerQuestLoaded.count(zone_name) == 1) { - return 1; - } - - string filename= "quests/"; - filename += zone_name; - filename += "/player_v"; - filename += itoa(zone->GetInstanceVersion()); - filename += ".pl"; - string packagename = "player"; - packagename += "_"; - packagename += zone_name; - - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char * err) - { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); - } - - if(!isloaded(packagename.c_str())) - { - filename= "quests/"; - filename += zone_name; - filename += "/player.pl"; - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char * err) - { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); - } - } - - //todo: change this to just read eval_file's %cache - duh! - if(!isloaded(packagename.c_str())) - { - filename = "quests/"; - filename += QUEST_TEMPLATES_DIRECTORY; - filename += "/player.pl"; - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char * err) - { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); - } - if(!isloaded(packagename.c_str())) - { - playerQuestLoaded[zone_name] = pQuestUnloaded; - return 0; - } - } - - if(perl->SubExists(packagename.c_str(), "EVENT_CAST")) - playerQuestLoaded[zone_name] = pQuestEventCast; - else - playerQuestLoaded[zone_name] = pQuestLoaded; - return 1; +void PerlembParser::LoadPlayerScript(std::string filename) { } -int PerlembParser::LoadGlobalPlayerScript() -{ - if(!perl) - return 0; - - if(perl->InUse()) - { - return 0; - } - - if(globalPlayerQuestLoaded != pQuestReadyToLoad) { - return 1; - } - - string filename = "quests/"; - filename += QUEST_TEMPLATES_DIRECTORY; - filename += "/global_player.pl"; - string packagename = "global_player"; - - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char * err) - { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); - } - - if(perl->SubExists(packagename.c_str(), "EVENT_CAST")) - globalPlayerQuestLoaded = pQuestEventCast; - else - globalPlayerQuestLoaded = pQuestLoaded; - return 1; +void PerlembParser::LoadGlobalPlayerScript(std::string filename) { } -int PerlembParser::LoadItemScript(ItemInst* iteminst, string packagename, itemQuestMode Qtype) { - if(!perl) - return 0; - - if(perl->InUse()) - { - return 0; - } - - // if we've already tried to load it, don't try again - if(itemQuestLoaded.count(packagename) == 1) - return 1; - - string filename = "quests/items/"; - if(Qtype == itemQuestScale) - filename += packagename; - else if(Qtype == itemQuestLore) { - filename += "lore_"; - filename += itoa(iteminst->GetItem()->LoreGroup); - } - else if(Qtype == itemScriptFileID) { - filename += "script_"; - filename += itoa(iteminst->GetItemScriptID()); - } - else - filename += itoa(iteminst->GetID()); - filename += ".pl"; - printf("Loading file %s\n",filename.c_str()); - - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char* err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); - } - - if(!isloaded(packagename.c_str())) { - itemQuestLoaded[packagename] = Qtype; - return 0; - } - - itemQuestLoaded[packagename] = itemQuestUnloaded; - return 1; +void PerlembParser::LoadItemScript(std::string filename, std::string item_script) { } -int PerlembParser::LoadSpellScript(uint32 id) -{ - if(!perl) - return 0; - - if(perl->InUse()) - { - return 0; - } - - // if we've already tried to load it, don't try again - if(spellQuestLoaded.count(id) == 1) - return 1; - - string filename = "quests/spells/"; - string packagename = "spell_effect_"; - filename += itoa(id); - packagename += itoa(id); - filename += ".pl"; - printf("Loading file %s\n", filename.c_str()); - - try { - perl->eval_file(packagename.c_str(), filename.c_str()); - } - catch(const char* err) { - LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); - } - - if(!isloaded(packagename.c_str())) { - spellQuestLoaded[id] = spellQuestFailed; - return 0; - } - - spellQuestLoaded[id] = spellQuestFullyLoaded; - return 1; +void PerlembParser::LoadSpellScript(std::string filename, uint32 spell_id) { } +//int PerlembParser::LoadScript(int npcid, const char * zone, Mob* activater) +//{ +// if(!perl) +// { +// return(0); +// } +// +// //we have already tried to load this quest... +// if(hasQuests.count(npcid) == 1) +// { +// return(1); +// } +// +// string filename = "quests/", packagename = GetPkgPrefix(npcid); +// //each package name is of the form qstxxxx where xxxx = npcid (since numbers alone are not valid package names) +// questMode curmode = questDefault; +// FILE *tmpf; +// //LogFile->write(EQEMuLog::Debug, "LoadScript(%d, %s):\n", npcid, zone); +// if(!npcid || !zone) +// { +// //Load quests/default.pl +// filename += DEFAULT_QUEST_PREFIX; +// filename += ".pl"; +// curmode = questDefault; +// } +// else +// { +// filename += zone; +// filename += "/"; +//#ifdef QUEST_SCRIPTS_BYNAME +// string bnfilename = filename; +//#endif +// filename += itoa(npcid); +// filename += ".pl"; +// curmode = questByID; +// +//#ifdef QUEST_SCRIPTS_BYNAME +// //assuming name limit stays 64 chars. +// char tmpname[64]; +// int count0 = 0; +// bool filefound = false; +// tmpf = fopen(filename.c_str(), "r"); +// if(tmpf != NULL) +// { +// fclose(tmpf); +// filefound = true; +// } +// //LogFile->write(EQEMuLog::Debug, " tried '%s': %d", filename.c_str(), filefound); +// +// tmpname[0] = 0; +// //if there is no file for the NPC's ID, try for the NPC's name +// if(!filefound) +// { +// //revert to just path +// filename = bnfilename; +// const NPCType *npct = database.GetNPCType(npcid); +// if(npct == NULL) +// { +// //LogFile->write(EQEMuLog::Debug, " no npc type"); +// //revert and go on with life +// filename += itoa(npcid); +// filename += ".pl"; +// curmode = questByID; +// } +// else +// { +// //trace out the ` characters, turn into - +// int nlen = strlen(npct->name); +// //just to make sure +// if(nlen < 64) +// { +// int r; +// //this should get our NULL as well.. +// for(r = 0; r <= nlen; r++) +// { +// tmpname[r] = npct->name[r]; +// +// //watch for 00 delimiter +// if(tmpname[r] == '0') +// { +// count0++; +// //second '0' +// if(count0 > 1) +// { +// //stop before previous 0 +// tmpname[r-1] = '\0'; +// break; +// } +// } +// else +// { +// count0 = 0; +// } +// +// //rewrite ` to be more file name friendly +// if(tmpname[r] == '`') +// { +// tmpname[r] = '-'; +// } +// +// } +// filename += tmpname; +// filename += ".pl"; +// curmode = questByName; +// } +// else +// { +// //LogFile->write(EQEMuLog::Debug, " namelen too long"); +// //revert and go on with life, again +// filename += itoa(npcid); +// filename += ".pl"; +// curmode = questByID; +// } +// } +// } +// +//#ifdef QUEST_TEMPLATES_BYNAME +// +// tmpf = fopen(filename.c_str(), "r"); +// if(tmpf != NULL) +// { +// fclose(tmpf); +// filefound = true; +// } +// +// +// //LogFile->write(EQEMuLog::Debug, " tried '%s': %d", filename.c_str(), filefound2); +// +// //if there is no file for the NPC's ID or name, +// //try for the NPC's name in the templates directory +// //only works if we have gotten the NPC's name above +// if(!filefound) +// { +// if(tmpname[0] != 0) +// { +// //revert to just path +// filename = "quests/"; +// filename += QUEST_TEMPLATES_DIRECTORY; +// filename += "/"; +// filename += tmpname; +// filename += ".pl"; +// curmode = questTemplate; +// //LogFile->write(EQEMuLog::Debug, " template '%s'", filename.c_str(), filefound2); +// } +// else +// { +// //LogFile->write(EQEMuLog::Debug, " no template name"); +// filename = "quests/"; +// filename += QUEST_TEMPLATES_DIRECTORY; +// filename += "/"; +// filename += itoa(npcid); +// filename += ".pl"; +// curmode = questTemplateByID; +// } +// } +// +//#endif //QUEST_TEMPLATES_BYNAME +// +//#endif //QUEST_SCRIPTS_BYNAME +// +// tmpf = fopen(filename.c_str(), "r"); +// if(tmpf != NULL) +// { +// fclose(tmpf); +// filefound = true; +// } +// +// // If by ID, Name or Template wasn't found, load /quests/zone/default.pl +// if(!filefound) +// { +// //Load Default Quests Per Zone quests/zonename/default.pl +// filename = bnfilename; +// filename += "default.pl"; +// curmode = questDefaultByZone; +// //LogFile->write(EQEMuLog::Debug, "LoadScript(%s)", filename.c_str()); +// } +// +// tmpf = fopen(filename.c_str(), "r"); +// if(tmpf != NULL) +// { +// fclose(tmpf); +// filefound = true; +// } +// +// // If zone template isn't found look for it globally /quests/template/default.pl +// if(!filefound) +// { +// //Load Default Quests Globally +// //filename = bnfilename; +// filename = "quests/"; +// filename += QUEST_TEMPLATES_DIRECTORY; +// filename += "/"; +// filename += "default.pl"; +// curmode = questDefaultByZone; +// //LogFile->write(EQEMuLog::Debug, "LoadScript(%s)", filename.c_str()); +// } +// } +// +// //check for existance of quest file before trying to make perl load it. +// tmpf = fopen(filename.c_str(), "r"); +// if(tmpf == NULL) +// { +// //the npc has no qst file, attach the defaults +// std::string setdefcmd = "$"; +// setdefcmd += packagename; +// setdefcmd += "::isdefault = 1;"; +// perl->eval(setdefcmd.c_str()); +// setdefcmd = "$"; +// setdefcmd += packagename; +// setdefcmd += "::isloaded = 1;"; +// perl->eval(setdefcmd.c_str()); +// hasQuests[npcid] = questDefault; +// return(1); +// } +// else +// { +// fclose(tmpf); +// } +// +// //LogFile->write(EQEMuLog::Debug, " finally settling on '%s'", filename.c_str()); +// // LogFile->write(EQEMuLog::Status, "Looking for quest file: '%s'", filename.c_str()); +// +// // todo: decide whether or not to delete the package to allow for script refreshes w/o restarting the server +// // remember to guard against deleting the default package, on a similar note... consider deleting packages upon zone change +// // try { perl->eval(std::string("delete_package(\"").append(packagename).append("\");").c_str()); } +// // catch(...) {/*perl balked at us trynig to delete a non-existant package... no big deal.*/} +// +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char * err) +// { +// //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,"No such file or directory")) +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s (reverting to default questfile)", filename.c_str(), err); +// } +// //todo: change this to just read eval_file's %cache - duh! +// if(!isloaded(packagename.c_str())) +// { +// //the npc has no qst file, attach the defaults +// std::string setdefcmd = "$"; +// setdefcmd += packagename; +// setdefcmd += "::isdefault = 1;"; +// perl->eval(setdefcmd.c_str()); +// setdefcmd = "$"; +// setdefcmd += packagename; +// setdefcmd += "::isloaded = 1;"; +// perl->eval(setdefcmd.c_str()); +// curmode = questDefault; +// } +// +// hasQuests[npcid] = curmode; +// return(1); +//} +// +//int PerlembParser::LoadGlobalNPCScript() +//{ +// if(!perl) +// return 0; +// +// if(perl->InUse()) +// { +// return 0; +// } +// +// if(globalNPCQuestLoaded != nQuestReadyToLoad) { +// return 1; +// } +// +// string filename = "quests/"; +// filename += QUEST_TEMPLATES_DIRECTORY; +// filename += "/global_npc.pl"; +// string packagename = "global_npc"; +// +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char * err) +// { +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); +// } +// +// globalNPCQuestLoaded = nQuestLoaded; +// +// return 1; +//} +// +//int PerlembParser::LoadPlayerScript(const char *zone_name) +//{ +// if(!perl) +// return 0; +// +// if(perl->InUse()) +// { +// return 0; +// } +// +// if(playerQuestLoaded.count(zone_name) == 1) { +// return 1; +// } +// +// string filename= "quests/"; +// filename += zone_name; +// filename += "/player_v"; +// filename += itoa(zone->GetInstanceVersion()); +// filename += ".pl"; +// string packagename = "player"; +// packagename += "_"; +// packagename += zone_name; +// +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char * err) +// { +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); +// } +// +// if(!isloaded(packagename.c_str())) +// { +// filename= "quests/"; +// filename += zone_name; +// filename += "/player.pl"; +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char * err) +// { +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); +// } +// } +// +// //todo: change this to just read eval_file's %cache - duh! +// if(!isloaded(packagename.c_str())) +// { +// filename = "quests/"; +// filename += QUEST_TEMPLATES_DIRECTORY; +// filename += "/player.pl"; +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char * err) +// { +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); +// } +// if(!isloaded(packagename.c_str())) +// { +// playerQuestLoaded[zone_name] = pQuestUnloaded; +// return 0; +// } +// } +// +// if(perl->SubExists(packagename.c_str(), "EVENT_CAST")) +// playerQuestLoaded[zone_name] = pQuestEventCast; +// else +// playerQuestLoaded[zone_name] = pQuestLoaded; +// return 1; +//} +// +//int PerlembParser::LoadGlobalPlayerScript() +//{ +// if(!perl) +// return 0; +// +// if(perl->InUse()) +// { +// return 0; +// } +// +// if(globalPlayerQuestLoaded != pQuestReadyToLoad) { +// return 1; +// } +// +// string filename = "quests/"; +// filename += QUEST_TEMPLATES_DIRECTORY; +// filename += "/global_player.pl"; +// string packagename = "global_player"; +// +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char * err) +// { +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); +// } +// +// if(perl->SubExists(packagename.c_str(), "EVENT_CAST")) +// globalPlayerQuestLoaded = pQuestEventCast; +// else +// globalPlayerQuestLoaded = pQuestLoaded; +// return 1; +//} +// +//int PerlembParser::LoadItemScript(ItemInst* iteminst, string packagename, itemQuestMode Qtype) { +// if(!perl) +// return 0; +// +// if(perl->InUse()) +// { +// return 0; +// } +// +// // if we've already tried to load it, don't try again +// if(itemQuestLoaded.count(packagename) == 1) +// return 1; +// +// string filename = "quests/items/"; +// if(Qtype == itemQuestScale) +// filename += packagename; +// else if(Qtype == itemQuestLore) { +// filename += "lore_"; +// filename += itoa(iteminst->GetItem()->LoreGroup); +// } +// else if(Qtype == itemScriptFileID) { +// filename += "script_"; +// filename += itoa(iteminst->GetItemScriptID()); +// } +// else +// filename += itoa(iteminst->GetID()); +// filename += ".pl"; +// printf("Loading file %s\n",filename.c_str()); +// +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char* err) { +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); +// } +// +// if(!isloaded(packagename.c_str())) { +// itemQuestLoaded[packagename] = Qtype; +// return 0; +// } +// +// itemQuestLoaded[packagename] = itemQuestUnloaded; +// return 1; +//} +// +//int PerlembParser::LoadSpellScript(uint32 id) +//{ +// if(!perl) +// return 0; +// +// if(perl->InUse()) +// { +// return 0; +// } +// +// // if we've already tried to load it, don't try again +// if(spellQuestLoaded.count(id) == 1) +// return 1; +// +// string filename = "quests/spells/"; +// string packagename = "spell_effect_"; +// filename += itoa(id); +// packagename += itoa(id); +// filename += ".pl"; +// printf("Loading file %s\n", filename.c_str()); +// +// try { +// perl->eval_file(packagename.c_str(), filename.c_str()); +// } +// catch(const char* err) { +// LogFile->write(EQEMuLog::Quest, "WARNING: error compiling quest file %s: %s", filename.c_str(), err); +// } +// +// if(!isloaded(packagename.c_str())) { +// spellQuestLoaded[id] = spellQuestFailed; +// return 0; +// } +// +// spellQuestLoaded[id] = spellQuestFullyLoaded; +// return 1; +//} + bool PerlembParser::isloaded(const char *packagename) const { char buffer[120]; snprintf(buffer, 120, "$%s::isloaded", packagename); @@ -1400,7 +1393,7 @@ int PerlembParser::HasQuestFile(uint32 npcid) { } if (qstID==-1) - success = LoadScript(npcid, zone->GetShortName()); + success = false; if (!success) return(false); @@ -1417,22 +1410,12 @@ int PerlembParser::HasQuestFile(uint32 npcid) { bool PerlembParser::HasQuestSub(uint32 npcid, const char *subname) { int32 qstID = GetNPCqstID(npcid); - if (qstID == -1) { - if(!LoadScript(npcid, zone->GetShortName())) { - return(false); - } - } - string packagename = GetPkgPrefix(npcid); return(perl->SubExists(packagename.c_str(), subname)); } bool PerlembParser::HasGlobalQuestSub(const char *subname) { - if(!LoadGlobalNPCScript()) { - return(false); - } - string packagename = "global_npc"; return(perl->SubExists(packagename.c_str(), subname)); @@ -1442,9 +1425,6 @@ bool PerlembParser::PlayerHasQuestSub(const char *subname) { string packagename = "player_"; packagename += zone->GetShortName(); - - if(playerQuestLoaded.count(zone->GetShortName()) == 0) - LoadPlayerScript(zone->GetShortName()); if(subname == "EVENT_CAST") return (playerQuestLoaded[zone->GetShortName()] == pQuestEventCast); @@ -1455,9 +1435,6 @@ bool PerlembParser::PlayerHasQuestSub(const char *subname) { bool PerlembParser::GlobalPlayerHasQuestSub(const char *subname) { string packagename = "global_player"; - - if(globalPlayerQuestLoaded == pQuestReadyToLoad) - LoadGlobalPlayerScript(); if(subname == "EVENT_CAST") return (globalPlayerQuestLoaded == pQuestEventCast); @@ -1470,9 +1447,6 @@ bool PerlembParser::SpellHasQuestSub(uint32 id, const char *subname) string packagename = "spell_effect_"; packagename += itoa(id); - if(spellQuestLoaded.count(id) == 0) - LoadSpellScript(id); - return(perl->SubExists(packagename.c_str(), subname)); } @@ -1486,22 +1460,16 @@ bool PerlembParser::ItemHasQuestSub(ItemInst *itm, const char *subname) if(strcmp("EVENT_SCALE_CALC", subname) == 0 || strcmp("EVENT_ITEM_ENTERZONE", subname) == 0) { packagename = item->CharmFile; - if(itemQuestLoaded.count(packagename) == 0) - LoadItemScript(itm, packagename, itemQuestScale); } else if(strcmp("EVENT_ITEM_CLICK", subname) == 0 || strcmp("EVENT_ITEM_CLICK_CAST", subname) == 0 ) { packagename = "script_"; packagename += itoa(item->ScriptFileID); - if(itemQuestLoaded.count(packagename) == 0) - LoadItemScript(itm, packagename, itemScriptFileID); } else { packagename = "item_"; packagename += itoa(item->ID); - if(itemQuestLoaded.count(packagename) == 0) - LoadItemScript(itm, packagename, itemQuestID); } return perl->SubExists(packagename.c_str(), subname); diff --git a/zone/embparser.h b/zone/embparser.h index 7b58b5930..1adc7cfde 100644 --- a/zone/embparser.h +++ b/zone/embparser.h @@ -118,12 +118,19 @@ public: virtual void AddVar(std::string name, std::string val) { Parser::AddVar(name, val); }; virtual uint32 GetIdentifier() { return 0xf8b05c11; } - int LoadScript(int npcid, const char * zone, Mob* activater=0); - int LoadGlobalNPCScript(); - int LoadPlayerScript(const char *zone); - int LoadGlobalPlayerScript(); - int LoadItemScript(ItemInst* iteminst, string packagename, itemQuestMode Qtype); - int LoadSpellScript(uint32 id); + virtual void LoadNPCScript(std::string filename, int npc_id); + virtual void LoadGlobalNPCScript(std::string filename); + virtual void LoadPlayerScript(std::string filename); + virtual void LoadGlobalPlayerScript(std::string filename); + virtual void LoadItemScript(std::string filename, std::string item_script); + virtual void LoadSpellScript(std::string filename, uint32 spell_id); + + //int LoadScript(int npcid, const char * zone, Mob* activater=0); + //int LoadGlobalNPCScript(); + //int LoadPlayerScript(const char *zone); + //int LoadGlobalPlayerScript(); + //int LoadItemScript(ItemInst* iteminst, string packagename, itemQuestMode Qtype); + //int LoadSpellScript(uint32 id); //expose a var to the script (probably parallels addvar)) //i.e. exportvar("qst1234", "name", "somemob"); diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp new file mode 100644 index 000000000..4228d290f --- /dev/null +++ b/zone/lua_parser.cpp @@ -0,0 +1,4 @@ +#ifdef LUA_EQEMU +#include "lua_parser.h" + +#endif diff --git a/zone/lua_parser.h b/zone/lua_parser.h new file mode 100644 index 000000000..7e9c78bc7 --- /dev/null +++ b/zone/lua_parser.h @@ -0,0 +1,40 @@ +#ifndef _EQE_LUA_PARSER_H +#define _EQE_LUA_PARSER_H +#ifdef LUA_EQEMU + +#include + +#include "QuestParserCollection.h" +#include "QuestInterface.h" + +class ItemInst; +class Client; +class NPC; + +class LuaParser { +public: + virtual void EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data); + virtual void EventGlobalNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data); + virtual void EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data); + virtual void EventGlobalPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data); + virtual void EventItem(QuestEventID evt, Client *client, ItemInst *item, uint32 objid, uint32 extra_data); + virtual void EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data); + + virtual bool HasQuestSub(uint32 npcid, const char *subname); + virtual bool HasGlobalQuestSub(const char *subname); + virtual bool PlayerHasQuestSub(const char *subname); + virtual bool GlobalPlayerHasQuestSub(const char *subname); + virtual bool SpellHasQuestSub(uint32 spell_id, const char *subname); + virtual bool ItemHasQuestSub(ItemInst *itm, const char *subname); + + virtual void AddVar(std::string name, std::string val); + virtual void ReloadQuests(bool reset_timers = true); + virtual uint32 GetIdentifier() { return 0xb0712acc; } +private: + lua_State* L; +}; + +#endif +#endif + + diff --git a/zone/net.cpp b/zone/net.cpp index 2ac9d1c61..3868c1f42 100644 --- a/zone/net.cpp +++ b/zone/net.cpp @@ -77,6 +77,7 @@ extern volatile bool ZoneLoaded; #include "parser.h" #include "embparser.h" #include "perlparser.h" +#include "lua_parser.h" #include "client_logs.h" #include "questmgr.h" #include "titles.h" @@ -288,6 +289,12 @@ int main(int argc, char** argv) { PerlXSParser *pxs = new PerlXSParser(); parse->RegisterQuestInterface(pxs, "pl"); #endif + +#ifdef LUA_EQEMU + LuaParser *lua_parser = new LuaParser(); + parse->RegisterQuestInterface(lua_parser, "lua"); +#endif + Parser *ps = new Parser(); //parse->RegisterQuestInterface(ps, "qst"); @@ -478,6 +485,11 @@ int main(int argc, char** argv) { #ifdef EMBPERL safe_delete(pxs); #endif + +#ifdef LUA_EQEMU + safe_delete(lua_parser); +#endif + safe_delete(ps); safe_delete(mmf);