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); } }