diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 4464cd6..67851f6 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -2128,17 +2128,20 @@ void Room::ProcDieAndroid(int die_time, int die_num) #endif std::vector alive_humans; alive_humans.reserve(human_hash_.size()); - for (auto& pair : human_hash_) { - if (pair.second->IsAndroid() && - !pair.second->real_dead && - pair.second->team_uuid.empty() && - a8::HasBitFlag(pair.second->status, HS_Disable) && - !HasPlayerInRound(pair.second->GetPos(), VIEW_RANGE)) - { - Android* hum = (Android*)pair.second; - alive_humans.push_back(hum); - if (alive_humans.size() > 20) { - break; + { + if (frame_no % 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; + } } } } @@ -2398,3 +2401,15 @@ void Room::CheckPartObjects(Human* testa, Human* testb) } } } + +void Room::CheckAliveHuman(Human* hum, std::vector& alive_humans) +{ + if (hum->IsAndroid() && + !hum->real_dead && + hum->team_uuid.empty() && + a8::HasBitFlag(hum->status, HS_Disable) && + !HasPlayerInRound(hum->GetPos(), VIEW_RANGE)) { + Android* hum = (Android*)hum; + alive_humans.push_back(hum); + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 1b0c3ce..c12a3ae 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -36,6 +36,7 @@ class Player; class Building; class Hero; class AabbCollider; +class Android; class Room { public: @@ -169,6 +170,7 @@ private: void ProcDisableHuman(); void OnHumanGridChg(Human* target); void ShuaGridRound(Human* target); + void CheckAliveHuman(Human* hum, std::vector& alive_humans); private: int elapsed_time_ = 0;