diff --git a/server/gameserver/battledatacontext.cc b/server/gameserver/battledatacontext.cc index 4c04430d..8cd5f810 100644 --- a/server/gameserver/battledatacontext.cc +++ b/server/gameserver/battledatacontext.cc @@ -16,8 +16,6 @@ class HeroAbility public: long long hero_uniid_ = 0; MetaData::Player* hero_meta = nullptr; - std::array attr_abs_ = {}; - std::array attr_rate_ = {}; float GetAtk() { @@ -56,8 +54,6 @@ class WeaponAbility public: long long weapon_uniid = 0; MetaData::Equip* weapon_meta = nullptr; - std::array attr_abs_ = {}; - std::array attr_rate_ = {}; float GetAtk() { @@ -65,22 +61,6 @@ public: } }; -float* GetAttrAbsPtr(std::array& attr, int attr_id) -{ - if (!IsValidHumanAttr(attr_id)) { - return nullptr; - } - return &attr[attr_id]; -} - -float* GetAttrRatePtr(std::array& attr, int attr_id) -{ - if (!IsValidHumanAttr(attr_id)) { - return nullptr; - } - return &attr[attr_id]; -} - BattleDataContext::BattleDataContext() { hero_ability_ = std::make_shared(); @@ -89,18 +69,6 @@ BattleDataContext::BattleDataContext() void BattleDataContext::Clear() { - if (hero_ability_) { - hero_ability_->attr_abs_ = {}; - hero_ability_->attr_rate_ = {}; - } - if (weapon1_ability_) { - weapon1_ability_->attr_abs_ = {}; - weapon1_ability_->attr_rate_ = {}; - } - if (weapon2_ability_) { - weapon2_ability_->attr_abs_ = {}; - weapon2_ability_->attr_rate_ = {}; - } } void BattleDataContext::ParseResult(a8::XObject& obj) @@ -116,11 +84,6 @@ void BattleDataContext::ParseResult(a8::XObject& obj) if (meta) { hero_ability_->hero_meta = meta; } - if (hero_dto->HasKey("attr") && hero_dto->IsArray()) { - ApplyAttr(hero_ability_->attr_abs_, - hero_ability_->attr_rate_, - hero_dto->At("attr")); - } } if (obj.HasKey("weapon_dto1") && obj.At("weapon_dto1")->IsObject()) { weapon_dto1 = obj.At("weapon_dto1"); @@ -129,11 +92,6 @@ void BattleDataContext::ParseResult(a8::XObject& obj) weapon1_ability_ = std::make_shared(); weapon1_ability_->weapon_uniid = weapon_dto1->Get("gun_uniid", 0); weapon1_ability_->weapon_meta = meta; - if (weapon_dto1->HasKey("attr") && weapon_dto1->IsArray()) { - ApplyAttr(weapon1_ability_->attr_abs_, - weapon1_ability_->attr_rate_, - weapon_dto1->At("attr")); - } } } if (obj.HasKey("weapon_dto2") && obj.At("weapon_dto2")->IsObject()) { @@ -143,88 +101,6 @@ void BattleDataContext::ParseResult(a8::XObject& obj) weapon2_ability_ = std::make_shared(); weapon2_ability_->weapon_uniid = weapon_dto2->Get("gun_uniid", 0); weapon1_ability_->weapon_meta = meta; - if (weapon_dto2->HasKey("attr") && weapon_dto2->IsArray()) { - ApplyAttr(weapon2_ability_->attr_abs_, - weapon2_ability_->attr_rate_, - weapon_dto2->At("attr")); - } - } - } -} - -float BattleDataContext::GetHeroAttrAbs(long long hero_uniid, int attr_id) -{ - if (hero_uniid && hero_uniid == hero_ability_->hero_uniid_) { - if (IsValidHumanAttr(attr_id)) { - return hero_ability_->attr_abs_[attr_id]; - } - } - return 0; -} - -float BattleDataContext::GetHeroAttrRate(long long hero_uniid, int attr_id) -{ - if (hero_uniid && hero_uniid == hero_ability_->hero_uniid_) { - if (IsValidHumanAttr(attr_id)) { - return hero_ability_->attr_rate_[attr_id]/ 100.0f; - } - } - return 0; -} - -float BattleDataContext::GetWeaponAttrAbs(long long weapon_uniid, int attr_id) -{ - if (!weapon_uniid) { - return 0; - } - if (IsValidHumanAttr(attr_id)) { - if (weapon1_ability_ && weapon_uniid == weapon1_ability_->weapon_uniid) { - return weapon1_ability_->attr_abs_[attr_id]; - } else if (weapon2_ability_ && weapon_uniid == weapon2_ability_->weapon_uniid) { - return weapon2_ability_->attr_abs_[attr_id]; - } - } - return 0; -} - -float BattleDataContext::GetWeaponAttrRate(long long weapon_uniid, int attr_id) -{ - if (!weapon_uniid) { - return 0; - } - if (IsValidHumanAttr(attr_id)) { - if (weapon1_ability_ && weapon_uniid == weapon1_ability_->weapon_uniid) { - return weapon1_ability_->attr_rate_[attr_id]; - } else if (weapon2_ability_ && weapon_uniid == weapon2_ability_->weapon_uniid) { - return weapon2_ability_->attr_rate_[attr_id]; - } - } - return 0; -} - -void BattleDataContext::ApplyAttr(std::array& attr_abs, - std::array& attr_rate, - std::shared_ptr obj) -{ - if (obj->IsArray()) { - for (int i = 0; i < obj->Size(); ++i) { - std::shared_ptr obj = obj->At(i); - if (obj->IsObject()) { - int attr_id = obj->Get("attr_id", 0); - int type = obj->Get("type", 0); - int val = obj->Get("val", 0); - if (type == 1) { - float* p = GetAttrAbsPtr(attr_abs, attr_id); - if (p) { - *p = val; - } - } else if (type == 2) { - float* p = GetAttrRatePtr(attr_rate, attr_id); - if (p) { - *p = val; - } - } - } } } } @@ -377,6 +253,11 @@ float BattleDataContext::CalcDmg(Obstacle* target, Bullet* bullet) return finaly_dmg; } +float BattleDataContext::CalcDmg(Explosion* e) +{ + +} + float BattleDataContext::GetTotalAtk(Bullet* bullet) { float total_atk = (GetHeroTotalAtk() / 100 + 1) * GetWeaponAtk(bullet); diff --git a/server/gameserver/battledatacontext.h b/server/gameserver/battledatacontext.h index 0748b95c..2ed23352 100644 --- a/server/gameserver/battledatacontext.h +++ b/server/gameserver/battledatacontext.h @@ -23,6 +23,7 @@ namespace MetaData class Creature; class Bullet; class Obstacle; +class Explosion; struct PlayerStats; class HeroAbility; class WeaponAbility; @@ -40,21 +41,17 @@ struct BattleDataContext std::shared_ptr weapon_dto2; BattleDataContext(); - float GetHeroAttrAbs(long long hero_uniid, int attr_id); - float GetHeroAttrRate(long long hero_uniid, int attr_id); void GetHeroLvQualit(int& hero_lv, int& quality); void GetWeaponLvQualit(int& weapon_lv, int& quality); - float GetWeaponAttrAbs(long long weapon_uniid, int attr_id); - float GetWeaponAttrRate(long long weapon_uniid, int attr_id); - void ParseResult(a8::XObject& obj); void CalcBattleStat(struct PlayerStats* stats); float CalcDmg(Creature* target, Bullet* bullet); float CalcDmg(Obstacle* target, Bullet* bullet); + float CalcDmg(Explosion* e); float GetDef(); @@ -68,10 +65,6 @@ struct BattleDataContext private: void Clear(); - void ApplyAttr(std::array& attr_abs, - std::array& attr_rate, - std::shared_ptr obj); - float GetTotalAtk(Bullet* bullet); float GetHeroTotalAtk(); float GetWeaponAtk(Bullet* bullet); diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 0c079484..d1628005 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -742,51 +742,6 @@ void Bullet::OnKillTarget(Entity* target) } } -void Bullet::CalcDmg(Entity* entity, - float& finaly_dmg, - float& hero_atk_rate, - float& target_def_rate) -{ - finaly_dmg = 0; - hero_atk_rate = 0; - target_def_rate = 0; - - if (sender.Get()->IsAndroid()) { - Android* android = (Android*)sender.Get(); - hero_atk_rate -= android->ai->GetAttackRate(); - } - hero_atk_rate += ability_->GetAttrRate(kHAT_Atk); - if (IsCurrWeapon()) { - hero_atk_rate += ability_->GetAttrRate(kHAT_WeaponDmg); - } - - { - float atk = gun_meta->i->atk(); - if (sender.Get()->GetBattleContext()) { - float gun_atk_add = sender.Get()->GetBattleContext()->GetWeaponAttrAbs(weapon_uniid, kHAT_Atk); - float hero_atk_add = sender.Get()->GetBattleContext()->GetHeroAttrAbs(sender.Get()->hero_uniid, kHAT_Atk); - float base_atk = sender.Get()->GetBaseAtk() + gun_meta->i->atk(); - if ((gun_atk_add + hero_atk_add) > 0.0001f && - base_atk > 0.0001f) { - hero_atk_rate += (gun_atk_add + hero_atk_add) / base_atk; - } - atk += gun_atk_add; - } - if (entity->IsCreature(room)) { - Creature* target = (Creature*)entity; - if (target->GetBattleContext()) { - float def_abs = target->GetBattleContext()->GetHeroAttrAbs(target->hero_uniid, kHAT_Def); - if (def_abs > 0.0001f && - target->GetBaseDef() > 0.0001f) { - target_def_rate += def_abs / target->GetBaseDef(); - } - } - } - finaly_dmg = atk * (1 + hero_atk_rate) * (1 - target_def_rate); - finaly_dmg = std::max(finaly_dmg, 0.0f); - } -} - void Bullet::OnStrengthen(Obstacle* ob) { diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 1aada2e7..b3086ec5 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -43,10 +43,6 @@ class Bullet : public MoveableEntity float GetExplosionRange(); bool IsCurrWeapon(); bool IsPreBattleBullet(); - void CalcDmg(Entity* entity, - float& finaly_dmg, - float& hero_atk_rate, - float& target_def_rate); protected: Bullet(); diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 6a7ec434..44df9b64 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -310,17 +310,7 @@ void Car::OnBulletHit(Bullet* bullet) { if (!IsDead(room)) { //超能电磁枪已删除 -#ifdef ATTR float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); -#else - float finaly_dmg = 0; - float atk_rate = 0; - float def_rate = 0; - bullet->CalcDmg(this, finaly_dmg, atk_rate, def_rate); -#if 1 - finaly_dmg += bullet->gun_meta->i->atk_mech(); -#endif -#endif if (bullet->meta->buff_meta) { MustBeAddBuff(bullet->sender.Get(), bullet->meta->i->buffid()); } @@ -351,20 +341,7 @@ void Car::OnExplosionHit(Explosion* e) HasBuffEffect(kBET_Fly)) { return; } - - float dmg = e->GetDmg(); - float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + - GetAbility()->GetAttrAbs(kHAT_Def); - float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); - finaly_dmg = std::max(finaly_dmg, 0.0f); -#ifdef DEBUG - { - room->BroadcastDebugMsg(a8::Format("explosion dmg:%d def:%d finaly_dmg:%d", - {dmg, - def, - finaly_dmg})); - } -#endif + float finaly_dmg = GetBattleContext()->CalcDmg(e); DecHP(finaly_dmg, VP_Explosion, "", diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 9242c558..b593ba0f 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -112,19 +112,7 @@ void Hero::OnExplosionHit(Explosion* e) } RemoveBuffByEffectId(kBET_PeaceMode); - float dmg = e->GetDmg(); - float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + - GetAbility()->GetAttrAbs(kHAT_Def); - float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); - finaly_dmg = std::max(finaly_dmg, 0.0f); -#ifdef DEBUG - { - room->BroadcastDebugMsg(a8::Format("explosion dmg:%d def:%d finaly_dmg:%d", - {dmg, - def, - finaly_dmg})); - } -#endif + float finaly_dmg = GetBattleContext()->CalcDmg(e); DecHP(finaly_dmg, VP_Explosion, "", @@ -143,14 +131,7 @@ void Hero::OnBulletHit(Bullet* bullet) RemoveBuffByEffectId(kBET_PeaceMode); if (!IsDead(room) && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { -#ifdef ATTR float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); -#else - float finaly_dmg = 0; - float atk_rate = 0; - float def_rate = 0; - bullet->CalcDmg(this, finaly_dmg, atk_rate, def_rate); -#endif if (bullet->sender.Get()->IsHuman()) { bullet->sender.Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index cc2c868c..bcd60e3f 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3527,16 +3527,7 @@ void Human::OnBulletHit(Bullet* bullet) RemoveBuffByEffectId(kBET_PeaceMode); if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { -#ifdef ATTR float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); -#else - float old_hp = GetHP(); - float old_max_hp = GetMaxHP(); - float finaly_dmg = 0; - float atk_rate = 0; - float def_rate = 0; - bullet->CalcDmg(this, finaly_dmg, atk_rate, def_rate); -#endif if (bullet->sender.Get()->IsHuman()) { bullet->sender.Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; } @@ -3585,19 +3576,7 @@ void Human::OnExplosionHit(Explosion* e) } RemoveBuffByEffectId(kBET_PeaceMode); - float dmg = e->GetDmg(); - float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + - GetAbility()->GetAttrAbs(kHAT_Def); - float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); - finaly_dmg = std::max(finaly_dmg, 0.0f); -#ifdef DEBUG - { - room->BroadcastDebugMsg(a8::Format("explosion dmg:%d def:%d finaly_dmg:%d", - {dmg, - def, - finaly_dmg})); - } -#endif + float finaly_dmg = GetBattleContext()->CalcDmg(e); DecHP(finaly_dmg, VP_Explosion, "", diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 9d8e3bdb..569d4aee 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -504,14 +504,7 @@ void Obstacle::OnBulletHit(Bullet* bullet) } } } -#ifdef ATTR float finaly_dmg = bullet->sender.Get()->GetBattleContext()->CalcDmg(this, bullet); -#else - float finaly_dmg = 0; - float atk_rate = 0; - float def_rate = 0; - bullet->CalcDmg(this, finaly_dmg, atk_rate, def_rate); -#endif SetHealth(bullet->room, std::max(0.0f, GetHealth(bullet->room) - finaly_dmg)); if (GetHealth(bullet->room) <= 0.01f) { Die(bullet->room);