From a0c8d9cd9fe677fd974af0408d07501c7d22f29b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Aug 2024 15:35:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dchild=5Fbuff=5F=E9=9A=90?= =?UTF-8?q?=E6=82=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.h | 1 + server/gameserver/creature.cc | 26 +++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 87da9a89..98c4c80a 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -37,6 +37,7 @@ class Buff float res_scale = 1; long long res_scale_frameno = 0; std::shared_ptr> buff_vars; + std::shared_ptr> child_buff_uniids; Buff(); virtual ~Buff(); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 6d105100..c6dd5260 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -398,7 +398,18 @@ int Creature::AddBuff(Creature* caster, for (int child_buff_id : buff->meta->_child_buff_list) { const mt::Buff* child_buff_meta = mt::Buff::GetById(child_buff_id); if (child_buff_meta) { - AddBuff(caster, child_buff_meta, buff_skill_meta, true, init_args, buff_vars); + int child_buff_uniid = AddBuff(caster, + child_buff_meta, + buff_skill_meta, + true, + init_args, + buff_vars); + if (child_buff_uniid) { + if (!buff->child_buff_uniids) { + buff->child_buff_uniids = std::make_shared>(); + } + buff->child_buff_uniids->push_back(child_buff_uniid); + } } } } @@ -537,7 +548,7 @@ void Creature::RemoveBuffById(int buff_id) void Creature::RemoveBuffByUniId(int buff_uniid) { int buff_id = 0; - std::vector> removed_buffs; + std::vector>>> removed_buffs; std::shared_ptr buff; for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { if ((*itr)->buff_uniid == buff_uniid) { @@ -553,7 +564,7 @@ void Creature::RemoveBuffByUniId(int buff_uniid) int i = 0; } #endif - removed_buffs.push_back(std::make_tuple(buff->meta, buff->GetCaster().Get())); + removed_buffs.push_back(std::make_tuple(buff->meta, buff->GetCaster().Get(), buff->child_buff_uniids)); OnBuffRemove(*buff.get()); buff->UnInit(); #ifdef MYDEBUG @@ -578,10 +589,19 @@ void Creature::RemoveBuffByUniId(int buff_uniid) for (auto& tuple1 : removed_buffs) { const mt::Buff* buff_meta = std::get<0>(tuple1); Creature* caster = std::get<1>(tuple1); + std::shared_ptr> child_buff_uniids = std::get<2>(tuple1); + #if 1 + if (child_buff_uniids) { + for (auto child_buff_uniid : *child_buff_uniids) { + RemoveBuffByUniId(child_buff_uniid); + } + } + #else for (int child_buff_id : buff_meta->_child_buff_list) { RemoveBuffById(child_buff_id); } + #endif if (!HasBuffEffect(buff_meta->buff_effect()) && !list_empty(&depend_effect_[buff_meta->buff_effect()])) {