public void ExecuteTask(IAiTask task, int slot) { task.StartExecute(); ActiveTasksBySlot[slot] = task; //entity.World.FrameProfiler.Mark("entity-ai-tasks-start-exec" + task.GetType()); }
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); } } } }
private void EntityGlowingAgent_OnTaskStarted(IAiTask task) { if (task is AiTaskSeekEntity) { WatchedAttributes.SetFloat("aggroTime", 10); } }
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); } }
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()]); } }
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 : "-"); } }
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); }
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); } }
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(); } } } }
public void RemoveTask(IAiTask task) { Tasks.Remove(task); }
public void AddTask(IAiTask task) { Tasks.Add(task); }
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 : "-"); } }
public void ExecuteTask(IAiTask task, int slot) { task.StartExecute(); ActiveTasksBySlot[slot] = task; }
public void AddTask(IAiTask task) { tasks.Add(task); task.ProfilerName = "task-startexecute-" + AiTaskRegistry.TaskCodes[task.GetType()]; }
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 : "-"); } }
public override bool ShouldExecuteTask(IAiTask task) { return(tradingWith == null || (task is AiTaskIdle || task is AiTaskSeekEntity || task is AiTaskGotoEntity)); }