From c4e742f90d63366950b6201708501e68745f7831 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 1 Jun 2020 16:34:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=AD=BB=E4=BA=A1=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/room.cc | 72 +++++++++++++++++++++------------------ server/gameserver/room.h | 1 + 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index cb70bb9..8be2018 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1862,23 +1862,7 @@ void Room::ProcDieAndroid(int die_time, int die_num) #endif std::vector alive_humans; alive_humans.reserve(human_hash_.size()); - { - if (GetFrameNo() % 8 < 5) { - for (auto itr = human_hash_.begin(); itr != human_hash_.end(); ++itr) { - CheckAliveHuman(itr->second, alive_humans); - if (alive_humans.size() > 16) { - break; - } - } - } else { - for (auto itr = human_hash_.rbegin(); itr != human_hash_.rend(); ++itr) { - CheckAliveHuman(itr->second, alive_humans); - if (alive_humans.size() > 16) { - break; - } - } - } - } + GetAliveHumans(alive_humans, 16, nullptr); { Human* first_alive_player = nullptr; for (auto& pair : accountid_hash_) { @@ -1983,23 +1967,15 @@ void Room::CheckAutoDie(Human* target, }, &target->xtimer_attacher.timer_list_); } else { - bool killed = false; - for (auto& pair : human_hash_) { - if (pair.second->GetEntityUniId() != target->GetEntityUniId() && - pair.second->IsAndroid() && - !pair.second->real_dead && - a8::HasBitFlag(pair.second->status, HS_Disable)) { - Android* hum = (Android*)pair.second; - { - target->BeKill(hum->GetEntityUniId(), - hum->name, - hum->curr_weapon->weapon_id); - } - killed = true; - break; - } - } - if (!killed) { + std::vector alive_humans; + GetAliveHumans(alive_humans, 5, target); + if (!alive_humans.empty()) { + Human* killer = alive_humans[rand() % alive_humans.size()]; + a8::UnSetBitFlag(target->status, HS_Disable); + target->BeKill(killer->GetEntityUniId(), + killer->name, + killer->curr_weapon->weapon_id); + } else { a8::UnSetBitFlag(target->status, HS_Disable); target->BeKill(VP_SafeArea, "毒圈", @@ -2139,6 +2115,34 @@ void Room::CheckPartObjects(Human* testa, Human* testb) } } +void Room::GetAliveHumans(std::vector& alive_humans, int num, Human* exclude_hum) +{ + alive_humans.reserve(num); + { + if (GetFrameNo() % 8 < 5) { + for (auto itr = human_hash_.begin(); itr != human_hash_.end(); ++itr) { + if (itr->second == exclude_hum) { + continue; + } + CheckAliveHuman(itr->second, alive_humans); + if (alive_humans.size() > num) { + break; + } + } + } else { + for (auto itr = human_hash_.rbegin(); itr != human_hash_.rend(); ++itr) { + if (itr->second == exclude_hum) { + continue; + } + CheckAliveHuman(itr->second, alive_humans); + if (alive_humans.size() > num) { + break; + } + } + } + } +} + void Room::CheckAliveHuman(Human* hum, std::vector& alive_humans) { if (hum->IsAndroid() && diff --git a/server/gameserver/room.h b/server/gameserver/room.h index ceabedb..f4b6f5f 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -166,6 +166,7 @@ private: void ProcDisableHuman(); void OnHumanGridChg(Human* target); void ShuaGridRound(Human* target); + void GetAliveHumans(std::vector& alive_humans, int num, Human* exclude_hum); void CheckAliveHuman(Human* hum, std::vector& alive_humans); a8::Vec2 GetDefaultBornPoint();