diff --git a/server/gameserver/ability.cc b/server/gameserver/ability.cc index 91300c85..bab19cc2 100644 --- a/server/gameserver/ability.cc +++ b/server/gameserver/ability.cc @@ -127,6 +127,11 @@ float Ability::GetSpeedAddition() return speed_addition_rate_; } +int Ability::GetSpeedAdditionTimes() +{ + return speed_addition_times_; +} + void Ability::AddDmgRuduce(float rate) { dmg_ruduce_rate_ += rate; @@ -150,6 +155,11 @@ float Ability::GetDmgRuduce() return dmg_ruduce_rate_; } +int Ability::GetDmgRuduceTimes() +{ + return dmg_ruduce_times_; +} + void Ability::AddDmgAddition(float rate) { dmg_addition_rate_ += rate; @@ -172,3 +182,56 @@ float Ability::GetDmgAddition() { return dmg_addition_rate_; } + +int Ability::GetDmgAdditionTimes() +{ + return dmg_addition_times_; +} + +void Ability::AddDefAddition(float rate) +{ + def_addition_rate_ += rate; + ++def_addition_times_; +} + +void Ability::DelDefAddition(float rate) +{ + def_addition_rate_ -= rate; + def_addition_rate_ = std::max(0.0f, def_addition_rate_); + --def_addition_times_; +#ifdef DEBUG + if (def_addition_times_ < 0) { + abort(); + } +#endif +} + +float Ability::GetDefAddition() +{ + return def_addition_rate_; +} + +int Ability::GetDefAdditionTimes() +{ + return def_addition_times_; +} + +void Ability::IncImmuneVertigo() +{ + ++immune_vertigo_times_; +} + +void Ability::DecImmuneVertigo() +{ + --immune_vertigo_times_; +#ifdef DEBUG + if (immune_vertigo_times_ < 0) { + abort(); + } +#endif +} + +int Ability::GetImmuneVertigoTimes() +{ + return immune_vertigo_times_; +} diff --git a/server/gameserver/ability.h b/server/gameserver/ability.h index 127839f4..a3e56456 100644 --- a/server/gameserver/ability.h +++ b/server/gameserver/ability.h @@ -22,12 +22,22 @@ class Ability void AddSpeedAddition(float rate); void DelSpeedAddition(float rate); float GetSpeedAddition(); + int GetSpeedAdditionTimes(); void AddDmgRuduce(float rate); void DelDmgRuduce(float rate); float GetDmgRuduce(); + int GetDmgRuduceTimes(); void AddDmgAddition(float rate); void DelDmgAddition(float rate); float GetDmgAddition(); + int GetDmgAdditionTimes(); + void AddDefAddition(float rate); + void DelDefAddition(float rate); + float GetDefAddition(); + int GetDefAdditionTimes(); + void IncImmuneVertigo(); + void DecImmuneVertigo(); + int GetImmuneVertigoTimes(); private: std::array buff_attr_abs_ = {}; @@ -42,4 +52,10 @@ class Ability int dmg_addition_times_ = 0; float dmg_addition_rate_ = 0; + + int def_addition_times_ = 0; + float def_addition_rate_ = 0; + + int immune_vertigo_times_ = 0; + }; diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 13997bcc..9421e335 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -495,26 +495,34 @@ void Skill::ProcCMXD() void Skill::ProcMYXY() { + float speed_rate = SkillHelper::GetMyxySpeedRate(meta); + float def_rate = SkillHelper::GetMyxyDefRate(meta); owner->GetTrigger()->AddListener ( kStartSwitchWeaponBuffEvent, - [this] (const std::vector& params) + [this, speed_rate, def_rate] (const std::vector& params) { Buff* buff = std::any_cast(params.at(0)); if (!buff->skill_meta || buff->skill_meta->GetMagicId() != MAGIC_HJHX) { return; } + owner->GetAbility()->AddSpeedAddition(speed_rate); + owner->GetAbility()->AddDefAddition(def_rate); + owner->GetAbility()->IncImmuneVertigo(); } ); owner->GetTrigger()->AddListener ( kEndSwitchWeaponBuffEvent, - [this] (const std::vector& params) + [this, speed_rate, def_rate] (const std::vector& params) { Buff* buff = std::any_cast(params.at(0)); if (!buff->skill_meta || buff->skill_meta->GetMagicId() != MAGIC_HJHX) { return; } + owner->GetAbility()->DelSpeedAddition(speed_rate); + owner->GetAbility()->DelDefAddition(def_rate); + owner->GetAbility()->DecImmuneVertigo(); } ); } diff --git a/server/gameserver/skillhelper.cc b/server/gameserver/skillhelper.cc index ce5a5ffa..023f0a93 100644 --- a/server/gameserver/skillhelper.cc +++ b/server/gameserver/skillhelper.cc @@ -386,3 +386,13 @@ float SkillHelper::GetSsjsSpeedRate(const MetaData::Skill* skill_meta) { return skill_meta->number_meta->float_speed; } + +float SkillHelper::GetMyxySpeedRate(const MetaData::Skill* skill_meta) +{ + return skill_meta->number_meta->float_speed; +} + +float SkillHelper::GetMyxyDefRate(const MetaData::Skill* skill_meta) +{ + return skill_meta->number_meta->float_ratio; +} diff --git a/server/gameserver/skillhelper.h b/server/gameserver/skillhelper.h index 96088f42..66447f59 100644 --- a/server/gameserver/skillhelper.h +++ b/server/gameserver/skillhelper.h @@ -50,6 +50,9 @@ class SkillHelper static float GetSsjsTime(const MetaData::Skill* skill_meta); static float GetSsjsProb(const MetaData::Skill* skill_meta); static float GetSsjsSpeedRate(const MetaData::Skill* skill_meta); + //免疫眩晕 + static float GetMyxySpeedRate(const MetaData::Skill* skill_meta); + static float GetMyxyDefRate(const MetaData::Skill* skill_meta); static void ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid); static bool ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_dmg);