From 143882b2a6c4c856c52b3562ed724bd0570ef409 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 25 May 2022 10:50:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BC=A4=E5=AE=B3=E5=85=AC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 1 + server/gameserver/car.cc | 20 +++++++++++++ server/gameserver/car.h | 2 ++ server/gameserver/entity.cc | 10 ------- server/gameserver/entity.h | 2 -- server/gameserver/hero.cc | 17 +++++++++++ server/gameserver/hero.h | 2 ++ server/gameserver/human.cc | 38 +++++++++++++++++++++---- server/gameserver/human.h | 2 ++ server/gameserver/obstacle.cc | 7 +++++ server/tools/protobuild/metatable.proto | 3 ++ 11 files changed, 87 insertions(+), 17 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 03117241..0202b0e0 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -709,5 +709,6 @@ void Bullet::CalcDmg(Entity* entity, } } finaly_dmg = atk * (1 + hero_atk_rate) * (1 - target_def_rate); + finaly_dmg = std::max(finaly_dmg, 0.0f); } } diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index f9107d06..0274721b 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -293,11 +293,21 @@ float Car::GetSpeed() void Car::OnBulletHit(Bullet* bullet) { if (!IsDead(room)) { +#ifdef NEWGS + 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 +#else float dmg = bullet->GetAtk() + bullet->gun_meta->i->atk_mech(); 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); +#endif if (bullet->meta->buff_meta) { MustBeAddBuff(bullet->sender.Get(), bullet->meta->i->buffid()); } @@ -543,3 +553,13 @@ void Car::OnKillTarget(Creature* target) } } } + +float Car::GetBaseAtk() +{ + return hero_meta_->i->damage(); +} + +float Car::GetBaseDef() +{ + return hero_meta_->i->defence(); +} diff --git a/server/gameserver/car.h b/server/gameserver/car.h index 652eba7f..274d4e96 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -30,6 +30,8 @@ class Car : public Creature virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual void GetHitAabbBox(AabbCollider& aabb_box) override; virtual std::string GetName() override; + virtual float GetBaseAtk() override; + virtual float GetBaseDef() override; bool IsDriver(Human* hum) { return driver_ == hum && driver_; } Human* GetPassengerBySeat(int seat); diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index 20e43504..69f290fb 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -260,13 +260,3 @@ float Entity::GetBaseDef() { return 0; } - -float Entity::GetTotalAtk() -{ - return 0; -} - -float Entity::GetTotalDef() -{ - return 0; -} diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 1079514a..9563d54a 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -82,8 +82,6 @@ class Entity bool CanClientCache(Human* hum); virtual float GetBaseAtk(); virtual float GetBaseDef(); - virtual float GetTotalAtk(); - virtual float GetTotalDef(); protected: void AddClientCache(Human* hum); diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 84679ca9..2f178cec 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -128,11 +128,18 @@ void Hero::OnBulletHit(Bullet* bullet) RemoveBuffByEffectId(kBET_PeaceMode); if (!IsDead(room) && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { +#ifdef NEWGS + float finaly_dmg = 0; + float atk_rate = 0; + float def_rate = 0; + bullet->CalcDmg(this, finaly_dmg, atk_rate, def_rate); +#else float dmg = bullet->GetAtk(); 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); +#endif if (bullet->sender.Get()->IsHuman()) { bullet->sender.Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; } @@ -395,3 +402,13 @@ void Hero::DropItems(Obstacle* obstacle) } room->ScatterDrop(obstacle->GetPos(), drop_id); } + +float Hero::GetBaseAtk() +{ + return meta->i->damage(); +} + +float Hero::GetBaseDef() +{ + return meta->i->defence(); +} diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index 03519b43..e84a885a 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -32,6 +32,8 @@ public: virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override; virtual std::string GetName() override; virtual void DropItems(Obstacle* obstacle) override; + virtual float GetBaseAtk() override; + virtual float GetBaseDef() override; virtual float GetSpeed() override; virtual float GetRadius() override; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 206cada7..c4c2db20 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3284,17 +3284,18 @@ void Human::OnBulletHit(Bullet* bullet) if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { float old_hp = GetHP(); float old_max_hp = GetMaxHP(); - #ifdef NEWGS - float def = 0; +#ifdef NEWGS float finaly_dmg = 0; - //bullet->CalcDmg(this, finaly_dmg, def); - #else + float atk_rate = 0; + float def_rate = 0; + bullet->CalcDmg(this, finaly_dmg, atk_rate, def_rate); +#else float dmg = bullet->GetAtk(); 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); - #endif +#endif if (bullet->sender.Get()->IsHuman()) { bullet->sender.Get()->AsHuman()->stats.damage_amount_out += finaly_dmg; } @@ -3321,6 +3322,22 @@ void Human::OnBulletHit(Bullet* bullet) } } #ifdef DEBUG +#ifdef NEWGS + bullet->sender.Get()->SendDebugMsg + (a8::Format("bullet uniid:%d weapon_id:%d atk:%f atk_rate:%f def_rate:%f finaly_dmg:%f old_hp:%f old_maxhp:%f cur_hp:%f", + { + bullet->GetUniId(), + bullet->gun_meta->i->id(), + bullet->GetAtk(), + atk_rate, + def_rate, + finaly_dmg, + old_hp, + old_max_hp, + GetHP() + }) + ); +#else bullet->sender.Get()->SendDebugMsg (a8::Format("bullet uniid:%d weapon_id:%d atk:%f def:%f finaly_dmg:%f old_hp:%f old_maxhp:%f cur_hp:%f", { @@ -3334,6 +3351,7 @@ void Human::OnBulletHit(Bullet* bullet) GetHP() }) ); +#endif #endif } } @@ -4039,3 +4057,13 @@ void Human::DecOxygen(int val) oxygen_ -= val; oxygen_ = std::max(0, oxygen_); } + +float Human::GetBaseAtk() +{ + return meta->i->damage(); +} + +float Human::GetBaseDef() +{ + return meta->i->defence(); +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 7411497e..50d01c1f 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -337,6 +337,8 @@ class Human : public Creature void SetOxygen(int oxygen) { oxygen_ = oxygen; }; void AddOxygen(int val); void DecOxygen(int val); + virtual float GetBaseAtk() override; + virtual float GetBaseDef() override; protected: void _InternalUpdateMove(float speed); diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index adc17c88..ddcb4f6f 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -504,9 +504,16 @@ void Obstacle::OnBulletHit(Bullet* bullet) } } } +#ifdef NEWGS + float finaly_dmg = 0; + float atk_rate = 0; + float def_rate = 0; + bullet->CalcDmg(this, finaly_dmg, atk_rate, def_rate); +#else float dmg = bullet->GetAtk(); float def = 0; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); +#endif SetHealth(bullet->room, std::max(0.0f, GetHealth(bullet->room) - finaly_dmg)); if (GetHealth(bullet->room) <= 0.01f) { Die(bullet->room); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index eceba14a..c3a1db0d 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -237,6 +237,9 @@ message Player optional int32 delay_remove = 47; optional int32 skinlist = 48; optional string pre_appear_effect = 50; + + optional int32 damage = 51; + optional int32 defence = 52; } message Robot