完成伤害公式

This commit is contained in:
aozhiwei 2022-05-25 10:50:54 +08:00
parent 411041a792
commit 143882b2a6
11 changed files with 87 additions and 17 deletions

View File

@ -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);
}
}

View File

@ -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();
}

View File

@ -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);

View File

@ -260,13 +260,3 @@ float Entity::GetBaseDef()
{
return 0;
}
float Entity::GetTotalAtk()
{
return 0;
}
float Entity::GetTotalDef()
{
return 0;
}

View File

@ -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);

View File

@ -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();
}

View File

@ -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;

View File

@ -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();
}

View File

@ -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);

View File

@ -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);

View File

@ -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