From fe0f6bfc8548d1662b68808896f53082ec7f9488 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 9 Oct 2022 19:00:26 +0800 Subject: [PATCH] 1 --- server/gameserver/explosion.cc | 4 +++- server/gameserver/explosion.h | 5 +++- server/gameserver/skill.cc | 41 ++++++++++++++++++++++++++++++++ server/gameserver/skillhelper.cc | 17 +++++++++++-- server/gameserver/skillhelper.h | 4 +++- 5 files changed, 66 insertions(+), 5 deletions(-) diff --git a/server/gameserver/explosion.cc b/server/gameserver/explosion.cc index 16ef501a..59e7f528 100644 --- a/server/gameserver/explosion.cc +++ b/server/gameserver/explosion.cc @@ -124,7 +124,9 @@ void Explosion::ProcDamage() if (target->IsCreature(room_) && ((Creature*)target)->HasBuffEffect(kBET_BulletThrough)) { continue; } - target->OnExplosionHit(this); + if (!IsThrough()) { + target->OnExplosionHit(this); + } if (hit_cb_) { hit_cb_({target}); } diff --git a/server/gameserver/explosion.h b/server/gameserver/explosion.h index 353fc3e2..c05f9265 100644 --- a/server/gameserver/explosion.h +++ b/server/gameserver/explosion.h @@ -17,7 +17,9 @@ class Explosion : public std::enable_shared_from_this bool IsPreBattleExplosion(); int GetExplosionEffect() { return explosion_effect_; }; void SetDamageDelay(int delay) { explosion_damage_delay_ = delay; }; - void SetHitCb(CommonCbProc cb) { hit_cb_ = cb;}; + void SetHitCb(CommonCbProc cb) { hit_cb_ = cb; }; + void SetThrough(bool through) { through_ = through; }; + bool IsThrough() { return through_; }; void IndifferenceAttack(Room* room, const a8::Vec2& center, @@ -51,6 +53,7 @@ protected: long long special_damage_type_ = 0; long long create_frameno_ = 0; CommonCbProc hit_cb_; + bool through_ = false; friend class EntityFactory; }; diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 514d94ca..1c95b8be 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -401,7 +401,48 @@ void Skill::ProcCMXD() { Buff* hold_shield_buff = owner->GetBuffByEffectId(kBET_HoldShield); if (hold_shield_buff) { + MetaData::Skill* skill_meta = hold_shield_buff->skill_meta; + CreatureWeakPtr sender = owner->GetWeakPtrRef(); + std::shared_ptr e = EntityFactory::Instance()->MakeExplosion(); + e->SetThrough(true); + e->SetHitCb + ( + [sender, skill_meta] (const std::vector& params) mutable + { + if (sender.Get()) { + Entity* e = std::any_cast(params.at(0)); + if (e->IsCreature(sender.Get()->room)) { + Creature* c = (Creature*)e; + if (c->IsInvincible()) { + return; + } + if (c->dead) { + return; + } + float dmg = SkillHelper::GetCmxdDmg(sender.Get(), skill_meta); + c->DecHP(dmg, + VP_Explosion, + "", + SkillHelper::GetCmxdExplosion(skill_meta)); + a8::Vec2 dir = sender.Get()->GetAttackDir(); + if (!dir.IsZero()) { + a8::Vec2 target_pos = c->GetPos() + + dir * SkillHelper::GetCmxdDistance(skill_meta); + c->PullTarget(target_pos); + } + } + } + } + ); + e->EnemyAndObstacleAttack + ( + owner->GetWeakPtrRef(), + owner->GetPos(), + SkillHelper::GetCmxdRange(meta), + SkillHelper::GetCmxdExplosion(meta), + 0 + ); } } ); diff --git a/server/gameserver/skillhelper.cc b/server/gameserver/skillhelper.cc index bd43c717..4c73b97a 100644 --- a/server/gameserver/skillhelper.cc +++ b/server/gameserver/skillhelper.cc @@ -158,12 +158,25 @@ void SkillHelper::GetMagicIdAndBaseSkillId(int skill_id, int& magic_id, int& bas } } -int SkillHelper::GetCmxdDmg(const MetaData::Skill* skill_meta) +int SkillHelper::GetCmxdDmg(Creature* c, const MetaData::Skill* skill_meta) { - return 0; + float dmg = + (skill_meta->number_meta->float_ratio + + skill_meta->number_meta->float_ratio2 * c->GetBattleContext()->GetHeroTotalAtk()); + return dmg; +} + +int SkillHelper::GetCmxdRange(const MetaData::Skill* skill_meta) +{ + return skill_meta->number_meta->int_range; } int SkillHelper::GetCmxdDistance(const MetaData::Skill* skill_meta) +{ + return skill_meta->number_meta->int_range2; +} + +int SkillHelper::GetCmxdExplosion(const MetaData::Skill* skill_meta) { return 0; } diff --git a/server/gameserver/skillhelper.h b/server/gameserver/skillhelper.h index ae668762..cbe7a088 100644 --- a/server/gameserver/skillhelper.h +++ b/server/gameserver/skillhelper.h @@ -21,8 +21,10 @@ class SkillHelper static float GetSjydhxForthDistance(const MetaData::Skill* skill_meta); static float GetSjydhxBackTime(const MetaData::Skill* skill_meta); //此面向敌 - static int GetCmxdDmg(const MetaData::Skill* skill_meta); + static int GetCmxdDmg(Creature* c, const MetaData::Skill* skill_meta); + static int GetCmxdRange(const MetaData::Skill* skill_meta); static int GetCmxdDistance(const MetaData::Skill* skill_meta); + static int GetCmxdExplosion(const MetaData::Skill* skill_meta); //击杀回血 static int GetJshxHp(Creature* c, const MetaData::Skill* skill_meta); //死亡自爆