diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index d358b71..bcec2dc 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -207,8 +207,8 @@ void Bullet::RayDetectionUpdate() }//end for movement->GetCollisionObjects(objects); float bullet_range = gun_meta->i->range(); - if (gun_upgrade_meta && gun_upgrade_meta->attr[EA_ShotRange] > 0) { - bullet_range += gun_upgrade_meta->attr[EA_ShotRange]; + if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange) > 0) { + bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange); } if (!objects.empty() || distance > bullet_range || distance >= movement->target_distance || (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) @@ -270,8 +270,8 @@ void Bullet::MapServiceUpdate() } #endif float bullet_range = gun_meta->i->range(); - if (gun_upgrade_meta && gun_upgrade_meta->attr[EA_ShotRange] > 0) { - bullet_range += gun_upgrade_meta->attr[EA_ShotRange]; + if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange) > 0) { + bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange); } if (!objects.empty() || distance > bullet_range || (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 2238439..1c3471c 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -16,6 +16,7 @@ class MovementComponent; class Bullet : public Entity { public: + int gun_lv = 0; MetaData::Equip* gun_meta = nullptr; MetaData::EquipUpgrade* gun_upgrade_meta = nullptr; MetaData::Equip* meta = nullptr; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 17ade5a..57917ea 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -132,6 +132,14 @@ enum EquipAttr_e EA_End }; +enum DressAttr_e +{ + DA_Atk = 1, + DA_Def = 2, + DA_Speed = 3, + DA_End +}; + const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 9ea4e17..94b81e5 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -226,7 +226,7 @@ void Human::Shot(Vector2D& target_dir) if (curr_weapon->meta->i->bullet_angle() >= 0.10f) { int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000; if (curr_weapon->upgrade_meta) { - angle -= curr_weapon->upgrade_meta->attr[EA_BulletAngle] * 1000; + angle -= curr_weapon->upgrade_meta->GetAttrValue(curr_weapon->weapon_lv, EA_BulletAngle) * 1000; } if (angle > 0) { bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); @@ -1423,13 +1423,13 @@ void Human::RecalcBuff() { buff = HumanAbility(); if (skin_jlf_meta) { - buff.damage_add += skin_jlf_meta->i->atk_add(); - buff.def_add += skin_jlf_meta->i->def_add(); - buff.speed += skin_jlf_meta->i->speed_add(); + buff.damage_add += skin_jlf_meta->GetAttrValue(skin_jlf.skin_lv, DA_Atk); + buff.def_add += skin_jlf_meta->GetAttrValue(skin_jlf.skin_lv, DA_Def); + buff.speed += skin_jlf_meta->GetAttrValue(skin_jlf.skin_lv, DA_Speed); } else if (skin_meta) { - buff.damage_add += skin_meta->i->atk_add(); - buff.def_add += skin_meta->i->def_add(); - buff.speed += skin_meta->i->speed_add(); + buff.damage_add += skin_meta->GetAttrValue(skin.skin_lv, DA_Atk); + buff.def_add += skin_meta->GetAttrValue(skin.skin_lv, DA_Def); + buff.speed += skin_meta->GetAttrValue(skin.skin_lv, DA_Speed); } } diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 17285c4..59f22c5 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -81,28 +81,49 @@ namespace MetaData void EquipUpgrade::Init() { - std::vector attr_type; - std::vector attr_value; + for (size_t j = 0; j < i->max_lv(); ++j) { + std::array& attrs = a8::FastAppend(level_attrs); + for (size_t k = 0; k < EA_End; ++k) { + attrs[k] = 0; + } + } { std::vector strings; a8::Split(i->attr_type(), strings, '|'); for (auto& str : strings) { - attr_type.push_back(a8::XValue(str).GetInt()); + std::vector strings2; + a8::Split(str, strings2, ':'); + if (strings2.size() != 3) { + abort(); + } + int attr_type = a8::XValue(strings2[0]); + int attr_level = a8::XValue(strings2[1]); + float attr_value = a8::XValue(strings2[2]).GetDouble(); + if (attr_type < EA_End) { + if (attr_level >= 0 && attr_level < i->max_lv()) { + for (size_t j = 1; j < i->max_lv(); ++j) { + if (j % attr_type == 0) { + level_attrs[j][attr_type] = attr_value; + } + } + } + } } } - { - std::vector strings; - a8::Split(i->attr_value(), strings, '|'); - for (auto& str : strings) { - attr_value.push_back(a8::XValue(str).GetDouble()); - } + } + + float EquipUpgrade::GetAttrValue(int level, int attr_type) + { + if (level < 1) { + return 0; } - assert(attr_type.size() == attr_value.size()); - for (size_t i = 0; i < attr_type.size(); ++i) { - if (attr_type[i] < EA_End) { - attr[attr_type[i]] = attr_value[i]; - } + if (level > level_attrs.size()) { + return 0; } + if (attr_type < EA_End) { + return level_attrs[level][attr_type]; + } + return 0; } void Player::Init() @@ -345,4 +366,51 @@ namespace MetaData last_time = a8::XValue(i->last_time()).GetInt(); } + void Dress::Init() + { + for (size_t j = 0; j < i->max_lv(); ++j) { + std::array& attrs = a8::FastAppend(level_attrs); + for (size_t k = 0; k < DA_End; ++k) { + attrs[k] = 0; + } + } + { + std::vector strings; + a8::Split(i->attr_type(), strings, '|'); + for (auto& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + if (strings2.size() != 3) { + abort(); + } + int attr_type = a8::XValue(strings2[0]); + int attr_level = a8::XValue(strings2[1]); + float attr_value = a8::XValue(strings2[2]).GetDouble(); + if (attr_type < DA_End) { + if (attr_level >= 0 && attr_level < i->max_lv()) { + for (size_t j = 1; j < i->max_lv(); ++j) { + if (j % attr_type == 0) { + level_attrs[j][attr_type] = attr_value; + } + } + } + } + } + } + } + + float Dress::GetAttrValue(int level, int attr_type) + { + if (level < 1) { + return 0; + } + if (level > level_attrs.size()) { + return 0; + } + if (attr_type < DA_End) { + return level_attrs[level][attr_type]; + } + return 0; + } + } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 388fbd0..4b806b0 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -56,8 +56,11 @@ namespace MetaData { const metatable::EquipUpgrade* i = nullptr; - std::array attr = {}; void Init(); + float GetAttrValue(int level, int attr_type); + + private: + std::vector> level_attrs; }; struct Player @@ -149,7 +152,13 @@ namespace MetaData struct Dress { const metatable::Dress* i = nullptr; - }; + + void Init(); + float GetAttrValue(int level, int attr_type); + + private: + std::vector> level_attrs; + }; struct RankReward { diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index d24e0bc..71bc3a3 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -58,11 +58,11 @@ public: std::map drop_hash; std::map> maptpl_meta_hash; std::map> maptpl_hash; - std::map dress_hash; + std::map dress_hash; std::map skill_hash; std::map rankreward_hash; std::map killreward_hash; - std::map equipupgrade_hash; + std::map equipupgrade_hash; std::map robot_hash; void Load() @@ -232,15 +232,7 @@ private: for (auto& meta : dress_meta_list) { MetaData::Dress& item = a8::FastAppend(dress_list); item.i = &meta; - dress_hash[a8::MakeInt64(item.i->id(), - item.i->level() - )] = &item; - } - for (auto& meta : dress_meta_list) { - MetaData::Dress* dress_meta = MetaMgr::Instance()->GetDress(meta.id(), 1); - if (dress_meta) { - meta.set_skill_id(dress_meta->i->skill_id()); - } + dress_hash[item.i->id()] = &item; } for (auto& meta : skill_meta_list) { @@ -265,7 +257,7 @@ private: for (auto& meta : equipupgrade_meta_list) { MetaData::EquipUpgrade& item = a8::FastAppend(equipupgrade_list); item.i = &meta; - equipupgrade_hash[a8::MakeInt64(meta.id(), meta.level())] = &item; + equipupgrade_hash[meta.id()] = &item; } for (auto& meta : robot_meta_list) { @@ -350,9 +342,9 @@ MetaData::Equip* MetaMgr::GetEquipBySlotId(int slot_id) return itr != loader_->equip_slot_hash.end() ? itr->second : nullptr; } -MetaData::EquipUpgrade* MetaMgr::GetEquipUpgrade(int equip_id, int equip_lv) +MetaData::EquipUpgrade* MetaMgr::GetEquipUpgrade(int equip_id) { - auto itr = loader_->equipupgrade_hash.find(a8::MakeInt64(equip_id, equip_lv)); + auto itr = loader_->equipupgrade_hash.find(equip_id); return itr != loader_->equipupgrade_hash.end() ? itr->second : nullptr; } @@ -399,9 +391,9 @@ MetaData::Skill* MetaMgr::GetSkill(int skill_id) return itr != loader_->skill_hash.end() ? itr->second : nullptr; } -MetaData::Dress* MetaMgr::GetDress(int dress_id, int level) +MetaData::Dress* MetaMgr::GetDress(int dress_id) { - auto itr = loader_->dress_hash.find(a8::MakeInt64(dress_id, level)); + auto itr = loader_->dress_hash.find(dress_id); return itr != loader_->dress_hash.end() ? itr->second : nullptr; } diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index f8dcc12..9b3955b 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -24,7 +24,7 @@ class MetaMgr : public a8::Singleton MetaData::Player* GetPlayer(int id); MetaData::Equip* GetEquip(int id); MetaData::Equip* GetEquipBySlotId(int slot_id); - MetaData::EquipUpgrade* GetEquipUpgrade(int equip_id, int equip_lv); + MetaData::EquipUpgrade* GetEquipUpgrade(int equip_id); MetaData::Building* GetBuilding(int building_id); MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); @@ -32,7 +32,7 @@ class MetaMgr : public a8::Singleton std::list& GetAirDrops(); MetaData::AirLine* RandAirLine(); MetaData::Skill* GetSkill(int skill_id); - MetaData::Dress* GetDress(int dress_id, int level); + MetaData::Dress* GetDress(int dress_id); float GetRankRewardParam(int rank); float GetKillRewardParam(int kill_num); std::vector* GetRobotList(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 01e3f13..d95c387 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -32,7 +32,7 @@ void Player::Initialize() Human::Initialize(); health = meta->i->health(); max_energy_shield = energy_shield; - skin_meta = MetaMgr::Instance()->GetDress(SkinId(), SkinLv()); + skin_meta = MetaMgr::Instance()->GetDress(SkinId()); if (skin_meta) { skill_meta = MetaMgr::Instance()->GetSkill(skin_meta->i->skill_id()); } else { @@ -341,7 +341,7 @@ void Player::Shot() if (curr_weapon->meta->i->bullet_angle() >= 0.01f) { int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000; if (curr_weapon->upgrade_meta) { - angle -= curr_weapon->upgrade_meta->attr[EA_BulletAngle] * 1000; + angle -= curr_weapon->upgrade_meta->GetAttrValue(curr_weapon->weapon_lv, EA_BulletAngle) * 1000; } if (angle > 0) { bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); @@ -552,7 +552,7 @@ void Player::LootInteraction(Loot* entity) } skin_jlf.skin_id = entity->item_id; skin_jlf.skin_lv = std::max(1, GetSkinConfigLv(skin_jlf.skin_id)); - skin_jlf_meta = MetaMgr::Instance()->GetDress(skin_jlf.skin_id, skin_jlf.skin_lv); + skin_jlf_meta = MetaMgr::Instance()->GetDress(skin_jlf.skin_id); if (skin_jlf_meta) { skill_meta = MetaMgr::Instance()->GetSkill(skin_jlf_meta->i->skill_id()); } else { diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc index c603101..9bca8ed 100644 --- a/server/gameserver/types.cc +++ b/server/gameserver/types.cc @@ -13,15 +13,13 @@ void Weapon::ToPB(cs::MFWeapon* pb_obj) void Weapon::Recalc() { - upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_id, - weapon_lv); - + upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_id); } int Weapon::GetClipVolume() { if (upgrade_meta) { - return meta->i->clip_volume() + upgrade_meta->attr[EA_Volume]; + return meta->i->clip_volume() + upgrade_meta->GetAttrValue(weapon_lv, EA_Volume); } else { return meta->i->clip_volume(); } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index c316917..0b560ba 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -85,10 +85,8 @@ message Equip message EquipUpgrade { optional int32 id = 1; - optional int32 level = 2; - optional int32 next_level = 3; optional string attr_type = 4; - optional string attr_value = 5; + optional int32 max_lv = 5; } message Player @@ -157,9 +155,8 @@ message Dress optional int32 id = 1; optional int32 level = 2; optional int32 skill_id = 3; - optional int32 atk_add = 10; - optional int32 def_add = 11; - optional int32 speed_add = 12; + optional string attr_type = 4; + optional int32 max_lv = 5; } message RankReward