修复宕机问题

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); p->set_can_revive(false);
} else { } else {
p->set_can_revive(true); 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); countdown = std::max(0, countdown - kReviveTimeAdd);
p->set_revive_countdown(countdown); 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(); Human* hum = (Human*)param.sender.GetUserData();
if (!hum->downed) { if (!hum->downed) {
hum->room->xtimer.DeleteTimer(hum->downed_timer); hum->FreeDownedTimer();
return; return;
} }
if (hum->dead) { if (hum->dead) {
hum->FreeDownedTimer();
return; return;
} }
if (!hum->HasLiveTeammate()) { if (!hum->HasLiveTeammate()) {
hum->FreeDownedTimer();
hum->BeKill(param.param1, param.param2, param.param3); hum->BeKill(param.param1, param.param2, param.param3);
return; return;
} }
@ -2446,6 +2453,22 @@ void Human::OnDie()
DeadDrop(); 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() void Human::Revive()
{ {
auto callback = auto callback =

View File

@ -216,6 +216,8 @@ class Human : public Entity
int SkinLv(); int SkinLv();
void CheckSkinTank(); void CheckSkinTank();
void OnDie(); void OnDie();
void FreeDownedTimer();
void FreeReviveTimer();
protected: protected:
void _UpdateMove(int speed); 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) { if (dead && !real_dead && revive_timer) {
dead = false; dead = false;
real_dead = false;
downed = false; downed = false;
if (downed_timer) { FreeDownedTimer();
room->xtimer.DeleteTimer(downed_timer);
downed_timer = nullptr;
}
health = GetMaxHP(); health = GetMaxHP();
ResetTankSkin(); ResetTankSkin();
SyncAroundPlayers(__FILE__, __LINE__, __func__); SyncAroundPlayers(__FILE__, __LINE__, __func__);
room->xtimer.DeleteTimer(revive_timer); FreeReviveTimer();
revive_timer = nullptr;
} }
} }
@ -1108,8 +1105,8 @@ void Player::_CMCancelRevive(f8::MsgHdr& hdr, const cs::CMCancelRevive& msg)
dead = true; dead = true;
real_dead = true; real_dead = true;
downed = false; downed = false;
FreeDownedTimer();
OnDie(); OnDie();
room->xtimer.DeleteTimer(revive_timer); FreeReviveTimer();
revive_timer = nullptr;
} }
} }