mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2024-11-17 03:20:06 +00:00
Fix segv: Halt buff iteration if mob is dead
This commit is contained in:
parent
93ec6380c1
commit
36b6aeeb00
@ -108,7 +108,6 @@ static SkillResult handleSkillBuff(SkillData* skill, int power, ICombatant* sour
|
|||||||
ICombatant* combatant = dynamic_cast<ICombatant*>(self.getEntity());
|
ICombatant* combatant = dynamic_cast<ICombatant*>(self.getEntity());
|
||||||
combatant->takeDamage(buff->getLastSource(), 0); // aggro
|
combatant->takeDamage(buff->getLastSource(), 0); // aggro
|
||||||
}
|
}
|
||||||
Buffs::timeBuffUpdate(self, buff, status, stack);
|
|
||||||
if(drainType == SkillDrainType::ACTIVE && status == ETBU_DEL)
|
if(drainType == SkillDrainType::ACTIVE && status == ETBU_DEL)
|
||||||
Buffs::timeBuffTimeout(self);
|
Buffs::timeBuffTimeout(self);
|
||||||
},
|
},
|
||||||
|
@ -441,32 +441,6 @@ static void useAbilities(Mob *mob, time_t currTime) {
|
|||||||
return;
|
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) {
|
void MobAI::incNextMovement(Mob* mob, time_t currTime) {
|
||||||
if (currTime == 0)
|
if (currTime == 0)
|
||||||
currTime = getTime();
|
currTime = getTime();
|
||||||
@ -558,6 +532,11 @@ void MobAI::combatStep(CombatNPC* npc, time_t currTime) {
|
|||||||
while(it != npc->buffs.end()) {
|
while(it != npc->buffs.end()) {
|
||||||
Buff* buff = (*it).second;
|
Buff* buff = (*it).second;
|
||||||
buff->combatTick(currTime);
|
buff->combatTick(currTime);
|
||||||
|
|
||||||
|
// if mob state changed, end the step
|
||||||
|
if(self->state != AIState::COMBAT)
|
||||||
|
return;
|
||||||
|
|
||||||
buff->tick(currTime);
|
buff->tick(currTime);
|
||||||
if(buff->isStale()) {
|
if(buff->isStale()) {
|
||||||
// garbage collect
|
// garbage collect
|
||||||
@ -567,10 +546,6 @@ void MobAI::combatStep(CombatNPC* npc, time_t currTime) {
|
|||||||
else it++;
|
else it++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if debuffs killed the mob, return early
|
|
||||||
if (self->hp <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// skip attack if stunned or asleep
|
// skip attack if stunned or asleep
|
||||||
if (self->hasBuff(ECSB_STUN) || self->hasBuff(ECSB_MEZ)) {
|
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.
|
self->skillStyle = -1; // in this case we also reset the any outlying abilities the mob might be winding up.
|
||||||
|
Loading…
Reference in New Issue
Block a user