diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 65a758a..238aca6 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -113,7 +113,7 @@ class Human : public Entity std::set kill_humans; Human* last_tank_attacker = nullptr; long long last_tank_attack_idx = 0; - const BornPoint* born_point = nullptr; + BornPoint* born_point = nullptr; bool shot_start = false; bool shot_hold = false; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index ab94a60..1bf938a 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1500,6 +1500,9 @@ void Room::RandRemoveAndroid() if (hum->team_id != 0) { team_hash_.erase(hum->team_id); } + if (hum->born_point) { + --hum->born_point->android_num; + } for (auto& cell : hum->grid_list) { for (Human* target : cell->human_list) { target->AddOutObjects(hum); @@ -1601,12 +1604,27 @@ BornPoint* Room::AllocBornPoint(Human* hum) { if (hum->born_point) { std::vector point_list; + std::vector free_point_list; + BornPoint* pre_point = nullptr; for (auto& pair : born_point_hash_) { if (&pair.second != hum->born_point) { point_list.push_back(&pair.second); + if (pair.second.player_num + pair.second.android_num < + pair.second.thing_tpl->i->param1()) { + free_point_list.push_back(&pair.second);; + } + } else { + pre_point = &pair.second; } } - return !point_list.empty() ? point_list[rand() % point_list.size()] : nullptr; + if (pre_point) { + --pre_point->player_num; + } + if (!free_point_list.empty()) { + return free_point_list[rand() % free_point_list.size()]; + } else { + return !point_list.empty() ? point_list[rand() % point_list.size()] : nullptr; + } } BornPoint* born_point = nullptr; for (auto& pair : born_point_hash_) {