diff --git a/server/gameserver/buff/hold_shield.cc b/server/gameserver/buff/hold_shield.cc index 75824d2d..149f8e41 100644 --- a/server/gameserver/buff/hold_shield.cc +++ b/server/gameserver/buff/hold_shield.cc @@ -7,6 +7,9 @@ #include "human.h" #include "room.h" #include "skillhelper.h" +#include "trigger.h" +#include "entityfactory.h" +#include "explosion.h" #include "mt/Skill.h" #include "mt/Buff.h" @@ -65,8 +68,114 @@ void HoldShieldBuff::Activate() break; } } + owner->GetTrigger()->AddListener + ( + kShieldDestoryEvent, + [this] (const a8::Args& params) + { + OnShieldDestory(params); + }); } void HoldShieldBuff::Deactivate() { } + +void HoldShieldBuff::OnShieldDestory(const a8::Args& params) +{ + if (!skill_meta || skill_meta->GetMagicId() != MAGIC_21001_NIU) { + return; + } + + CreatureWeakPtr sender = owner->GetWeakPtrRef(); + + std::shared_ptr e = EntityFactory::Instance()->MakeExplosion(); + e->SetThrough(true); + e->SetCustomCheckCb + ( + [sender] + (const a8::Args& args) mutable + { + bool* is_hit = args.Get(0); + Entity* e = args.Get(1); + if (sender.Get() && e->IsCreature(sender.Get()->room)) { + Creature* c = (Creature*)e; + glm::vec3 target_pos = sender.Get()->GetPos().ToGlmVec3(); + target_pos = target_pos + (sender.Get()->GetAttackDir() * (float)SkillHelper::GetCmxdRange(this_skill_meta) / 2.0f); + bool ret = Collision::Check2dRotationRectangle + (c->GetPos().GetX(), + c->GetPos().GetY(), + 20, + target_pos.x, + target_pos.y, + shield_buff_meta->_buff_param4, + SkillHelper::GetCmxdRange(this_skill_meta), + sender.Get()->GetAttackDirRotate() * 180.0f + ); + if (ret) { + *is_hit = true; + } + } + } + ); + e->SetHitCb + ( + [sender, skill_meta] (const a8::Args& args) mutable + { + if (sender.Get()) { + Entity* e = args.Get(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); + float dmg_out = 0.0f; + c->DecHP(dmg, + VP_Explosion, + "", + SkillHelper::GetCmxdExplosion(skill_meta), + sender.Get()->GetUniId(), + sender.Get()->GetName(), + dmg_out); + glm::vec3 dir = sender.Get()->GetAttackDir(); + if (!GlmHelper::IsZero(dir)) { + glm::vec3 target_pos = c->GetPos().ToGlmVec3() + + dir * (float)SkillHelper::GetCmxdDistance(skill_meta); + c->PullTarget(target_pos); + } + c->TryAddBuffAndSetTime(sender.Get(), + kVertigoEffectBuffId, + SkillHelper::GetCmxdVertigoTime(skill_meta) * 1000); + } + } + } + ); + e->EnemyAndObstacleAttack + ( + owner->GetWeakPtrRef(), + owner->GetPos(), + SkillHelper::GetCmxdRange(meta), + SkillHelper::GetCmxdExplosion(meta), + 0 + ); +#ifdef DEBUG + { + std::string dbg_msg = a8::Format + ( + "skill_id:%d 此面向 range:%f range2:%f ratio:%f time:%f", + { + meta->skill_id(), + meta->_number_meta->_float_range, + meta->_number_meta->_float_range2, + meta->_number_meta->_float_ratio, + meta->_number_meta->_float_time + }); + owner->SendDebugMsg(dbg_msg); + a8::XPrintf("%s\n", {dbg_msg}); + } +#endif +} diff --git a/server/gameserver/buff/hold_shield.h b/server/gameserver/buff/hold_shield.h index b54cce8f..7b343222 100644 --- a/server/gameserver/buff/hold_shield.h +++ b/server/gameserver/buff/hold_shield.h @@ -9,4 +9,7 @@ class HoldShieldBuff : public Buff virtual void Activate() override; virtual void Deactivate() override; + private: + void OnShieldDestory(const a8::Args& params); + }; diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 6a1a569c..b69e5141 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -1041,114 +1041,7 @@ void Skill::Proc30901XIONG() void Skill::Proc31001NIU() { - #if 1 owner->GetAbility()->AddDmgRuduce(meta->_number_meta->damage_change()); - #else - owner->GetTrigger()->AddListener - ( - kShieldDestoryEvent, - [this] (const a8::Args& params) - { - Buff* hold_shield_buff = owner->GetBuffByEffectId(kBET_HoldShield); - if (hold_shield_buff) { - const mt::Skill* skill_meta = hold_shield_buff->skill_meta; - const mt::Skill* this_skill_meta = meta; - const mt::Buff* shield_buff_meta = hold_shield_buff->meta; - CreatureWeakPtr sender = owner->GetWeakPtrRef(); - - std::shared_ptr e = EntityFactory::Instance()->MakeExplosion(); - e->SetThrough(true); - e->SetCustomCheckCb - ( - [sender, skill_meta, this_skill_meta, shield_buff_meta] - (const a8::Args& args) mutable - { - bool* is_hit = args.Get(0); - Entity* e = args.Get(1); - if (sender.Get() && e->IsCreature(sender.Get()->room)) { - Creature* c = (Creature*)e; - glm::vec3 target_pos = sender.Get()->GetPos().ToGlmVec3(); - target_pos = target_pos + (sender.Get()->GetAttackDir() * (float)SkillHelper::GetCmxdRange(this_skill_meta) / 2.0f); - bool ret = Collision::Check2dRotationRectangle - (c->GetPos().GetX(), - c->GetPos().GetY(), - 20, - target_pos.x, - target_pos.y, - shield_buff_meta->_buff_param4, - SkillHelper::GetCmxdRange(this_skill_meta), - sender.Get()->GetAttackDirRotate() * 180.0f - ); - if (ret) { - *is_hit = true; - } - } - } - ); - e->SetHitCb - ( - [sender, skill_meta] (const a8::Args& args) mutable - { - if (sender.Get()) { - Entity* e = args.Get(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); - float dmg_out = 0.0f; - c->DecHP(dmg, - VP_Explosion, - "", - SkillHelper::GetCmxdExplosion(skill_meta), - sender.Get()->GetUniId(), - sender.Get()->GetName(), - dmg_out); - glm::vec3 dir = sender.Get()->GetAttackDir(); - if (!GlmHelper::IsZero(dir)) { - glm::vec3 target_pos = c->GetPos().ToGlmVec3() + - dir * (float)SkillHelper::GetCmxdDistance(skill_meta); - c->PullTarget(target_pos); - } - c->TryAddBuffAndSetTime(sender.Get(), - kVertigoEffectBuffId, - SkillHelper::GetCmxdVertigoTime(skill_meta) * 1000); - } - } - } - ); - e->EnemyAndObstacleAttack - ( - owner->GetWeakPtrRef(), - owner->GetPos(), - SkillHelper::GetCmxdRange(meta), - SkillHelper::GetCmxdExplosion(meta), - 0 - ); -#ifdef DEBUG - { - std::string dbg_msg = a8::Format - ( - "skill_id:%d 此面向 range:%f range2:%f ratio:%f time:%f", - { - meta->skill_id(), - meta->_number_meta->_float_range, - meta->_number_meta->_float_range2, - meta->_number_meta->_float_ratio, - meta->_number_meta->_float_time - }); - owner->SendDebugMsg(dbg_msg); - a8::XPrintf("%s\n", {dbg_msg}); - } -#endif - } - } - ); - #endif } void Skill::ProcSkillPhase(const mt::SkillPhase* phase)