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    }