diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 41dc3b37..10c9429b 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -347,9 +347,13 @@ void CallFuncBuff::ProcFlashMove() void CallFuncBuff::ProcAddEnergyShield() { if (!owner->dead && !owner->downed) { + float dur_time = meta->GetBuffParam3(this) * FRAME_RATE_MS; + if (dur_time < 0.00001f) { + dur_time = 99999999; + } if (owner->energy_shield > 0) { is_valid_ = false; - owner->GetTrigger()->UpdateEnergyShield(hold_param2_, meta->GetDurationTime(this) * FRAME_RATE_MS); + owner->GetTrigger()->UpdateEnergyShield(hold_param2_, dur_time); } else { owner->AddEnergyShield(hold_param2_); event_handlers_.push_back(owner->GetTrigger()->AddListener @@ -368,6 +372,16 @@ void CallFuncBuff::ProcAddEnergyShield() { owner->RemoveBuffByUniId(buff_uniid); })); + owner->room->xtimer.SetTimeoutWpEx + ( + dur_time / FRAME_RATE_MS, + [owner = owner] (int event, const a8::Args* args) mutable + { + if (a8::TIMER_DELETE_EVENT == event) { + owner->ClearEnergyShield(); + } + }, + &owner->xtimer_attacher); } } }