internal static void DoPatrolCommandState(EntityInfo entity, long deltaTime, AbstractAiStateLogic logic) { AiStateInfo info = entity.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; EntityInfo target = null; if (info.IsExternalTarget) { target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(entity, info.Target); if (null == target) { target = AiLogicUtility.GetNearstTargetHelper(entity, CharacterRelation.RELATION_ENEMY); if (null != target) { info.Target = target.GetId(); } } } else { target = AiLogicUtility.GetNearstTargetHelper(entity, CharacterRelation.RELATION_ENEMY); if (null != target) { info.Target = target.GetId(); } } if (null != target) { logic.AiSendStoryMessage(entity, "obj_patrol_exit", entity.GetId()); logic.AiSendStoryMessage(entity, string.Format("npc_patrol_exit:{0}", entity.GetUnitId()), entity.GetId()); logic.ChangeToState(entity, (int)AiStateId.Idle); } else { AiData_ForPatrolCommand data = GetAiDataForPatrolCommand(entity); if (null != data) { ScriptRuntime.Vector3 srcPos = entity.GetMovementStateInfo().GetPosition3D(); if (data.PatrolPath.HavePathPoint && !data.PatrolPath.IsReached(srcPos)) { logic.NotifyAiPursue(entity, data.PatrolPath.CurPathPoint); } else { data.PatrolPath.UseNextPathPoint(); if (data.PatrolPath.HavePathPoint) { logic.NotifyAiPursue(entity, data.PatrolPath.CurPathPoint); } else { if (data.IsLoopPatrol) { logic.AiSendStoryMessage(entity, "obj_patrol_restart", entity.GetId()); logic.AiSendStoryMessage(entity, string.Format("npc_patrol_restart:{0}", entity.GetUnitId()), entity.GetId()); data.PatrolPath.Restart(); } else { logic.AiSendStoryMessage(entity, "obj_patrol_finish", entity.GetId()); logic.AiSendStoryMessage(entity, string.Format("npc_patrol_finish:{0}", entity.GetUnitId()), entity.GetId()); logic.NotifyAiStopPursue(entity); logic.ChangeToState(entity, (int)AiStateId.Idle); } } } info.HomePos = entity.GetMovementStateInfo().GetPosition3D(); } else { logic.NotifyAiStopPursue(entity); logic.ChangeToState(entity, (int)AiStateId.Idle); } } } }
private static AiData_ForPatrolCommand GetAiDataForPatrolCommand(EntityInfo entity) { AiData_ForPatrolCommand data = entity.GetAiStateInfo().AiDatas.GetData <AiData_ForPatrolCommand>(); return(data); }
protected override bool ExecCommand(StoryInstance instance, long delta) { Scene scene = instance.Context as Scene; if (null != scene) { int unitId = m_UnitId.Value; List<object> poses = m_WayPoints.Value; bool isLoop = m_ParamNum > 2 ? 0 == m_IsLoop.Value.CompareTo("isloop") : false; EntityInfo entity = scene.SceneContext.GetEntityByUnitId(unitId); if (null != entity && null != poses) { AiStateInfo aiInfo = entity.GetAiStateInfo(); AiData_ForPatrolCommand data = aiInfo.AiDatas.GetData<AiData_ForPatrolCommand>(); if (null == data) { data = new AiData_ForPatrolCommand(); aiInfo.AiDatas.AddData(data); } List<Vector3> wayPts = new List<Vector3>(); for (int i = 0; i < poses.Count; ++i) { Vector3 pt = (Vector3)poses[i]; wayPts.Add(pt); } data.PatrolPath.SetPathPoints(entity.GetMovementStateInfo().GetPosition3D(), wayPts); data.IsLoopPatrol = isLoop; aiInfo.Time = 1000;//下一帧即触发移动 aiInfo.ChangeToState((int)AiStateId.PatrolCommand); } } return false; }