コード例 #1
0
        public void ExecuteTask(IAiTask task, int slot)
        {
            task.StartExecute();
            ActiveTasksBySlot[slot] = task;

            //entity.World.FrameProfiler.Mark("entity-ai-tasks-start-exec" + task.GetType());
        }
コード例 #2
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();
                        Console.WriteLine("start " + task.ProfilerName);
                        OnTaskStarted?.Invoke(task);
                    }
                }
            }
        }
コード例 #3
0
 private void EntityGlowingAgent_OnTaskStarted(IAiTask task)
 {
     if (task is AiTaskSeekEntity)
     {
         WatchedAttributes.SetFloat("aggroTime", 10);
     }
 }
コード例 #4
0
        public override void Initialize(EntityProperties properties, JsonObject aiconfig)
        {
            if (!(entity is EntityAgent))
            {
                entity.World.Logger.Error("The task ai currently only works on entities inheriting from. EntityLiving. Will ignore loading tasks for entity {0} ", entity.Code);
                return;
            }

            JsonObject[] tasks = aiconfig["aitasks"]?.AsArray();
            if (tasks == null)
            {
                return;
            }

            foreach (JsonObject taskConfig in tasks)
            {
                string taskCode = taskConfig["code"]?.AsString();
                Type   taskType = null;
                if (!AiTaskManager.TaskTypes.TryGetValue(taskCode, out taskType))
                {
                    entity.World.Logger.Error("Task with code {0} for entity {1} does not exist. Ignoring.", taskCode, entity.Code);
                    continue;
                }

                IAiTask task = (IAiTask)Activator.CreateInstance(taskType, (EntityAgent)entity);
                task.LoadConfig(taskConfig, aiconfig);

                taskManager.AddTask(task);
            }
        }
コード例 #5
0
        public void ExecuteTask(IAiTask task, int slot)
        {
            task.StartExecute();
            activeTasksBySlot[slot] = task;

            if (entity.World.FrameProfiler.Enabled)
            {
                entity.World.FrameProfiler.Mark("task-startexecute-" + AiTaskRegistry.TaskCodes[task.GetType()]);
            }
        }
コード例 #6
0
        public void OnGameTick(float dt)
        {
            foreach (IAiTask task in Tasks)
            {
                int slot = task.Slot;

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

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


            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.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 += ", ";
                    }
                    tasks += TaskCodes[task.GetType()] + "(" + task.Priority + ")";
                }
                entity.DebugAttributes.SetString("AI Tasks", tasks.Length > 0 ? tasks : "-");
            }
        }
コード例 #7
0
        private bool ShouldExecuteTask(IAiTask task)
        {
            if (OnShouldExecuteTask == null)
            {
                return(true);
            }
            bool exec = true;

            foreach (ActionBoolReturn <IAiTask> dele in OnShouldExecuteTask.GetInvocationList())
            {
                exec &= dele(task);
            }

            return(exec);
        }
コード例 #8
0
        public override void Initialize(EntityProperties properties, JsonObject aiconfig)
        {
            if (!(entity is EntityAgent))
            {
                entity.World.Logger.Error("The task ai currently only works on entities inheriting from EntityAgent. Will ignore loading tasks for entity {0} ", entity.Code);
                return;
            }

            PathTraverser = new WaypointsTraverser(entity as EntityAgent);

            JsonObject[] tasks = aiconfig["aitasks"]?.AsArray();
            if (tasks == null)
            {
                return;
            }

            foreach (JsonObject taskConfig in tasks)
            {
                string taskCode = taskConfig["code"]?.AsString();
                bool   enabled  = taskConfig["enabled"].AsBool(true);
                if (!enabled)
                {
                    continue;
                }

                Type taskType = null;
                if (!AiTaskRegistry.TaskTypes.TryGetValue(taskCode, out taskType))
                {
                    entity.World.Logger.Error("Task with code {0} for entity {1} does not exist. Ignoring.", taskCode, entity.Code);
                    continue;
                }

                IAiTask task = (IAiTask)Activator.CreateInstance(taskType, (EntityAgent)entity);

                try
                {
                    task.LoadConfig(taskConfig, aiconfig);
                } catch (Exception e)
                {
                    entity.World.Logger.Error("Task with code {0} for entity {1}: Unable to load json code.", taskCode, entity.Code);
                    throw e;
                }

                TaskManager.AddTask(task);
            }
        }
コード例 #9
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();
                    }
                }
            }
        }
コード例 #10
0
 public void RemoveTask(IAiTask task)
 {
     Tasks.Remove(task);
 }
コード例 #11
0
 public void AddTask(IAiTask task)
 {
     Tasks.Add(task);
 }
コード例 #12
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 : "-");
            }
        }
コード例 #13
0
 public void ExecuteTask(IAiTask task, int slot)
 {
     task.StartExecute();
     ActiveTasksBySlot[slot] = task;
 }
コード例 #14
0
 public void AddTask(IAiTask task)
 {
     tasks.Add(task);
     task.ProfilerName = "task-startexecute-" + AiTaskRegistry.TaskCodes[task.GetType()];
 }
コード例 #15
0
        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 : "-");
            }
        }
コード例 #16
0
 public override bool ShouldExecuteTask(IAiTask task)
 {
     return(tradingWith == null || (task is AiTaskIdle || task is AiTaskSeekEntity || task is AiTaskGotoEntity));
 }