This commit is contained in:
aozhiwei 2019-06-19 16:33:42 +08:00
parent 30daad3228
commit 09bcbe9142
11 changed files with 131 additions and 58 deletions

View File

@ -207,8 +207,8 @@ void Bullet::RayDetectionUpdate()
}//end for }//end for
movement->GetCollisionObjects(objects); movement->GetCollisionObjects(objects);
float bullet_range = gun_meta->i->range(); float bullet_range = gun_meta->i->range();
if (gun_upgrade_meta && gun_upgrade_meta->attr[EA_ShotRange] > 0) { if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange) > 0) {
bullet_range += gun_upgrade_meta->attr[EA_ShotRange]; bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange);
} }
if (!objects.empty() || distance > bullet_range || distance >= movement->target_distance || if (!objects.empty() || distance > bullet_range || distance >= movement->target_distance ||
(IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance)
@ -270,8 +270,8 @@ void Bullet::MapServiceUpdate()
} }
#endif #endif
float bullet_range = gun_meta->i->range(); float bullet_range = gun_meta->i->range();
if (gun_upgrade_meta && gun_upgrade_meta->attr[EA_ShotRange] > 0) { if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange) > 0) {
bullet_range += gun_upgrade_meta->attr[EA_ShotRange]; bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange);
} }
if (!objects.empty() || distance > bullet_range || if (!objects.empty() || distance > bullet_range ||
(IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance)

View File

@ -16,6 +16,7 @@ class MovementComponent;
class Bullet : public Entity class Bullet : public Entity
{ {
public: public:
int gun_lv = 0;
MetaData::Equip* gun_meta = nullptr; MetaData::Equip* gun_meta = nullptr;
MetaData::EquipUpgrade* gun_upgrade_meta = nullptr; MetaData::EquipUpgrade* gun_upgrade_meta = nullptr;
MetaData::Equip* meta = nullptr; MetaData::Equip* meta = nullptr;

View File

@ -132,6 +132,14 @@ enum EquipAttr_e
EA_End 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_NAME_FMT = "game%d_gameserver";
const char* const PROJ_ROOT_FMT = "/data/logs/%s"; const char* const PROJ_ROOT_FMT = "/data/logs/%s";

View File

@ -226,7 +226,7 @@ void Human::Shot(Vector2D& target_dir)
if (curr_weapon->meta->i->bullet_angle() >= 0.10f) { if (curr_weapon->meta->i->bullet_angle() >= 0.10f) {
int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000; int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000;
if (curr_weapon->upgrade_meta) { 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) { if (angle > 0) {
bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1);
@ -1423,13 +1423,13 @@ void Human::RecalcBuff()
{ {
buff = HumanAbility(); buff = HumanAbility();
if (skin_jlf_meta) { if (skin_jlf_meta) {
buff.damage_add += skin_jlf_meta->i->atk_add(); buff.damage_add += skin_jlf_meta->GetAttrValue(skin_jlf.skin_lv, DA_Atk);
buff.def_add += skin_jlf_meta->i->def_add(); buff.def_add += skin_jlf_meta->GetAttrValue(skin_jlf.skin_lv, DA_Def);
buff.speed += skin_jlf_meta->i->speed_add(); buff.speed += skin_jlf_meta->GetAttrValue(skin_jlf.skin_lv, DA_Speed);
} else if (skin_meta) { } else if (skin_meta) {
buff.damage_add += skin_meta->i->atk_add(); buff.damage_add += skin_meta->GetAttrValue(skin.skin_lv, DA_Atk);
buff.def_add += skin_meta->i->def_add(); buff.def_add += skin_meta->GetAttrValue(skin.skin_lv, DA_Def);
buff.speed += skin_meta->i->speed_add(); buff.speed += skin_meta->GetAttrValue(skin.skin_lv, DA_Speed);
} }
} }

View File

@ -81,28 +81,49 @@ namespace MetaData
void EquipUpgrade::Init() void EquipUpgrade::Init()
{ {
std::vector<int> attr_type; for (size_t j = 0; j < i->max_lv(); ++j) {
std::vector<float> attr_value; std::array<float, EA_End>& attrs = a8::FastAppend(level_attrs);
for (size_t k = 0; k < EA_End; ++k) {
attrs[k] = 0;
}
}
{ {
std::vector<std::string> strings; std::vector<std::string> strings;
a8::Split(i->attr_type(), strings, '|'); a8::Split(i->attr_type(), strings, '|');
for (auto& str : strings) { for (auto& str : strings) {
attr_type.push_back(a8::XValue(str).GetInt()); std::vector<std::string> 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<std::string> strings;
a8::Split(i->attr_value(), strings, '|'); float EquipUpgrade::GetAttrValue(int level, int attr_type)
for (auto& str : strings) { {
attr_value.push_back(a8::XValue(str).GetDouble()); if (level < 1) {
} return 0;
} }
assert(attr_type.size() == attr_value.size()); if (level > level_attrs.size()) {
for (size_t i = 0; i < attr_type.size(); ++i) { return 0;
if (attr_type[i] < EA_End) {
attr[attr_type[i]] = attr_value[i];
}
} }
if (attr_type < EA_End) {
return level_attrs[level][attr_type];
}
return 0;
} }
void Player::Init() void Player::Init()
@ -345,4 +366,51 @@ namespace MetaData
last_time = a8::XValue(i->last_time()).GetInt(); last_time = a8::XValue(i->last_time()).GetInt();
} }
void Dress::Init()
{
for (size_t j = 0; j < i->max_lv(); ++j) {
std::array<float, DA_End>& attrs = a8::FastAppend(level_attrs);
for (size_t k = 0; k < DA_End; ++k) {
attrs[k] = 0;
}
}
{
std::vector<std::string> strings;
a8::Split(i->attr_type(), strings, '|');
for (auto& str : strings) {
std::vector<std::string> 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;
}
} }

View File

@ -56,8 +56,11 @@ namespace MetaData
{ {
const metatable::EquipUpgrade* i = nullptr; const metatable::EquipUpgrade* i = nullptr;
std::array<float, EA_End> attr = {};
void Init(); void Init();
float GetAttrValue(int level, int attr_type);
private:
std::vector<std::array<float, EA_End>> level_attrs;
}; };
struct Player struct Player
@ -149,7 +152,13 @@ namespace MetaData
struct Dress struct Dress
{ {
const metatable::Dress* i = nullptr; const metatable::Dress* i = nullptr;
};
void Init();
float GetAttrValue(int level, int attr_type);
private:
std::vector<std::array<float, DA_End>> level_attrs;
};
struct RankReward struct RankReward
{ {

View File

@ -58,11 +58,11 @@ public:
std::map<int, MetaData::Drop*> drop_hash; std::map<int, MetaData::Drop*> drop_hash;
std::map<std::string, std::list<metatable::MapTplThingJson>> maptpl_meta_hash; std::map<std::string, std::list<metatable::MapTplThingJson>> maptpl_meta_hash;
std::map<std::string, std::vector<MetaData::MapTplThing>> maptpl_hash; std::map<std::string, std::vector<MetaData::MapTplThing>> maptpl_hash;
std::map<long long, MetaData::Dress*> dress_hash; std::map<int, MetaData::Dress*> dress_hash;
std::map<int, MetaData::Skill*> skill_hash; std::map<int, MetaData::Skill*> skill_hash;
std::map<int, MetaData::RankReward*> rankreward_hash; std::map<int, MetaData::RankReward*> rankreward_hash;
std::map<int, MetaData::KillReward*> killreward_hash; std::map<int, MetaData::KillReward*> killreward_hash;
std::map<long long, MetaData::EquipUpgrade*> equipupgrade_hash; std::map<int, MetaData::EquipUpgrade*> equipupgrade_hash;
std::map<int, MetaData::Robot*> robot_hash; std::map<int, MetaData::Robot*> robot_hash;
void Load() void Load()
@ -232,15 +232,7 @@ private:
for (auto& meta : dress_meta_list) { for (auto& meta : dress_meta_list) {
MetaData::Dress& item = a8::FastAppend(dress_list); MetaData::Dress& item = a8::FastAppend(dress_list);
item.i = &meta; item.i = &meta;
dress_hash[a8::MakeInt64(item.i->id(), dress_hash[item.i->id()] = &item;
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());
}
} }
for (auto& meta : skill_meta_list) { for (auto& meta : skill_meta_list) {
@ -265,7 +257,7 @@ private:
for (auto& meta : equipupgrade_meta_list) { for (auto& meta : equipupgrade_meta_list) {
MetaData::EquipUpgrade& item = a8::FastAppend(equipupgrade_list); MetaData::EquipUpgrade& item = a8::FastAppend(equipupgrade_list);
item.i = &meta; item.i = &meta;
equipupgrade_hash[a8::MakeInt64(meta.id(), meta.level())] = &item; equipupgrade_hash[meta.id()] = &item;
} }
for (auto& meta : robot_meta_list) { 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; 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; 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; 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; return itr != loader_->dress_hash.end() ? itr->second : nullptr;
} }

View File

@ -24,7 +24,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
MetaData::Player* GetPlayer(int id); MetaData::Player* GetPlayer(int id);
MetaData::Equip* GetEquip(int id); MetaData::Equip* GetEquip(int id);
MetaData::Equip* GetEquipBySlotId(int slot_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::Building* GetBuilding(int building_id);
MetaData::Drop* GetDrop(int drop_id); MetaData::Drop* GetDrop(int drop_id);
MetaData::SafeArea* GetSafeArea(int area_id); MetaData::SafeArea* GetSafeArea(int area_id);
@ -32,7 +32,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
std::list<MetaData::AirDrop>& GetAirDrops(); std::list<MetaData::AirDrop>& GetAirDrops();
MetaData::AirLine* RandAirLine(); MetaData::AirLine* RandAirLine();
MetaData::Skill* GetSkill(int skill_id); 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 GetRankRewardParam(int rank);
float GetKillRewardParam(int kill_num); float GetKillRewardParam(int kill_num);
std::vector<MetaData::Robot>* GetRobotList(); std::vector<MetaData::Robot>* GetRobotList();

View File

@ -32,7 +32,7 @@ void Player::Initialize()
Human::Initialize(); Human::Initialize();
health = meta->i->health(); health = meta->i->health();
max_energy_shield = energy_shield; max_energy_shield = energy_shield;
skin_meta = MetaMgr::Instance()->GetDress(SkinId(), SkinLv()); skin_meta = MetaMgr::Instance()->GetDress(SkinId());
if (skin_meta) { if (skin_meta) {
skill_meta = MetaMgr::Instance()->GetSkill(skin_meta->i->skill_id()); skill_meta = MetaMgr::Instance()->GetSkill(skin_meta->i->skill_id());
} else { } else {
@ -341,7 +341,7 @@ void Player::Shot()
if (curr_weapon->meta->i->bullet_angle() >= 0.01f) { if (curr_weapon->meta->i->bullet_angle() >= 0.01f) {
int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000; int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000;
if (curr_weapon->upgrade_meta) { 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) { if (angle > 0) {
bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); 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_id = entity->item_id;
skin_jlf.skin_lv = std::max(1, GetSkinConfigLv(skin_jlf.skin_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) { if (skin_jlf_meta) {
skill_meta = MetaMgr::Instance()->GetSkill(skin_jlf_meta->i->skill_id()); skill_meta = MetaMgr::Instance()->GetSkill(skin_jlf_meta->i->skill_id());
} else { } else {

View File

@ -13,15 +13,13 @@ void Weapon::ToPB(cs::MFWeapon* pb_obj)
void Weapon::Recalc() void Weapon::Recalc()
{ {
upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_id, upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_id);
weapon_lv);
} }
int Weapon::GetClipVolume() int Weapon::GetClipVolume()
{ {
if (upgrade_meta) { 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 { } else {
return meta->i->clip_volume(); return meta->i->clip_volume();
} }

View File

@ -85,10 +85,8 @@ message Equip
message EquipUpgrade message EquipUpgrade
{ {
optional int32 id = 1; optional int32 id = 1;
optional int32 level = 2;
optional int32 next_level = 3;
optional string attr_type = 4; optional string attr_type = 4;
optional string attr_value = 5; optional int32 max_lv = 5;
} }
message Player message Player
@ -157,9 +155,8 @@ message Dress
optional int32 id = 1; optional int32 id = 1;
optional int32 level = 2; optional int32 level = 2;
optional int32 skill_id = 3; optional int32 skill_id = 3;
optional int32 atk_add = 10; optional string attr_type = 4;
optional int32 def_add = 11; optional int32 max_lv = 5;
optional int32 speed_add = 12;
} }
message RankReward message RankReward