package net.minecraft.entity.ai;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.minecraft.profiler.Profiler;
public class EntityAITasks
{
/** A list of EntityAITaskEntrys in EntityAITasks. */
public List taskEntries = new ArrayList();
/** A list of EntityAITaskEntrys that are currently being executed. */
private List executingTaskEntries = new ArrayList();
/** Instance of Profiler. */
private final Profiler theProfiler;
private int field_75778_d = 0;
private int field_75779_e = 3;
public EntityAITasks(Profiler par1Profiler)
{
this.theProfiler = par1Profiler;
}
public void addTask(int par1, EntityAIBase par2EntityAIBase)
{
this.taskEntries.add(new EntityAITaskEntry(this, par1, par2EntityAIBase));
}
/**
* removes the indicated task from the entity's AI tasks.
*/
public void removeTask(EntityAIBase par1EntityAIBase)
{
Iterator iterator = this.taskEntries.iterator();
while (iterator.hasNext())
{
EntityAITaskEntry entityaitaskentry = (EntityAITaskEntry)iterator.next();
EntityAIBase entityaibase1 = entityaitaskentry.action;
if (entityaibase1 == par1EntityAIBase)
{
if (this.executingTaskEntries.contains(entityaitaskentry))
{
entityaibase1.resetTask();
this.executingTaskEntries.remove(entityaitaskentry);
}
iterator.remove();
}
}
}
public void onUpdateTasks()
{
ArrayList arraylist = new ArrayList();
Iterator iterator;
EntityAITaskEntry entityaitaskentry;
if (this.field_75778_d++ % this.field_75779_e == 0)
{
iterator = this.taskEntries.iterator();
while (iterator.hasNext())
{
entityaitaskentry = (EntityAITaskEntry)iterator.next();
boolean flag = this.executingTaskEntries.contains(entityaitaskentry);
if (flag)
{
if (this.canUse(entityaitaskentry) && this.canContinue(entityaitaskentry))
{
continue;
}
entityaitaskentry.action.resetTask();
this.executingTaskEntries.remove(entityaitaskentry);
}
if (this.canUse(entityaitaskentry) && entityaitaskentry.action.shouldExecute())
{
arraylist.add(entityaitaskentry);
this.executingTaskEntries.add(entityaitaskentry);
}
}
}
else
{
iterator = this.executingTaskEntries.iterator();
while (iterator.hasNext())
{
entityaitaskentry = (EntityAITaskEntry)iterator.next();
if (!entityaitaskentry.action.continueExecuting())
{
entityaitaskentry.action.resetTask();
iterator.remove();
}
}
}
this.theProfiler.startSection("goalStart");
iterator = arraylist.iterator();
while (iterator.hasNext())
{
entityaitaskentry = (EntityAITaskEntry)iterator.next();
this.theProfiler.startSection(entityaitaskentry.action.getClass().getSimpleName());
entityaitaskentry.action.startExecuting();
this.theProfiler.endSection();
}
this.theProfiler.endSection();
this.theProfiler.startSection("goalTick");
iterator = this.executingTaskEntries.iterator();
while (iterator.hasNext())
{
entityaitaskentry = (EntityAITaskEntry)iterator.next();
entityaitaskentry.action.updateTask();
}
this.theProfiler.endSection();
}
/**
* Determine if a specific AI Task should continue being executed.
*/
private boolean canContinue(EntityAITaskEntry par1EntityAITaskEntry)
{
this.theProfiler.startSection("canContinue");
boolean flag = par1EntityAITaskEntry.action.continueExecuting();
this.theProfiler.endSection();
return flag;
}
/**
* Determine if a specific AI Task can be executed, which means that all running higher (= lower int value) priority
* tasks are compatible with it or all lower priority tasks can be interrupted.
*/
private boolean canUse(EntityAITaskEntry par1EntityAITaskEntry)
{
this.theProfiler.startSection("canUse");
Iterator iterator = this.taskEntries.iterator();
while (iterator.hasNext())
{
EntityAITaskEntry entityaitaskentry1 = (EntityAITaskEntry)iterator.next();
if (entityaitaskentry1 != par1EntityAITaskEntry)
{
if (par1EntityAITaskEntry.priority >= entityaitaskentry1.priority)
{
if (this.executingTaskEntries.contains(entityaitaskentry1) && !this.areTasksCompatible(par1EntityAITaskEntry, entityaitaskentry1))
{
this.theProfiler.endSection();
return false;
}
}
else if (this.executingTaskEntries.contains(entityaitaskentry1) && !entityaitaskentry1.action.isInterruptible())
{
this.theProfiler.endSection();
return false;
}
}
}
this.theProfiler.endSection();
return true;
}
/**
* Returns whether two EntityAITaskEntries can be executed concurrently
*/
private boolean areTasksCompatible(EntityAITaskEntry par1EntityAITaskEntry, EntityAITaskEntry par2EntityAITaskEntry)
{
return (par1EntityAITaskEntry.action.getMutexBits() & par2EntityAITaskEntry.action.getMutexBits()) == 0;
}
}