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 func_85156_a(EntityAIBase par1EntityAIBase)
031        {
032            Iterator var2 = this.taskEntries.iterator();
033    
034            while (var2.hasNext())
035            {
036                EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next();
037                EntityAIBase var4 = var3.action;
038    
039                if (var4 == par1EntityAIBase)
040                {
041                    if (this.executingTaskEntries.contains(var3))
042                    {
043                        var4.resetTask();
044                        this.executingTaskEntries.remove(var3);
045                    }
046    
047                    var2.remove();
048                }
049            }
050        }
051    
052        public void onUpdateTasks()
053        {
054            ArrayList var1 = new ArrayList();
055            Iterator var2;
056            EntityAITaskEntry var3;
057    
058            if (this.field_75778_d++ % this.field_75779_e == 0)
059            {
060                var2 = this.taskEntries.iterator();
061    
062                while (var2.hasNext())
063                {
064                    var3 = (EntityAITaskEntry)var2.next();
065                    boolean var4 = this.executingTaskEntries.contains(var3);
066    
067                    if (var4)
068                    {
069                        if (this.func_75775_b(var3) && this.func_75773_a(var3))
070                        {
071                            continue;
072                        }
073    
074                        var3.action.resetTask();
075                        this.executingTaskEntries.remove(var3);
076                    }
077    
078                    if (this.func_75775_b(var3) && var3.action.shouldExecute())
079                    {
080                        var1.add(var3);
081                        this.executingTaskEntries.add(var3);
082                    }
083                }
084            }
085            else
086            {
087                var2 = this.executingTaskEntries.iterator();
088    
089                while (var2.hasNext())
090                {
091                    var3 = (EntityAITaskEntry)var2.next();
092    
093                    if (!var3.action.continueExecuting())
094                    {
095                        var3.action.resetTask();
096                        var2.remove();
097                    }
098                }
099            }
100    
101            this.theProfiler.startSection("goalStart");
102            var2 = var1.iterator();
103    
104            while (var2.hasNext())
105            {
106                var3 = (EntityAITaskEntry)var2.next();
107                this.theProfiler.startSection(var3.action.getClass().getSimpleName());
108                var3.action.startExecuting();
109                this.theProfiler.endSection();
110            }
111    
112            this.theProfiler.endSection();
113            this.theProfiler.startSection("goalTick");
114            var2 = this.executingTaskEntries.iterator();
115    
116            while (var2.hasNext())
117            {
118                var3 = (EntityAITaskEntry)var2.next();
119                var3.action.updateTask();
120            }
121    
122            this.theProfiler.endSection();
123        }
124    
125        private boolean func_75773_a(EntityAITaskEntry par1EntityAITaskEntry)
126        {
127            this.theProfiler.startSection("canContinue");
128            boolean var2 = par1EntityAITaskEntry.action.continueExecuting();
129            this.theProfiler.endSection();
130            return var2;
131        }
132    
133        private boolean func_75775_b(EntityAITaskEntry par1EntityAITaskEntry)
134        {
135            this.theProfiler.startSection("canUse");
136            Iterator var2 = this.taskEntries.iterator();
137    
138            while (var2.hasNext())
139            {
140                EntityAITaskEntry var3 = (EntityAITaskEntry)var2.next();
141    
142                if (var3 != par1EntityAITaskEntry)
143                {
144                    if (par1EntityAITaskEntry.priority >= var3.priority)
145                    {
146                        if (this.executingTaskEntries.contains(var3) && !this.areTasksCompatible(par1EntityAITaskEntry, var3))
147                        {
148                            this.theProfiler.endSection();
149                            return false;
150                        }
151                    }
152                    else if (this.executingTaskEntries.contains(var3) && !var3.action.isContinuous())
153                    {
154                        this.theProfiler.endSection();
155                        return false;
156                    }
157                }
158            }
159    
160            this.theProfiler.endSection();
161            return true;
162        }
163    
164        /**
165         * Returns whether two EntityAITaskEntries can be executed concurrently
166         */
167        private boolean areTasksCompatible(EntityAITaskEntry par1EntityAITaskEntry, EntityAITaskEntry par2EntityAITaskEntry)
168        {
169            return (par1EntityAITaskEntry.action.getMutexBits() & par2EntityAITaskEntry.action.getMutexBits()) == 0;
170        }
171    }