添加复活处理
This commit is contained in:
parent
f044c2dd9c
commit
a5329d2d4d
@ -664,7 +664,7 @@ void Human::FillSMGameOver(cs::SMGameOver& msg)
|
||||
|
||||
void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
||||
{
|
||||
if (!dead && !room->game_over) {
|
||||
if (!dead && !room->game_over && !real_dead) {
|
||||
lethal_weapon = weapon_id;
|
||||
Entity* hum = room->GetEntityByUniId(killer_id);
|
||||
if (hum && hum->entity_type == ET_Player) {
|
||||
@ -745,56 +745,16 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
||||
dead = true;
|
||||
health = 0.0f;
|
||||
dead_frameno = room->frame_no;
|
||||
room->OnHumanDie(this);
|
||||
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||
if (team_members) {
|
||||
for (auto& hum : *team_members) {
|
||||
if (hum != this && hum->action_type == AT_Relive &&
|
||||
hum->action_target_id == entity_uniid) {
|
||||
hum->CancelAction();
|
||||
}
|
||||
}
|
||||
++dead_times;
|
||||
int max_revive_times = MetaMgr::Instance()->GetSysParamAsInt("max_revive_times", 1);
|
||||
if (weapon_id != VW_Spectate &&
|
||||
dead_times <= max_revive_times &&
|
||||
entity_subtype == EST_Player) {
|
||||
Revive();
|
||||
} else {
|
||||
real_dead = true;
|
||||
OnDie();
|
||||
}
|
||||
if (!HasNoDownedTeammate() && !leave_) {
|
||||
if (team_members) {
|
||||
for (auto& member : *team_members) {
|
||||
if (member == this) {
|
||||
member->SendGameOver();
|
||||
} else {
|
||||
if (member->dead) {
|
||||
member->SendGameOver();
|
||||
} else if (member->downed) {
|
||||
a8::XParams* timer_param = room->xtimer.MutableParams(member->downed_timer);
|
||||
member->stats.killer_id = timer_param->param1;
|
||||
member->stats.killer_name = timer_param->param2.GetString();
|
||||
member->stats.weapon_id = timer_param->param2;
|
||||
member->dead = true;
|
||||
member->health = 0.0f;
|
||||
member->dead_frameno = room->frame_no;
|
||||
member->room->OnHumanDie(this);
|
||||
member->SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||
member->SendGameOver();
|
||||
room->xtimer.DeleteTimer(member->downed_timer);
|
||||
member->downed_timer = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SendGameOver();
|
||||
}
|
||||
}
|
||||
if (room->GetAliveTeamNum() == 1) {
|
||||
std::set<Human*>* alive_team = room->GetAliveTeam();
|
||||
if (team_members != alive_team) {
|
||||
SendGameOver();
|
||||
}
|
||||
if (alive_team) {
|
||||
for (Human* member : *alive_team) {
|
||||
member->SendGameOver();
|
||||
}
|
||||
}
|
||||
}
|
||||
DeadDrop();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2375,3 +2335,80 @@ void Human::FindLocationWithTarget(Entity* target)
|
||||
}
|
||||
}
|
||||
|
||||
void Human::OnDie()
|
||||
{
|
||||
room->OnHumanDie(this);
|
||||
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||
if (team_members) {
|
||||
for (auto& hum : *team_members) {
|
||||
if (hum != this && hum->action_type == AT_Relive &&
|
||||
hum->action_target_id == entity_uniid) {
|
||||
hum->CancelAction();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!HasNoDownedTeammate() && !leave_) {
|
||||
if (team_members) {
|
||||
for (auto& member : *team_members) {
|
||||
if (member == this) {
|
||||
member->SendGameOver();
|
||||
} else {
|
||||
if (member->dead) {
|
||||
member->SendGameOver();
|
||||
} else if (member->downed) {
|
||||
a8::XParams* timer_param = room->xtimer.MutableParams(member->downed_timer);
|
||||
member->stats.killer_id = timer_param->param1;
|
||||
member->stats.killer_name = timer_param->param2.GetString();
|
||||
member->stats.weapon_id = timer_param->param2;
|
||||
member->dead = true;
|
||||
member->health = 0.0f;
|
||||
member->dead_frameno = room->frame_no;
|
||||
member->room->OnHumanDie(this);
|
||||
member->SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||
member->SendGameOver();
|
||||
room->xtimer.DeleteTimer(member->downed_timer);
|
||||
member->downed_timer = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SendGameOver();
|
||||
}
|
||||
}
|
||||
if (room->GetAliveTeamNum() == 1) {
|
||||
std::set<Human*>* alive_team = room->GetAliveTeam();
|
||||
if (team_members != alive_team) {
|
||||
SendGameOver();
|
||||
}
|
||||
if (alive_team) {
|
||||
for (Human* member : *alive_team) {
|
||||
member->SendGameOver();
|
||||
}
|
||||
}
|
||||
}
|
||||
DeadDrop();
|
||||
}
|
||||
|
||||
void Human::Revive()
|
||||
{
|
||||
auto callback =
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->dead = true;
|
||||
hum->real_dead = true;
|
||||
hum->OnDie();
|
||||
};
|
||||
int wait_revive_time = MetaMgr::Instance()->GetSysParamAsInt("revive_time", 15);
|
||||
revive_timer = room->xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * wait_revive_time,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
callback,
|
||||
&xtimer_attacher.timer_list_,
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Human* hum = (Human*)param.sender.GetUserData();
|
||||
hum->revive_timer = nullptr;
|
||||
});
|
||||
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ class Human : public Entity
|
||||
bool has_pass = 0;
|
||||
bool real_dead = false;
|
||||
xtimer_list* revive_timer = nullptr;
|
||||
int revive_count = 0;
|
||||
int dead_times = 0;
|
||||
|
||||
Weapon default_weapon;
|
||||
Weapon tank_weapon;
|
||||
@ -226,6 +226,8 @@ private:
|
||||
void FillSMGameOver(cs::SMGameOver& msg);
|
||||
void SendBattleReport();
|
||||
void FindLocationWithTarget(Entity* target);
|
||||
void OnDie();
|
||||
void Revive();
|
||||
|
||||
protected:
|
||||
long long last_shot_frameno_ = 0;
|
||||
|
@ -1080,3 +1080,18 @@ void Player::_CMLeave(f8::MsgHdr& hdr, const cs::CMLeave& msg)
|
||||
cs::SMLeave respmsg;
|
||||
SendNotifyMsg(respmsg);
|
||||
}
|
||||
|
||||
void Player::_CMRevive(f8::MsgHdr& hdr, const cs::CMRevive& msg)
|
||||
{
|
||||
if (real_dead) {
|
||||
SendGameOver();
|
||||
return;
|
||||
}
|
||||
if (dead && !real_dead && revive_timer) {
|
||||
dead = false;
|
||||
health = GetMaxHP();
|
||||
SyncAroundPlayers(__FILE__, __LINE__, __func__);
|
||||
room->xtimer.DeleteTimer(revive_timer);
|
||||
revive_timer = nullptr;
|
||||
}
|
||||
}
|
||||
|
@ -88,5 +88,6 @@ class Player : public Human
|
||||
void _CMGameOver(f8::MsgHdr& hdr, const cs::CMGameOver& msg);
|
||||
void _CMWatchWar(f8::MsgHdr& hdr, const cs::CMWatchWar& msg);
|
||||
void _CMLeave(f8::MsgHdr& hdr, const cs::CMLeave& msg);
|
||||
void _CMRevive(f8::MsgHdr& hdr, const cs::CMRevive& msg);
|
||||
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user