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 }