internal void Notify(string key, object data)
        {
            for (int i = 0; i < tasks.Count; i++)
            {
                IAiTask task = tasks[i];

                if (task.Notify(key, data))
                {
                    int slot = tasks[i].Slot;

                    if ((activeTasksBySlot[slot] == null || task.Priority > activeTasksBySlot[slot].PriorityForCancel))
                    {
                        if (activeTasksBySlot[slot] != null)
                        {
                            activeTasksBySlot[slot].FinishExecute(true);
                        }

                        activeTasksBySlot[slot] = task;
                        task.StartExecute();
                        Console.WriteLine("start " + task.ProfilerName);
                        OnTaskStarted?.Invoke(task);
                    }
                }
            }
        }
示例#2
0
        private void UpdateProgressBar(ProgressBarModel pb)
        {
            ProgressBar.Value      = pb.Value;
            ProgressBar.Content    = pb.Content;
            ProgressBar.Visibility = pb.Visibility;

            if (ProgressBar.Visibility == Visibility.Visible)
            {
                OnTaskStarted?.Invoke();
            }
            if (ProgressBar.Visibility == Visibility.Hidden)
            {
                OnTaskFinished?.Invoke();
            }
        }
        public void ExecuteTask <T>() where T : IAiTask
        {
            foreach (IAiTask task in tasks)
            {
                if (task is T)
                {
                    int slot = task.Slot;

                    activeTasksBySlot[slot]?.FinishExecute(true);

                    activeTasksBySlot[slot] = task;
                    task.StartExecute();
                    OnTaskStarted?.Invoke(task);

                    entity.World.FrameProfiler.Mark(task.ProfilerName);
                }
            }
        }
示例#4
0
        public void ExecuteTask <T>() where T : IAiTask
        {
            foreach (IAiTask task in Tasks)
            {
                if (task is T)
                {
                    int slot = task.Slot;

                    if (ActiveTasksBySlot[slot] != null)
                    {
                        ActiveTasksBySlot[slot].FinishExecute(true);
                    }

                    ActiveTasksBySlot[slot] = task;
                    task.StartExecute();
                    OnTaskStarted?.Invoke(task);
                }
            }

            entity.World.FrameProfiler.Mark("entity-ai-tasks-start-execg");
        }
示例#5
0
        internal void Notify(string key, object data)
        {
            for (int i = 0; i < Tasks.Count; i++)
            {
                IAiTask task = Tasks[i];

                if (task.Notify(key, data))
                {
                    int slot = Tasks[i].Slot;

                    if ((ActiveTasksBySlot[slot] == null || task.Priority > ActiveTasksBySlot[slot].PriorityForCancel))
                    {
                        if (ActiveTasksBySlot[slot] != null)
                        {
                            ActiveTasksBySlot[slot].FinishExecute(true);
                        }

                        ActiveTasksBySlot[slot] = task;
                        task.StartExecute();
                        OnTaskStarted?.Invoke(task);
                    }
                }
            }
        }
