diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index d0c7b142..24c82751 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -442,6 +442,33 @@ void Skill::Proc30301XL() void Skill::Proc30401MAO() { + #if 1 + a8::XTimerWp shield_timer; + owner->GetTrigger()->AddListener + ( + kHpChgEvent, + [this, shield_timer] (const a8::Args& args) mutable + { + if (!owner->dead && + !owner->room->IsGameOver() && + owner->GetHP() < meta->_number_meta->number() * owner->GetMaxHP() + ) { + if (shield_timer.expired()) { + owner->AddEnergyShield + (meta->_number_meta->shield() + + meta->_number_meta->shield_addition() * owner->GetBattleContext()->GetHeroTotalAtk()); + shield_timer = owner->room->xtimer.SetTimeoutWpEx + ( + meta->_number_meta->_float_time * SERVER_FRAME_RATE, + [this] (int event, const a8::Args* args) + { + owner->ClearEnergyShield(); + }, + &xtimer_attacher); + } + } + }); + #else struct _Nested { static void cb(CreatureWeakPtr sender, Entity* e, const mt::Skill* skill_meta) @@ -543,6 +570,7 @@ void Skill::Proc30401MAO() } #endif }); + #endif } void Skill::Proc30501TZ() diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 4a40a582..7612d044 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -224,6 +224,7 @@ void Trigger::HpChg() RemoveBuffs(buff->meta->_int_buff_param1, buff->meta->_buff_param4_int_list); } }); + DispatchEvent(kHpChgEvent, {}); } void Trigger::ReceiveDmg() diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index 7408de43..50b12378 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -35,6 +35,7 @@ enum EventId_e kUseSkillEvent, kTriggerBulletHitBuffEvent, kDmgOutEvent, + kHpChgEvent, kAttacked };