diff --git a/server/gameserver/android.cc b/server/gameserver/android.cc index 410d31d..1ab377c 100644 --- a/server/gameserver/android.cc +++ b/server/gameserver/android.cc @@ -31,6 +31,11 @@ void Android::Initialize() if (skin_meta) { skill_meta = MetaMgr::Instance()->GetSkill(skin_meta->i->skill_id()); } + MetaData::TankSkin* tank_skin_meta = MetaMgr::Instance()->GetTank(SkinId()); + if (tank_skin_meta) { + tankskin.skin_id = tank_skin_meta->i->tank_id(); + tankskin.skin_lv = 1; + } RecalcBaseAttr(); } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 83a6636..044e9d5 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -129,6 +129,7 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data) p->set_backpack(backpack); p->set_helmet(helmet); p->set_chest(chest); + tankskin.ToPB(p->mutable_tankskin()); curr_weapon->ToPB(p->mutable_weapon()); #if 0 p->set_energy_shield(energy_shield); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 02a674f..817233d 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -64,6 +64,7 @@ class Human : public Entity int action_item_id = 0; int action_target_id = 0; Skin skin_jlf; + Skin tankskin; Driver driver; int backpack = 0; int helmet = 0; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index eacbd0f..a2bf2b7 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -194,4 +194,9 @@ namespace MetaData std::map> attr_up; }; + struct TankSkin + { + const metatable::TankSkin* i = nullptr; + }; + } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index d3fb9dc..92926f8 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -33,6 +33,8 @@ public: std::list dress_list; std::list tank_meta_list; std::list tank_list; + std::list tankskin_meta_list; + std::list tankskin_list; std::list driver_meta_list; std::list driver_list; std::list skill_meta_list; @@ -64,6 +66,7 @@ public: std::map> maptpl_size_hash; std::map dress_hash; std::map tank_hash; + std::map tankskin_hash; std::vector tankid_list; std::map driver_hash; std::map skill_hash; @@ -95,6 +98,7 @@ public: f8::ReadCsvMetaFile(res_path + "map@map.csv", map_meta_list); f8::ReadCsvMetaFile(res_path + "safearea@safearea.csv", safearea_meta_list); f8::ReadCsvMetaFile(res_path + "tank@tank.csv", tank_meta_list); + f8::ReadCsvMetaFile(res_path + "tankskin@tankskin.csv", tankskin_meta_list); f8::ReadCsvMetaFile(res_path + "driver@driver.csv", driver_meta_list); f8::ReadCsvMetaFile(res_path + "item@item.csv", item_meta_list); f8::ReadCsvMetaFile(res_path + "equip@equip.csv", equip_meta_list); @@ -210,6 +214,12 @@ private: tankid_list.push_back(meta.id()); } + for (auto& meta : tankskin_meta_list) { + MetaData::TankSkin& item = a8::FastAppend(tankskin_list); + item.i = &meta; + tankskin_hash[item.i->tank_id()] = &item; + } + for (auto& meta : driver_meta_list) { MetaData::Driver& item = a8::FastAppend(driver_list); item.i = &meta; @@ -488,6 +498,12 @@ MetaData::Tank* MetaMgr::GetTank(int tank_id) return itr != loader_->tank_hash.end() ? itr->second : nullptr; } +MetaData::TankSkin* MetaMgr::GetTankSkin(int tank_id) +{ + auto itr = loader_->tankskin_hash.find(tank_id); + return itr != loader_->tankskin_hash.end() ? itr->second : nullptr; +} + int MetaMgr::RandTank() { return !loader_->tankid_list.empty() ? loader_->tankid_list[rand() % loader_->tankid_list.size()] : 0; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index a41a341..59b5790 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -38,6 +38,7 @@ class MetaMgr : public a8::Singleton MetaData::Dress* GetDress(int dress_id); MetaData::Driver* GetDriver(int driver_id); MetaData::Tank* GetTank(int tank_id); + MetaData::TankSkin* GetTankSkin(int tank_id); int RandTank(); float GetRankRewardParam(int rank); float GetKillRewardParam(int kill_num); diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index d70da1e..1d58139 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -80,6 +80,7 @@ Player* PlayerMgr::CreatePlayerByCMJoin(long ip_saddr, int socket, const cs::CMJ } hum->SetSkinInfo(msg.baseskin()); hum->driver.FromPB(&msg.driver()); + hum->tankskin.FromPB(&msg.tankskin()); socket_hash_[socket] = hum; return hum; } diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc index 6ac8af5..45d21e4 100644 --- a/server/gameserver/types.cc +++ b/server/gameserver/types.cc @@ -20,6 +20,12 @@ int Weapon::GetClipVolume() return meta->i->clip_volume(); } +void Skin::FromPB(const cs::MFSkin* pb_obj) +{ + skin_id = pb_obj->skin_id(); + skin_lv = pb_obj->skin_lv(); +} + void Skin::ToPB(cs::MFSkin* pb_obj) { pb_obj->set_skin_id(skin_id); diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 9c5b777..f7fce83 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -61,6 +61,7 @@ struct Skin int skin_id = 0; int skin_lv = 0; + void FromPB(const cs::MFSkin* pb_obj); void ToPB(cs::MFSkin* pb_obj); }; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index b0de4c2..cca9c8b 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -178,6 +178,7 @@ message MFPlayerFull optional int32 energy_shield = 19; //能量护盾 optional int32 max_energy_shield = 22; //最大能量护盾 repeated MFBuff buff_list = 24; //buff列表 + optional MFSkin tankskin = 25; //坦克皮肤 } //阻挡物-部分 @@ -596,6 +597,7 @@ message CMJoin repeated int32 prepare_items = 19; //战斗前准备道具 战前准备护盾存到energy_shield optional string from_appid = 21; //from_appid optional MFDriver driver = 22; //驾驶员 + optional MFSkin tankskin = 23; //坦克皮肤 } //移动 diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index c98492c..0856394 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -217,6 +217,12 @@ message Tank optional int32 type = 7; } +message TankSkin +{ + required int32 id = 1; + optional int32 tank_id = 2; +} + //end message DoorObjJson