diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 11126b2c..21b8fc87 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2717,7 +2717,7 @@ void Human::OnDie() return true; }); } - { + if (real_dead) { std::set over_humans; if (!leave_) { if (!HasNoDownedTeammate()) { @@ -4619,33 +4619,41 @@ void Human::InternalBeKill(int killer_id, const std::string& killer_name, int we ((Creature*)killer)->GetTrigger()->Kill(this, weapon_id); } } - if (room->IsPveRoom()){ + if (room->IsPveRoom()) { dead = true; real_dead = false; downed = false; SetHP(0.0f); - if (GetBattleContext()->GetReviveCoin() > 0 && real_killer_id != GetUniId()) { - room->frame_event.AddDead(GetWeakPtrRef(), 1000 * MetaMgr::Instance()->revive_time); - dead_timer = room->xtimer.AddDeadLineTimerAndAttach - (MetaMgr::Instance()->revive_time * SERVER_FRAME_RATE, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->real_dead = true; - hum->SendGameOver(); - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->dead_timer = nullptr; - }); + if (real_killer_id != GetUniId() && GetTeam() && GetTeam()->HasReviveCoin(this)) { + real_dead = true; dead_frameno = room->GetFrameNo(); GetTrigger()->Die(killer_id, weapon_id); - OnDie(); - KillMgr::Instance()->OnHumanDead(this, &info); + if (real_dead) { + real_dead = false; + OnDie(); + KillMgr::Instance()->OnHumanDead(this, &info); + room->frame_event.AddDead(GetWeakPtrRef(), 1000 * MetaMgr::Instance()->revive_time); + dead_timer = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->revive_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->real_dead = true; + hum->SendGameOver(); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->dead_timer = nullptr; + }); + } else { + OnDie(); + KillMgr::Instance()->OnHumanDead(this, &info); + room->frame_event.AddDead(GetWeakPtrRef(), 0); + } } else { real_dead = true; dead_frameno = room->GetFrameNo(); diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index 734bab78..15be28fc 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -140,3 +140,13 @@ void Team::AddCombineMemberNum(int member_num) { combined_team_member_num_ += member_num; } + +bool Team::HasReviveCoin(Human* member) +{ + for (Human* member : members_) { + if (member->GetBattleContext()->GetReviveCoin() > 0) { + return true; + } + } + return false; +} diff --git a/server/gameserver/team.h b/server/gameserver/team.h index 235762ea..69b2564e 100644 --- a/server/gameserver/team.h +++ b/server/gameserver/team.h @@ -28,6 +28,7 @@ class Team void AddCombineMemberNum(int member_num); Human* GetMemberByUniId(int member_id); int GetInitTeamMemberNum() { return init_team_member_num_; }; + bool HasReviveCoin(Human* member); private: int team_id_ = 0;