From f9b40e6c01c6c9dbf7a0fb818671748b7dd3c61a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 15 Feb 2023 11:45:24 +0800 Subject: [PATCH] 1 --- server/gameserver/car.cc | 1 + server/gameserver/creature.h | 1 + server/gameserver/hero.cc | 1 + server/gameserver/human.cc | 1 + server/gameserver/skill.cc | 22 ++++++++-------------- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 208c14d0..891b710e 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -335,6 +335,7 @@ void Car::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int if (dec_hp < 0.001f) { return; } + last_receive_dmg_frameno = room->GetFrameNo(); float old_health = GetHP(); float new_health = std::max(0.0f, GetHP() - dec_hp); SetHP(std::max(0.0f, new_health)); diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 01217120..7431e1dd 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -69,6 +69,7 @@ class Creature : public MoveableEntity long long hero_uniid = 0; std::vector weapons; long long last_shot_frameno_ = 0; + long long last_receive_dmg_frameno = 0; int status = 0; bool downed = false; bool dead = false; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index cc6e1bb9..b460acdd 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -172,6 +172,7 @@ void Hero::DecHP(float dec_hp, int killer_id, const std::string& killer_name, in if (dec_hp < 0.001f) { return; } + last_receive_dmg_frameno = room->GetFrameNo(); float old_health = GetHP(); float new_health = std::max(0.0f, GetHP() - dec_hp); SetHP(std::max(0.0f, new_health)); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 4926dc71..ae319f75 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -688,6 +688,7 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i std::string real_killer_name; }; + last_receive_dmg_frameno = room->GetFrameNo(); float old_hp = GetHP(); if (energy_shield > 0.001f) { energy_shield = std::max(0.0f, energy_shield - dec_hp); diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 18826a23..33b0fefc 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -399,27 +399,21 @@ void Skill::Proc30301XL() { a8::XTimerWp recover_timer = owner->room->xtimer.SetIntervalWpEx ( - GetCd() / FRAME_RATE_MS, - [this] (int event, const a8::Args* args) + SERVER_FRAME_RATE, + [this] (int event, const a8::Args* args) mutable { if (a8::TIMER_EXEC_EVENT == event) { if (!owner->dead) { - + if (owner->room->GetFrameNo() - owner->last_receive_dmg_frameno > + (int)(meta->_number_meta->number() / FRAME_RATE_MS)) { + if (owner->GetHP() < owner->GetMaxHP()) { + owner->AddHp(owner->GetMaxHP() * meta->_number_meta->resume()); + } + } } } }, &xtimer_attacher); - - owner->GetTrigger()->AddListener - ( - kReceiveDmgEvent, - [this, recover_timer] (const a8::Args& args) mutable - { - if (!recover_timer.expired()) { - owner->room->xtimer.ResetTimer(recover_timer); - } - } - ); } void Skill::Proc30401MAO()