diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index c74e78c..9b51c3a 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -131,6 +131,7 @@ void Buff::InternalTimerAddBuff() Creature* receiver = (Creature*)param.sender.GetUserData(); SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); if (caster_state->caster.Get()) { + CreatureWeakPtr caster = caster_state->caster; std::shared_ptr old_context_ability = receiver->context_ability; a8::Vec2 old_context_dir = receiver->context_dir; a8::Vec2 old_context_pos = receiver->context_pos; @@ -142,10 +143,11 @@ void Buff::InternalTimerAddBuff() MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); if (buff_meta) { SkillCasterState old_caster_state; - caster_state->caster.Get()->FillSkillCasterState(&old_caster_state); - caster_state->caster.Get()->RecoverSkillCasterState(caster_state); - receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill); - caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state); + caster.Get()->FillSkillCasterState(&old_caster_state); + caster.Get()->RecoverSkillCasterState(caster_state); + //!!!在AddBuff的过程可能删除buff导致caster_state野指针 + receiver->AddBuff(caster.Get(), buff_meta, 1, skill); + caster.Get()->RecoverSkillCasterState(&old_caster_state); } receiver->context_dir = old_context_dir;