diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 15df897..d5ce03f 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -156,7 +156,12 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data) p->set_can_revive(false); } else { p->set_can_revive(true); - int countdown = std::ceil(room->xtimer.GetRemainTime(revive_timer) / SERVER_FRAME_RATE); + int countdown = 0; + if (revive_timer) { + countdown = std::ceil(room->xtimer.GetRemainTime(revive_timer) / SERVER_FRAME_RATE); + } else { + a8::UdpLog::Instance()->Warning("Human::FillMFObjectfull revive_timer == nullptr", {}); + } countdown = std::max(0, countdown - kReviveTimeAdd); p->set_revive_countdown(countdown); } @@ -827,13 +832,15 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i { Human* hum = (Human*)param.sender.GetUserData(); if (!hum->downed) { - hum->room->xtimer.DeleteTimer(hum->downed_timer); + hum->FreeDownedTimer(); return; } if (hum->dead) { + hum->FreeDownedTimer(); return; } if (!hum->HasLiveTeammate()) { + hum->FreeDownedTimer(); hum->BeKill(param.param1, param.param2, param.param3); return; } @@ -2446,6 +2453,22 @@ void Human::OnDie() DeadDrop(); } +void Human::FreeDownedTimer() +{ + if (downed_timer) { + room->xtimer.DeleteTimer(downed_timer); + downed_timer = nullptr; + } +} + +void Human::FreeReviveTimer() +{ + if (revive_timer) { + room->xtimer.DeleteTimer(revive_timer); + revive_timer = nullptr; + } +} + void Human::Revive() { auto callback = diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 6dea5f0..545ebc4 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -216,6 +216,8 @@ class Human : public Entity int SkinLv(); void CheckSkinTank(); void OnDie(); + void FreeDownedTimer(); + void FreeReviveTimer(); protected: void _UpdateMove(int speed); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index ff48cfb..4aa742b 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1089,16 +1089,13 @@ void Player::_CMRevive(f8::MsgHdr& hdr, const cs::CMRevive& msg) } if (dead && !real_dead && revive_timer) { dead = false; + real_dead = false; downed = false; - if (downed_timer) { - room->xtimer.DeleteTimer(downed_timer); - downed_timer = nullptr; - } + FreeDownedTimer(); health = GetMaxHP(); ResetTankSkin(); SyncAroundPlayers(__FILE__, __LINE__, __func__); - room->xtimer.DeleteTimer(revive_timer); - revive_timer = nullptr; + FreeReviveTimer(); } } @@ -1108,8 +1105,8 @@ void Player::_CMCancelRevive(f8::MsgHdr& hdr, const cs::CMCancelRevive& msg) dead = true; real_dead = true; downed = false; + FreeDownedTimer(); OnDie(); - room->xtimer.DeleteTimer(revive_timer); - revive_timer = nullptr; + FreeReviveTimer(); } }