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; }
private static AiData_ForPatrolCommand GetAiDataForPatrolCommand(NpcInfo npc) { AiData_ForPatrolCommand data = npc.GetAiStateInfo().AiDatas.GetData <AiData_ForPatrolCommand>(); return(data); }
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); } } } }