diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index a1f64d1f..fa262883 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -136,30 +136,31 @@ void Buff::InternalTimerAddBuff() [this, caster_state, skill] (int event, const a8::Args* args) { if (a8::TIMER_EXEC_EVENT == event) { - Creature* receiver = owner; - if (caster_state->caster.Get()) { - CreatureWeakPtr caster = caster_state->caster; - std::shared_ptr old_context_ability = receiver->context_ability; - glm::vec3 old_context_dir = receiver->context_dir; - Position old_context_pos = receiver->context_pos; - receiver->context_dir = receiver->GetAttackDir(); - receiver->context_pos = receiver->GetPos(); - - int buff_id = meta->_int_param2; - const mt::Buff* buff_meta = mt::Buff::GetById(buff_id); - if (buff_meta) { - SkillCasterState old_caster_state; - caster.Get()->FillSkillCasterState(&old_caster_state); - caster.Get()->RecoverSkillCasterState(caster_state.get()); - //!!!在AddBuff的过程可能删除buff导致caster_state野指针 - receiver->AddBuff(caster.Get(), buff_meta, skill); - caster.Get()->RecoverSkillCasterState(&old_caster_state); - } - - receiver->context_dir = old_context_dir; - receiver->context_pos = old_context_pos; - receiver->context_ability = old_context_ability; + if (!caster_state->caster.Get()) { + return; } + Creature* receiver = owner; + CreatureWeakPtr caster = caster_state->caster; + std::shared_ptr old_context_ability = receiver->context_ability; + glm::vec3 old_context_dir = receiver->context_dir; + Position old_context_pos = receiver->context_pos; + receiver->context_dir = receiver->GetAttackDir(); + receiver->context_pos = receiver->GetPos(); + + int buff_id = meta->_int_param2; + const mt::Buff* buff_meta = mt::Buff::GetById(buff_id); + if (buff_meta) { + SkillCasterState old_caster_state; + caster.Get()->FillSkillCasterState(&old_caster_state); + caster.Get()->RecoverSkillCasterState(caster_state.get()); + //!!!在AddBuff的过程可能删除buff导致caster_state野指针 + receiver->AddBuff(caster.Get(), buff_meta, skill); + caster.Get()->RecoverSkillCasterState(&old_caster_state); + } + + receiver->context_dir = old_context_dir; + receiver->context_pos = old_context_pos; + receiver->context_ability = old_context_ability; } };