From 6080b7fa0a0af9d2979c60bd2c1fbb5cc441f58d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 9 Oct 2022 20:13:40 +0800 Subject: [PATCH] 1 --- server/gameserver/skill.cc | 44 ++++++++++++++++++++++++++------ server/gameserver/skillhelper.cc | 25 +++++++++++++----- server/gameserver/skillhelper.h | 8 +++--- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 96465a4f..e0a75825 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -9,6 +9,7 @@ #include "entityfactory.h" #include "explosion.h" #include "buff.h" +#include "human.h" void Skill::Initialzie() { @@ -364,20 +365,40 @@ void Skill::ProcSWZB() [this] (const std::vector& params) { CreatureWeakPtr sender = owner->GetWeakPtrRef(); + MetaData::Skill* skill_meta = meta; a8::Vec2 center = owner->GetPos(); std::shared_ptr e = EntityFactory::Instance()->MakeExplosion(); + e->SetThrough(true); e->SetHitCb ( - [sender, center] (const std::vector& params) mutable + [sender, center, skill_meta] (const std::vector& params) mutable { - #if 0 if (sender.Get()) { Entity* e = std::any_cast(params.at(0)); - if (e->IsCreature()) { - + if (e->IsCreature(sender.Get()->room)) { + Creature* c = (Creature*)e; + if (c->IsInvincible()) { + return; + } + if (c->dead) { + return; + } + float dmg = SkillHelper::GetSwzbDmg(sender.Get(), skill_meta); + c->DecHP(dmg, + VP_Explosion, + "", + SkillHelper::GetSwzbEffect(skill_meta)); + a8::Vec2 dir = sender.Get()->GetAttackDir(); + if (!dir.IsZero()) { + a8::Vec2 target_pos = c->GetPos() + + dir * SkillHelper::GetSwzbPullDistance(skill_meta); + c->PullTarget(target_pos); + } + int buff_id = SkillHelper::GetSwzbBuffId(skill_meta); + float buff_time = SkillHelper::GetSwzbBuffTime(skill_meta); + c->TryAddBuffAndSetTime(sender.Get(), buff_id, buff_time); } } - #endif } ); e->EnemyAndObstacleAttack @@ -386,7 +407,7 @@ void Skill::ProcSWZB() owner->GetPos(), SkillHelper::GetSwzbRadius(meta), SkillHelper::GetSwzbEffect(meta), - SkillHelper::GetSwzbDmg(meta) + 0 ); } ); @@ -465,12 +486,19 @@ void Skill::ProcJYFH() kStartRescueEvent, [this] (const std::vector& params) { + Human* target = std::any_cast(params.at(0)); + int buff_id = SkillHelper::GetJyfhBuffId(meta); + float buff_time = SkillHelper::GetJyfhBuffTime(meta); + owner->TryAddBuffAndSetTime(owner, buff_id, buff_time, meta); + target->TryAddBuffAndSetTime(owner, buff_id, buff_time, meta); owner->GetTrigger()->AddListener ( kEndRescueEvent, - [this] (const std::vector& params) + [this, buff_id] (const std::vector& params) { - + Human* target = std::any_cast(params.at(0)); + owner->RemoveBuffById(buff_id); + target->RemoveBuffById(buff_id); } ); } diff --git a/server/gameserver/skillhelper.cc b/server/gameserver/skillhelper.cc index efb2d954..a01ccc84 100644 --- a/server/gameserver/skillhelper.cc +++ b/server/gameserver/skillhelper.cc @@ -192,12 +192,15 @@ int SkillHelper::GetJshxHp(Creature* c, const MetaData::Skill* skill_meta) int SkillHelper::GetSwzbRadius(const MetaData::Skill* skill_meta) { - return 0; + return skill_meta->number_meta->float_range; } -int SkillHelper::GetSwzbDmg(const MetaData::Skill* skill_meta) +int SkillHelper::GetSwzbDmg(Creature* c, const MetaData::Skill* skill_meta) { - return 0; + float finaly_dmg = + (skill_meta->number_meta->float_ratio + + skill_meta->number_meta->float_ratio2 * c->GetBattleContext()->GetHeroTotalAtk()); + return finaly_dmg; } int SkillHelper::GetSwzbEffect(const MetaData::Skill* skill_meta) @@ -207,7 +210,17 @@ int SkillHelper::GetSwzbEffect(const MetaData::Skill* skill_meta) int SkillHelper::GetSwzbPullDistance(const MetaData::Skill* skill_meta) { - return 0; + return skill_meta->number_meta->float_range2; +} + +int SkillHelper::GetSwzbBuffId(const MetaData::Skill* skill_meta) +{ + return kVertigoBuffId; +} + +float SkillHelper::GetSwzbBuffTime(const MetaData::Skill* skill_meta) +{ + return skill_meta->number_meta->float_time; } void SkillHelper::ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid) @@ -343,12 +356,12 @@ int SkillHelper::GetJyfhBuffId(const MetaData::Skill* skill_meta) return 0; } -int SkillHelper::GetJyfhBuffTime(const MetaData::Skill* skill_meta) +float SkillHelper::GetJyfhBuffTime(const MetaData::Skill* skill_meta) { return 0; } -int SkillHelper::GetJyfhDmgRuduce(const MetaData::Skill* skill_meta) +float SkillHelper::GetJyfhDmgRuduce(const MetaData::Skill* skill_meta) { return 0; } diff --git a/server/gameserver/skillhelper.h b/server/gameserver/skillhelper.h index a43c6649..2b7807be 100644 --- a/server/gameserver/skillhelper.h +++ b/server/gameserver/skillhelper.h @@ -29,9 +29,11 @@ class SkillHelper static int GetJshxHp(Creature* c, const MetaData::Skill* skill_meta); //死亡自爆 static int GetSwzbRadius(const MetaData::Skill* skill_meta); - static int GetSwzbDmg(const MetaData::Skill* skill_meta); + static int GetSwzbDmg(Creature* c, const MetaData::Skill* skill_meta); static int GetSwzbEffect(const MetaData::Skill* skill_meta); static int GetSwzbPullDistance(const MetaData::Skill* skill_meta); + static int GetSwzbBuffId(const MetaData::Skill* skill_meta); + static float GetSwzbBuffTime(const MetaData::Skill* skill_meta); //野蛮冲撞 static int GetYmczBuffTime(const MetaData::Skill* skill_meta); static int GetYmczReserveDistance(const MetaData::Skill* skill_meta); @@ -41,8 +43,8 @@ class SkillHelper static int GetYlzRecoverHp(Creature* sender, Creature* target, const MetaData::Skill* skill_meta); //救援防护 static int GetJyfhBuffId(const MetaData::Skill* skill_meta); - static int GetJyfhBuffTime(const MetaData::Skill* skill_meta); - static int GetJyfhDmgRuduce(const MetaData::Skill* skill_meta); + static float GetJyfhBuffTime(const MetaData::Skill* skill_meta); + static float GetJyfhDmgRuduce(const MetaData::Skill* skill_meta); static void ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid); static bool ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_dmg);