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