diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 1e304e4..865c175 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -17,7 +17,7 @@ namespace MetaData assert(strings2.size() == 2); rand_space += a8::XValue(strings[1]).GetInt(); template_list.push_back(std::make_tuple( - strings[0], + strings2[0], rand_space )); } @@ -148,4 +148,36 @@ namespace MetaData } } + void MapTplThing::Init() + { + rand_space = 0; + std::vector strings; + a8::Split(i->things(), strings, '\n'); + for (auto& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + assert(strings.size() == 2); + rand_space += a8::XValue(strings2[1]).GetInt(); + things.push_back(std::make_tuple( + a8::XValue(strings2[0]), + rand_space + ) + ); + } + } + + int MapTplThing::RandThing() + { + if (rand_space <= 0) { + return 0; + } + int rnd = rand() % rand_space; + for (auto& tuple : things) { + if (std::get<1>(tuple) > rnd) { + return std::get<0>(tuple); + } + } + return 0; + } + } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 836f919..f90d2cc 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -76,4 +76,15 @@ namespace MetaData int total_weight = 0; }; + struct MapTplThing + { + const metatable::MapTplThingJson* i = nullptr; + + void Init(); + int RandThing(); + + std::vector> things; + int rand_space = 0; + }; + } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 0f9f9b1..5c62c13 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -39,10 +39,11 @@ public: std::map mapthing_hash; std::map building_hash; std::map drop_hash; + std::map> maptpl_meta_hash; + std::map> maptpl_hash; void Load() { - std::string res_path; if (!f8::IsOnlineEnv()) { res_path = a8::Format("/var/data/conf_test/game%d/gameserver/res/", {GAME_ID}); } else { @@ -76,7 +77,29 @@ private: for (auto& meta : map_meta_list) { MetaData::Map& item = a8::FastAppend(map_list); item.i = &meta; + item.Init(); gamemap_hash[item.i->map_id()] = &item; + #if 0 + { + for (auto& tuple : item.template_list) { + auto itr = maptpl_meta_hash.find(std::get<0>(tuple)); + if (itr == maptpl_meta_hash.end()) { + maptpl_meta_hash[std::get<0>(tuple)] = std::list(); + itr = maptpl_meta_hash.find(std::get<0>(tuple)); + } + f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".json", itr->second); + } + for (auto& pair : maptpl_meta_hash) { + std::vector things; + for (auto& itr : pair.second) { + auto& thing = a8::FastAppend(things); + thing.i = &itr; + thing.Init(); + } + maptpl_hash[pair.first] = things; + } + } + #endif } for (auto& meta : safearea_meta_list) { @@ -134,9 +157,10 @@ private: building_hash[item.i->_building_id()] = &item; } } - } +private: + std::string res_path; }; void MetaMgr::Init() @@ -213,3 +237,9 @@ MetaData::SafeArea* MetaMgr::GetSafeArea(int area_id) auto itr = loader_->safearea_hash.find(area_id); return itr != loader_->safearea_hash.end() ? itr->second : nullptr; } + +std::vector* MetaMgr::GetMapTplThing(std::string& map_name) +{ + auto itr = loader_->maptpl_hash.find(map_name); + return itr != loader_->maptpl_hash.end() ? &itr->second : nullptr; +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 665c1ad..d306541 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -25,6 +25,7 @@ class MetaMgr : public a8::Singleton MetaData::Building* GetBuilding(int building_id); MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); + std::vector* GetMapTplThing(std::string& map_name); private: MetaDataLoader* loader_ = nullptr; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 8d84ed6..fa9d3dd 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -140,6 +140,6 @@ message MapTplThingJson optional string name = 2; optional string things = 3; optional int32 weight = 4; - optional float x = 5; - optional float y = 6; + // optional float x = 5; + // optional float y = 6; } \ No newline at end of file