From 1e75e2489cf750785942db62d81a399c51a51e2b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 23 Mar 2021 19:29:04 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 67 +++++++++++++++++------------- server/gameserver/creature.h | 2 +- server/gameserver/player.cc | 10 ++++- server/gameserver/player.h | 1 + server/gameserver/zombiemode.ai.cc | 2 +- 5 files changed, 50 insertions(+), 32 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 4a25e6b..a45f9b0 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1,5 +1,7 @@ #include "precompile.h" +#include + #include "creature.h" #include "metamgr.h" #include "room.h" @@ -414,7 +416,7 @@ bool Creature::CanUseSkill(int skill_id) return skill->GetLeftTime() <= 0; } -void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos) +void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, const a8::Vec2& target_pos) { DoSkillPreProc(skill_id, target_id, target_pos); skill_target_id_ = target_id; @@ -429,19 +431,23 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos) ) { skill_target_id_ = GetEntityUniId(); } - Entity* entity = room->GetEntityByUniId(skill_target_id_); - if (entity && entity->IsEntityType(ET_Player)) { - Creature* c = (Creature*)entity; - std::set target_list; - skill_target_pos_ = c->GetPos(); - SelectSkillTargets(CurrentSkill(), c->GetPos(), target_list); - TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); - if (!CurrentSkill()->meta->phases.empty() && - CurrentSkill()->meta->phases[0].time_offset <= 0) { - UpdateSkill(); - } + if (CurrentSkill()->meta->i->skill_target() == kST_SpecDir) { + UpdateSkill(); } else { - playing_skill = false; + Entity* entity = room->GetEntityByUniId(skill_target_id_); + if (entity && entity->IsEntityType(ET_Player)) { + Creature* c = (Creature*)entity; + std::set target_list; + skill_target_pos_ = c->GetPos(); + SelectSkillTargets(CurrentSkill(), c->GetPos(), target_list); + TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); + if (!CurrentSkill()->meta->phases.empty() && + CurrentSkill()->meta->phases[0].time_offset <= 0) { + UpdateSkill(); + } + } else { + playing_skill = false; + } } if (HasBuffEffect(kBET_Camouflage)) { RemoveBuffByEffectId(kBET_Camouflage); @@ -506,22 +512,25 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) MetaData::Equip* bullet_meta = MetaMgr::Instance()->GetEquip(weapon_meta->i->use_bullet()); 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; + if (std::abs(skill_dir_.x) > FLT_EPSILON || + std::abs(skill_dir_.y) > FLT_EPSILON) { + 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_); diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 563d3ce..0637339 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -60,7 +60,7 @@ class Creature : public MoveableEntity const a8::Vec2& target_pos, std::set& target_list); virtual bool CanUseSkill(int skill_id); - void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos); + void DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, const a8::Vec2& target_pos); void ResetSkill(); Skill* CurrentSkill(); MetaData::SkillPhase* GetCurrSkillPhase(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index adc7fbb..4a1e2cf 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -393,7 +393,7 @@ void Player::UpdateUseSkill() if (HasBuffEffect(kBET_Vertigo)) { return; } - DoSkill(use_skill_id, skill_target_id, a8::Vec2()); + DoSkill(use_skill_id, skill_target_id, skill_dir, a8::Vec2()); use_skill = false; } @@ -1122,6 +1122,14 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) use_skill = msg.use_skill(); use_skill_id = msg.skill_id(); skill_target_id = msg.skill_target_id(); + if (std::abs(msg.skill_dir().x()) > FLT_EPSILON || + std::abs(msg.skill_dir().y()) > FLT_EPSILON + ) { + TypeConvert::FromPb(skill_dir, &msg.skill_dir()); + skill_dir.Normalize(); + } else { + skill_dir = a8::Vec2(); + } } else { use_skill = false; } diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 3b65e8b..28b3cc8 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -60,6 +60,7 @@ class Player : public Human bool use_skill = false; int use_skill_id = 0; int skill_target_id = 0; + a8::Vec2 skill_dir; bool get_down = false; int get_on = 0; diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index fc61fb0..99f482b 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -479,7 +479,7 @@ void ZombieModeAI::DoShot() void ZombieModeAI::DoSkill(int skill_id) { Human* myself = (Human*)owner; - myself->DoSkill(skill_id, node_->target->GetEntityUniId(), node_->target->GetPos()); + myself->DoSkill(skill_id, node_->target->GetEntityUniId(), a8::Vec2(), node_->target->GetPos()); } int ZombieModeAI::GetAttackTimes()