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 this.theProfiler.startSection(var3.action.getClass().getSimpleName()); 098 var3.action.updateTask(); 099 this.theProfiler.endSection(); 100 } 101 102 this.theProfiler.endSection(); 103 } 104 105 private boolean func_75773_a(EntityAITaskEntry par1EntityAITaskEntry) 106 { 107 this.theProfiler.startSection("canContinue"); 108 boolean var2 = par1EntityAITaskEntry.action.continueExecuting(); 109 this.theProfiler.endSection(); 110 return var2; 111 } 112 113 private boolean func_75775_b(EntityAITaskEntry par1EntityAITaskEntry) 114 { 115 this.theProfiler.startSection("canUse"); 116 Iterator var2 = this.taskEntries.iterator(); 117 118 while (var2.hasNext()) 119 { 120 EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next(); 121 122 if (var3 != par1EntityAITaskEntry) 123 { 124 if (par1EntityAITaskEntry.priority >= var3.priority) 125 { 126 if (this.executingTaskEntries.contains(var3) && !this.areTasksCompatible(par1EntityAITaskEntry, var3)) 127 { 128 this.theProfiler.endSection(); 129 return false; 130 } 131 } 132 else if (this.executingTaskEntries.contains(var3) && !var3.action.isContinuous()) 133 { 134 this.theProfiler.endSection(); 135 return false; 136 } 137 } 138 } 139 140 this.theProfiler.endSection(); 141 return true; 142 } 143 144 /** 145 * Returns whether two EntityAITaskEntries can be executed concurrently 146 */ 147 private boolean areTasksCompatible(EntityAITaskEntry par1EntityAITaskEntry, EntityAITaskEntry par2EntityAITaskEntry) 148 { 149 return (par1EntityAITaskEntry.action.getMutexBits() & par2EntityAITaskEntry.action.getMutexBits()) == 0; 150 } 151 }