/// <summary> /// Will find and move to Prioritized Scene's based on Scene SNOId or Name /// </summary> /// <returns></returns> private Composite PrioritySceneCheck() { return (new Decorator(ret => !(SceneId == 0 && String.IsNullOrEmpty(SceneName.Trim())), new Sequence( new DecoratorContinue(ret => DateTime.Now.Subtract(lastCheckedScenes).TotalMilliseconds > 1000, new Sequence( new Action(ret => lastCheckedScenes = DateTime.Now), new Action(ret => FindPrioritySceneTarget()) ) ), new Decorator(ret => PrioritySceneTarget != Vector3.Zero, new PrioritySelector( new Decorator(ret => PrioritySceneTarget.Distance2D(myPos) <= PathPrecision, new Sequence( new Action(ret => Logger.DBLog.DebugFormat("Successfully navigated to priority scene {0} {1} center {2} Distance {3:0}", CurrentPriorityScene.Name, CurrentPriorityScene.SceneInfo.SNOId, PrioritySceneTarget, PrioritySceneTarget.Distance2D(myPos))), new Action(ret => isDone = true) ) ), new Action(ret => MoveToPriorityScene()) ) ) ) )); }
/// <summary> /// Called when the profile behavior starts /// </summary> public override void OnStart() { Logger.DBLog.DebugFormat("TrinityMoveToScene OnStart() called"); if (PathPrecision == 0) { PathPrecision = 15f; } if (SceneId == 0 && String.IsNullOrEmpty(SceneName.Trim())) { Logger.DBLog.DebugFormat("TrinityMoveToScene: No sceneId or sceneName specified!"); isDone = true; } }
/// <summary> /// Called when the profile behavior starts /// </summary> public override void OnStart() { DbHelper.Log(TrinityLogLevel.Normal, LogCategory.ProfileTag, "TrinityMoveToScene OnStart() called"); if (PathPrecision == 0) { PathPrecision = 15f; } if (SceneId == 0 && SceneName.Trim() == String.Empty) { DbHelper.Log(TrinityLogLevel.Normal, LogCategory.UserInformation, "TrinityMoveToScene: No sceneId or sceneName specified!"); isDone = true; } }
/// <summary> /// Called when the profile behavior starts /// </summary> public override void OnStart() { Logger.Log("TrinityMoveToScene OnStart()"); if (Math.Abs(PathPrecision) < 1f) { PathPrecision = 15f; } if (SceneId == 0 && SceneName.Trim() == String.Empty) { Logger.Log("TrinityMoveToScene: No sceneId or sceneName specified!"); _isDone = true; } }
/// <summary> /// Finds a navigable point in a priority scene /// </summary> private void FindPrioritySceneTarget() { if (SceneId == 0 && String.IsNullOrEmpty(SceneName)) { return; } //gp.Update(); if (PrioritySceneTarget != Vector3.Zero) { return; } var foundPriorityScene = false; // find any matching priority scenes in scene manager - match by name or SNOId var PScenes = ZetaDia.Scenes.GetScenes() .Where(s => s.SceneInfo.SNOId == SceneId).ToList(); PScenes.AddRange(ZetaDia.Scenes.GetScenes() .Where(s => !String.IsNullOrEmpty(SceneName.Trim()) && s.Name.ToLower().Contains(SceneName.ToLower())).ToList()); var foundPriorityScenes = new List <Scene>(); var foundPrioritySceneIndex = new Dictionary <int, Vector3>(); foreach (var scene in PScenes) { if (PriorityScenesInvestigated.Contains(scene.SceneInfo.SNOId)) { continue; } foundPriorityScene = true; var navZone = scene.Mesh.Zone; var zoneDef = navZone.NavZoneDef; var zoneCenter = GetNavZoneCenter(navZone); var NavCells = zoneDef.NavCells.Where(c => c.Flags.HasFlag(NavCellFlags.AllowWalk)).ToList(); if (!NavCells.Any()) { continue; } var bestCell = NavCells.OrderBy(c => GetNavCellCenter(c.Min, c.Max, navZone).Distance2D(zoneCenter)).FirstOrDefault(); if (bestCell != null) { foundPrioritySceneIndex.Add(scene.SceneInfo.SNOId, GetNavCellCenter(bestCell, navZone)); foundPriorityScenes.Add(scene); } else { Logger.DBLog.DebugFormat("Found Priority Scene but could not find a navigable point!"); } } if (foundPrioritySceneIndex.Any()) { var nearestPriorityScene = foundPrioritySceneIndex.OrderBy(s => s.Value.Distance2D(myPos)).FirstOrDefault(); PrioritySceneSNOId = nearestPriorityScene.Key; PrioritySceneTarget = nearestPriorityScene.Value; CurrentPriorityScene = foundPriorityScenes.FirstOrDefault(s => s.SceneInfo.SNOId == PrioritySceneSNOId); Logger.DBLog.DebugFormat("Found Priority Scene {0} - {1} Center {2} Distance {3:0}", CurrentPriorityScene.Name, CurrentPriorityScene.SceneInfo.SNOId, PrioritySceneTarget, PrioritySceneTarget.Distance2D(myPos)); } if (!foundPriorityScene) { PrioritySceneTarget = Vector3.Zero; } }
/// <summary> /// Finds a navigable point in a priority scene /// </summary> private void FindPrioritySceneTarget() { if (SceneId == 0 && SceneName == String.Empty) { return; } gp.Update(); if (PrioritySceneTarget != Vector3.Zero) { return; } bool foundPriorityScene = false; // find any matching priority scenes in scene manager - match by name or SNOId List <Scene> PScenes = ZetaDia.Scenes.GetScenes() .Where(s => s.SceneInfo.SNOId == SceneId).ToList(); PScenes.AddRange(ZetaDia.Scenes.GetScenes() .Where(s => SceneName.Trim() != String.Empty && s.Name.ToLower().Contains(SceneName.ToLower())).ToList()); List <Scene> foundPriorityScenes = new List <Scene>(); Dictionary <int, Vector3> foundPrioritySceneIndex = new Dictionary <int, Vector3>(); foreach (Scene scene in PScenes) { if (PriorityScenesInvestigated.Contains(scene.SceneInfo.SNOId)) { continue; } foundPriorityScene = true; NavZone navZone = scene.Mesh.Zone; NavZoneDef zoneDef = navZone.NavZoneDef; Vector2 zoneMin = navZone.ZoneMin; Vector2 zoneMax = navZone.ZoneMax; Vector3 zoneCenter = GetNavZoneCenter(navZone); List <NavCell> NavCells = zoneDef.NavCells.Where(c => c.Flags.HasFlag(NavCellFlags.AllowWalk)).ToList(); if (!NavCells.Any()) { continue; } NavCell bestCell = NavCells.OrderBy(c => GetNavCellCenter(c.Min, c.Max, navZone).Distance2D(zoneCenter)).FirstOrDefault(); if (bestCell != null) { foundPrioritySceneIndex.Add(scene.SceneInfo.SNOId, GetNavCellCenter(bestCell, navZone)); foundPriorityScenes.Add(scene); } else { DbHelper.Log(TrinityLogLevel.Normal, LogCategory.ProfileTag, "Found Priority Scene but could not find a navigable point!", true); } } if (foundPrioritySceneIndex.Any()) { KeyValuePair <int, Vector3> nearestPriorityScene = foundPrioritySceneIndex.OrderBy(s => s.Value.Distance2D(myPos)).FirstOrDefault(); PrioritySceneSNOId = nearestPriorityScene.Key; PrioritySceneTarget = nearestPriorityScene.Value; CurrentPriorityScene = foundPriorityScenes.FirstOrDefault(s => s.SceneInfo.SNOId == PrioritySceneSNOId); DbHelper.Log(TrinityLogLevel.Normal, LogCategory.ProfileTag, "Found Priority Scene {0} - {1} Center {2} Distance {3:0}", CurrentPriorityScene.Name, CurrentPriorityScene.SceneInfo.SNOId, PrioritySceneTarget, PrioritySceneTarget.Distance2D(myPos)); } if (!foundPriorityScene) { PrioritySceneTarget = Vector3.Zero; } }