package net.minecraft.entity.ai; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.profiler.Profiler; public class EntityAITasks { /** 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 field_75778_d = 0; private int field_75779_e = 3; public EntityAITasks(Profiler par1Profiler) { this.theProfiler = par1Profiler; } public void addTask(int par1, EntityAIBase par2EntityAIBase) { this.taskEntries.add(new EntityAITaskEntry(this, par1, par2EntityAIBase)); } public void func_85156_a(EntityAIBase par1EntityAIBase) { Iterator var2 = this.taskEntries.iterator(); while (var2.hasNext()) { EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next(); EntityAIBase var4 = var3.action; if (var4 == par1EntityAIBase) { if (this.executingTaskEntries.contains(var3)) { var4.resetTask(); this.executingTaskEntries.remove(var3); } var2.remove(); } } } public void onUpdateTasks() { ArrayList var1 = new ArrayList(); Iterator var2; EntityAITaskEntry var3; if (this.field_75778_d++ % this.field_75779_e == 0) { var2 = this.taskEntries.iterator(); while (var2.hasNext()) { var3 = (EntityAITaskEntry)var2.next(); boolean var4 = this.executingTaskEntries.contains(var3); if (var4) { if (this.func_75775_b(var3) && this.func_75773_a(var3)) { continue; } var3.action.resetTask(); this.executingTaskEntries.remove(var3); } if (this.func_75775_b(var3) && var3.action.shouldExecute()) { var1.add(var3); this.executingTaskEntries.add(var3); } } } else { var2 = this.executingTaskEntries.iterator(); while (var2.hasNext()) { var3 = (EntityAITaskEntry)var2.next(); if (!var3.action.continueExecuting()) { var3.action.resetTask(); var2.remove(); } } } this.theProfiler.startSection("goalStart"); var2 = var1.iterator(); while (var2.hasNext()) { var3 = (EntityAITaskEntry)var2.next(); this.theProfiler.startSection(var3.action.getClass().getSimpleName()); var3.action.startExecuting(); this.theProfiler.endSection(); } this.theProfiler.endSection(); this.theProfiler.startSection("goalTick"); var2 = this.executingTaskEntries.iterator(); while (var2.hasNext()) { var3 = (EntityAITaskEntry)var2.next(); var3.action.updateTask(); } this.theProfiler.endSection(); } private boolean func_75773_a(EntityAITaskEntry par1EntityAITaskEntry) { this.theProfiler.startSection("canContinue"); boolean var2 = par1EntityAITaskEntry.action.continueExecuting(); this.theProfiler.endSection(); return var2; } private boolean func_75775_b(EntityAITaskEntry par1EntityAITaskEntry) { this.theProfiler.startSection("canUse"); Iterator var2 = this.taskEntries.iterator(); while (var2.hasNext()) { EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next(); if (var3 != par1EntityAITaskEntry) { if (par1EntityAITaskEntry.priority >= var3.priority) { if (this.executingTaskEntries.contains(var3) && !this.areTasksCompatible(par1EntityAITaskEntry, var3)) { this.theProfiler.endSection(); return false; } } else if (this.executingTaskEntries.contains(var3) && !var3.action.isContinuous()) { this.theProfiler.endSection(); return false; } } } this.theProfiler.endSection(); return true; } /** * Returns whether two EntityAITaskEntries can be executed concurrently */ private boolean areTasksCompatible(EntityAITaskEntry par1EntityAITaskEntry, EntityAITaskEntry par2EntityAITaskEntry) { return (par1EntityAITaskEntry.action.getMutexBits() & par2EntityAITaskEntry.action.getMutexBits()) == 0; } }