From 1c53583e4fafc54f482f65d4a72774a04ebf0006 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 27 May 2020 11:19:57 +0800 Subject: [PATCH 1/3] 1 --- server/gameserver/human.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index e14f69a..cd7bada 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2074,8 +2074,8 @@ void Human::GenBattleReportData(a8::MutableXObject* params) MetaData::RankReward* rank_reward_meta = MetaMgr::Instance()->GetRankReward(rank); #ifdef DEBUG { - if (rank_reward_meta && rank_reward_meta->i->drop() > 0) { #else + if (rank_reward_meta && rank_reward_meta->i->drop() > 0) { #endif #ifdef DEBUG { From 5f3b8de6abf3e7562b24059d2528090fdbbe3461 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 27 May 2020 11:40:43 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 4 ++-- server/gameserver/constant.h | 5 +++++ server/gameserver/human.cc | 4 ++-- server/gameserver/metadata.cc | 16 ++++++++-------- server/gameserver/metadata.h | 4 ++-- server/gameserver/player.cc | 2 +- server/gameserver/types.cc | 3 ++- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 6591964..51a4c5e 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -236,8 +236,8 @@ void Bullet::MapServiceUpdate() } #endif float bullet_range = gun_meta->i->range(); - if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange) > 0) { - bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, EA_ShotRange); + if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_ShotRange) > 0) { + bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_ShotRange); } if (!objects.empty() || distance > bullet_range || (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 4ae46ca..3195191 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -145,6 +145,9 @@ enum HumanAttrType_e kHAT_ShotSpeed = 7, kHAT_ReloadSpeed = 8, kHAT_FireRate = 9, + kHAT_Volume = 10, + kHAT_MaxHp = 11, + kHAT_BulletAngle = 20, kHAT_End }; @@ -180,6 +183,7 @@ enum VirtualPlayer_e VP_Mine = 9000003, }; +#if 0 enum EquipAttr_e { EA_View = 1, //客户端用 @@ -192,6 +196,7 @@ enum EquipAttr_e EA_Speed = 8, EA_End }; +#endif enum EquipType_e { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index cd7bada..a53fd64 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -308,7 +308,7 @@ void Human::Shot(a8::Vec2& 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->GetAttrValue(curr_weapon->weapon_lv, EA_BulletAngle) * 1000; + angle -= curr_weapon->upgrade_meta->GetAttrValue(curr_weapon->weapon_lv, kHAT_BulletAngle) * 1000; } if (angle > 0) { bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); @@ -396,7 +396,7 @@ void Human::TankShot(a8::Vec2& target_dir) 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, EA_BulletAngle) * 1000; + angle -= tank_weapon.upgrade_meta->GetAttrValue(tank_weapon.weapon_lv, 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 9f78842..bc955f3 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -83,8 +83,8 @@ namespace MetaData void EquipUpgrade::Init() { for (int j = 0; j < i->max_lv(); ++j) { - std::array& attrs = a8::FastAppend(level_attrs); - for (size_t k = 0; k < EA_End; ++k) { + std::array& attrs = a8::FastAppend(level_attrs); + for (size_t k = 0; k < kHAT_End; ++k) { attrs[k] = 0; } } @@ -100,7 +100,7 @@ namespace MetaData 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_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) { @@ -121,7 +121,7 @@ namespace MetaData if (level > (int)level_attrs.size()) { return 0; } - if (attr_type < EA_End) { + if (attr_type < kHAT_End) { return level_attrs[level][attr_type]; } return 0; @@ -443,8 +443,8 @@ namespace MetaData void Dress::Init() { for (int j = 0; j < i->max_lv(); ++j) { - std::array& attrs = a8::FastAppend(level_attrs); - for (size_t k = 0; k < EA_End; ++k) { + std::array& attrs = a8::FastAppend(level_attrs); + for (size_t k = 0; k < kHAT_End; ++k) { attrs[k] = 0; } } @@ -460,7 +460,7 @@ namespace MetaData 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_type < kHAT_End) { if (attr_level >= 0 && attr_level < i->max_lv()) { for (int j = 1; j < i->max_lv(); ++j) { if (j % attr_type == 0) { @@ -481,7 +481,7 @@ namespace MetaData if (level > (int)level_attrs.size()) { return 0; } - if (attr_type < EA_End) { + if (attr_type < kHAT_End) { return level_attrs[level][attr_type]; } return 0; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 3195f5d..1667aa6 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -65,7 +65,7 @@ namespace MetaData float GetAttrValue(int level, int attr_type); private: - std::vector> level_attrs; + std::vector> level_attrs; }; struct Player @@ -190,7 +190,7 @@ namespace MetaData float GetAttrValue(int level, int attr_type); private: - std::vector> level_attrs; + std::vector> level_attrs; }; struct RankReward diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 0e8ca09..9b745ac 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -360,7 +360,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->GetAttrValue(curr_weapon->weapon_lv, EA_BulletAngle) * 1000; + angle -= curr_weapon->upgrade_meta->GetAttrValue(curr_weapon->weapon_lv, kHAT_BulletAngle) * 1000; } if (angle > 0) { bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1); diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc index 2d20546..1b039dd 100644 --- a/server/gameserver/types.cc +++ b/server/gameserver/types.cc @@ -19,7 +19,8 @@ void Weapon::Recalc() int Weapon::GetClipVolume() { if (upgrade_meta) { - return meta->i->clip_volume() + upgrade_meta->GetAttrValue(weapon_lv, EA_Volume); + return meta->i->clip_volume() + + upgrade_meta->GetAttrValue(weapon_lv, kHAT_Volume); } else { return meta->i->clip_volume(); } From f64e16d276570a94711d59e8d2e4e83c1e9e4b1c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 27 May 2020 15:21:01 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=AD=A6=E5=99=A8?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 15 +++++++--- server/gameserver/bullet.h | 1 + server/gameserver/human.cc | 10 +++---- server/gameserver/metadata.cc | 38 ++++++++++++++----------- server/gameserver/player.cc | 14 +++++++-- server/gameserver/playermgr.cc | 14 ++++++--- server/gameserver/room.cc | 2 +- server/gameserver/types.cc | 35 +++++++++++++++++++++++ server/gameserver/types.h | 6 +++- server/tools/protobuild/metatable.proto | 1 - 10 files changed, 101 insertions(+), 35 deletions(-) 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