From deb8ec286d05126744ace13d95df0cf437d0d528 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 12 Apr 2023 14:12:25 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/callfunc.cc | 26 +++++++++++++++++++++++++- server/gameserver/human.cc | 1 + server/gameserver/trigger.cc | 10 ++++++++++ server/gameserver/trigger.h | 6 +++++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 801d6a87..005d1cc7 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -190,6 +190,11 @@ void CallFuncBuff::Deactivate() owner->GetCurrWeapon()->buff_id = 0; } break; + case BuffCallFunc_e::kAddEnergyShield: + { + owner->ClearEnergyShield(); + } + break; default: { } @@ -333,7 +338,26 @@ void CallFuncBuff::ProcFlashMove() void CallFuncBuff::ProcAddEnergyShield() { - owner->AddEnergyShield(hold_param2_); + if (!owner->dead && !owner->downed) { + if (owner->energy_shield > 0) { + is_valid_ = false; + owner->GetTrigger()->UpdateEnergyShield(hold_param2_, meta->GetDurationTime(this) * FRAME_RATE_MS); + } else { + owner->AddEnergyShield(hold_param2_); + event_handlers_.push_back(owner->GetTrigger()->AddListener + ( + kUpdateEnergyShieldEvent, + [this] (const a8::Args& args) mutable + { + })); + event_handlers_.push_back(owner->GetTrigger()->AddListener + ( + kDestoryEnergyShieldEvent, + [this] (const a8::Args& args) mutable + { + })); + } + } } void CallFuncBuff::ProcAddHp() diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 55a68422..2ada0ee7 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -261,6 +261,7 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string killer_name, in energy_shield, max_energy_shield, true); + GetTrigger()->ReceiveDmg(); } else { float old_health = GetHP(); float new_health = std::max(0.0f, GetHP() - dec_hp); diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index cff384d0..742c23f3 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -574,3 +574,13 @@ void Trigger::EndReload() { DispatchEvent(kEndReloadEvent, {}); } + +void Trigger::UpdateEnergyShield(int value, int new_time) +{ + DispatchEvent(kUpdateEnergyShieldEvent, {value, new_time}); +} + +void Trigger::DestoryEnergyShield() +{ + DispatchEvent(kDestoryEnergyShieldEvent, {}); +} diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index d53fe95a..7746a005 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -46,7 +46,9 @@ enum EventId_e kAttackTargetEvent, kStartReloadEvent, kEndReloadEvent, - kDownedEvent + kDownedEvent, + kUpdateEnergyShieldEvent, + kDestoryEnergyShieldEvent }; class Weapon; @@ -92,6 +94,8 @@ public: void Downed(); void StartReload(); void EndReload(); + void UpdateEnergyShield(int value, int new_time); + void DestoryEnergyShield(); std::weak_ptr AddListener(int event_id, a8::CommonCbProc cb); void RemoveEventHandler(std::weak_ptr handler_ptr);