diff --git a/server/gameserver/mapmgr.cc b/server/gameserver/mapmgr.cc index b8d7c75..e48afdc 100644 --- a/server/gameserver/mapmgr.cc +++ b/server/gameserver/mapmgr.cc @@ -34,13 +34,14 @@ void MapMgr::Init() MAP_GRID_WIDTH); CreateThings(); a8::UdpLog::Instance()->Info - ("current_uniid:%d loots:%d spawn_points:%d " + ("current_uniid:%d loots:%d mini_room_spawn_points:%d normal_room_spawn_points:%d " "building_num:%d obstalce_num:%d obstacle0_num:%d " "obstacle1_num:%d obstacle2_num:%d", { current_uniid_, loots_.size(), - spawn_points_.size(), + mini_room_spawn_points_.size(), + normal_room_spawn_points_.size(), building_num_, obstacle_num_, obstacle0_num_, @@ -66,7 +67,8 @@ void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info) init_info.map_meta = map_meta_; init_info.grid_service = grid_service_; init_info.map_service = map_service_; - init_info.spawn_points = &spawn_points_; + init_info.mini_room_spawn_points = &mini_room_spawn_points_; + init_info.normal_room_spawn_points = &normal_room_spawn_points_; init_info.level0room_born_point_meta = level0room_born_point_; init_info.level1room_born_point_meta = level1room_born_point_; init_info.loots = &loots_; @@ -99,11 +101,23 @@ void MapMgr::CreateThings() break; case kMOT_SpawnPoint: { + std::string point_name = thing_tpl.i->name(); + //pointxxx + if (point_name.size() < 6) { + abort(); + } + std::string name_part = point_name.substr(0, 5); + std::string id_part = point_name.substr(5, point_name.size() - 5); + int point_id = a8::XValue(id_part); if (spawn_points_hash.find(thing_tpl.i->name()) != spawn_points_hash.end()) { abort(); } - spawn_points_.push_back(&thing_tpl); + if (point_id <= 100) { + normal_room_spawn_points_.push_back(&thing_tpl); + } else { + mini_room_spawn_points_.push_back(&thing_tpl); + } spawn_points_hash[thing_tpl.i->name()] = &thing_tpl; } break; @@ -116,10 +130,12 @@ void MapMgr::CreateThings() if (spawn_points_hash.find(MetaMgr::Instance()->newbie_born_point) != spawn_points_hash.end()) { level0room_born_point_ = spawn_points_hash[MetaMgr::Instance()->newbie_born_point]; + mini_room_spawn_points_.push_back(level0room_born_point_); } if (spawn_points_hash.find(MetaMgr::Instance()->level1room_born_point) != spawn_points_hash.end()) { level1room_born_point_ = spawn_points_hash[MetaMgr::Instance()->level1room_born_point]; + mini_room_spawn_points_.push_back(level1room_born_point_); } } diff --git a/server/gameserver/mapmgr.h b/server/gameserver/mapmgr.h index 8ee5d24..1c88917 100644 --- a/server/gameserver/mapmgr.h +++ b/server/gameserver/mapmgr.h @@ -41,7 +41,8 @@ class MapMgr : public a8::Singleton MetaData::Map* map_meta_ = nullptr; MapService* map_service_ = nullptr; GridService* grid_service_ = nullptr; - std::vector spawn_points_; + std::vector mini_room_spawn_points_; + std::vector normal_room_spawn_points_; MetaData::MapTplThing* level0room_born_point_ = nullptr; MetaData::MapTplThing* level1room_born_point_ = nullptr; std::vector loots_; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 0f614cc..dfb548d 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -26,7 +26,9 @@ #include "entityfactory.h" #include "perfmonitor.h" -const int ROOM_MAX_PLAYER_NUM = 40; +const size_t NORMAL_ROOM_MAX_PLAYER_NUM = 40; +const size_t MINI_ROOM_MAX_PLAYER_NUM = 20; + const int SHUA_RANGE = 580; static long long RoomXGetTickCount(void* context) @@ -51,7 +53,8 @@ void Room::InitData(RoomInitInfo& init_info) grid_service = init_info.grid_service; map_service = init_info.map_service; map_meta_ = init_info.map_meta; - spawn_points_ = init_info.spawn_points; + mini_room_spawn_points_ = init_info.mini_room_spawn_points; + normal_room_spawn_points_ = init_info.normal_room_spawn_points; level0room_born_point_meta_ = init_info.level0room_born_point_meta; level1room_born_point_meta_ = init_info.level1room_born_point_meta; loots_ = init_info.loots; @@ -261,7 +264,7 @@ void Room::ShowAndroid(Human* target, int num) void Room::CreateAndroid(int robot_num) { for (int i = 0; i < robot_num; ++i) { - if (human_hash_.size() >= ROOM_MAX_PLAYER_NUM) { + if (human_hash_.size() >= GetRoomMaxPlayerNum()) { return; } MetaData::Robot* robot_meta = MetaMgr::Instance()->RandRobot(refreshed_robot_set_); @@ -667,7 +670,7 @@ bool Room::CanJoin(const std::string& accountid, RoomType_e self_room_type) return false; } } - return GetPlayerNum() < ROOM_MAX_PLAYER_NUM; + return GetPlayerNum() < (int)GetRoomMaxPlayerNum(); } void Room::OnPlayerOffline(Player* hum) @@ -881,8 +884,13 @@ void Room::UpdateGasInactive() { if (GetFrameNo() - gas_data_.gas_start_frameno >= GetGasInactiveTime() * SERVER_FRAME_RATE) { gas_data_.gas_mode = GasWaiting; - gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001); - gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002); + if (IsMiniRoom()) { + gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(60001); + gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(60002); + } else { + gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001); + gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002); + } gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); gas_data_.gas_start_frameno = GetFrameNo(); gas_data_.pos_old = a8::Vec2(map_meta_->i->map_width() / 2.0f, @@ -898,8 +906,8 @@ void Room::UpdateGasInactive() gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); battle_start_frameno_ = GetFrameNo(); - if (human_hash_.size() < ROOM_MAX_PLAYER_NUM) { - CreateAndroid(ROOM_MAX_PLAYER_NUM - human_hash_.size()); + if (human_hash_.size() < GetRoomMaxPlayerNum()) { + CreateAndroid(GetRoomMaxPlayerNum() - human_hash_.size()); NotifyUiUpdate(); } CombineTeam(); @@ -1545,10 +1553,16 @@ BornPoint* Room::GetBornPoint(int point_uniid) void Room::CreateSpawnPoints() { - if (!spawn_points_ || spawn_points_->empty()) { + const std::vector* spawn_points = nullptr; + if (IsMiniRoom()) { + spawn_points = mini_room_spawn_points_; + } else { + spawn_points = normal_room_spawn_points_; + } + if (!spawn_points || spawn_points->empty()) { abort(); } - for (auto& thing_tpl : *spawn_points_) { + for (auto& thing_tpl : *spawn_points) { int uniid = AllocUniid(); BornPoint born_point; born_point.thing_tpl = thing_tpl; @@ -1688,7 +1702,7 @@ void Room::SecondRandPoint() #endif if (room_type_ == RT_NewBrid || room_type_ == RT_MidBrid) { std::vector tmp_humans; - tmp_humans.reserve(ROOM_MAX_PLAYER_NUM); + tmp_humans.reserve(GetRoomMaxPlayerNum()); for (auto& pair : human_hash_) { if (pair.second->IsAndroid() && a8::HasBitFlag(pair.second->status, HS_Disable) && @@ -2405,7 +2419,7 @@ void Room::AddPlayerPostProc(Player* hum) } } } - while (human_hash_.size() > ROOM_MAX_PLAYER_NUM) { + while (human_hash_.size() > GetRoomMaxPlayerNum()) { RandRemoveAndroid(); } #ifdef DEBUG @@ -2831,3 +2845,20 @@ void Room::ShuaLastGas() CheckPartObjects(); #endif } + +bool Room::IsMiniRoom() +{ + return + GetRoomType() == RT_NewBrid || + GetRoomType() == RT_MidBrid || + GetRoomType() == RT_OldBrid1; +} + +size_t Room::GetRoomMaxPlayerNum() +{ + if (IsMiniRoom()) { + return MINI_ROOM_MAX_PLAYER_NUM; + } else { + return NORMAL_ROOM_MAX_PLAYER_NUM; + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 36063d8..122b880 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -196,6 +196,8 @@ private: void CheckShowHand(); void ShowHand(); void ShuaLastGas(); + bool IsMiniRoom(); + size_t GetRoomMaxPlayerNum(); #ifdef DEBUG void InitDebugInfo(); @@ -208,7 +210,8 @@ private: const MetaData::Map* map_meta_ = nullptr; std::string map_tpl_name_; RoomType_e room_type_ = RT_NewBrid; - const std::vector* spawn_points_ = nullptr; + const std::vector* mini_room_spawn_points_ = nullptr; + const std::vector* normal_room_spawn_points_ = nullptr; const MetaData::MapTplThing* level0room_born_point_meta_ = nullptr; const MetaData::MapTplThing* level1room_born_point_meta_ = nullptr; const std::vector* loots_ = nullptr; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 7da9e17..ccfa369 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -159,7 +159,8 @@ struct RoomInitInfo std::string map_tpl_name; GridService* grid_service = nullptr; MapService* map_service = nullptr; - const std::vector* spawn_points = nullptr; + const std::vector* mini_room_spawn_points = nullptr; + const std::vector* normal_room_spawn_points = nullptr; const MetaData::MapTplThing* level0room_born_point_meta = nullptr; const MetaData::MapTplThing* level1room_born_point_meta = nullptr; const std::vector* loots = nullptr;