diff --git a/src/MobManager.cpp b/src/MobManager.cpp index 402da94..94a7a69 100644 --- a/src/MobManager.cpp +++ b/src/MobManager.cpp @@ -15,6 +15,7 @@ #endif std::map MobManager::Mobs; +std::queue MobManager::RemovalQueue; void MobManager::init() { REGISTER_SHARD_TIMER(step, 200); @@ -241,10 +242,10 @@ void MobManager::deadStep(Mob *mob, time_t currTime) { NPCManager::sendToViewable(mob, &pkt, P_FE2CL_NPC_EXIT, sizeof(sP_FE2CL_NPC_EXIT)); - // if it was summoned, remove it permanently + // if it was summoned, mark it for removal if (mob->summoned) { - std::cout << "[INFO] Deallocating killed summoned mob" << std::endl; - NPCManager::destroyNPC(mob->appearanceData.iNPC_ID); + std::cout << "[INFO] Queueing killed summoned mob for removal" << std::endl; + RemovalQueue.push(mob->appearanceData.iNPC_ID); return; } } @@ -452,6 +453,7 @@ void MobManager::retreatStep(Mob *mob, time_t currTime) { } void MobManager::step(CNServer *serv, time_t currTime) { + for (auto& pair : Mobs) { int x = pair.second->appearanceData.iX; int y = pair.second->appearanceData.iY; @@ -487,6 +489,12 @@ void MobManager::step(CNServer *serv, time_t currTime) { break; } } + + // deallocate all NPCs queued for removal + while (RemovalQueue.size() > 0) { + NPCManager::destroyNPC(RemovalQueue.front()); + RemovalQueue.pop(); + } } /* @@ -772,4 +780,4 @@ void MobManager::resendMobHP(Mob *mob) { heal->iHP = mob->appearanceData.iHP; NPCManager::sendToViewable(mob, (void*)&respbuf, P_FE2CL_CHAR_TIME_BUFF_TIME_TICK, resplen); -} \ No newline at end of file +} diff --git a/src/MobManager.hpp b/src/MobManager.hpp index 234a090..61b2ac1 100644 --- a/src/MobManager.hpp +++ b/src/MobManager.hpp @@ -8,6 +8,7 @@ #include "contrib/JSON.hpp" #include +#include enum class MobState { INACTIVE, @@ -83,6 +84,7 @@ struct Mob : public BaseNPC { namespace MobManager { extern std::map Mobs; + extern std::queue RemovalQueue; void init(); void step(CNServer*, time_t);