diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 3f6ed8c..c4a2263 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1609,6 +1609,7 @@ BornPoint* Room::AllocBornPoint(Human* hum) std::vector point_list; std::vector free_point_list; BornPoint* pre_point = nullptr; + BornPoint* reserve_point = nullptr; for (auto& pair : born_point_hash_) { if (&pair.second != hum->born_point) { if (pair.second.player_num + pair.second.android_num < @@ -1616,17 +1617,27 @@ BornPoint* Room::AllocBornPoint(Human* hum) point_list.push_back(&pair.second); free_point_list.push_back(&pair.second);; } + if (!reserve_point || rand() % 100 < 10) { + reserve_point = &pair.second; + } } else { pre_point = &pair.second; } } - if (pre_point) { - DecBornPointHumanNum(pre_point, hum); - } if (!free_point_list.empty()) { born_point = free_point_list[rand() % free_point_list.size()]; + if (pre_point) { + DecBornPointHumanNum(pre_point, hum); + } } else { - born_point = !point_list.empty() ? point_list[rand() % point_list.size()] : nullptr; + if (point_list.empty() && reserve_point) { + born_point = ForceTakeBornPoint(hum, reserve_point); + } else { + born_point = !point_list.empty() ? point_list[rand() % point_list.size()] : nullptr; + if (pre_point) { + DecBornPointHumanNum(pre_point, hum); + } + } } } else { for (auto& pair : born_point_hash_) { @@ -2719,6 +2730,29 @@ void Room::ForceSetBornPoint(Human* hum, BornPoint* born_point) } } +BornPoint* Room::ForceTakeBornPoint(Human* hum, BornPoint* reserve_born_point) +{ + if (!reserve_born_point) { + abort(); + } + if (hum->born_point == reserve_born_point) { + abort(); + } + if (!hum->born_point) { + abort(); + } + BornPoint* pre_point = hum->born_point; + if (pre_point) { + DecBornPointHumanNum(pre_point, hum); + } + for (auto& pair : human_hash_) { + if (pair.second->born_point == reserve_born_point) { + ForceSetBornPoint(pair.second, pre_point); + } + } + return reserve_born_point; +} + void Room::NewBieRoomStart() { if (room_type_ == RT_NewBrid) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 7d172c9..591fe85 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -196,6 +196,7 @@ private: void AddPlayerPostProc(Player* hum); void CombineTeamBornPoint(); void ForceSetBornPoint(Human* hum, BornPoint* born_point); + BornPoint* ForceTakeBornPoint(Human* hum, BornPoint* reserve_born_point); void NewBieRoomStart(); void ZombieModeStart(); void CreateLevel0RoomSpecThings();