diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 51a4c5e..f9cf011 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -62,10 +62,10 @@ void Bullet::OnHit(std::set& objects) (hum->team_id == 0 || player->team_id != hum->team_id)) { #endif #if 1 - float dmg = gun_meta->i->atk() * (1 + player->GetBuffAttrRate(kHAT_Atk)) + + float dmg = GetAtk() * (1 + player->GetBuffAttrRate(kHAT_Atk)) + player->GetBuffAttrAbs(kHAT_Atk); #else - float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add + player->atk_add); + float dmg = GetAtk() * (1 + player->buff.damage_add + player->atk_add); #endif #if 1 float def = hum->ability.def * (1 + hum->GetBuffAttrRate(kHAT_Def)) + @@ -92,10 +92,10 @@ void Bullet::OnHit(std::set& objects) Obstacle* obstacle = (Obstacle*)target; if (!obstacle->dead && obstacle->meta->i->attack_type() == 1) { #if 1 - float dmg = gun_meta->i->atk() * (1 + player->GetBuffAttrRate(kHAT_Atk)) + + float dmg = GetAtk() * (1 + player->GetBuffAttrRate(kHAT_Atk)) + player->GetBuffAttrAbs(kHAT_Atk); #else - float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add + player->atk_add); + float dmg = GetAtk() * (1 + player->buff.damage_add + player->atk_add); #endif float def = 0; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); @@ -254,3 +254,10 @@ void Bullet::MapServiceUpdate() } } } + + +float Bullet::GetAtk() +{ + return gun_meta->i->atk() + + (gun_upgrade_meta ? gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_Atk) : 0); +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index e5400b9..eb9768c 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -40,6 +40,7 @@ class Bullet : public Entity void ProcBomb(); bool IsBomb(); void MapServiceUpdate(); + float GetAtk(); private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index a53fd64..db7f0ee 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -73,7 +73,7 @@ void Human::Initialize() RecalcSelfCollider(); volume_ = meta->volume; observers_.insert(this); - ability.hp = meta->i->health(); + ability.hp = meta->i->health() + (spec_weapon.meta ? spec_weapon.GetAttrValue(kHAT_MaxHp) : 0); } float Human::GetSpeed() @@ -307,8 +307,8 @@ void Human::Shot(a8::Vec2& target_dir) float bullet_angle = std::get<2>(tuple); 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->GetAttrValue(curr_weapon->weapon_lv, kHAT_BulletAngle) * 1000; + if (curr_weapon->GetUpgradeMeta()) { + angle -= curr_weapon->GetAttrValue(kHAT_BulletAngle) * 1000; } if (angle > 0) { bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); @@ -395,8 +395,8 @@ void Human::TankShot(a8::Vec2& target_dir) float bullet_angle = std::get<2>(tuple); if (tank_weapon.meta->i->bullet_angle() >= 0.01f) { int angle = (int)tank_weapon.meta->i->bullet_angle() * 1000; - if (tank_weapon.upgrade_meta) { - angle -= tank_weapon.upgrade_meta->GetAttrValue(tank_weapon.weapon_lv, kHAT_BulletAngle) * 1000; + if (tank_weapon.GetUpgradeMeta()) { + angle -= tank_weapon.GetAttrValue(kHAT_BulletAngle) * 1000; } if (angle > 0) { bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index bc955f3..3391b83 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -82,7 +82,8 @@ namespace MetaData void EquipUpgrade::Init() { - for (int j = 0; j < i->max_lv(); ++j) { + const int MAX_LV = 20; + for (int j = 0; j < MAX_LV; ++j) { std::array& attrs = a8::FastAppend(level_attrs); for (size_t k = 0; k < kHAT_End; ++k) { attrs[k] = 0; @@ -91,24 +92,29 @@ namespace MetaData { std::vector strings; a8::Split(i->attr_type(), strings, '|'); + int level = 1; for (auto& str : strings) { - std::vector strings2; - a8::Split(str, strings2, ':'); - if (strings2.size() != 3) { - abort(); + if (str.empty()) { + continue; } - 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 < kHAT_End) { - if (attr_level >= 0 && attr_level < i->max_lv()) { - for (int j = 1; j < i->max_lv(); ++j) { - if (j % attr_level == 0) { - level_attrs[j][attr_type] = attr_value * (j / attr_level); - } - } + ++level; + std::vector strings2; + a8::Split(str, strings2, ';'); + for (auto& str2 : strings2) { + std::vector strings3; + a8::Split(str2, strings3, ':'); + if (strings3.size() != 2) { + abort(); + } + int attr_type = a8::XValue(strings3[0]); + int attr_value = a8::XValue(strings3[1]); + if (attr_type <= kHAT_End) { + level_attrs[level][attr_type] = attr_value; } } + }//end for strings + for (int i = level; i < MAX_LV; ++i) { + level_attrs[i] = level_attrs[level]; } } } @@ -121,7 +127,7 @@ namespace MetaData if (level > (int)level_attrs.size()) { return 0; } - if (attr_type < kHAT_End) { + if (attr_type <= kHAT_End) { return level_attrs[level][attr_type]; } return 0; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 9b745ac..b4ff4c1 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -165,7 +165,7 @@ void Player::UpdateShot() if (last_shot_frameno_ == 0 || ( (room->frame_no - last_shot_frameno_) * (1000 / SERVER_FRAME_RATE)) >= - p_weapon->meta->i->fire_rate() + p_weapon->GetAttrValue(kHAT_FireRate) ) { Shot(); } @@ -359,8 +359,8 @@ void Player::Shot() float bullet_angle = std::get<2>(tuple); 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->GetAttrValue(curr_weapon->weapon_lv, kHAT_BulletAngle) * 1000; + if (curr_weapon->GetUpgradeMeta()) { + angle -= curr_weapon->GetAttrValue(kHAT_BulletAngle) * 1000; } if (angle > 0) { bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); @@ -523,7 +523,11 @@ void Player::LootInteraction(Loot* entity) } else { weapons[0].weapon_idx = 0; weapons[0].weapon_id = entity->item_id; + #if 1 + weapons[0].weapon_lv = std::max(1, entity->item_level); + #else weapons[0].weapon_lv = std::max(1, GetWeaponConfigLv(weapons[0].weapon_id)); + #endif weapons[0].ammo = 0; weapons[0].meta = item_meta; weapons[0].Recalc(); @@ -554,7 +558,11 @@ void Player::LootInteraction(Loot* entity) return; } weapon->weapon_id = entity->item_id; + #if 1 + weapon->weapon_lv = std::max(1, entity->item_level); + #else weapon->weapon_lv = std::max(1, GetWeaponConfigLv(weapon->weapon_id)); + #endif weapon->ammo = 0; weapon->meta = item_meta; weapon->Recalc(); diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 77e6fcb..7ff4fc8 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -5,6 +5,7 @@ #include "cs_proto.pb.h" #include "ss_proto.pb.h" #include "room.h" +#include "metamgr.h" #include "framework/cpp/utils.h" @@ -73,10 +74,15 @@ Player* PlayerMgr::CreatePlayerByCMJoin(long ip_saddr, int socket, const cs::CMJ #endif for (auto& weapon : msg.weapons()) { if (weapon.weapon_id() != 0 && weapon.weapon_lv() > 0) { - hum->weapon_configs[weapon.weapon_id()] = weapon.weapon_lv(); - hum->spec_weapon.weapon_id = weapon.weapon_id(); - hum->spec_weapon.weapon_lv = weapon.weapon_lv(); - hum->spec_weapon.ammo = weapon.ammo(); + MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(weapon.weapon_id()); + if (equip_meta) { + hum->weapon_configs[weapon.weapon_id()] = weapon.weapon_lv(); + hum->spec_weapon.weapon_id = weapon.weapon_id(); + hum->spec_weapon.weapon_lv = weapon.weapon_lv(); + hum->spec_weapon.ammo = weapon.ammo(); + hum->spec_weapon.meta = equip_meta; + hum->spec_weapon.Recalc(); + } } } for (auto& weapon : msg.grow_weapons()) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index bdc207d..dfb4e17 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -549,7 +549,7 @@ void Room::CreateBullet(Human* hum, Weapon* weapon, bullet->player = hum; bullet->room = this; bullet->gun_meta = weapon->meta; - bullet->gun_upgrade_meta = weapon->upgrade_meta; + bullet->gun_upgrade_meta = weapon->GetUpgradeMeta(); bullet->meta = MetaMgr::Instance()->GetEquip(weapon->meta->i->use_bullet()); bullet->SetPos(pos); bullet->dir = dir; diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc index 1b039dd..13afca7 100644 --- a/server/gameserver/types.cc +++ b/server/gameserver/types.cc @@ -26,6 +26,41 @@ int Weapon::GetClipVolume() } } +float Weapon::GetAttrValue(HumanAttrType_e attr_type) +{ + if (!meta) { + return 0; + } + switch (attr_type) { + case kHAT_Atk: + { + return meta->i->atk() + + (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0); + } + break; + case kHAT_FireRate: + { + return meta->i->fire_rate() - + (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0); + } + break; + case kHAT_Volume: + { + return meta->i->clip_volume() + + (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0); + } + break; + case kHAT_MaxHp: + { + return 0 + + (upgrade_meta ? upgrade_meta->GetAttrValue(weapon_lv, attr_type) : 0); + } + break; + default: + return 0; + } +} + 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 f4a1956..e00a8dc 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -52,11 +52,15 @@ struct Weapon int weapon_lv = 0; int ammo = 0; MetaData::Equip* meta = nullptr; - MetaData::EquipUpgrade* upgrade_meta = nullptr; void ToPB(cs::MFWeapon* pb_obj); void Recalc(); int GetClipVolume(); + float GetAttrValue(HumanAttrType_e attr_type); + MetaData::EquipUpgrade* GetUpgradeMeta() { return upgrade_meta;} + +private: + MetaData::EquipUpgrade* upgrade_meta = nullptr; }; struct Skin diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 6e3560a..0773157 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -99,7 +99,6 @@ message EquipUpgrade { optional int32 id = 1; optional string attr_type = 4; - optional int32 max_lv = 5; } message Player