From efe851c6271d9b036e98f7b2c5505b94a2b8eb2d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 9 Jan 2024 10:37:27 +0800 Subject: [PATCH] 1 --- server/gameserver/ability.cc | 73 ++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/server/gameserver/ability.cc b/server/gameserver/ability.cc index 19c5dde4..738e3ae2 100644 --- a/server/gameserver/ability.cc +++ b/server/gameserver/ability.cc @@ -11,6 +11,7 @@ struct AttrAddition { list_head entry; + list_head list_entry; int attr_id; float value; std::shared_ptr holder; @@ -39,6 +40,9 @@ Ability::Ability(CreatureWeakPtr owner) std::get<0>(tuple) = 0.0f; INIT_LIST_HEAD(&std::get<1>(tuple)); } + for (auto& list : attr_list_) { + INIT_LIST_HEAD(&list); + } for (auto& tuple : vattr_add_) { std::get<0>(tuple) = 0.0f; INIT_LIST_HEAD(&std::get<1>(tuple)); @@ -47,6 +51,9 @@ Ability::Ability(CreatureWeakPtr owner) std::get<0>(tuple) = 0.0f; INIT_LIST_HEAD(&std::get<1>(tuple)); } + for (auto& list : vattr_list_) { + INIT_LIST_HEAD(&list); + } owner_ = owner; } @@ -57,48 +64,41 @@ Ability::~Ability() void Ability::Clear() { - for (auto& tuple : attr_add_) { - std::get<0>(tuple) = 0.0f; - while (!list_empty(&std::get<1>(tuple))) { - AttrAddition* e = list_first_entry(&std::get<1>(tuple), + for (auto& list : attr_list_) { + while (!list_empty(&list)) { + AttrAddition* e = list_first_entry(&list, AttrAddition, entry); list_del_init(&e->entry); + list_del_init(&e->list_entry); e->holder = nullptr; } } - for (auto& tuple : attr_dec_) { - std::get<0>(tuple) = 0.0f; - while (!list_empty(&std::get<1>(tuple))) { - AttrAddition* e = list_first_entry(&std::get<1>(tuple), + for (auto& list : vattr_list_) { + while (!list_empty(&list)) { + AttrAddition* e = list_first_entry(&list, AttrAddition, - entry); + entry); list_del_init(&e->entry); + list_del_init(&e->list_entry); e->holder = nullptr; } } - for (auto& tuple : vattr_add_) { - std::get<0>(tuple) = 0.0f; - while (!list_empty(&std::get<1>(tuple))) { - AttrAddition* e = list_first_entry(&std::get<1>(tuple), - AttrAddition, - entry); - list_del_init(&e->entry); - e->holder = nullptr; + { + for (auto& tuple : attr_add_) { + std::get<0>(tuple) = 0.0f; + } + for (auto& tuple : attr_dec_) { + std::get<0>(tuple) = 0.0f; + } + for (auto& tuple : vattr_add_) { + std::get<0>(tuple) = 0.0f; + } + for (auto& tuple : vattr_dec_) { + std::get<0>(tuple) = 0.0f; } } - for (auto& tuple : vattr_dec_) { - std::get<0>(tuple) = 0.0f; - while (!list_empty(&std::get<1>(tuple))) { - AttrAddition* e = list_first_entry(&std::get<1>(tuple), - AttrAddition, - entry); - list_del_init(&e->entry); - e->holder = nullptr; - } - } - switch_times_ = {}; immune_tags_.clear(); } @@ -147,12 +147,21 @@ AttrHandle Ability::AddAttr(int attr_id, float val) IsValidHumanVirtualAttr(attr_id)) { auto p = std::make_shared(attr_id, val); p->holder = p; - if (IsValidHumanAttr(attr_id)) { - list_add_tail(&p->entry, &std::get<1>(attr_add_[attr_id])); + if (p->IsAdd()) { + if (IsValidHumanAttr(attr_id)) { + list_add_tail(&p->entry, &std::get<1>(attr_add_[attr_id])); + } else { + list_add_tail(&p->entry, &std::get<1>(vattr_add_[attr_id - kHVAT_Begin])); + } + RecalcAttrAddition(attr_id); } else { - list_add_tail(&p->entry, &std::get<1>(vattr_add_[attr_id - kHVAT_Begin])); + if (IsValidHumanAttr(attr_id)) { + list_add_tail(&p->entry, &std::get<1>(attr_dec_[attr_id])); + } else { + list_add_tail(&p->entry, &std::get<1>(vattr_dec_[attr_id - kHVAT_Begin])); + } + RecalcAttrRuduce(attr_id); } - RecalcAttrAddition(attr_id); return p; } return AttrHandle();