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    }