From 057259ce1e520057ff1e9f5a9406c2086de64a27 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 16 Feb 2023 15:11:22 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/dive.cc | 4 +++- server/gameserver/buff/once_chg_attr.cc | 8 ++++++-- server/gameserver/buff/sprint.cc | 5 +++-- server/gameserver/car.cc | 13 +++++++++---- server/gameserver/car.h | 6 ++++-- server/gameserver/creature.cc | 4 +++- server/gameserver/creature.h | 6 ++++-- server/gameserver/hero.cc | 12 +++++++++--- server/gameserver/hero.h | 6 ++++-- server/gameserver/human.cc | 22 +++++++++++++++------- server/gameserver/human.h | 6 ++++-- server/gameserver/roomobstacle.cc | 5 +++-- server/gameserver/skill.cc | 8 ++++++-- server/gameserver/trigger.cc | 5 +++++ server/gameserver/trigger.h | 2 ++ 15 files changed, 80 insertions(+), 32 deletions(-) diff --git a/server/gameserver/buff/dive.cc b/server/gameserver/buff/dive.cc index bfd14261..f7df4c73 100644 --- a/server/gameserver/buff/dive.cc +++ b/server/gameserver/buff/dive.cc @@ -30,12 +30,14 @@ void DiveBuff::Activate() true); return; } + float dmg_out = 0.0f; hum->DecHP(mt::Param::s().dive_hp_consume, VP_Water, "water", 0, 0, - "water"); + "water", + dmg_out); } }, &xtimer_attacher diff --git a/server/gameserver/buff/once_chg_attr.cc b/server/gameserver/buff/once_chg_attr.cc index 85867a2c..83a037eb 100644 --- a/server/gameserver/buff/once_chg_attr.cc +++ b/server/gameserver/buff/once_chg_attr.cc @@ -36,13 +36,15 @@ void OnceChgAttrBuff::InternalProcOnceChgAttr() if (meta->_buff_param3 > 0) { owner->AddHp(meta->_buff_param3); } else if (meta->_buff_param3 < 0) { + float dmg_out = 0.0f; owner->over_delay_time = 100; owner->DecHP(std::abs(meta->_buff_param3), VP_Buff, "", meta->buff_id(), real_killer_id, - real_killer_name); + real_killer_name, + dmg_out); owner->over_delay_time = 0; } } else if (meta->_int_buff_param2 == 2) { @@ -51,13 +53,15 @@ void OnceChgAttrBuff::InternalProcOnceChgAttr() if (chg_hp > 0.0001f) { owner->AddHp(chg_hp); } else if (chg_hp < 0.0001f) { + float dmg_out = 0.0f; owner->over_delay_time = 100; owner->DecHP(std::abs(chg_hp), VP_Buff, "", meta->buff_id(), real_killer_id, - real_killer_name); + real_killer_name, + dmg_out); owner->over_delay_time = 0; } } diff --git a/server/gameserver/buff/sprint.cc b/server/gameserver/buff/sprint.cc index a565f6b1..8913ba90 100644 --- a/server/gameserver/buff/sprint.cc +++ b/server/gameserver/buff/sprint.cc @@ -148,14 +148,15 @@ void SprintBuff::OnEnemyHit(Creature* enemy) enemy, skill_meta); if (dmg > 0.0001f) { + float dmg_out = 0.0f; enemy->DecHP( dmg, owner->GetUniId(), owner->GetName(), 0, owner->GetUniId(), - owner->GetName() - ); + owner->GetName(), + dmg_out); } } break; diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 891b710e..63ea1305 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -284,13 +284,14 @@ void Car::OnBulletHit(IBullet* bullet) MustBeAddBuff(bullet->GetSender().Get(), bullet->GetBulletMeta()->buffid()); } if (!bullet->IsPreBattleBullet()) { + float dmg_out = 0.0f; DecHP(finaly_dmg, bullet->GetSender().Get()->GetUniId(), bullet->GetSender().Get()->GetName(), bullet->GetGunMeta()->id(), bullet->GetSender().Get()->GetUniId(), - bullet->GetSender().Get()->GetName() - ); + bullet->GetSender().Get()->GetName(), + dmg_out); } if (bullet->GetBulletMeta()->_buff_meta) { MustBeAddBuff(this, bullet->GetBulletMeta()->buffid()); @@ -320,18 +321,22 @@ void Car::OnExplosionHit(Explosion* e) real_killer_name = e->GetSender().Get()->GetName(); } + float dmg_out = 0.0f; float finaly_dmg = GetBattleContext()->CalcDmg(e); DecHP(finaly_dmg, VP_Explosion, "", e->GetExplosionEffect(), real_killer_id, - real_killer_name); + real_killer_name, + dmg_out); } void Car::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, - int real_killer_id, const std::string& real_killer_name) + int real_killer_id, const std::string& real_killer_name, + float& real_dmg_out) { + real_dmg_out = 0.0f; if (dec_hp < 0.001f) { return; } diff --git a/server/gameserver/car.h b/server/gameserver/car.h index c6f10a0a..e192302a 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -35,8 +35,10 @@ class Car : public Creature bool HasPassenter() { return !passengers_.empty();}; virtual float GetRadius() override; virtual float GetSpeed() override; - virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, - int real_killer_id, const std::string& real_killer_name) override; + virtual void DecHP(float dec_hp, + int killer_id, const std::string& killer_name, int weapon_id, + int real_killer_id, const std::string& real_killer_name, + float& real_dmg_out) override; virtual void SendDebugMsg(const std::string& debug_msg) override; virtual void SetAttackDir(const glm::vec3& attack_dir) override; virtual void DropItems(Obstacle* obstacle) override; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 868d39dd..8cbba1e1 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1154,9 +1154,11 @@ void Creature::UpdatePoisoning() } else { dmg = std::max(1.0f, dmg); } + float dmg_out = 0.0f; DecHP(dmg, VP_Gas, TEXT("battle_server_killer_gas", "毒圈"), VW_Gas, VP_Gas, - TEXT("battle_server_killer_gas", "毒圈")); + TEXT("battle_server_killer_gas", "毒圈"), + dmg_out); if (dead) { poisoning_time = 0; break; diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 7431e1dd..cf9b23f7 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -191,8 +191,10 @@ class Creature : public MoveableEntity Human* AsHuman() { return IsHuman() ? (Human*)this : nullptr; }; Player* AsPlayer() { return IsPlayer() ? (Player*)this : nullptr; }; Car* AsCar() { return IsCar() ? (Car*)this : nullptr; }; - virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, - int real_killer_id, const std::string& real_killer_name) {}; + virtual void DecHP(float dec_hp, int killer_id, + const std::string& killer_name, int weapon_id, + int real_killer_id, const std::string& real_killer_name, + float& real_dmg_out) {}; void AddHp(float hp); void SetHP(float hp); void SetMaxHP(float max_hp); diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index d5164cea..666cea6c 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -93,13 +93,15 @@ void Hero::OnExplosionHit(Explosion* e) } RemoveBuffByEffectId(kBET_PeaceMode); + float dmg_out = 0.0f; float finaly_dmg = GetBattleContext()->CalcDmg(e); DecHP(finaly_dmg, VP_Explosion, "", e->GetExplosionEffect(), real_killer_id, - real_killer_name); + real_killer_name, + dmg_out); } void Hero::OnBulletHit(IBullet* bullet) @@ -122,12 +124,14 @@ void Hero::OnBulletHit(IBullet* bullet) MustBeAddBuff(bullet->GetSender().Get(), bullet->GetBulletMeta()->buffid()); } if (!bullet->IsPreBattleBullet()) { + float dmg_out = 0.0f; DecHP(finaly_dmg, bullet->GetSender().Get()->GetUniId(), bullet->GetSender().Get()->GetName(), bullet->GetGunMeta()->id(), bullet->GetSender().Get()->GetUniId(), - bullet->GetSender().Get()->GetName()); + bullet->GetSender().Get()->GetName(), + dmg_out); } } } @@ -164,8 +168,10 @@ void Hero::DetachFromMaster() } void Hero::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, - int real_killer_id, const std::string& real_killer_name) + int real_killer_id, const std::string& real_killer_name, + float& real_dmg_out) { + real_dmg_out = 0.0f; if (!room->BattleStarted()) { return; } diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index dabba164..3d081d64 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -24,8 +24,10 @@ public: virtual void OnExplosionHit(Explosion* e) override; virtual void OnBulletHit(IBullet* bullet) override; virtual void Update(int delta_time) override; - virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, - int real_killer_id, const std::string& real_killer_name) override; + virtual void DecHP(float dec_hp, + int killer_id, const std::string& killer_name, int weapon_id, + int real_killer_id, const std::string& real_killer_name, + float& real_dmg_out) override; virtual std::string GetName() override; virtual void DropItems(Obstacle* obstacle) override; virtual const mt::Hero* GetHeroMeta() override { return meta; }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 72203a86..38696825 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -652,8 +652,10 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id, } void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, - int real_killer_id, const std::string& real_killer_name) + int real_killer_id, const std::string& real_killer_name, + float& real_dmg_out) { + real_dmg_out = 0.0f; if (!room->BattleStarted()) { return; } @@ -745,9 +747,11 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i info->real_killer_id, info->real_killer_name); return; } + float dmg_out = 0.0f; int dec_hp = mt::Param::GetIntParam("downed_dec_hp"); DecHP(dec_hp, info->killer_id, info->killer_name, info->weapon_id, - info->real_killer_id, info->real_killer_name); + info->real_killer_id, info->real_killer_name, + dmg_out); } }, &xtimer_attacher); @@ -2457,13 +2461,14 @@ void Human::OnBulletHit(IBullet* bullet) } if (bullet->GetSender().Get() && bullet->GetSender().Get()->IsCar() && bullet->GetPassenger().Get()) { if (!bullet->IsPreBattleBullet()) { + float dmg_out = 0.0f; DecHP(finaly_dmg, bullet->GetPassenger().Get()->GetUniId(), bullet->GetPassenger().Get()->GetName(), bullet->GetGunMeta()->id(), bullet->GetPassenger().Get()->GetUniId(), - bullet->GetPassenger().Get()->GetName() - ); + bullet->GetPassenger().Get()->GetName(), + dmg_out); } } else { if (!bullet->IsPreBattleBullet()) { @@ -2471,13 +2476,14 @@ void Human::OnBulletHit(IBullet* bullet) bullet->GetSender().Get()->AsHuman()->stats.IncWeaponDamageOut (bullet->GetGunMeta()->id(), finaly_dmg); } + float dmg_out = 0.0f; DecHP(finaly_dmg, bullet->GetSender().Get()->GetUniId(), bullet->GetSender().Get()->GetName(), bullet->GetGunMeta()->id(), bullet->GetSender().Get()->GetUniId(), - bullet->GetSender().Get()->GetName() - ); + bullet->GetSender().Get()->GetName(), + dmg_out); } } } @@ -2515,12 +2521,14 @@ void Human::OnExplosionHit(Explosion* e) #else if (e->GetSender().Get()) { #endif + float dmg_out = 0.0f; DecHP(finaly_dmg, VP_Explosion, "", e->GetExplosionEffect(), real_killer_id, - real_killer_name); + real_killer_name, + dmg_out); } } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 61377797..2961e2a7 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -299,8 +299,10 @@ class Human : public Creature void CarShot(const glm::vec3& target_dir); void BeKill(int killer_id, const std::string& killer_name, int weapon_id, int real_killer_id, const std::string& real_killer_name); - virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id, - int real_killer_id, const std::string& real_killer_name) override; + virtual void DecHP(float dec_hp, + int killer_id, const std::string& killer_name, int weapon_id, + int real_killer_id, const std::string& real_killer_name, + float& real_dmg_out) override; virtual void AddToNewObjects(Entity* entity) override; virtual void AddToPartObjects(Entity* entity) override; virtual void AddToImageObjects(Creature* c) override; diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index 67e329df..519cf636 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -859,13 +859,14 @@ void RoomObstacle::ActiveMedicalStation() float damage = SkillHelper::GetYlzDamage(master.Get(), c, skill_meta); + float dmg_out = 0.0f; c->DecHP(damage, master.Get()->GetUniId(), master.Get()->GetName(), VP_Buff, master.Get()->GetUniId(), - master.Get()->GetName() - ); + master.Get()->GetName(), + dmg_out); for (int buff_id : meta->_buff_list) { c->TryAddBuff(master.Get(), diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index f0e80a2c..68fc2ac9 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -456,12 +456,14 @@ void Skill::Proc30401MAO() return; } float dmg = SkillHelper::GetSwzbDmg(sender.Get(), skill_meta); + float dmg_out = 0.0f; c->DecHP(dmg, VP_Explosion, "", SkillHelper::GetSwzbEffect(skill_meta), sender.Get()->GetUniId(), - sender.Get()->GetName()); + sender.Get()->GetName(), + dmg_out); glm::vec3 dir = sender.Get()->GetAttackDir(); if (!GlmHelper::IsZero(dir)) { // 999 @@ -601,12 +603,14 @@ void Skill::Proc30501TZ() return; } float dmg = SkillHelper::GetCmxdDmg(sender.Get(), skill_meta); + float dmg_out = 0.0f; c->DecHP(dmg, VP_Explosion, "", SkillHelper::GetCmxdExplosion(skill_meta), sender.Get()->GetUniId(), - sender.Get()->GetName()); + sender.Get()->GetName(), + dmg_out); glm::vec3 dir = sender.Get()->GetAttackDir(); if (!GlmHelper::IsZero(dir)) { glm::vec3 target_pos = c->GetPos().ToGlmVec3() + diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 2212d47b..4a40a582 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -485,3 +485,8 @@ void Trigger::Attacked(Creature* sender) { DispatchEvent(kAttacked, {sender}); } + +void Trigger::DmgOut(Creature* target, float dmg) +{ + DispatchEvent(kDmgOutEvent, {target, dmg}); +} diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index 5aa50483..7408de43 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -34,6 +34,7 @@ enum EventId_e kSkillBulletPreCreateEvent, kUseSkillEvent, kTriggerBulletHitBuffEvent, + kDmgOutEvent, kAttacked }; @@ -72,6 +73,7 @@ public: void FlyHookDestory(); void BulletHitBuff(Bullet* bullet); void Attacked(Creature* sender); + void DmgOut(Creature* target, float dmg); std::weak_ptr AddListener(int event_id, a8::CommonCbProc cb); void RemoveEventHandler(std::weak_ptr handler_ptr);