修复宕机问题

This commit is contained in:
aozhiwei 2020-01-19 15:35:55 +08:00
parent 0940d8be4c
commit 7262f36d42
3 changed files with 32 additions and 10 deletions

View File

@ -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 =

View File

@ -216,6 +216,8 @@ class Human : public Entity
int SkinLv();
void CheckSkinTank();
void OnDie();
void FreeDownedTimer();
void FreeReviveTimer();
protected:
void _UpdateMove(int speed);

View File

@ -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();
}
}