From 0b84b9cd378ac37719de20c33d25aa216db48a53 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 20:15:14 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index e80c9ac..7eac770 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -224,17 +224,41 @@ void Creature::MustBeAddBuff(Creature* caster, int buff_id) void Creature::RemoveBuffById(int buff_id) { + std::vector removed_buffs; for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { const Buff& buff = *itr; if (buff.meta->i->buff_id() == buff_id) { if (buff_effect_[buff.meta->i->buff_effect()] == &(*itr)) { buff_effect_[buff.meta->i->buff_effect()] = nullptr; } + removed_buffs.push_back(buff.meta); OnBuffRemove(buff); buff_list_.erase(itr); break; } } + for (MetaData::Buff* buff_meta : removed_buffs) { + for (const auto& tuple : buff_meta->post_remove_action) { + switch (std::get<0>(tuple)) { + case kRemoveBuffByIdAction: + { + for (int buff_id :std::get<1>(tuple)) { + RemoveBuffById(buff_id); + } + } + break; + case kRemoveBuffByEffectAction: + { + for (int buff_effect :std::get<1>(tuple)) { + RemoveBuffByEffectId(buff_effect); + } + } + break; + default: + break; + } + } + } RecalcBuffAttr(); #ifdef DEBUG SendDebugMsg(a8::Format("移除buff_id:%d", @@ -283,8 +307,9 @@ void Creature::OnBuffRemove(const Buff& buff) void Creature::RemoveBuffByEffectId(int buff_effect_id) { Buff* buff = GetBuffByEffectId(buff_effect_id); - if (buff) { + while (buff) { RemoveBuffById(buff->meta->i->buff_id()); + buff = GetBuffByEffectId(buff_effect_id); } }