private void CombatHandler(EntityInfo npc, long deltaTime)
{
if (npc.GetSkillStateInfo().IsSkillActivated()) {
return;
}
AiStateInfo info = npc.GetAiStateInfo();
Vector3 targetPos = info.HomePos;
ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
float distSqrToHome = Geometry.DistanceSquare(srcPos, info.HomePos);
if (distSqrToHome > npc.GohomeRange * npc.GohomeRange) {
NotifyAiStopPursue(npc);
ChangeToState(npc, (int)AiStateId.GoHome);
return;
}
///
EntityInfo attackTarget = null;
SkillStateInfo currSkInfo = npc.GetSkillStateInfo();
///找到可以使用的技能
SkillInfo skInfo = AiLogicUtility.NpcFindCanUseSkill(npc, this.GetAiData(npc), true);
NotifyAiSelectSkill(npc, skInfo);
if (skInfo == null) {
//没有可以使用的技能就切换到Idle状态
ChangeToState(npc, (int)AiStateId.Idle);
return;
}
CharacterRelation relation =
(skInfo.TargetType == SkillTargetType.Friend ||
skInfo.TargetType == SkillTargetType.RandFriend) ?
CharacterRelation.RELATION_FRIEND :
CharacterRelation.RELATION_ENEMY;
attackTarget = AiLogicUtility.GetNearstTargetHelper(
npc, skInfo.Distance, relation);
if (attackTarget != null && null != skInfo) //攻击范围内找到可攻击目标
{
info.Target = attackTarget.GetId();
NotifyAiStopPursue(npc);
NotifyAiSkill(npc, skInfo.SkillId); //攻击目标
return;
}
attackTarget = AiLogicUtility.GetNearstTargetHelper(
npc, npc.ViewRange, relation);
if (attackTarget != null) //视野范围内找到可攻击目标
{
NotifyAiPursue(npc, attackTarget.GetMovementStateInfo().GetPosition3D()); // 追赶目标
return;
}
currSkInfo.SetCurSkillInfo(0);
NotifyAiStopPursue(npc);
ChangeToState(npc, (int)AiStateId.GoHome);
}