diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index f31710f7..8d291573 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -1570,12 +1570,27 @@ namespace MetaData void PveGemini::Init() { - + { + std::vector strings; + a8::Split(pb->multiplayer_enemy_hp_mul(), strings, '|'); + for (auto& str : strings) { + hp_muls.push_back(a8::XValue(str).GetDouble()); + } + if (hp_muls.size() != 4) { + abort(); + } + } } - float PveGemini::GetHpMul() + float PveGemini::GetHpMul(int num) { - return 0; + if (num > 0 && num <= hp_muls.size()) { + return hp_muls[num - 1]; + } +#ifdef DEBUG + abort(); +#endif + return 0.5; } void PveGeminiContent::Init() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 14cd471e..20ae0cb4 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -167,6 +167,11 @@ namespace MetaData int RandDrop(); }; + struct NpcStandard + { + const metatable::NpcStandard* pb = nullptr; + }; + struct Robot { const metatable::Robot* i = nullptr; @@ -442,9 +447,10 @@ namespace MetaData struct PveGemini { const metatable::PveGemini* pb = nullptr; + std::vector hp_muls; void Init(); - float GetHpMul(); + float GetHpMul(int num); private: std::vector hp_mul; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 52af2723..949c19af 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -199,6 +199,7 @@ public: std::list pve_gemini_meta_list; std::list pve_gemini_content_meta_list; std::list pve_gemini_mode_meta_list; + std::list npc_standard_meta_list; std::map parameter_hash; std::map gamemap_hash; @@ -240,6 +241,7 @@ public: std::map pve_gemini_hash; std::map> pve_gemini_content_hash; std::map pve_gemini_mode_hash; + std::map npc_standard_hash; int curr_group_id = 1001; std::map weapon_group_hash; @@ -295,6 +297,7 @@ public: f8::ReadCsvMetaFile(res_path + "pveGemini@pveGemini.csv", pve_gemini_meta_list); f8::ReadCsvMetaFile(res_path + "pveGeminiContent@pveGeminiContent.csv", pve_gemini_content_meta_list); f8::ReadCsvMetaFile(res_path + "pveGeminiMode@pveGeminiMode.csv", pve_gemini_mode_meta_list); + f8::ReadCsvMetaFile(res_path + "npcStandard@npcStandard.csv", npc_standard_meta_list); f8::ReadJsonMetaFile(res_path + "terrain.json", terrain_meta_list); BindToMetaData(); #if 1 @@ -784,6 +787,13 @@ private: if (MetaMgr::Instance()->match_lock_time >= MetaMgr::Instance()->match_choose_time) { A8_ABORT(); } + { + for (int i = 1; i <= 15; ++i) { + if (!MetaMgr::Instance()->GetNpcStandard(i)) { + abort(); + } + } + } } void BindToMetaData() @@ -1109,6 +1119,12 @@ private: pve_gemini_mode_hash[meta.id()] = item; } + for (auto& meta : npc_standard_meta_list) { + MetaData::NpcStandard item; + item.pb = &meta; + npc_standard_hash[meta.id()] = item; + } + } private: @@ -1495,3 +1511,9 @@ void MetaMgr::CheckMapSpawnPoint() } } } + +MetaData::NpcStandard* MetaMgr::GetNpcStandard(int quality) +{ + auto itr = loader_->npc_standard_hash.find(quality); + return itr != loader_->npc_standard_hash.end() ? &itr->second : nullptr; +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 85975ecc..5742559e 100644 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -31,6 +31,7 @@ class MetaMgr : public a8::Singleton MetaData::Item* GetHeroSkin(int id); MetaData::Building* GetBuilding(int building_id); MetaData::Drop* GetDrop(int drop_id); + MetaData::NpcStandard* GetNpcStandard(int quality); MetaData::SafeArea* GetSafeArea(int area_id); MetaData::SafeArea* GetSafeAreaByType(int area_type); MetaData::SafeAreaPos* RandSafeAreaPos(int area_id); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 6427a25c..009b2593 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -321,6 +321,15 @@ message SkillNumber optional string cd = 10; } +message NpcStandard +{ + required int32 id = 1; + optional int32 quality = 2; + optional int32 hp = 3; + optional int32 damage = 4; + optional int32 defence = 5; +} + message Buff { required int32 buff_id = 1;