修复child_buff_隐患

This commit is contained in:
aozhiwei 2024-08-15 15:35:03 +08:00
parent 5db58d028a
commit a0c8d9cd9f
2 changed files with 24 additions and 3 deletions

View File

@ -37,6 +37,7 @@ class Buff
float res_scale = 1;
long long res_scale_frameno = 0;
std::shared_ptr<std::vector<float>> buff_vars;
std::shared_ptr<std::list<int>> child_buff_uniids;
Buff();
virtual ~Buff();

View File

@ -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<std::list<int>>();
}
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<std::tuple<const mt::Buff*, Creature*>> removed_buffs;
std::vector<std::tuple<const mt::Buff*, Creature*, std::shared_ptr<std::list<int>>>> removed_buffs;
std::shared_ptr<Buff> 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<std::list<int>> 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()])) {