From 12fbdc962119e074e6330c00c6b1ae87a1e65f47 Mon Sep 17 00:00:00 2001 From: dongresource Date: Tue, 22 Sep 2020 00:21:43 +0200 Subject: [PATCH] Wait about 2s before despawning killed mobs. This gives them enough time to play their death animations before they disappear. --- src/MobManager.cpp | 28 +++++++++++++++++++--------- src/MobManager.hpp | 1 + src/NanoManager.cpp | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/MobManager.cpp b/src/MobManager.cpp index f8dd121..64ce007 100644 --- a/src/MobManager.cpp +++ b/src/MobManager.cpp @@ -137,15 +137,28 @@ void MobManager::killMob(CNSocket *sock, Mob *mob) { giveReward(sock); MissionManager::mobKilled(sock, mob->appearanceData.iNPCType); - INITSTRUCT(sP_FE2CL_NPC_EXIT, pkt); - - pkt.iNPC_ID = mob->appearanceData.iNPC_ID; - - sock->sendPacket(&pkt, P_FE2CL_NPC_EXIT, sizeof(sP_FE2CL_NPC_EXIT)); - PlayerManager::sendToViewable(sock, (void*)&pkt, P_FE2CL_NPC_EXIT, sizeof(sP_FE2CL_NPC_EXIT)); + mob->despawned = false; } void MobManager::deadStep(Mob *mob, time_t currTime) { + auto chunk = ChunkManager::grabChunk(mob->appearanceData.iX, mob->appearanceData.iY); + auto chunks = ChunkManager::grabChunks(chunk); + + // despawn the mob after a short delay + if (mob->killedTime != 0 && !mob->despawned && currTime - mob->killedTime > 2000) { + mob->despawned = true; + + INITSTRUCT(sP_FE2CL_NPC_EXIT, pkt); + + pkt.iNPC_ID = mob->appearanceData.iNPC_ID; + + for (Chunk *chunk : chunks) { + for (CNSocket *s : chunk->players) { + s->sendPacket(&pkt, P_FE2CL_NPC_EXIT, sizeof(sP_FE2CL_NPC_EXIT)); + } + } + } + if (mob->killedTime != 0 && currTime - mob->killedTime < mob->regenTime * 100) return; @@ -158,9 +171,6 @@ void MobManager::deadStep(Mob *mob, time_t currTime) { pkt.NPCAppearanceData = mob->appearanceData; - auto chunk = ChunkManager::grabChunk(mob->appearanceData.iX, mob->appearanceData.iY); - auto chunks = ChunkManager::grabChunks(chunk); - // notify all nearby players for (Chunk *chunk : chunks) { for (CNSocket *s : chunk->players) { diff --git a/src/MobManager.hpp b/src/MobManager.hpp index 26e3812..1bad7ac 100644 --- a/src/MobManager.hpp +++ b/src/MobManager.hpp @@ -20,6 +20,7 @@ struct Mob : public BaseNPC { const int maxHealth; time_t killedTime = 0; const int regenTime; + bool despawned = false; // for the sake of death animations Mob(int x, int y, int z, int type, int hp, int angle, int rt) : BaseNPC(x, y, z, type), maxHealth(hp), regenTime(rt) { diff --git a/src/NanoManager.cpp b/src/NanoManager.cpp index 16d04fe..7f39466 100644 --- a/src/NanoManager.cpp +++ b/src/NanoManager.cpp @@ -184,7 +184,7 @@ void NanoManager::addNano(CNSocket* sock, int16_t nanoId, int16_t slot) { resp.Nano.iStamina = 150; resp.iQuestItemSlotNum = slot; resp.iPC_Level = level; - resp.iPC_FusionMatter = plr->fusionmatter; // will decrese in actual nano missions + resp.iPC_FusionMatter = plr->fusionmatter; // will decrease in actual nano missions // Update player plr->Nanos[nanoId] = resp.Nano;