This commit is contained in:
aozhiwei 2022-12-28 19:27:26 +08:00
parent bbd187541c
commit e64246b0c8

View File

@ -136,30 +136,31 @@ void Buff::InternalTimerAddBuff()
[this, caster_state, skill] (int event, const a8::Args* args) [this, caster_state, skill] (int event, const a8::Args* args)
{ {
if (a8::TIMER_EXEC_EVENT == event) { if (a8::TIMER_EXEC_EVENT == event) {
Creature* receiver = owner; if (!caster_state->caster.Get()) {
if (caster_state->caster.Get()) { return;
CreatureWeakPtr caster = caster_state->caster;
std::shared_ptr<Ability> 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;
} }
Creature* receiver = owner;
CreatureWeakPtr caster = caster_state->caster;
std::shared_ptr<Ability> 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;
} }
}; };