diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index c7e3a7dc..1d8f2af9 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -49,6 +49,7 @@ class Buff bool FreezeOperate(); CreatureWeakPtr& GetCaster(); void SetCaster(Creature* caster); + virtual bool IsValid() { return is_valid_; }; void CalcPassengerShotOffset(); @@ -65,6 +66,7 @@ protected: void ProcSputteringFunc(Bullet* bullet); protected: + bool is_valid_ = true; int hold_curr_weapon_idx_ = 0; std::list hold_weapons_; std::list> event_handlers_; diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 731d87dd..adc5ea2a 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -302,6 +302,9 @@ void FrameEvent::AddWeaponAmmoChg(CreatureWeakPtr& sender) void FrameEvent::AddBuff(CreatureWeakPtr& sender, Buff* buff) { + if (!buff->IsValid()) { + return; + } { cs::MFBuffChg chged_buff_pb; chged_buff_pb.set_obj_id(sender.Get()->GetUniId()); @@ -322,6 +325,9 @@ void FrameEvent::AddBuff(CreatureWeakPtr& sender, Buff* buff) void FrameEvent::RemoveBuff(CreatureWeakPtr& sender, Buff* buff) { + if (!buff->IsValid()) { + return; + } { cs::MFBuffChg chged_buff_pb; chged_buff_pb.set_obj_id(sender.Get()->GetUniId()); diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index 3e399fb8..59211603 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -61,7 +61,7 @@ static void Creature_FillBuffList(Creature* self, Human* hum, ::google::protobuf ( [hum, pb_buff_list] (Buff* buff, bool& stop) { - if (buff->NeedSync(hum)) { + if (buff->NeedSync(hum) && buff->IsValid()) { auto p = pb_buff_list->Add(); buff->FillMFBuff(p); }