From 36b6aeeb00a573256c07cae34ed202be1f356b19 Mon Sep 17 00:00:00 2001 From: gsemaj Date: Sun, 13 Aug 2023 11:55:25 -0700 Subject: [PATCH] Fix segv: Halt buff iteration if mob is dead --- src/Abilities.cpp | 1 - src/MobAI.cpp | 35 +++++------------------------------ 2 files changed, 5 insertions(+), 31 deletions(-) diff --git a/src/Abilities.cpp b/src/Abilities.cpp index cc99c10..8646dff 100644 --- a/src/Abilities.cpp +++ b/src/Abilities.cpp @@ -108,7 +108,6 @@ static SkillResult handleSkillBuff(SkillData* skill, int power, ICombatant* sour ICombatant* combatant = dynamic_cast(self.getEntity()); combatant->takeDamage(buff->getLastSource(), 0); // aggro } - Buffs::timeBuffUpdate(self, buff, status, stack); if(drainType == SkillDrainType::ACTIVE && status == ETBU_DEL) Buffs::timeBuffTimeout(self); }, diff --git a/src/MobAI.cpp b/src/MobAI.cpp index bcd6a85..7a31ed3 100644 --- a/src/MobAI.cpp +++ b/src/MobAI.cpp @@ -441,32 +441,6 @@ static void useAbilities(Mob *mob, time_t currTime) { return; } -// TODO abiilities -static void drainMobHP(Mob *mob, int amount) { - size_t resplen = sizeof(sP_FE2CL_CHAR_TIME_BUFF_TIME_TICK) + sizeof(sSkillResult_Damage); - assert(resplen < CN_PACKET_BUFFER_SIZE - 8); - uint8_t respbuf[CN_PACKET_BUFFER_SIZE]; - - memset(respbuf, 0, resplen); - - sP_FE2CL_CHAR_TIME_BUFF_TIME_TICK *pkt = (sP_FE2CL_CHAR_TIME_BUFF_TIME_TICK*)respbuf; - sSkillResult_Damage *drain = (sSkillResult_Damage*)(respbuf + sizeof(sP_FE2CL_CHAR_TIME_BUFF_TIME_TICK)); - - pkt->iID = mob->id; - pkt->eCT = 4; // mob - pkt->iTB_ID = ECSB_BOUNDINGBALL; - - drain->eCT = 4; - drain->iID = mob->id; - drain->iDamage = amount; - drain->iHP = mob->hp -= amount; - - NPCManager::sendToViewable(mob, (void*)&respbuf, P_FE2CL_CHAR_TIME_BUFF_TIME_TICK, resplen); - - if (mob->hp <= 0) - mob->transition(AIState::DEAD, mob->target); -} - void MobAI::incNextMovement(Mob* mob, time_t currTime) { if (currTime == 0) currTime = getTime(); @@ -558,6 +532,11 @@ void MobAI::combatStep(CombatNPC* npc, time_t currTime) { while(it != npc->buffs.end()) { Buff* buff = (*it).second; buff->combatTick(currTime); + + // if mob state changed, end the step + if(self->state != AIState::COMBAT) + return; + buff->tick(currTime); if(buff->isStale()) { // garbage collect @@ -567,10 +546,6 @@ void MobAI::combatStep(CombatNPC* npc, time_t currTime) { else it++; } - // if debuffs killed the mob, return early - if (self->hp <= 0) - return; - // skip attack if stunned or asleep if (self->hasBuff(ECSB_STUN) || self->hasBuff(ECSB_MEZ)) { self->skillStyle = -1; // in this case we also reset the any outlying abilities the mob might be winding up.