From a5329d2d4ddb4f5780b0f00a871137baba534046 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 8 Oct 2019 15:24:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=8D=E6=B4=BB=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 137 +++++++++++++++++++++++------------- server/gameserver/human.h | 4 +- server/gameserver/player.cc | 15 ++++ server/gameserver/player.h | 1 + 4 files changed, 106 insertions(+), 51 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 2ab9116..cd1f7d8 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -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* 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* 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__); +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 9423c9b..26d45f7 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -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; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index a19d4e2..6bee909 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -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; + } +} diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 26b568c..e65a5b3 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -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); };