From 3e4231c662e7efe8bc1c3c251b3622d6b06b0dcc Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 1 Jan 2023 19:07:14 -0500 Subject: [PATCH] [Quest API] Cleanup Proximity Events (#2697) * [Quest API] Cleanup Proximity Events # Perl - Add `$area_id` export to EVENT_ENTER_AREA. - Add `$area_type` export to EVENT_ENTER_AREA. - Add `$area_id` export to EVENT_LEAVE_AREA. - Add `$area_type` export to EVENT_LEAVE_AREA. # Notes - This is so Spire will parse these events properly. * Update entity.cpp * Update entity.cpp * Update entity.cpp * Update entity.cpp --- zone/embparser.cpp | 9 +++++++++ zone/entity.cpp | 43 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/zone/embparser.cpp b/zone/embparser.cpp index c3fd6e186..30994bf1a 100644 --- a/zone/embparser.cpp +++ b/zone/embparser.cpp @@ -2004,6 +2004,15 @@ void PerlembParser::ExportEventVariables( break; } + case EVENT_ENTER_AREA: + case EVENT_LEAVE_AREA: { + if (extra_pointers && extra_pointers->size() >= 2) { + ExportVar(package_name.c_str(), "area_id", *std::any_cast(extra_pointers->at(0))); + ExportVar(package_name.c_str(), "area_type", *std::any_cast(extra_pointers->at(1))); + } + break; + } + default: { break; } diff --git a/zone/entity.cpp b/zone/entity.cpp index 7c865450a..749c8cafa 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -4007,14 +4007,31 @@ void EntityList::ProcessMove(Client *c, const glm::vec3& location) for (auto iter = events.begin(); iter != events.end(); ++iter) { quest_proximity_event& evt = (*iter); + + std::vector args; + args.push_back(&evt.area_id); + args.push_back(&evt.area_type); + if (evt.npc) { - std::vector args; - parse->EventNPC(evt.event_id, evt.npc, evt.client, "", 0, &args); + if (evt.event_id == EVENT_ENTER) { + parse->EventNPC(EVENT_ENTER, evt.npc, evt.client, "", 0); + } else if (evt.event_id == EVENT_EXIT) { + parse->EventNPC(EVENT_EXIT, evt.npc, evt.client, "", 0); + } else if (evt.event_id == EVENT_ENTER_AREA) { + parse->EventNPC(EVENT_ENTER_AREA, evt.npc, evt.client, "", 0, &args); + } else if (evt.event_id == EVENT_LEAVE_AREA) { + parse->EventNPC(EVENT_LEAVE_AREA, evt.npc, evt.client, "", 0, &args); + } } else { - std::vector args; - args.push_back(&evt.area_id); - args.push_back(&evt.area_type); - parse->EventPlayer(evt.event_id, evt.client, "", 0, &args); + if (evt.event_id == EVENT_ENTER) { + parse->EventPlayer(EVENT_ENTER, evt.client, "", 0); + } else if (evt.event_id == EVENT_EXIT) { + parse->EventPlayer(EVENT_EXIT, evt.client, "", 0); + } else if (evt.event_id == EVENT_ENTER_AREA) { + parse->EventNPC(EVENT_ENTER_AREA, evt.npc, evt.client, "", 0, &args); + } else if (evt.event_id == EVENT_LEAVE_AREA) { + parse->EventNPC(EVENT_LEAVE_AREA, evt.npc, evt.client, "", 0, &args); + } } } } @@ -4067,10 +4084,20 @@ void EntityList::ProcessMove(NPC *n, float x, float y, float z) { for (auto iter = events.begin(); iter != events.end(); ++iter) { quest_proximity_event &evt = (*iter); + std::vector args; args.push_back(&evt.area_id); args.push_back(&evt.area_type); - parse->EventNPC(evt.event_id, evt.npc, evt.client, "", 0, &args); + + if (evt.event_id == EVENT_ENTER) { + parse->EventNPC(EVENT_ENTER, evt.npc, evt.client, "", 0); + } else if (evt.event_id == EVENT_EXIT) { + parse->EventNPC(EVENT_EXIT, evt.npc, evt.client, "", 0); + } else if (evt.event_id == EVENT_ENTER_AREA) { + parse->EventNPC(EVENT_ENTER_AREA, evt.npc, evt.client, "", 0, &args); + } else if (evt.event_id == EVENT_LEAVE_AREA) { + parse->EventNPC(EVENT_LEAVE_AREA, evt.npc, evt.client, "", 0, &args); + } } } @@ -5835,7 +5862,7 @@ void EntityList::DespawnGridNodes(int32 grid_id) { mob->IsNPC() && mob->GetRace() == RACE_NODE_2254 && mob->EntityVariableExists("grid_id") && - std::stoi(mob->GetEntityVariable("grid_id")) == grid_id) + std::stoi(mob->GetEntityVariable("grid_id")) == grid_id) { mob->Depop(); }