package net.minecraft.entity.ai;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
import net.minecraft.profiler.Profiler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class EntityAITasks
{
private static final Logger logger = LogManager.getLogger();
/** A list of EntityAITaskEntrys in EntityAITasks. */
private List taskEntries = Lists.newArrayList();
/** A list of EntityAITaskEntrys that are currently being executed. */
private List executingTaskEntries = Lists.newArrayList();
/** Instance of Profiler. */
private final Profiler theProfiler;
private int tickCount;
private int tickRate = 3;
private static final String __OBFID = "CL_00001588";
public EntityAITasks(Profiler p_i1628_1_)
{
this.theProfiler = p_i1628_1_;
}
/**
* Add a now AITask. Args : priority, task
*/
public void addTask(int p_75776_1_, EntityAIBase p_75776_2_)
{
this.taskEntries.add(new EntityAITasks.EntityAITaskEntry(p_75776_1_, p_75776_2_));
}
/**
* removes the indicated task from the entity's AI tasks.
*/
public void removeTask(EntityAIBase p_85156_1_)
{
Iterator var2 = this.taskEntries.iterator();
while (var2.hasNext())
{
EntityAITasks.EntityAITaskEntry var3 = (EntityAITasks.EntityAITaskEntry)var2.next();
EntityAIBase var4 = var3.action;
if (var4 == p_85156_1_)
{
if (this.executingTaskEntries.contains(var3))
{
var4.resetTask();
this.executingTaskEntries.remove(var3);
}
var2.remove();
}
}
}
public void onUpdateTasks()
{
this.theProfiler.startSection("goalSetup");
Iterator var1;
EntityAITasks.EntityAITaskEntry var2;
if (this.tickCount++ % this.tickRate == 0)
{
var1 = this.taskEntries.iterator();
while (var1.hasNext())
{
var2 = (EntityAITasks.EntityAITaskEntry)var1.next();
boolean var3 = this.executingTaskEntries.contains(var2);
if (var3)
{
if (this.canUse(var2) && this.canContinue(var2))
{
continue;
}
var2.action.resetTask();
this.executingTaskEntries.remove(var2);
}
if (this.canUse(var2) && var2.action.shouldExecute())
{
var2.action.startExecuting();
this.executingTaskEntries.add(var2);
}
}
}
else
{
var1 = this.executingTaskEntries.iterator();
while (var1.hasNext())
{
var2 = (EntityAITasks.EntityAITaskEntry)var1.next();
if (!this.canContinue(var2))
{
var2.action.resetTask();
var1.remove();
}
}
}
this.theProfiler.endSection();
this.theProfiler.startSection("goalTick");
var1 = this.executingTaskEntries.iterator();
while (var1.hasNext())
{
var2 = (EntityAITasks.EntityAITaskEntry)var1.next();
var2.action.updateTask();
}
this.theProfiler.endSection();
}
/**
* Determine if a specific AI Task should continue being executed.
*/
private boolean canContinue(EntityAITasks.EntityAITaskEntry p_75773_1_)
{
boolean var2 = p_75773_1_.action.continueExecuting();
return var2;
}
/**
* 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(EntityAITasks.EntityAITaskEntry p_75775_1_)
{
Iterator var2 = this.taskEntries.iterator();
while (var2.hasNext())
{
EntityAITasks.EntityAITaskEntry var3 = (EntityAITasks.EntityAITaskEntry)var2.next();
if (var3 != p_75775_1_)
{
if (p_75775_1_.priority >= var3.priority)
{
if (!this.areTasksCompatible(p_75775_1_, var3) && this.executingTaskEntries.contains(var3))
{
return false;
}
}
else if (!var3.action.isInterruptible() && this.executingTaskEntries.contains(var3))
{
return false;
}
}
}
return true;
}
/**
* Returns whether two EntityAITaskEntries can be executed concurrently
*/
private boolean areTasksCompatible(EntityAITasks.EntityAITaskEntry p_75777_1_, EntityAITasks.EntityAITaskEntry p_75777_2_)
{
return (p_75777_1_.action.getMutexBits() & p_75777_2_.action.getMutexBits()) == 0;
}
class EntityAITaskEntry
{
public EntityAIBase action;
public int priority;
private static final String __OBFID = "CL_00001589";
public EntityAITaskEntry(int p_i1627_2_, EntityAIBase p_i1627_3_)
{
this.priority = p_i1627_2_;
this.action = p_i1627_3_;
}
}
}