From 4f7f2b001a50c00e2c9f0f726e4283e165c1977e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Jul 2021 06:20:51 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BC=AA=E8=A3=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.h | 2 ++ server/gameserver/constant_export.h | 1 + server/gameserver/creature.cc | 31 +++++++++++++++++++++++++---- server/gameserver/creature.h | 3 +++ server/gameserver/human.cc | 12 +++++++++++ server/gameserver/player.cc | 4 ++-- 6 files changed, 47 insertions(+), 6 deletions(-) diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 89ccc1c..f9544a2 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -25,6 +25,7 @@ struct RemoveBuffCbConext class Human; class Creature; +struct xtimer_list; class Buff { public: @@ -38,6 +39,7 @@ class Buff list_head depend_entry; list_head cond_entry; list_head on_remove_contexts; + xtimer_list* remover_timer = nullptr; Buff(); void Init(); diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index 2b6aac0..753b782 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -83,6 +83,7 @@ enum BuffEffectType_e kBET_Trace = 62, //追踪玩家 kBET_MountainTop = 63, //在山顶 kBET_UseSkill = 64, //使用技能 + kBET_CamouflageAddition = 65, //对抗伪装 kBET_End }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index f9f9b22..133becd 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -239,19 +239,26 @@ void Creature::AddBuff(Creature* caster, list_add_tail(&buff->depend_entry, &depend_effect_[buff->meta->i->depend_effect()]); } { - room->xtimer.AddDeadLineTimerAndAttach + buff->remover_timer = room->xtimer.AddDeadLineTimerAndAttach ( buff_meta->i->duration_time() * SERVER_FRAME_RATE, a8::XParams() .SetSender(this) - .SetParam1(buff_meta->i->buff_id()), + .SetParam1(buff_meta->i->buff_id()) + .SetParam2(buff), [] (const a8::XParams& param) { Creature* c = (Creature*)param.sender.GetUserData(); c->RemoveBuffById(param.param1); }, - &buff->xtimer_attacher.timer_list_ - ); + &buff->xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Buff* buff = (Buff*)param.param2.GetUserData(); + if (buff->remover_timer) { + buff->remover_timer = nullptr; + } + }); } GetTrigger()->ActiveBuff(buff->meta); ProcBuffEffect(caster, buff); @@ -1090,6 +1097,22 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) } } break; + case kBET_CamouflageAddition: + { + Buff* camouflage_buff = GetBuffByEffectId(kBET_Camouflage); + if (camouflage_buff && camouflage_buff->remover_timer && buff->meta->int_param1 > 0) { + int remain_time = room->xtimer.GetRemainTime(camouflage_buff->remover_timer) * FRAME_RATE_MS; + remain_time += buff->meta->int_param1; + room->xtimer.ModifyTimer(camouflage_buff->remover_timer, remain_time / FRAME_RATE_MS); + } + if (buff->meta->int_param2 != 0) { + ++camouflage_move_addition_; + } + if (buff->meta->int_param3 != 0) { + ++camouflage_aiming_addition_; + } + } + break; default: { } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index dece347..a08cd6e 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -240,6 +240,9 @@ protected: Entity* last_collision_door_ = nullptr; std::array buff_inventory_ = {}; + int camouflage_move_addition_ = 0; + int camouflage_aiming_addition_ = 0; + private: CreatureWeakPtr weak_ptr_; Trigger* trigger_ = nullptr; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 6301c7c..a321d2e 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3184,6 +3184,18 @@ void Human::OnBuffRemove(Buff& buff) need_sync_active_player = true; } break; + case kBET_CamouflageAddition: + { + if (buff.meta->int_param2 != 0) { + --camouflage_move_addition_; + } + if (buff.meta->int_param3 != 0) { + -camouflage_aiming_addition_; + } + camouflage_move_addition_ = std::max(camouflage_move_addition_, 0); + camouflage_aiming_addition_ = std::max(camouflage_aiming_addition_, 0); + } + break; default: { } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 75d3a43..6331af9 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -166,7 +166,7 @@ void Player::UpdateMove() if (HasBuffEffect(kBET_Passenger)) { return; } - if (HasBuffEffect(kBET_Camouflage)) { + if (HasBuffEffect(kBET_Camouflage) && camouflage_move_addition_ <= 0) { RemoveBuffByEffectId(kBET_Camouflage); } ++moved_frames; @@ -1668,7 +1668,7 @@ void Player::UpdateAiming() aiming_frameno = room->GetFrameNo(); power_idx = -1; } - if (HasBuffEffect(kBET_Camouflage)) { + if (HasBuffEffect(kBET_Camouflage) && camouflage_aiming_addition_ <= 0) { RemoveBuffByEffectId(kBET_Camouflage); } Weapon* p_weapon = GetCurrWeapon();