From 3b9b07605eb4c8d105c48f7939d2acf79aca01b3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 23 Aug 2021 09:30:48 +0000 Subject: [PATCH] =?UTF-8?q?=E6=AF=92=E5=9C=88Ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/metadata.cc | 66 +++++++++++++++++++++++++ server/gameserver/metadata.h | 10 ++++ server/gameserver/metamgr.cc | 33 +++++++++++++ server/gameserver/metamgr.h | 2 + server/gameserver/room.cc | 25 ++++++---- server/gameserver/types.h | 2 + server/tools/protobuild/metatable.proto | 25 ++++++++++ 7 files changed, 154 insertions(+), 9 deletions(-) diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 29e0063..1ccee22 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -112,6 +112,44 @@ namespace MetaData } } + void Map::Init2() + { + std::vector* pos_list = MetaMgr::Instance()->GetSafeAreaPosList(i->safearea()); + MetaData::SafeArea* area_meta = MetaMgr::Instance()->GetSafeArea(i->safearea()); + if (area_meta && pos_list) { + std::vector area_list; + MetaData::SafeArea* cur_area_meta = area_meta; + while (cur_area_meta) { + area_list.push_back(cur_area_meta); + cur_area_meta = MetaMgr::Instance()->GetSafeArea(cur_area_meta->i->id() + 1); + } + + for (MetaData::SafeAreaPos* pos_meta : *pos_list) { + if (area_list.size() != pos_meta->poses.size()) { + abort(); + } + for (size_t j = 0; j < area_list.size(); ++j) { + a8::Vec2 pos = pos_meta->poses[j]; + if (pos.x < 0 || pos.y < 0) { + abort(); + } + if (pos.x > i->map_width() || pos.y > i->map_height()) { + abort(); + } + if (j > 0) { + a8::Vec2 pre_pos = pos_meta->poses[j - 1]; + MetaData::SafeArea* pre_area_meta = area_list[j - 1]; + float distance = pos.Distance(pre_pos); + if (distance + area_meta->i->rad() < pre_area_meta->i->rad()) { + } else { + abort(); + } + } + }//end for i + } + } + } + std::string Map::RandTemplate() { if (rand_space <= 0) { @@ -1253,4 +1291,32 @@ namespace MetaData ); } + void SafeAreaPos::Init() + { + std::vector tmp_list; + { + tmp_list.push_back(a8::Vec2(i->x1(), i->y1())); + tmp_list.push_back(a8::Vec2(i->x2(), i->y2())); + tmp_list.push_back(a8::Vec2(i->x3(), i->y3())); + tmp_list.push_back(a8::Vec2(i->x4(), i->y4())); + tmp_list.push_back(a8::Vec2(i->x5(), i->y5())); + tmp_list.push_back(a8::Vec2(i->x6(), i->y6())); + tmp_list.push_back(a8::Vec2(i->x7(), i->y7())); + tmp_list.push_back(a8::Vec2(i->x8(), i->y8())); + tmp_list.push_back(a8::Vec2(i->x9(), i->y9())); + tmp_list.push_back(a8::Vec2(i->x10(), i->y10())); + } + for (auto& pos : tmp_list) { + if (pos.x < 1.0f || pos.y < 1.0f) { + break; + } + poses.push_back(pos); + } + } + + void SafeAreaPos::Init2() + { + + } + } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 65a276e..5a98ae6 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -33,6 +33,7 @@ namespace MetaData std::map car_num_limit; void Init(); + void Init2(); std::string RandTemplate(); int GetCarLimit(int car_id); }; @@ -64,6 +65,15 @@ namespace MetaData const metatable::SafeArea* i = nullptr; }; + struct SafeAreaPos + { + const metatable::SafeAreaPos* i = nullptr; + std::vector poses; + + void Init(); + void Init2(); + }; + struct Item { const metatable::Item* i = nullptr; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 063d69c..e488058 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -27,6 +27,8 @@ public: std::list map_list; std::list safearea_meta_list; std::list safearea_list; + std::list safearea_pos_meta_list; + std::list safearea_pos_list; std::list item_meta_list; std::list item_list; std::list equip_meta_list; @@ -75,6 +77,7 @@ public: std::map airdrop_hash; std::map airraid_hash; std::map safearea_hash; + std::map> safearea_pos_hash; std::map item_hash; std::map equip_hash; std::map equip_slot_hash; @@ -129,6 +132,7 @@ public: f8::ReadCsvMetaFile(res_path + "parameter@parameter.csv", parameter_meta_list); f8::ReadCsvMetaFile(res_path + "map@map.csv", map_meta_list); f8::ReadCsvMetaFile(res_path + "safearea@safearea.csv", safearea_meta_list); + f8::ReadCsvMetaFile(res_path + "safearea_pos@safearea_pos.csv", safearea_pos_meta_list); f8::ReadCsvMetaFile(res_path + "item@item.csv", item_meta_list); f8::ReadCsvMetaFile(res_path + "buff@buff.csv", buff_meta_list); f8::ReadCsvMetaFile(res_path + "equip@equip.csv", equip_meta_list); @@ -463,6 +467,9 @@ private: for (auto& equip : equip_list) { equip.Init2(); } + for (auto& map : map_list) { + map.Init2(); + } } } @@ -546,6 +553,20 @@ private: safearea_hash[item.i->id()] = &item; } + for (auto& meta : safearea_pos_meta_list) { + MetaData::SafeAreaPos& item = a8::FastAppend(safearea_pos_list); + item.i = &meta; + item.Init(); + { + auto itr = safearea_pos_hash.find(meta.id()); + if (itr != safearea_pos_hash.end()) { + itr->second.push_back(&item); + } else { + safearea_pos_hash[meta.id()] = std::vector({&item}); + } + } + } + for (auto& meta : buff_meta_list) { if (!IsValidBuffEffect(meta.buff_effect())) { abort(); @@ -824,6 +845,18 @@ MetaData::SafeArea* MetaMgr::GetSafeArea(int area_id) return itr != loader_->safearea_hash.end() ? itr->second : nullptr; } +MetaData::SafeAreaPos* MetaMgr::RandSafeAreaPos(int area_id) +{ + std::vector* pos_list = GetSafeAreaPosList(area_id); + return pos_list && !pos_list->empty() ? pos_list->at(rand() % pos_list->size()) : nullptr; +} + +std::vector* MetaMgr::GetSafeAreaPosList(int area_id) +{ + auto itr = loader_->safearea_pos_hash.find(area_id); + return itr != loader_->safearea_pos_hash.end() ? &itr->second : nullptr; +} + std::vector* MetaMgr::GetMapTplThing(const std::string& map_name) { auto itr = loader_->maptpl_hash.find(map_name); diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index f6cf138..28d5bb0 100644 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -31,6 +31,8 @@ class MetaMgr : public a8::Singleton MetaData::Building* GetBuilding(int building_id); MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); + MetaData::SafeAreaPos* RandSafeAreaPos(int area_id); + std::vector* GetSafeAreaPosList(int area_id); std::vector* GetMapTplThing(const std::string& map_name); metatable::TerrainJson* GetTerrainJson(int map_id); std::list* GetMapLayer(const std::string& map_name); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index d7ede8e..81f5551 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1381,11 +1381,16 @@ void Room::UpdateGasJump() 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_.gas_progress = gas_data_.old_area_meta->i->rad(); gas_data_.gas_start_frameno = GetFrameNo(); gas_data_.pos_old = map_meta_->first_safearea_center; gas_data_.pos_old_bk = gas_data_.pos_old; { + if (gas_data_.pos_list && !gas_data_.pos_list->poses.empty()) { + gas_data_.pos_old = gas_data_.pos_list->poses[0]; + gas_data_.pos_old_bk = gas_data_.pos_old; + } bool gen_ok = GenSmallCircle(); if (!gen_ok) { abort(); @@ -1412,16 +1417,18 @@ bool Room::GenSmallCircle() if (gas_data_.new_area_meta->i->rad() >= gas_data_.old_area_meta->i->rad()) { abort(); } - #if 1 - a8::Vec2 dir = a8::Vec2::UP; - dir.Rotate(a8::RandAngle()); - float rad = rand() % (int)(gas_data_.old_area_meta->i->rad() - - gas_data_.new_area_meta->i->rad()); - if (rad <= 0.001f){ - rad = 0.001f; + 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 { + a8::Vec2 dir = a8::Vec2::UP; + dir.Rotate(a8::RandAngle()); + float rad = rand() % (int)(gas_data_.old_area_meta->i->rad() - + gas_data_.new_area_meta->i->rad()); + if (rad <= 0.001f){ + rad = 0.001f; + } + gas_data_.pos_new = gas_data_.pos_old + dir * rad; } - gas_data_.pos_new = gas_data_.pos_old + dir * rad; - #endif return true; } diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 8f5f7b8..2b23240 100644 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -4,6 +4,7 @@ namespace MetaData { struct Map; struct SafeArea; + struct SafeAreaPos; struct Equip; struct EquipUpgrade; struct MapTplThing; @@ -28,6 +29,7 @@ struct GasData long long gas_start_frameno = 0; MetaData::SafeArea* old_area_meta = nullptr; MetaData::SafeArea* new_area_meta = nullptr; + MetaData::SafeAreaPos* pos_list = nullptr; bool is_last_gas = false; int gas_count = 0; }; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index ff7fc59..81e4c08 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -85,6 +85,31 @@ message SafeArea optional int32 hurt = 6; //伤害/秒 } +message SafeAreaPos +{ + optional int32 id = 1; + optional int32 x1 = 2; + optional int32 y1 = 3; + optional int32 x2 = 4; + optional int32 y2 = 5; + optional int32 x3 = 6; + optional int32 y3 = 7; + optional int32 x4 = 8; + optional int32 y4 = 9; + optional int32 x5 = 10; + optional int32 y5 = 11; + optional int32 x6 = 12; + optional int32 y6 = 13; + optional int32 x7 = 14; + optional int32 y7 = 15; + optional int32 x8 = 16; + optional int32 y8 = 17; + optional int32 x9 = 18; + optional int32 y9 = 19; + optional int32 x10 = 20; + optional int32 y10 = 21; +} + message Item { optional int32 id = 1; //道具id