From cc22f58811051e0ff0a2e323e042ff50d3d44631 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 23 Mar 2021 19:13:58 +0800 Subject: [PATCH] 1 --- server/gameserver/constant.h | 3 +- server/gameserver/creature.cc | 62 ++++++++++++++++++++++++----------- server/gameserver/creature.h | 2 +- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 24c4840..fa0c5bd 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -196,7 +196,8 @@ enum SkillTarget_e kST_EnemyGroup = 7, kST_EnemyAndObject = 8, kST_EnemyAndSelf = 9, - kST_SingleEnemyAndSelf = 10 + kST_SingleEnemyAndSelf = 10, + kST_SpecDir = 11 }; enum VirtualWeapon_e diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index e4d71a6..4a25e6b 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -464,7 +464,7 @@ void Creature::ResetSkill() { curr_skill_ = nullptr; curr_skill_phase = 0; - skill_dir = a8::Vec2(); + skill_dir_ = a8::Vec2(); skill_target_pos_ = a8::Vec2(); skill_param1 = 0.0f; playing_skill = false; @@ -499,29 +499,51 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) break; case kSkill_Shot: { - Entity* entity = room->GetEntityByUniId(skill_target_id_); MetaData::Equip* weapon_meta = MetaMgr::Instance()->GetEquip(phase->param1.GetInt()); - if (weapon_meta && entity) { - float target_distance = entity->GetPos().Distance(GetPos()); + if (weapon_meta) { MetaData::EquipUpgrade* weapon_upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_meta->i->id()); MetaData::Equip* bullet_meta = MetaMgr::Instance()->GetEquip(weapon_meta->i->use_bullet()); - if (bullet_meta && target_distance > 0.00001f) { - a8::Vec2 old_attack_dir = attack_dir; - attack_dir = entity->GetPos() - GetPos(); - attack_dir.Normalize(); - InternalShot - ( - this, - weapon_meta, - weapon_upgrade_meta, - bullet_meta, - 1, - CurrentSkill() ? CurrentSkill()->meta->i->skill_id() : 0, - target_distance, - false); - attack_dir = old_attack_dir; + if (CurrentSkill()->meta->i->skill_target() == kST_SpecDir) { + float target_distance = 5; + if (bullet_meta && target_distance > 0.00001f) { + a8::Vec2 old_attack_dir = attack_dir; + attack_dir = skill_dir_; + attack_dir.Normalize(); + InternalShot + ( + this, + weapon_meta, + weapon_upgrade_meta, + bullet_meta, + 1, + CurrentSkill() ? CurrentSkill()->meta->i->skill_id() : 0, + target_distance, + false); + attack_dir = old_attack_dir; + } + } else { + Entity* entity = room->GetEntityByUniId(skill_target_id_); + if (entity) { + float target_distance = entity->GetPos().Distance(GetPos()); + if (bullet_meta && target_distance > 0.00001f) { + a8::Vec2 old_attack_dir = attack_dir; + attack_dir = entity->GetPos() - GetPos(); + attack_dir.Normalize(); + InternalShot + ( + this, + weapon_meta, + weapon_upgrade_meta, + bullet_meta, + 1, + CurrentSkill() ? CurrentSkill()->meta->i->skill_id() : 0, + target_distance, + false); + attack_dir = old_attack_dir; + } + } } } } @@ -637,7 +659,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) } else { move_dir = entity->GetPos() - GetPos(); move_dir.Normalize(); - skill_dir = move_dir; + skill_dir_ = move_dir; skill_target_pos_ = GetPos() + move_dir * (target_distance - buff->meta->param3); } } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 1f1143b..563d3ce 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -104,7 +104,7 @@ private: std::array buff_effect_ = {}; std::list buff_list_; - a8::Vec2 skill_dir; + a8::Vec2 skill_dir_; float skill_param1 = 0; bool playing_skill = false; size_t curr_skill_phase = 0;