From 45445369c088256eb58ec52c2a84bcd704459c22 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 20 Jul 2019 17:16:36 +0800 Subject: [PATCH] =?UTF-8?q?ai=E6=B7=BB=E5=8A=A0=E6=9C=BA=E5=99=A8=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/android.ai.cc | 50 +++++++++++++++++++++++++-------- server/gameserver/android.ai.h | 2 ++ server/gameserver/human.cc | 19 ++++++++++++- server/gameserver/human.h | 1 + 4 files changed, 59 insertions(+), 13 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index b057a6c..f3830fd 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -132,19 +132,45 @@ void AndroidAI::DoAttack() !enemy->HasBuffEffect(BET_InGrass) ) { Human* sender = (Human*)owner; - a8::Vec2 shot_dir = enemy->pos - sender->pos; - if (std::abs(shot_dir.x) > FLT_EPSILON || - std::abs(shot_dir.y) > FLT_EPSILON) { - shot_dir.Normalize(); - shot_dir.Rotate((rand() % 10) / 180.0f); - sender->attack_dir = shot_dir; - if (sender->curr_weapon->meta->NeedTrace()) { - sender->shot_target_id = enemy->entity_uniid; - } else { - sender->shot_target_id = 0; - } - sender->Shot(); + if (sender->CanUseSkill()) { + UseSkill(enemy); + } else { + Shot(enemy); } } } } + +void AndroidAI::Shot(Human* enemy) +{ + Human* sender = (Human*)owner; + a8::Vec2 shot_dir = enemy->pos - sender->pos; + if (std::abs(shot_dir.x) > FLT_EPSILON || + std::abs(shot_dir.y) > FLT_EPSILON) { + shot_dir.Normalize(); + shot_dir.Rotate((rand() % 10) / 180.0f); + sender->attack_dir = shot_dir; + if (sender->curr_weapon->meta->NeedTrace()) { + sender->shot_target_id = enemy->entity_uniid; + } else { + sender->shot_target_id = 0; + } + sender->Shot(); + } +} + +void AndroidAI::UseSkill(Human* enemy) +{ + Human* sender = (Human*)owner; + a8::Vec2 shot_dir = enemy->pos - sender->pos; + if (std::abs(shot_dir.x) > FLT_EPSILON || + std::abs(shot_dir.y) > FLT_EPSILON) { + sender->curr_skill_phase = 0; + sender->skill_target_id = enemy->entity_uniid; + sender->skill_dir = shot_dir; + sender->skill_target_pos = enemy->pos; + sender->skill_param1 = 0; + sender->playing_skill = false; + sender->DoSkill(); + } +} diff --git a/server/gameserver/android.ai.h b/server/gameserver/android.ai.h index 6c121bc..9bb9710 100644 --- a/server/gameserver/android.ai.h +++ b/server/gameserver/android.ai.h @@ -27,4 +27,6 @@ private: void DoMove(); void DoAttack(); + void Shot(Human* enemy); + void UseSkill(Human* enemy); }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 539c1c8..a9c086a 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -541,9 +541,26 @@ bool Human::HasLiveTeammate() return false; } +bool Human::CanUseSkill() +{ + if (!skill_meta_) { + return false; + } + if (GetSkillLeftTime() > 0) { + return false; + } + if (a8::HasBitFlag(status, HS_Assaulting) || + HasBuffEffect(BET_Vertigo) || + HasBuffEffect(BET_Dcgr) + ) { + return false; + } + return true; +} + void Human::DoSkill() { - if (skill_meta_ && GetSkillLeftTime() <= 0 && !a8::HasBitFlag(status, HS_Assaulting)) { + if (CanUseSkill()) { use_skill = false; curr_skill_phase = 0; skill_dir = a8::Vec2(); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index b1bd331..cb19fab 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -136,6 +136,7 @@ class Human : public Entity void AddOutObjects(Entity* entity); void RemoveOutObjects(Entity* entity); bool HasLiveTeammate(); + bool CanUseSkill(); void DoSkill(); void FindLocation(); void RefreshView();