    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    }