Small changes to encounter stuff

This commit is contained in:
KimLS 2014-11-04 21:01:20 -08:00
parent 5decde0af9
commit 957f05860b
4 changed files with 105 additions and 20 deletions

View File

@ -32,20 +32,34 @@ struct lua_registered_event {
}; };
extern std::map<std::string, std::list<lua_registered_event>> lua_encounter_events_registered; extern std::map<std::string, std::list<lua_registered_event>> lua_encounter_events_registered;
extern std::map<std::string, bool> lua_encounters_loaded;
extern void MapOpcodes(); extern void MapOpcodes();
extern void ClearMappedOpcode(EmuOpcode op); extern void ClearMappedOpcode(EmuOpcode op);
void unregister_event(std::string package_name, std::string name, int evt);
void load_encounter(std::string name) { void load_encounter(std::string name) {
if(lua_encounters_loaded.count(name) > 0)
return;
lua_encounters_loaded[name] = true;
parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, 0); parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, 0);
} }
void load_encounter_with_data(std::string name, std::string info_str) { void load_encounter_with_data(std::string name, std::string info_str) {
if(lua_encounters_loaded.count(name) > 0)
return;
lua_encounters_loaded[name] = true;
std::vector<EQEmu::Any> info_ptrs; std::vector<EQEmu::Any> info_ptrs;
info_ptrs.push_back(&info_str); info_ptrs.push_back(&info_str);
parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, 0, &info_ptrs); parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, 0, &info_ptrs);
} }
void unload_encounter(std::string name) { void unload_encounter(std::string name) {
if(lua_encounters_loaded.count(name) == 0)
return;
auto liter = lua_encounter_events_registered.begin(); auto liter = lua_encounter_events_registered.begin();
while(liter != lua_encounter_events_registered.end()) { while(liter != lua_encounter_events_registered.end()) {
std::list<lua_registered_event> &elist = liter->second; std::list<lua_registered_event> &elist = liter->second;
@ -65,10 +79,13 @@ void unload_encounter(std::string name) {
} }
} }
lua_encounters_loaded.erase(name);
parse->EventEncounter(EVENT_ENCOUNTER_UNLOAD, name, 0); parse->EventEncounter(EVENT_ENCOUNTER_UNLOAD, name, 0);
} }
void unload_encounter_with_data(std::string name, std::string info_str) { void unload_encounter_with_data(std::string name, std::string info_str) {
if(lua_encounters_loaded.count(name) == 0)
return;
auto liter = lua_encounter_events_registered.begin(); auto liter = lua_encounter_events_registered.begin();
while(liter != lua_encounter_events_registered.end()) { while(liter != lua_encounter_events_registered.end()) {
@ -91,12 +108,18 @@ void unload_encounter_with_data(std::string name, std::string info_str) {
} }
} }
lua_encounters_loaded.erase(name);
std::vector<EQEmu::Any> info_ptrs; std::vector<EQEmu::Any> info_ptrs;
info_ptrs.push_back(&info_str); info_ptrs.push_back(&info_str);
parse->EventEncounter(EVENT_ENCOUNTER_UNLOAD, name, 0, &info_ptrs); parse->EventEncounter(EVENT_ENCOUNTER_UNLOAD, name, 0, &info_ptrs);
} }
void register_event(std::string package_name, std::string name, int evt, luabind::adl::object func) { void register_event(std::string package_name, std::string name, int evt, luabind::adl::object func) {
if(lua_encounters_loaded.count(name) == 0)
return;
unregister_event(package_name, name, evt);
lua_registered_event e; lua_registered_event e;
e.encounter_name = name; e.encounter_name = name;
e.lua_reference = func; e.lua_reference = func;
@ -109,15 +132,6 @@ void register_event(std::string package_name, std::string name, int evt, luabind
lua_encounter_events_registered[package_name] = elist; lua_encounter_events_registered[package_name] = elist;
} else { } else {
std::list<lua_registered_event> &elist = liter->second; std::list<lua_registered_event> &elist = liter->second;
auto iter = elist.begin();
while(iter != elist.end()) {
if(iter->event_id == evt && iter->encounter_name.compare(name) == 0) {
//already registered this event for this encounter
return;
}
++iter;
}
elist.push_back(e); elist.push_back(e);
} }
} }
@ -130,6 +144,7 @@ void unregister_event(std::string package_name, std::string name, int evt) {
while(iter != elist.end()) { while(iter != elist.end()) {
if(iter->event_id == evt && iter->encounter_name.compare(name) == 0) { if(iter->event_id == evt && iter->encounter_name.compare(name) == 0) {
iter = elist.erase(iter); iter = elist.erase(iter);
break;
} }
} }
lua_encounter_events_registered[package_name] = elist; lua_encounter_events_registered[package_name] = elist;
@ -145,6 +160,11 @@ void register_npc_event(std::string name, int evt, int npc_id, luabind::adl::obj
} }
} }
void register_npc_event(int evt, int npc_id, luabind::adl::object func) {
std::string name = quest_manager.GetEncounter();
register_npc_event(name, evt, npc_id, func);
}
void unregister_npc_event(std::string name, int evt, int npc_id) { void unregister_npc_event(std::string name, int evt, int npc_id) {
std::stringstream package_name; std::stringstream package_name;
package_name << "npc_" << npc_id; package_name << "npc_" << npc_id;
@ -152,16 +172,31 @@ void unregister_npc_event(std::string name, int evt, int npc_id) {
unregister_event(package_name.str(), name, evt); unregister_event(package_name.str(), name, evt);
} }
void unregister_npc_event(int evt, int npc_id) {
std::string name = quest_manager.GetEncounter();
unregister_npc_event(name, evt, npc_id);
}
void register_player_event(std::string name, int evt, luabind::adl::object func) { void register_player_event(std::string name, int evt, luabind::adl::object func) {
if(luabind::type(func) == LUA_TFUNCTION) { if(luabind::type(func) == LUA_TFUNCTION) {
register_event("player", name, evt, func); register_event("player", name, evt, func);
} }
} }
void register_player_event(int evt, luabind::adl::object func) {
std::string name = quest_manager.GetEncounter();
register_player_event(name, evt, func);
}
void unregister_player_event(std::string name, int evt) { void unregister_player_event(std::string name, int evt) {
unregister_event("player", name, evt); unregister_event("player", name, evt);
} }
void unregister_player_event(int evt) {
std::string name = quest_manager.GetEncounter();
unregister_player_event(name, evt);
}
void register_item_event(std::string name, int evt, int item_id, luabind::adl::object func) { void register_item_event(std::string name, int evt, int item_id, luabind::adl::object func) {
std::string package_name = "item_"; std::string package_name = "item_";
package_name += std::to_string(static_cast<long long>(item_id)); package_name += std::to_string(static_cast<long long>(item_id));
@ -171,6 +206,11 @@ void register_item_event(std::string name, int evt, int item_id, luabind::adl::o
} }
} }
void register_item_event(int evt, int item_id, luabind::adl::object func) {
std::string name = quest_manager.GetEncounter();
register_item_event(name, evt, item_id, func);
}
void unregister_item_event(std::string name, int evt, int item_id) { void unregister_item_event(std::string name, int evt, int item_id) {
std::string package_name = "item_"; std::string package_name = "item_";
package_name += std::to_string(static_cast<long long>(item_id)); package_name += std::to_string(static_cast<long long>(item_id));
@ -178,6 +218,11 @@ void unregister_item_event(std::string name, int evt, int item_id) {
unregister_event(package_name, name, evt); unregister_event(package_name, name, evt);
} }
void unregister_item_event(int evt, int item_id) {
std::string name = quest_manager.GetEncounter();
unregister_item_event(name, evt, item_id);
}
void register_spell_event(std::string name, int evt, int spell_id, luabind::adl::object func) { void register_spell_event(std::string name, int evt, int spell_id, luabind::adl::object func) {
if(luabind::type(func) == LUA_TFUNCTION) { if(luabind::type(func) == LUA_TFUNCTION) {
std::stringstream package_name; std::stringstream package_name;
@ -187,6 +232,11 @@ void register_spell_event(std::string name, int evt, int spell_id, luabind::adl:
} }
} }
void register_spell_event(int evt, int spell_id, luabind::adl::object func) {
std::string name = quest_manager.GetEncounter();
register_spell_event(name, evt, spell_id, func);
}
void unregister_spell_event(std::string name, int evt, int spell_id) { void unregister_spell_event(std::string name, int evt, int spell_id) {
std::stringstream package_name; std::stringstream package_name;
package_name << "spell_" << spell_id; package_name << "spell_" << spell_id;
@ -194,6 +244,11 @@ void unregister_spell_event(std::string name, int evt, int spell_id) {
unregister_event(package_name.str(), name, evt); unregister_event(package_name.str(), name, evt);
} }
void unregister_spell_event(int evt, int spell_id) {
std::string name = quest_manager.GetEncounter();
unregister_spell_event(name, evt, spell_id);
}
Lua_Mob lua_spawn2(int npc_type, int grid, int unused, double x, double y, double z, double heading) { Lua_Mob lua_spawn2(int npc_type, int grid, int unused, double x, double y, double z, double heading) {
return Lua_Mob(quest_manager.spawn2(npc_type, grid, unused, return Lua_Mob(quest_manager.spawn2(npc_type, grid, unused,
static_cast<float>(x), static_cast<float>(y), static_cast<float>(z), static_cast<float>(heading))); static_cast<float>(x), static_cast<float>(y), static_cast<float>(z), static_cast<float>(heading)));
@ -1161,6 +1216,11 @@ Lua_ItemInst lua_get_quest_item() {
return quest_manager.GetQuestItem(); return quest_manager.GetQuestItem();
} }
std::string lua_get_encounter() {
return quest_manager.GetEncounter();
}
void lua_map_opcodes() { void lua_map_opcodes() {
MapOpcodes(); MapOpcodes();
} }
@ -1195,14 +1255,22 @@ luabind::scope lua_register_general() {
luabind::def("unload_encounter", &unload_encounter), luabind::def("unload_encounter", &unload_encounter),
luabind::def("load_encounter_with_data", &load_encounter_with_data), luabind::def("load_encounter_with_data", &load_encounter_with_data),
luabind::def("unload_encounter_with_data", &unload_encounter_with_data), luabind::def("unload_encounter_with_data", &unload_encounter_with_data),
luabind::def("register_npc_event", &register_npc_event), luabind::def("register_npc_event", (void(*)(std::string, int, int, luabind::adl::object))&register_npc_event),
luabind::def("unregister_npc_event", &unregister_npc_event), luabind::def("register_npc_event", (void(*)(int, int, luabind::adl::object))&register_npc_event),
luabind::def("register_player_event", &register_player_event), luabind::def("unregister_npc_event", (void(*)(std::string, int, int))&unregister_npc_event),
luabind::def("unregister_player_event", &unregister_player_event), luabind::def("unregister_npc_event", (void(*)(int, int))&unregister_npc_event),
luabind::def("register_item_event", &register_item_event), luabind::def("register_player_event", (void(*)(std::string, int, luabind::adl::object))&register_player_event),
luabind::def("unregister_item_event", &unregister_item_event), luabind::def("register_player_event", (void(*)(int, luabind::adl::object))&register_player_event),
luabind::def("register_spell_event", &register_spell_event), luabind::def("unregister_player_event", (void(*)(std::string, int))&unregister_player_event),
luabind::def("unregister_spell_event", &unregister_spell_event), luabind::def("unregister_player_event", (void(*)(int))&unregister_player_event),
luabind::def("register_item_event", (void(*)(std::string, int, int, luabind::adl::object))&register_item_event),
luabind::def("register_item_event", (void(*)(int, int, luabind::adl::object))&register_item_event),
luabind::def("unregister_item_event", (void(*)(std::string, int, int))&unregister_item_event),
luabind::def("unregister_item_event", (void(*)(int, int))&unregister_item_event),
luabind::def("register_spell_event", (void(*)(std::string, int, int, luabind::adl::object func))&register_spell_event),
luabind::def("register_spell_event", (void(*)(int, int, luabind::adl::object func))&register_spell_event),
luabind::def("unregister_spell_event", (void(*)(std::string, int, int))&unregister_spell_event),
luabind::def("unregister_spell_event", (void(*)(int, int))&unregister_spell_event),
luabind::def("spawn2", (Lua_Mob(*)(int,int,int,double,double,double,double))&lua_spawn2), luabind::def("spawn2", (Lua_Mob(*)(int,int,int,double,double,double,double))&lua_spawn2),
luabind::def("unique_spawn", (Lua_Mob(*)(int,int,int,double,double,double))&lua_unique_spawn), luabind::def("unique_spawn", (Lua_Mob(*)(int,int,int,double,double,double))&lua_unique_spawn),
luabind::def("unique_spawn", (Lua_Mob(*)(int,int,int,double,double,double,double))&lua_unique_spawn), luabind::def("unique_spawn", (Lua_Mob(*)(int,int,int,double,double,double,double))&lua_unique_spawn),
@ -1360,6 +1428,7 @@ luabind::scope lua_register_general() {
luabind::def("get_initiator", &lua_get_initiator), luabind::def("get_initiator", &lua_get_initiator),
luabind::def("get_owner", &lua_get_owner), luabind::def("get_owner", &lua_get_owner),
luabind::def("get_quest_item", &lua_get_quest_item), luabind::def("get_quest_item", &lua_get_quest_item),
luabind::def("get_encounter", &lua_get_encounter),
luabind::def("map_opcodes", &lua_map_opcodes), luabind::def("map_opcodes", &lua_map_opcodes),
luabind::def("clear_opcode", &lua_clear_opcode), luabind::def("clear_opcode", &lua_clear_opcode),
luabind::def("enable_recipe", &lua_enable_recipe), luabind::def("enable_recipe", &lua_enable_recipe),

View File

@ -126,6 +126,7 @@ struct lua_registered_event {
}; };
std::map<std::string, std::list<lua_registered_event>> lua_encounter_events_registered; std::map<std::string, std::list<lua_registered_event>> lua_encounter_events_registered;
std::map<std::string, bool> lua_encounters_loaded;
LuaParser::LuaParser() { LuaParser::LuaParser() {
for(int i = 0; i < _LargestEventID; ++i) { for(int i = 0; i < _LargestEventID; ++i) {
@ -607,7 +608,7 @@ int LuaParser::_EventEncounter(std::string package_name, QuestEventID evt, std::
lua_setfield(L, -2, "data"); lua_setfield(L, -2, "data");
} }
quest_manager.StartQuest(nullptr, nullptr, nullptr); quest_manager.StartQuest(nullptr, nullptr, nullptr, encounter_name);
if(lua_pcall(L, 1, 1, 0)) { if(lua_pcall(L, 1, 1, 0)) {
std::string error = lua_tostring(L, -1); std::string error = lua_tostring(L, -1);
AddError(error); AddError(error);
@ -776,6 +777,7 @@ void LuaParser::ReloadQuests() {
loaded_.clear(); loaded_.clear();
errors_.clear(); errors_.clear();
lua_encounter_events_registered.clear(); lua_encounter_events_registered.clear();
lua_encounters_loaded.clear();
if(L) { if(L) {
lua_close(L); lua_close(L);

View File

@ -95,6 +95,7 @@ QuestManager quest_manager;
Client *initiator = nullptr; \ Client *initiator = nullptr; \
ItemInst* questitem = nullptr; \ ItemInst* questitem = nullptr; \
bool depop_npc = false; \ bool depop_npc = false; \
std::string encounter; \
do { \ do { \
if(!quests_running_.empty()) { \ if(!quests_running_.empty()) { \
running_quest e = quests_running_.top(); \ running_quest e = quests_running_.top(); \
@ -102,6 +103,7 @@ QuestManager quest_manager;
initiator = e.initiator; \ initiator = e.initiator; \
questitem = e.questitem; \ questitem = e.questitem; \
depop_npc = e.depop_npc; \ depop_npc = e.depop_npc; \
encounter = e.encounter; \
} \ } \
} while(0) } while(0)
@ -151,12 +153,13 @@ void QuestManager::Process() {
} }
} }
void QuestManager::StartQuest(Mob *_owner, Client *_initiator, ItemInst* _questitem) { void QuestManager::StartQuest(Mob *_owner, Client *_initiator, ItemInst* _questitem, std::string encounter) {
running_quest run; running_quest run;
run.owner = _owner; run.owner = _owner;
run.initiator = _initiator; run.initiator = _initiator;
run.questitem = _questitem; run.questitem = _questitem;
run.depop_npc = false; run.depop_npc = false;
run.encounter = encounter;
quests_running_.push(run); quests_running_.push(run);
} }
@ -3014,3 +3017,12 @@ ItemInst *QuestManager::GetQuestItem() const {
return nullptr; return nullptr;
} }
std::string QuestManager::GetEncounter() const {
if(!quests_running_.empty()) {
running_quest e = quests_running_.top();
return e.encounter;
}
return "";
}

View File

@ -34,12 +34,13 @@ class QuestManager {
Client *initiator; Client *initiator;
ItemInst* questitem; ItemInst* questitem;
bool depop_npc; bool depop_npc;
std::string encounter;
}; };
public: public:
QuestManager(); QuestManager();
virtual ~QuestManager(); virtual ~QuestManager();
void StartQuest(Mob *_owner, Client *_initiator = nullptr, ItemInst* _questitem = nullptr); void StartQuest(Mob *_owner, Client *_initiator = nullptr, ItemInst* _questitem = nullptr, std::string encounter = "");
void EndQuest(); void EndQuest();
bool QuestsRunning() { return !quests_running_.empty(); } bool QuestsRunning() { return !quests_running_.empty(); }
@ -252,6 +253,7 @@ public:
NPC *GetNPC() const; NPC *GetNPC() const;
Mob *GetOwner() const; Mob *GetOwner() const;
ItemInst *GetQuestItem() const; ItemInst *GetQuestItem() const;
std::string GetEncounter() const;
inline bool ProximitySayInUse() { return HaveProximitySays; } inline bool ProximitySayInUse() { return HaveProximitySays; }
#ifdef BOTS #ifdef BOTS