diff --git a/server/gameserver/ability.cc b/server/gameserver/ability.cc index f739cf75..d4e73a9c 100644 --- a/server/gameserver/ability.cc +++ b/server/gameserver/ability.cc @@ -62,6 +62,14 @@ Ability::Ability(CreatureWeakPtr owner) std::get<0>(tuple) = .0f; INIT_LIST_HEAD(&std::get<1>(tuple)); } + for (auto& tuple : vattr_add_) { + std::get<0>(tuple) = .0f; + INIT_LIST_HEAD(&std::get<1>(tuple)); + } + for (auto& tuple : vattr_dec_) { + std::get<0>(tuple) = .0f; + INIT_LIST_HEAD(&std::get<1>(tuple)); + } Clear(); } @@ -124,6 +132,30 @@ void Ability::Clear() delete e; } } + + 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); + e->ptr->data = nullptr; + list_del_init(&e->entry); + delete e; + } + } + for (auto& tuple : vattr_dec_) { + std::get<0>(tuple) = 0.0f; + while (!list_empty(&std::get<1>(tuple))) { + AttrRuduce* e = list_first_entry(&std::get<1>(tuple), + AttrRuduce, + entry); + e->ptr->data = nullptr; + list_del_init(&e->entry); + delete e; + } + } + } float* Ability::GetBuffAttrAbsPtr(int attr_id) diff --git a/server/gameserver/ability.h b/server/gameserver/ability.h index 3db1b28c..5be50d01 100644 --- a/server/gameserver/ability.h +++ b/server/gameserver/ability.h @@ -83,6 +83,8 @@ class Ability std::array buff_attr_flag_ = {}; std::array, kHAT_End> attr_add_ = {}; std::array, kHAT_End> attr_dec_ = {}; + std::array, kHVAT_End - kHVAT_Begin> vattr_add_ = {}; + std::array, kHVAT_End - kHVAT_Begin> vattr_dec_ = {}; int speed_addition_times_ = 0; float speed_addition_rate_ = 0; diff --git a/server/gameserver/attrdefine.h b/server/gameserver/attrdefine.h index 045b48b5..4b6ebb46 100644 --- a/server/gameserver/attrdefine.h +++ b/server/gameserver/attrdefine.h @@ -49,3 +49,10 @@ enum HumanAttrType_e kHAT_Shield = 53, kHAT_End }; + +enum HumanVirtualAttrType_e +{ + kHVAT_Begin = 1000, + kHVAT_Dmg = 1001, + kHVAT_End +}; diff --git a/server/gameserver/battledatacontext.cc b/server/gameserver/battledatacontext.cc index 2a9830f6..66cf6df8 100644 --- a/server/gameserver/battledatacontext.cc +++ b/server/gameserver/battledatacontext.cc @@ -565,8 +565,8 @@ float BattleDataContext::CalcDmg(Creature* target, IBullet* bullet) normal_dmg *= 1.5; } float finaly_dmg = normal_dmg; - finaly_dmg *= (1 + owner_.Get()->GetAbility()->GetAttrAddition(kHAT_Atk)); //连加 - finaly_dmg *= target->GetAbility()->GetAttrRuduce(kHAT_Atk); //(1-减免) 连乘 + finaly_dmg *= (1 + owner_.Get()->GetAbility()->GetAttrAddition(kHVAT_Dmg)); //连加 + finaly_dmg *= target->GetAbility()->GetAttrRuduce(kHVAT_Dmg); //(1-减免) 连乘 #else float total_atk = GetTotalAtk(bullet); if (bullet->GetSkillMeta() && bullet->GetSkillMeta()->_number_meta) { diff --git a/server/gameserver/global.cc b/server/gameserver/global.cc index 1b43fe0c..fa8914d4 100644 --- a/server/gameserver/global.cc +++ b/server/gameserver/global.cc @@ -23,6 +23,11 @@ bool IsValidHumanAttr(int attr_type) return attr_type > kHAT_Begin && attr_type < kHAT_End; } +bool IsValidHumanVirtualAttr(int attr_type) +{ + return attr_type > kHVAT_Begin && attr_type < kHVAT_End; +} + bool IsValidEventBuff(int event) { return event >= 0 && event < kEventBuffEnd; diff --git a/server/gameserver/global.h b/server/gameserver/global.h index 566ab37b..3fe1cdfd 100644 --- a/server/gameserver/global.h +++ b/server/gameserver/global.h @@ -21,6 +21,7 @@ class Global : public a8::Singleton bool IsValidSlotId(int slot_id); bool IsValidBuffEffect(int buff_effect); bool IsValidHumanAttr(int attr_type); +bool IsValidHumanVirtualAttr(int attr_type); bool IsValidEventBuff(int event); bool IsValidWeaponOpt(int opt); bool IsValidBuffOpt(int opt);