From f86482d2eb0320346f60f4c2c874804bf875d06a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 28 Nov 2022 11:06:03 +0800 Subject: [PATCH] 1 --- server/gameserver/ability.cc | 32 +++++++++++++++++++++++++ server/gameserver/ability.h | 11 +++++++++ server/gameserver/creature.cc | 25 +++++++++++++++++++ server/tools/protobuild/metatable.proto | 3 +++ 4 files changed, 71 insertions(+) diff --git a/server/gameserver/ability.cc b/server/gameserver/ability.cc index ec54f3e5..f5a34ad9 100644 --- a/server/gameserver/ability.cc +++ b/server/gameserver/ability.cc @@ -321,3 +321,35 @@ int Ability::GetSpeedRuduceTimes() { return speed_ruduce_times_; } + +void Ability::IncDisableShotTimes() +{ + ++disable_shot_times_; +} + +void Ability::DecDisableShotTimes() +{ + --disable_shot_times_; + disable_shot_times_ = std::max(0, disable_shot_times_); +} + +int Ability::GetDisableShotTimes() +{ + return disable_shot_times_; +} + +void Ability::IncDisableUseSkillTimes() +{ + ++disable_useskill_times_; +} + +void Ability::DecDisableUseSkillTimes() +{ + --disable_useskill_times_; + disable_useskill_times_ = std::max(0, disable_useskill_times_); +} + +int Ability::GetDisableUseSkillTimes() +{ + return disable_useskill_times_; +} diff --git a/server/gameserver/ability.h b/server/gameserver/ability.h index 65181a52..be298536 100644 --- a/server/gameserver/ability.h +++ b/server/gameserver/ability.h @@ -53,6 +53,14 @@ class Ability bool CanImmune(int tag); bool CanImmune(const std::set& tags); + void IncDisableShotTimes(); + void DecDisableShotTimes(); + int GetDisableShotTimes(); + + void IncDisableUseSkillTimes(); + void DecDisableUseSkillTimes(); + int GetDisableUseSkillTimes(); + private: std::array buff_attr_abs_ = {}; std::array buff_attr_rate_ = {}; @@ -76,6 +84,9 @@ class Ability int atk_addition_times_ = 0; float atk_addition_rate_ = 0; + int disable_shot_times_ = 0; + int disable_useskill_times_ = 0; + std::map immune_tags_; }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index b2493ff2..4206c415 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -192,6 +192,15 @@ int Creature::AddBuff(Creature* caster, if (buff->meta->i->lock_move()) { IncDisableMoveTimes(); } + if (buff->meta->i->lock_dir()) { + IncDisableAttackDirTimes(); + } + if (buff->meta->i->disable_shot()) { + GetAbility()->IncDisableShotTimes(); + } + if (buff->meta->i->disable_useskill()) { + GetAbility()->IncDisableUseSkillTimes(); + } list_add_tail(&buff->effect_entry, &buff_effect_[buff->meta->i->buff_effect()]); if (buff->meta->i->depend_effect() != 0 && IsValidBuffEffect(buff->meta->i->depend_effect())) { @@ -563,6 +572,15 @@ void Creature::OnBuffRemove(Buff& buff) if (buff.meta->i->lock_move()) { DecDisableMoveTimes(); } + if (buff.meta->i->lock_dir()) { + DecDisableAttackDirTimes(); + } + if (buff.meta->i->disable_shot()) { + GetAbility()->DecDisableShotTimes(); + } + if (buff.meta->i->disable_useskill()) { + GetAbility()->DecDisableUseSkillTimes(); + } #if 999 if (buff.meta->i->buff_id() == 8042) { if (GetAbility()->GetSpeedRuduceTimes() > 0) { @@ -793,6 +811,9 @@ bool Creature::CanUseSkill(int skill_id) if (!skill) { return false; } + if (GetAbility()->GetDisableUseSkillTimes() > 0) { + return false; + } if (room->GetGasData().GetGasMode() == GasInactive && !MetaMgr::Instance()->prebattle_can_use_skill) { return false; @@ -1819,6 +1840,10 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance, int return; } + if (GetAbility()->GetDisableShotTimes() > 0) { + return; + } + if (GetCurrWeapon()->weapon_idx != 0 && GetCurrWeapon()->ammo <= 0) { CheckLoadingBullet(); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index cf6d5da9..ca0e2b1a 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -375,6 +375,9 @@ message Buff optional int32 dead_remove = 29; optional int32 no_immune = 30; optional int32 lock_move = 31; + optional int32 lock_dir = 34; + optional int32 disable_shot = 32; + optional int32 disable_useskill = 33; } message Drop