Esempio n. 1
0
 /// <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())
                                              )
                                          )
                            )
                        ));
 }
Esempio n. 2
0
        /// <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;
            }
        }
Esempio n. 3
0
        /// <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;
            }
        }
Esempio n. 4
0
        /// <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;
            }
        }
Esempio n. 5
0
        /// <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;
            }
        }
Esempio n. 6
0
        /// <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;
            }
        }