From 411041a792626b837470ba3f388545fce9673c06 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 25 May 2022 10:18:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=AD=90=E5=BC=B9=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 44 ++++++++++++++++++++++++++++++++++++ server/gameserver/bullet.h | 8 ++++--- server/gameserver/creature.h | 1 + server/gameserver/human.cc | 9 +------- server/gameserver/human.h | 1 - 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 3d5c8d68..03117241 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -667,3 +667,47 @@ 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); + } +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index ad19a93c..ebb1d39f 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -20,7 +20,7 @@ class Ability; class Bullet : public MoveableEntity { public: - std::string weapon_uniid; + long long weapon_uniid = 0; int gun_lv = 0; MetaData::Equip* gun_meta = nullptr; MetaData::EquipUpgrade* gun_upgrade_meta = nullptr; @@ -43,8 +43,10 @@ class Bullet : public MoveableEntity float GetExplosionRange(); bool IsCurrWeapon(); bool IsPreBattleBullet(); - /*void CalcDmg(Entity* entity, float& finaly_dmg, - );*/ + void CalcDmg(Entity* entity, + float& finaly_dmg, + float& hero_atk_rate, + float& target_def_rate); protected: Bullet(); diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index a2ba455d..af76af76 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -69,6 +69,7 @@ class Creature : public MoveableEntity { public: + long long hero_uniid = 0; std::vector weapons; long long last_shot_frameno_ = 0; int status = 0; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index d6594870..206cada7 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3287,14 +3287,7 @@ void Human::OnBulletHit(Bullet* bullet) #ifdef NEWGS float def = 0; float finaly_dmg = 0; - { - float base_atk = bullet->gun_meta->i->atk(); - float total_atk = bullet->GetAtk() + GetAttrAbs(kHAT_Atk); - float atk_rate = (total_atk - base_atk) / base_atk; - float base_def = 0; - float def_rate = (0)/base_def; - finaly_dmg = total_atk * (1 + atk_rate) * (1 - def_rate); - } + //bullet->CalcDmg(this, finaly_dmg, def); #else float dmg = bullet->GetAtk(); float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 5b0fa755..7411497e 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -136,7 +136,6 @@ class Human : public Creature int today_enter_times = 0; int account_registertime = 0; int channel = 0; - long long hero_uniid = 0; long long battle_uuid = 0; int is_valid_battle = 0; std::string payload;