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