001 package net.minecraft.src;
002
003 import java.util.ArrayList;
004 import java.util.Iterator;
005 import java.util.List;
006
007 public class EntityAITasks
008 {
009 /** A list of EntityAITaskEntrys in EntityAITasks. */
010 public List taskEntries = new ArrayList();
011
012 /** A list of EntityAITaskEntrys that are currently being executed. */
013 private List executingTaskEntries = new ArrayList();
014
015 /** Instance of Profiler. */
016 private final Profiler theProfiler;
017 private int field_75778_d = 0;
018 private int field_75779_e = 3;
019
020 public EntityAITasks(Profiler par1Profiler)
021 {
022 this.theProfiler = par1Profiler;
023 }
024
025 public void addTask(int par1, EntityAIBase par2EntityAIBase)
026 {
027 this.taskEntries.add(new EntityAITaskEntry(this, par1, par2EntityAIBase));
028 }
029
030 public void onUpdateTasks()
031 {
032 ArrayList var1 = new ArrayList();
033 Iterator var2;
034 EntityAITaskEntry var3;
035
036 if (this.field_75778_d++ % this.field_75779_e == 0)
037 {
038 var2 = this.taskEntries.iterator();
039
040 while (var2.hasNext())
041 {
042 var3 = (EntityAITaskEntry)var2.next();
043 boolean var4 = this.executingTaskEntries.contains(var3);
044
045 if (var4)
046 {
047 if (this.func_75775_b(var3) && this.func_75773_a(var3))
048 {
049 continue;
050 }
051
052 var3.action.resetTask();
053 this.executingTaskEntries.remove(var3);
054 }
055
056 if (this.func_75775_b(var3) && var3.action.shouldExecute())
057 {
058 var1.add(var3);
059 this.executingTaskEntries.add(var3);
060 }
061 }
062 }
063 else
064 {
065 var2 = this.executingTaskEntries.iterator();
066
067 while (var2.hasNext())
068 {
069 var3 = (EntityAITaskEntry)var2.next();
070
071 if (!var3.action.continueExecuting())
072 {
073 var3.action.resetTask();
074 var2.remove();
075 }
076 }
077 }
078
079 this.theProfiler.startSection("goalStart");
080 var2 = var1.iterator();
081
082 while (var2.hasNext())
083 {
084 var3 = (EntityAITaskEntry)var2.next();
085 this.theProfiler.startSection(var3.action.getClass().getSimpleName());
086 var3.action.startExecuting();
087 this.theProfiler.endSection();
088 }
089
090 this.theProfiler.endSection();
091 this.theProfiler.startSection("goalTick");
092 var2 = this.executingTaskEntries.iterator();
093
094 while (var2.hasNext())
095 {
096 var3 = (EntityAITaskEntry)var2.next();
097 var3.action.updateTask();
098 }
099
100 this.theProfiler.endSection();
101 }
102
103 private boolean func_75773_a(EntityAITaskEntry par1EntityAITaskEntry)
104 {
105 this.theProfiler.startSection("canContinue");
106 boolean var2 = par1EntityAITaskEntry.action.continueExecuting();
107 this.theProfiler.endSection();
108 return var2;
109 }
110
111 private boolean func_75775_b(EntityAITaskEntry par1EntityAITaskEntry)
112 {
113 this.theProfiler.startSection("canUse");
114 Iterator var2 = this.taskEntries.iterator();
115
116 while (var2.hasNext())
117 {
118 EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next();
119
120 if (var3 != par1EntityAITaskEntry)
121 {
122 if (par1EntityAITaskEntry.priority >= var3.priority)
123 {
124 if (this.executingTaskEntries.contains(var3) && !this.areTasksCompatible(par1EntityAITaskEntry, var3))
125 {
126 this.theProfiler.endSection();
127 return false;
128 }
129 }
130 else if (this.executingTaskEntries.contains(var3) && !var3.action.isContinuous())
131 {
132 this.theProfiler.endSection();
133 return false;
134 }
135 }
136 }
137
138 this.theProfiler.endSection();
139 return true;
140 }
141
142 /**
143 * Returns whether two EntityAITaskEntries can be executed concurrently
144 */
145 private boolean areTasksCompatible(EntityAITaskEntry par1EntityAITaskEntry, EntityAITaskEntry par2EntityAITaskEntry)
146 {
147 return (par1EntityAITaskEntry.action.getMutexBits() & par2EntityAITaskEntry.action.getMutexBits()) == 0;
148 }
149 }