Example #1
0
        private void PursuitHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (user.IsDead())
            {
                user.GetMovementStateInfo().IsMoving = false;
                return;
            }
            if (user.IsUnderControl())
            {
                user.GetMovementStateInfo().IsMoving = false;
                return;
            }
            if (user.GetSkillStateInfo().IsSkillActivated())
            {
                user.GetMovementStateInfo().IsMoving = false;
                return;
            }
            UserAiStateInfo         info = user.GetAiStateInfo();
            AiData_UserSelf_General data = GetAiData(user);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(user, info.Target);
                if (null != target)
                {
                    float   dist          = (float)user.GetActualProperty().AttackRange;
                    float   distGoHome    = (float)user.GohomeRange;
                    Vector3 targetPos     = target.GetMovementStateInfo().GetPosition3D();
                    Vector3 srcPos        = user.GetMovementStateInfo().GetPosition3D();
                    float   powDist       = Geometry.DistanceSquare(srcPos, targetPos);
                    float   powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos);
                    TryCastSkill(user, target, powDist);
                    // 大于攻击距离 跑向目标
                    if (powDist > m_AttackRange * m_AttackRange)
                    {
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            if (!user.UnityPathFinding)
                            {
                                AiLogicUtility.PathToTargetWithoutObstacle(user, data.FoundPath, targetPos, m_IntervalTime, true, this);
                            }
                            else
                            {
                                if (info.PreviousState != (int)AiStateId.PathFinding)
                                {
                                    user.PathFindingFinished = false;
                                    GfxSystem.UserSelfGeneralPathToTarget(user, targetPos);
                                    ChangeToState(user, (int)AiStateId.PathFinding);
                                }
                                else
                                {
                                    AiLogicUtility.PathToTargetWithoutObstacle(user, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                }
                            }
                        }
                    }
                    else
                    {
                        user.GetMovementStateInfo().IsMoving = false;
                        NotifyUserMove(user);
                    }
                }
                else
                {
                    user.GetMovementStateInfo().IsMoving = false;
                    NotifyUserMove(user);
                    info.Time = 0;
                    ChangeToState(user, (int)AiStateId.Idle);
                }
            }
        }