修复宕机问题
This commit is contained in:
parent
0940d8be4c
commit
7262f36d42
@ -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 =
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user