添加复活处理

This commit is contained in:
aozhiwei 2019-10-08 15:24:13 +08:00
parent f044c2dd9c
commit a5329d2d4d
4 changed files with 106 additions and 51 deletions

View File

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

View File

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

View File

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

View File

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