diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 8733926..5d9e15a 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -38,6 +38,13 @@ namespace MetaData airdrops.push_back(a8::XValue(str).GetInt()); } } + { + std::vector strings; + a8::Split(i->safearea(), strings, '|'); + for (auto& str : strings) { + safearea_list.push_back(a8::XValue(str).GetInt()); + } + } { std::vector strings; a8::Split(i->airraids(), strings, '|'); @@ -114,6 +121,7 @@ namespace MetaData void Map::Init2() { + #if 0 std::vector* pos_list = MetaMgr::Instance()->GetSafeAreaPosList(i->safearea()); MetaData::SafeArea* area_meta = MetaMgr::Instance()->GetSafeArea(i->safearea()); if (area_meta && pos_list) { @@ -148,6 +156,17 @@ namespace MetaData }//end for i } } + #endif + { + if (safearea_list.empty()) { + abort(); + } + for (int area_type : safearea_list) { + if (!MetaMgr::Instance()->GetSafeAreaByType(area_type)) { + abort(); + } + } + } } std::string Map::RandTemplate() @@ -176,6 +195,14 @@ namespace MetaData return center; } + int Map::RandSafeArea() const + { + if (safearea_list.empty()) { + abort(); + } + return safearea_list[rand() % safearea_list.size()]; + } + void MapThing::Init() { { diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 301467a..f091d15 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -31,12 +31,14 @@ namespace MetaData std::vector buff_list; a8::Vec2 first_safearea_center; std::map car_num_limit; + std::vector safearea_list; void Init(); void Init2(); std::string RandTemplate(); int GetCarLimit(int car_id); a8::Vec2 GetCenter() const; + int RandSafeArea() const; }; struct Attr diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index c728b76..10d8b6b 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -197,6 +197,7 @@ public: std::map airdrop_hash; std::map airraid_hash; std::map safearea_hash; + std::map safearea_type_hash; std::map> safearea_pos_hash; std::map item_hash; std::map equip_hash; @@ -692,6 +693,9 @@ private: meta.set_shrink_speed(500); } safearea_hash[item.i->id()] = &item; + if (safearea_type_hash.find(item.i->type()) == safearea_type_hash.end()) { + safearea_type_hash[item.i->type()] = &item; + } } for (auto& meta : safearea_pos_meta_list) { @@ -1010,6 +1014,12 @@ MetaData::SafeArea* MetaMgr::GetSafeArea(int area_id) return itr != loader_->safearea_hash.end() ? itr->second : nullptr; } +MetaData::SafeArea* MetaMgr::GetSafeAreaByType(int area_type) +{ + auto itr = loader_->safearea_type_hash.find(area_type); + return itr != loader_->safearea_type_hash.end() ? itr->second : nullptr; +} + MetaData::SafeAreaPos* MetaMgr::RandSafeAreaPos(int area_id) { std::vector* pos_list = GetSafeAreaPosList(area_id); diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 5347679..e9b6bba 100644 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -33,6 +33,7 @@ class MetaMgr : public a8::Singleton MetaData::Building* GetBuilding(int building_id); MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); + MetaData::SafeArea* GetSafeAreaByType(int area_type); MetaData::SafeAreaPos* RandSafeAreaPos(int area_id); std::vector* GetSafeAreaPosList(int area_id); std::vector* GetMapTplThing(const std::string& map_name); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 11c47d1..5458b1e 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1348,13 +1348,19 @@ void Room::UpdateGasJump() } return true; }); + MetaData::SafeArea* first_safearea = MetaMgr::Instance()->GetSafeAreaByType + (map_meta_->RandSafeArea()); gas_data_.gas_mode = GasWaiting; - gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea()); - gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea() + 1); - gas_data_.pos_list = MetaMgr::Instance()->RandSafeAreaPos(map_meta_->i->safearea()); + gas_data_.old_area_meta = first_safearea; + gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(first_safearea->i->id() + 1); + gas_data_.pos_list = MetaMgr::Instance()->RandSafeAreaPos(first_safearea->i->id()); gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); gas_data_.gas_start_frameno = GetFrameNo(); + #if 1 + gas_data_.pos_old = a8::Vec2(first_safearea->i->x1(), first_safearea->i->y1()); + #else gas_data_.pos_old = map_meta_->first_safearea_center; + #endif gas_data_.pos_old_bk = gas_data_.pos_old; { if (gas_data_.pos_list && !gas_data_.pos_list->poses.empty()) { @@ -1390,6 +1396,10 @@ bool Room::GenSmallCircle() if (gas_data_.pos_list && gas_data_.gas_count + 1 < gas_data_.pos_list->poses.size()) { gas_data_.pos_new = gas_data_.pos_list->poses[gas_data_.gas_count + 1]; } else { + #if 1 + gas_data_.pos_new = a8::Vec2(gas_data_.new_area_meta->i->x1(), + gas_data_.new_area_meta->i->y1()); + #else a8::Vec2 dir = a8::Vec2::UP; dir.Rotate(a8::RandAngle()); float rad = rand() % (int)(gas_data_.old_area_meta->i->rad() - @@ -1398,6 +1408,7 @@ bool Room::GenSmallCircle() rad = 0.001f; } gas_data_.pos_new = gas_data_.pos_old + dir * rad; + #endif } return true; } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 9a1a68a..41c567f 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -31,7 +31,7 @@ message Map optional int32 player = 8; optional string refresh_robot = 9; optional int32 map_mode = 10; - optional int32 safearea = 11; + optional string safearea = 11; optional string game_start_buff_list = 12; optional string map_pic = 13; optional string first_safearea_center = 14; @@ -85,6 +85,9 @@ message SafeArea optional int32 wait_time = 4; //等待时间 optional int32 shrink_speed = 5; //收缩速度 optional int32 hurt = 6; //伤害/秒 + optional int32 type = 7; + optional int32 x1 = 8; + optional int32 y1 = 9; } message SafeAreaPos