package net.minecraft.entity.ai; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.profiler.Profiler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class EntityAITasks { private static final Logger logger = LogManager.getLogger(); /** A list of EntityAITaskEntrys in EntityAITasks. */ public List taskEntries = new ArrayList(); /** A list of EntityAITaskEntrys that are currently being executed. */ private List executingTaskEntries = new ArrayList(); /** Instance of Profiler. */ private final Profiler theProfiler; private int tickCount; private int tickRate = 3; private static final String __OBFID = "CL_00001588"; public EntityAITasks(Profiler p_i1628_1_) { this.theProfiler = p_i1628_1_; } /** * Add a now AITask. Args : priority, task */ public void addTask(int p_75776_1_, EntityAIBase p_75776_2_) { this.taskEntries.add(new EntityAITasks.EntityAITaskEntry(p_75776_1_, p_75776_2_)); } /** * removes the indicated task from the entity's AI tasks. */ public void removeTask(EntityAIBase p_85156_1_) { Iterator iterator = this.taskEntries.iterator(); while (iterator.hasNext()) { EntityAITasks.EntityAITaskEntry entityaitaskentry = (EntityAITasks.EntityAITaskEntry)iterator.next(); EntityAIBase entityaibase1 = entityaitaskentry.action; if (entityaibase1 == p_85156_1_) { if (this.executingTaskEntries.contains(entityaitaskentry)) { entityaibase1.resetTask(); this.executingTaskEntries.remove(entityaitaskentry); } iterator.remove(); } } } public void onUpdateTasks() { ArrayList arraylist = new ArrayList(); Iterator iterator; EntityAITasks.EntityAITaskEntry entityaitaskentry; if (this.tickCount++ % this.tickRate == 0) { iterator = this.taskEntries.iterator(); while (iterator.hasNext()) { entityaitaskentry = (EntityAITasks.EntityAITaskEntry)iterator.next(); boolean flag = this.executingTaskEntries.contains(entityaitaskentry); if (flag) { if (this.canUse(entityaitaskentry) && this.canContinue(entityaitaskentry)) { continue; } entityaitaskentry.action.resetTask(); this.executingTaskEntries.remove(entityaitaskentry); } if (this.canUse(entityaitaskentry) && entityaitaskentry.action.shouldExecute()) { arraylist.add(entityaitaskentry); this.executingTaskEntries.add(entityaitaskentry); } } } else { iterator = this.executingTaskEntries.iterator(); while (iterator.hasNext()) { entityaitaskentry = (EntityAITasks.EntityAITaskEntry)iterator.next(); if (!entityaitaskentry.action.continueExecuting()) { entityaitaskentry.action.resetTask(); iterator.remove(); } } } this.theProfiler.startSection("goalStart"); iterator = arraylist.iterator(); while (iterator.hasNext()) { entityaitaskentry = (EntityAITasks.EntityAITaskEntry)iterator.next(); this.theProfiler.startSection(entityaitaskentry.action.getClass().getSimpleName()); entityaitaskentry.action.startExecuting(); this.theProfiler.endSection(); } this.theProfiler.endSection(); this.theProfiler.startSection("goalTick"); iterator = this.executingTaskEntries.iterator(); while (iterator.hasNext()) { entityaitaskentry = (EntityAITasks.EntityAITaskEntry)iterator.next(); entityaitaskentry.action.updateTask(); } this.theProfiler.endSection(); } /** * Determine if a specific AI Task should continue being executed. */ private boolean canContinue(EntityAITasks.EntityAITaskEntry p_75773_1_) { this.theProfiler.startSection("canContinue"); boolean flag = p_75773_1_.action.continueExecuting(); this.theProfiler.endSection(); return flag; } /** * Determine if a specific AI Task can be executed, which means that all running higher (= lower int value) priority * tasks are compatible with it or all lower priority tasks can be interrupted. */ private boolean canUse(EntityAITasks.EntityAITaskEntry p_75775_1_) { this.theProfiler.startSection("canUse"); Iterator iterator = this.taskEntries.iterator(); while (iterator.hasNext()) { EntityAITasks.EntityAITaskEntry entityaitaskentry = (EntityAITasks.EntityAITaskEntry)iterator.next(); if (entityaitaskentry != p_75775_1_) { if (p_75775_1_.priority >= entityaitaskentry.priority) { if (this.executingTaskEntries.contains(entityaitaskentry) && !this.areTasksCompatible(p_75775_1_, entityaitaskentry)) { this.theProfiler.endSection(); return false; } } else if (this.executingTaskEntries.contains(entityaitaskentry) && !entityaitaskentry.action.isInterruptible()) { this.theProfiler.endSection(); return false; } } } this.theProfiler.endSection(); return true; } /** * Returns whether two EntityAITaskEntries can be executed concurrently */ private boolean areTasksCompatible(EntityAITasks.EntityAITaskEntry p_75777_1_, EntityAITasks.EntityAITaskEntry p_75777_2_) { return (p_75777_1_.action.getMutexBits() & p_75777_2_.action.getMutexBits()) == 0; } public class EntityAITaskEntry { /** The EntityAIBase object. */ public EntityAIBase action; /** Priority of the EntityAIBase */ public int priority; private static final String __OBFID = "CL_00001589"; public EntityAITaskEntry(int p_i1627_2_, EntityAIBase p_i1627_3_) { this.priority = p_i1627_2_; this.action = p_i1627_3_; } } }