From b8c76dc6af134330e28f5fbf9cd6fa738c9fac0f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 28 Apr 2021 14:49:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8F=98=E8=BA=AB=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.cc | 5 +++++ server/gameserver/buff.h | 1 + server/gameserver/creature.cc | 6 ++++++ server/gameserver/creature.h | 1 + server/gameserver/human.cc | 4 +++- server/gameserver/player.cc | 25 ++++++++++++++----------- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 3d7fabd..c0ca214 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -169,6 +169,11 @@ bool Buff::NeedSync(Human* hum) return !meta->i->only_server() || !(meta->i->only_self() && owner == hum); } +bool Buff::FreezeOperate() +{ + return meta->i->buff_effect() == kBET_Become && !hold_weapons_.empty(); +} + void Buff::ProcBecome(Creature* caster) { if (caster->IsHuman() && meta->param2 > 0.01) { diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 92e9b73..6437cf5 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -31,6 +31,7 @@ class Buff int GetLastingTime(); bool NeedSync(Human* hum); void FillMFBuff(cs::MFBuff* buff_pb); + bool FreezeOperate(); void ProcDelayAddBuff(Creature* caster); void ProcIntervalAddBuff(Creature* caster); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index a3d20d2..faf4065 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1537,3 +1537,9 @@ void Creature::SummonHero(const a8::Vec2& pos, } } } + +bool Creature::FreezeOperate() +{ + Buff* buff = GetBuffByEffectId(kBET_Become); + return buff && !buff->FreezeOperate(); +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 0bae52d..ec5415f 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -145,6 +145,7 @@ class Creature : public MoveableEntity void SetCurrWeapon(Weapon* weapon); void ResetAllSkillCd(); void UpdateSkill(); + bool FreezeOperate(); private: diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f6f8c45..f4579d3 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2290,7 +2290,9 @@ void Human::DeadDrop() #endif }; - if (GetRace() == kHumanRace && !HasBuffEffect(kBET_Terminator)) { + if (GetRace() == kHumanRace && + !HasBuffEffect(kBET_Terminator) && + !(HasBuffEffect(kBET_Become) && GetBuffByEffectId(kBET_Become)->FreezeOperate())) { for (auto& weapon : weapons) { if (weapon.weapon_id != 0 && weapon.weapon_id != default_weapon.weapon_id) { a8::Vec2 drop_pos = GetPos(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 837d295..5e154a2 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -218,16 +218,18 @@ void Player::UpdateShot() void Player::UpdateSelectWeapon() { - if (selected_weapon_idx >= 0 && selected_weapon_idx < weapons.size()) { - Weapon* old_weapon = GetCurrWeapon(); - Weapon* weapon = &weapons[selected_weapon_idx]; - if (weapon->weapon_id != 0) { - SetCurrWeapon(weapon); - ResetAction(); - need_sync_active_player = true; - SyncAroundPlayers(__FILE__, __LINE__, __func__); - if (old_weapon != weapon) { - AutoLoadingBullet(); + if (!FreezeOperate()) { + if (selected_weapon_idx >= 0 && selected_weapon_idx < weapons.size()) { + Weapon* old_weapon = GetCurrWeapon(); + Weapon* weapon = &weapons[selected_weapon_idx]; + if (weapon->weapon_id != 0) { + SetCurrWeapon(weapon); + ResetAction(); + need_sync_active_player = true; + SyncAroundPlayers(__FILE__, __LINE__, __func__); + if (old_weapon != weapon) { + AutoLoadingBullet(); + } } } } @@ -1119,7 +1121,8 @@ void Player::UpdateDropWeapon() { if (drop_weapon_idx >= 0 && drop_weapon_idx < weapons.size() && - !HasBuffEffect(kBET_Terminator)) { + !HasBuffEffect(kBET_Terminator) && + !FreezeOperate()) { bool drop_ok = false; Weapon* weapon = &weapons[drop_weapon_idx]; int weapon_id = weapon->weapon_id;