示例#6
0
        public void OnGameTick(float dt)
        {
            entity.World.FrameProfiler.Mark("entity-ai-tasks-tick-begin");

            foreach (IAiTask task in Tasks)
            {
                int slot = task.Slot;

                if ((ActiveTasksBySlot[slot] == null || task.Priority > ActiveTasksBySlot[slot].PriorityForCancel) && task.ShouldExecute() && ShouldExecuteTask(task))
                {
                    if (ActiveTasksBySlot[slot] != null)
                    {
                        ActiveTasksBySlot[slot].FinishExecute(true);
                    }

                    ActiveTasksBySlot[slot] = task;
                    task.StartExecute();
                    OnTaskStarted?.Invoke(task);
                }

                if (entity.World.FrameProfiler.Enabled)
                {
                    entity.World.FrameProfiler.Mark("entity-ai-tasks-tick-start-exec" + task.GetType());
                }
            }

            entity.World.FrameProfiler.Mark("entity-ai-tasks-tick-begin-cont");

            for (int i = 0; i < ActiveTasksBySlot.Length; i++)
            {
                IAiTask task = ActiveTasksBySlot[i];
                if (task == null)
                {
                    continue;
                }

                if (!task.ContinueExecute(dt))
                {
                    task.FinishExecute(false);
                    ActiveTasksBySlot[i] = null;
                }

                if (entity.World.FrameProfiler.Enabled)
                {
                    entity.World.FrameProfiler.Mark("entity-ai-tasks-tick-cont-" + task.GetType());
                }
            }


            entity.World.FrameProfiler.Mark("entity-ai-tasks-tick-cont-exec");


            if (entity.World.EntityDebugMode)
            {
                string tasks = "";
                int    j     = 0;
                for (int i = 0; i < ActiveTasksBySlot.Length; i++)
                {
                    IAiTask task = ActiveTasksBySlot[i];
                    if (task == null)
                    {
                        continue;
                    }
                    if (j++ > 0)
                    {
                        tasks += ", ";
                    }

                    string code;
                    AiTaskRegistry.TaskCodes.TryGetValue(task.GetType(), out code);

                    tasks += code + "(" + task.Priority + ")";
                }
                entity.DebugAttributes.SetString("AI Tasks", tasks.Length > 0 ? tasks : "-");
            }
        }
示例#7
0
 /// <summary>
 /// Reports the task started.
 /// </summary>
 /// <param name="taskId">The task identifier.</param>
 /// <param name="clientId">The client identifier.</param>
 public static void ReportTaskStarted(string taskId, string clientId)
 {
     OnTaskStarted?.Invoke(taskId, clientId);
 }
        public void OnGameTick(float dt)
        {
            foreach (IAiTask task in tasks)
            {
                int     slot    = task.Slot;
                IAiTask oldTask = activeTasksBySlot[slot];
                if ((oldTask == null || task.Priority > oldTask.PriorityForCancel) && task.ShouldExecute() && ShouldExecuteTask(task))
                {
                    //if (oldTask!=null) Console.WriteLine("stop " + oldTask.ProfilerName);
                    oldTask?.FinishExecute(true);
                    activeTasksBySlot[slot] = task;
                    task.StartExecute();
                    OnTaskStarted?.Invoke(task);
                    //Console.WriteLine("start " + task.ProfilerName);
                }

                if (entity.World.FrameProfiler.Enabled)
                {
                    entity.World.FrameProfiler.Mark(task.ProfilerName);
                }
            }


            for (int i = 0; i < activeTasksBySlot.Length; i++)
            {
                IAiTask task = activeTasksBySlot[i];
                if (task == null)
                {
                    continue;
                }
                if (!task.CanContinueExecute())
                {
                    continue;
                }

                if (!task.ContinueExecute(dt))
                {
                    task.FinishExecute(false);
                    //Console.WriteLine("stop " + task.ProfilerName);
                    activeTasksBySlot[i] = null;
                }

                if (entity.World.FrameProfiler.Enabled)
                {
                    entity.World.FrameProfiler.Mark("task-continueexec-" + AiTaskRegistry.TaskCodes[task.GetType()]);
                }
            }


            if (entity.World.EntityDebugMode)
            {
                string tasks = "";
                int    j     = 0;
                for (int i = 0; i < activeTasksBySlot.Length; i++)
                {
                    IAiTask task = activeTasksBySlot[i];
                    if (task == null)
                    {
                        continue;
                    }
                    if (j++ > 0)
                    {
                        tasks += ", ";
                    }

                    string code;
                    AiTaskRegistry.TaskCodes.TryGetValue(task.GetType(), out code);

                    tasks += code + "(p" + task.Priority + ", pc" + task.PriorityForCancel + ")";
#if DEBUG
                    // temporary for debugging
                    if (entity.Properties.Habitat == EnumHabitat.Underwater && task is AiTaskWander wand)
                    {
                        tasks += String.Format(" Heading to: {0:0.00},{1:0.00},{2:0.00}", wand.MainTarget.X - 500000, wand.MainTarget.Y, wand.MainTarget.Z - 500000);
                    }
#endif
                }
                entity.DebugAttributes.SetString("AI Tasks", tasks.Length > 0 ? tasks : "-");
            }
        }