Example #1
0
        private void InitPatrolData(NpcInfo npc)
        {
            AiData_ForPatrolCommand data = new AiData_ForPatrolCommand();

            data.IsLoopPatrol = true;
            List <Vector3> path = new List <Vector3>();
            NpcAiStateInfo info = npc.GetAiStateInfo();

            path = Converter.ConvertVector3DList(info.AiParam[1]);
            data.PatrolPath.SetPathPoints(npc.GetAiStateInfo().HomePos, path);
            npc.GetAiStateInfo().AiDatas.AddData <AiData_ForPatrolCommand>(data);
            AiData_Demo_Melee aiData = GetAiData(npc);

            aiData.HasPatrolData = true;
        }
Example #2
0
        private static AiData_ForPatrolCommand GetAiDataForPatrolCommand(NpcInfo npc)
        {
            AiData_ForPatrolCommand data = npc.GetAiStateInfo().AiDatas.GetData <AiData_ForPatrolCommand>();

            return(data);
        }
Example #3
0
        public static void DoPatrolCommandState(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime, AbstractNpcStateLogic logic)
        {
            if (npc.IsDead())
            {
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                long intervalTime = info.Time;
                info.Time = 0;
                CharacterInfo target = null;
                if (info.IsExternalTarget)
                {
                    target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(npc, info.Target);
                    if (null == target)
                    {
                        target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                        if (null != target)
                        {
                            info.Target = target.GetId();
                        }
                    }
                }
                else
                {
                    target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                    if (null != target)
                    {
                        info.Target = target.GetId();
                    }
                }
                if (null != target)
                {
                    logic.NotifyNpcTargetChange(npc);
                    npc.GetMovementStateInfo().IsMoving = false;
                    logic.NotifyNpcMove(npc);
                    info.Time = 0;
                    AiData_ForPatrolCommand data = GetAiDataForPatrolCommand(npc);
                    if (null != data)
                    {
                        data.FoundPath.Clear();
                    }
                    logic.ChangeToState(npc, (int)AiStateId.Pursuit);
                }
                else
                {
                    AiData_ForPatrolCommand data = GetAiDataForPatrolCommand(npc);
                    if (null != data)
                    {
                        ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
                        if (data.PatrolPath.HavePathPoint && !data.PatrolPath.IsReached(srcPos))
                        {
                            PathToTargetWithoutObstacle(npc, data.FoundPath, data.PatrolPath.CurPathPoint, intervalTime, true, logic);
                        }
                        else
                        {
                            data.PatrolPath.UseNextPathPoint();
                            data.FoundPath.Clear();
                            if (!data.PatrolPath.HavePathPoint)
                            {
                                if (data.IsLoopPatrol)
                                {
                                    data.PatrolPath.Restart();
                                }
                                else
                                {
                                    info.Time = 0;
                                    logic.ChangeToState(npc, (int)AiStateId.Idle);
                                }
                            }
                        }
                        info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
                    }
                    else
                    {
                        info.Time = 0;
                        logic.ChangeToState(npc, (int)AiStateId.Idle);
                    }
                }
            }
        }