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 func_85156_a(EntityAIBase par1EntityAIBase)
031 {
032 Iterator var2 = this.taskEntries.iterator();
033
034 while (var2.hasNext())
035 {
036 EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next();
037 EntityAIBase var4 = var3.action;
038
039 if (var4 == par1EntityAIBase)
040 {
041 if (this.executingTaskEntries.contains(var3))
042 {
043 var4.resetTask();
044 this.executingTaskEntries.remove(var3);
045 }
046
047 var2.remove();
048 }
049 }
050 }
051
052 public void onUpdateTasks()
053 {
054 ArrayList var1 = new ArrayList();
055 Iterator var2;
056 EntityAITaskEntry var3;
057
058 if (this.field_75778_d++ % this.field_75779_e == 0)
059 {
060 var2 = this.taskEntries.iterator();
061
062 while (var2.hasNext())
063 {
064 var3 = (EntityAITaskEntry)var2.next();
065 boolean var4 = this.executingTaskEntries.contains(var3);
066
067 if (var4)
068 {
069 if (this.func_75775_b(var3) && this.func_75773_a(var3))
070 {
071 continue;
072 }
073
074 var3.action.resetTask();
075 this.executingTaskEntries.remove(var3);
076 }
077
078 if (this.func_75775_b(var3) && var3.action.shouldExecute())
079 {
080 var1.add(var3);
081 this.executingTaskEntries.add(var3);
082 }
083 }
084 }
085 else
086 {
087 var2 = this.executingTaskEntries.iterator();
088
089 while (var2.hasNext())
090 {
091 var3 = (EntityAITaskEntry)var2.next();
092
093 if (!var3.action.continueExecuting())
094 {
095 var3.action.resetTask();
096 var2.remove();
097 }
098 }
099 }
100
101 this.theProfiler.startSection("goalStart");
102 var2 = var1.iterator();
103
104 while (var2.hasNext())
105 {
106 var3 = (EntityAITaskEntry)var2.next();
107 this.theProfiler.startSection(var3.action.getClass().getSimpleName());
108 var3.action.startExecuting();
109 this.theProfiler.endSection();
110 }
111
112 this.theProfiler.endSection();
113 this.theProfiler.startSection("goalTick");
114 var2 = this.executingTaskEntries.iterator();
115
116 while (var2.hasNext())
117 {
118 var3 = (EntityAITaskEntry)var2.next();
119 var3.action.updateTask();
120 }
121
122 this.theProfiler.endSection();
123 }
124
125 private boolean func_75773_a(EntityAITaskEntry par1EntityAITaskEntry)
126 {
127 this.theProfiler.startSection("canContinue");
128 boolean var2 = par1EntityAITaskEntry.action.continueExecuting();
129 this.theProfiler.endSection();
130 return var2;
131 }
132
133 private boolean func_75775_b(EntityAITaskEntry par1EntityAITaskEntry)
134 {
135 this.theProfiler.startSection("canUse");
136 Iterator var2 = this.taskEntries.iterator();
137
138 while (var2.hasNext())
139 {
140 EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next();
141
142 if (var3 != par1EntityAITaskEntry)
143 {
144 if (par1EntityAITaskEntry.priority >= var3.priority)
145 {
146 if (this.executingTaskEntries.contains(var3) && !this.areTasksCompatible(par1EntityAITaskEntry, var3))
147 {
148 this.theProfiler.endSection();
149 return false;
150 }
151 }
152 else if (this.executingTaskEntries.contains(var3) && !var3.action.isContinuous())
153 {
154 this.theProfiler.endSection();
155 return false;
156 }
157 }
158 }
159
160 this.theProfiler.endSection();
161 return true;
162 }
163
164 /**
165 * Returns whether two EntityAITaskEntries can be executed concurrently
166 */
167 private boolean areTasksCompatible(EntityAITaskEntry par1EntityAITaskEntry, EntityAITaskEntry par2EntityAITaskEntry)
168 {
169 return (par1EntityAITaskEntry.action.getMutexBits() & par2EntityAITaskEntry.action.getMutexBits()) == 0;
170 }
171 }