Role class

Пакет: com.hypixel.hytale.server.npc.role

Файл: com/hypixel/hytale/server/npc/role/Role.java

implements: IAnnotatedComponentCollection

Поля (137)

МодификаторыТипИмя
final boolean DEBUG_APPLIED_FORCES
break
break
break
private final String description
private final String description
return
int var1
BodyMotion var1
BodyMotion var1
BodyMotion var1
DisplayNameSupport var10
StateSupport var10
Vector3d var10
double var10
double var10
int var10
int var10
InventoryComponent.Armor var10
InventoryComponent.Armor var10
MotionContextSupport var11
MotionContextSupport var11
InventoryComponent.Storage var11
InventoryComponent.Storage var11
ItemContainer var11
PlayerTaskSupport var12
NPCEntity var12
double var12
BodyMotion var12
InventoryComponent.Utility var12
HealthRegenState var13
Instruction var13
Ref var13
Role var14
Instruction var14
Ref var14
double var15
String var15
double var17
ItemStack var17
boolean var19
double var20
Vector3d var22
var22
var22
TransformComponent var23
TransformComponent var23
Vector3d var24
double var25
var25
var25
double var27
var27
var27
double var29
CombatSupport var3
ExecutionSupport var3
ExecutionSupport var3
ExecutionSupport var3
ExecutionSupport var3
double var3
StateSupport var3
String var3
double var31
var31
double var33
var33
double var35
var35
var35
var35
double var37
var37
var37
double var39
StateSupport var4
StateTransitionController var4
MotionController var4
StateTransitionController var4
StateTransitionController var4
ExecutionSupport var4
int var4
List var4
var4
List var4
var4
InventoryComponent.Hotbar var4
InventoryComponent.Hotbar var4
Vector3d var40
double var41
var41
WorldSupport var5
ExecutionSupport var5
ExecutionSupport var5
MotionController var5
MotionContextSupport var5
StateTransitionController var5
double var5
ItemModule var5
ItemModule var5
ItemContainer var5
World var52
EntitySupport var6
List var6
var6
StateTransitionController var6
StateTransitionController var6
double var6
ObjectArrayList var6
ObjectArrayList var6
String var6
PositionCache var7
Ref var7
double var7
var7
var7
double var7
InventoryComponent.Hotbar var7
InventoryComponent.Hotbar var7
String var7
List var7
DebugSupport var8
Instruction[] var8
DebugSupport var8
Ref var8
double var8
InventoryComponent.Utility var8
InventoryComponent.Utility var8
List var8
FlagsComponent var9
boolean var9
World var9
TransformComponent var9
double var9
InventoryComponent.Storage var9
InventoryComponent.Storage var9
InventoryComponent.Utility var9

Методы (192)

МодификаторыВозвратСигнатура
abstract Any Any("Any avoidance allowed")
AvoidanceMode AvoidanceMode(@Nonnull final String nullxx)
abstract Push Push("Push away from all neighbours and also applied when no other steering happens")
SeparationMode SeparationMode(String nullxx)
abstract throw new UnsupportedOperationExceptionthrow new UnsupportedOperationException("Roles do not have component indexes!")
abstract throw new UnsupportedOperationExceptionthrow new UnsupportedOperationException("Roles do not have parent contexts!")
public void activateInitialMotionControllervoid activateInitialMotionController(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull NPCEntity var3)
public void addVelocityvoid addVelocity(@Nonnull Vector3d var1, @Nullable VelocityConfig var2)
public void blendAvoidancevoid blendAvoidance(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull Rotation3f var3, @Nonnull Steering var4, @Nonnull CommandBuffer<EntityStore> var5)
public void blendSeparationvoid blendSeparation(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull Rotation3f var3, @Nonnull Steering var4, @Nonnull ComponentType<EntityStore, TransformComponent> var5, @Nonnull CommandBuffer<EntityStore> var6)
public boolean canBreatheboolean canBreathe(@Nonnull BlockMaterial var1, int var2)
public void clearOncevoid clearOnce(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
public void clearOnceIfNeededvoid clearOnceIfNeeded(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
protected void computeActionsAndSteeringvoid computeActionsAndSteering(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, double var3, @Nonnull Steering var5, @Nonnull Steering var6, @Nonnull Store<EntityStore> var7)
private void computeSummedDistanceLegacyvoid computeSummedDistanceLegacy(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull ComponentType<EntityStore, TransformComponent> var3, @Nonnull CommandBuffer<EntityStore> var4, @Nullable Ref<EntityStore> var5, Role.SeparationMode var6)
private void computeSummedDistancePushvoid computeSummedDistancePush(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull ComponentType<EntityStore, TransformComponent> var3, @Nonnull CommandBuffer<EntityStore> var4, @Nullable Ref<EntityStore> var5)
public boolean couldBreatheboolean couldBreathe(@Nonnull BlockMaterial var1, int var2)
public boolean couldBreatheCachedboolean couldBreatheCached(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
for for(int var2 = 0; var2 < var1; var2++)
for for(ItemStack var14 : var4)
for for(ItemStack var13 : var4)
for for(byte var6 = 0; var6 < this.hotbarItems.length; var6++)
for for(byte var13 = 0; var13 < this.offHandItems.length; var13++)
for for(String var18 : this.armor)
for for(byte var5 = 0; var5 < this.hotbarItems.length; var5++)
for for(byte var9 = 0; var9 < this.offHandItems.length; var9++)
for for(String var8 : this.armor)
public String getpublic String get()
public String getpublic String get()
public MotionController getActiveMotionControllerMotionController getActiveMotionController()
public String getAppearanceNameString getAppearanceName()
public Role.AvoidanceMode getAvoidanceModeRole.AvoidanceMode getAvoidanceMode()
public double getCollisionProbeDistancedouble getCollisionProbeDistance()
public double getCollisionRadiusdouble getCollisionRadius()
public double getDeathAnimationTimedouble getDeathAnimationTime()
public float getDespawnAnimationTimefloat getDespawnAnimationTime()
public String getDropListIdString getDropListId()
public double getFlockInfluenceRangedouble getFlockInfluenceRange()
public int[] getFlockSpawnTypesint[] getFlockSpawnTypes()
public double getInertiadouble getInertia()
public int getInitialMaxHealthint getInitialMaxHealth()
public double getKnockbackScaledouble getKnockbackScale()
public String getMemoriesNameOverrideString getMemoriesNameOverride()
public String getNameTranslationKeyString getNameTranslationKey()
public int getRoleIndexint getRoleIndex()
public String getRoleNameString getRoleName()
public Instruction getRootInstructionInstruction getRootInstruction()
public double getSeparationDistancedouble getSeparationDistance()
public float getSpawnLockTimefloat getSpawnLockTime()
public boolean hasDroppedDeathItemsboolean hasDroppedDeathItems()
public boolean hasMotionControllerboolean hasMotionController(@Nonnull String var1)
public boolean hasReachedTerminalActionboolean hasReachedTerminalAction()
if if(var6 == null)
if if(this.interactionInstruction != null)
if if(this.interactionInstruction != null)
if if(this.deathInstruction != null)
if if(var4 != null)
if if(var4 != null)
if if(this.interactionInstruction != null)
if if(this.deathInstruction != null)
if if(var6 != null)
if if(this.interactionInstruction != null)
if if(this.deathInstruction != null)
if if(var4 != null)
if if(this.interactionInstruction != null)
if if(this.deathInstruction != null)
if if(var4 != null)
if if(this.interactionInstruction != null)
if if(this.deathInstruction != null)
if if(var6 != null)
if if(var5 == null)
if if(this.activeMotionController != var3)
if if(this.activeMotionController != null)
if if(this.deathInstruction != null)
if if(this.interactionInstruction != null)
if if(var5 != null)
if if(this.activeMotionController == null)
if if(var3 != null && var2 != null)
if if(this.activeMotionController != null)
if if(var9)
if if(this.interactionInstruction != null)
if if(var13 != this.lastBodyMotionStep)
if if(this.lastBodyMotionStep != null)
if if(var13 != null)
if if(var14 != this.lastHeadMotionStep)
if if(this.lastHeadMotionStep != null)
if if(var14 != null)
if if(var13 != null)
if if(var14 != null)
if if(this.separationSummedCount != 0)
if if(this.useOrientationHint)
if if(var10 <= this.separationNearRadiusTarget * this.separationNearRadiusTarget)
if if(var3 > 0.0)
if if(var14 != null)
if if(var1 != var19x)
if if(var5 != var19x)
if if(var19)
if if(var19x == var14)
if if(var29 <= var20)
if if(var35 < 1.0E-6)
if if(var5 > 1.0)
if if(var7 < 1.0000000000000002E-10)
if if(!this.alwaysApplySeparation)
if if(this.collisionRadius >= 0.0)
if if(var2 != 0)
if if(this.activeMotionController != null)
if if(this.activeMotionController != null)
if if(this.activeMotionController != null)
if if(this.activeMotionController != null)
if if(this.interactionInstruction != null)
if if(this.deathInstruction != null)
if if(this.flockSpawnTypeIndices != null)
if if(var4 == Integer.MIN_VALUE)
if if(this.lastBodyMotionStep == null)
if if(this.inventoryContentsDropList != null)
if if(var10 > 0 || this.hotbarSlots > 3 || this.offHandSlots > 0)
if if(var7 != null)
if if(var8 != null)
if if(var9 != null)
if if(var4 != null)
if if(var11 != null)
if if(this.defaultOffHandSlot >= 0)
if if(this.inventoryContentsDropList != null)
if if(var10 > 0 || this.hotbarSlots > 3 || this.offHandSlots > 0)
if if(var7 != null)
if if(var8 != null)
if if(var9 != null)
if if(var4 != null)
if if(var11 != null)
if if(this.hotbarItems != null && this.hotbarItems.length > 0)
if if(var7 != null)
if if(this.offHandItems != null && this.offHandItems.length > 0)
if if(var9 != null)
if if(this.armor != null)
if if(var10 != null)
if if(this.hotbarItems != null && this.hotbarItems.length > 0)
if if(var6 != null)
if if(this.offHandItems != null && this.offHandItems.length > 0)
if if(this.armor != null)
if if(var10 != null)
if if(this.defaultOffHandSlot >= 0)
private void initialiseInventoriesvoid initialiseInventories(@Nonnull NPCEntity var1, @Nonnull Holder<EntityStore> var2, @Nonnull Store<EntityStore> var3)
private void initialiseInventoriesvoid initialiseInventories(@Nonnull NPCEntity var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull Ref<EntityStore> var3)
private void initialiseInventoriesvoid initialiseInventories(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull ComponentAccessor<EntityStore> var3)
private void initialiseItemsAndArmorvoid initialiseItemsAndArmor(@Nonnull Holder<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull Store<EntityStore> var3)
private void initialiseItemsAndArmorvoid initialiseItemsAndArmor(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull ComponentAccessor<EntityStore> var3)
public boolean isApplySeparationboolean isApplySeparation()
public boolean isAvoidingEntitiesboolean isAvoidingEntities()
public boolean isBackingAwayboolean isBackingAway()
public boolean isBreathesInAirboolean isBreathesInAir()
public boolean isBreathesInWaterboolean isBreathesInWater()
public boolean isCanLeadFlockboolean isCanLeadFlock()
public boolean isCorpseStaysInFlockboolean isCorpseStaysInFlock()
public boolean isDropDeathItemsInstantlyboolean isDropDeathItemsInstantly()
public boolean isFlockSpawnTypesRandomboolean isFlockSpawnTypesRandom()
public boolean isIgnoredForAvoidanceboolean isIgnoredForAvoidance(@Nonnull Ref<EntityStore> var1)
public boolean isInvulnerableboolean isInvulnerable()
public boolean isMemoriesNameOverridenboolean isMemoriesNameOverriden()
public boolean isMemoryboolean isMemory()
public boolean isOnGroundboolean isOnGround()
public boolean isPickupDropOnDeathboolean isPickupDropOnDeath()
public boolean isRoleChangeRequestedboolean isRoleChangeRequested()
public void loadedvoid loaded(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
protected void motionControllerChangedvoid motionControllerChanged(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nullable MotionController var3, @Nonnull ComponentAccessor<EntityStore> var4)
public void onLoadFromWorldGenOrPrefabvoid onLoadFromWorldGenOrPrefab(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull ComponentAccessor<EntityStore> var3)
public void postRoleBuiltvoid postRoleBuilt(@Nonnull Holder<EntityStore> var1, @Nonnull BuilderSupport var2)
public void preInitMotionControllersvoid preInitMotionControllers(@Nonnull DebugSupport var1, @Nonnull Map<String, MotionController> var2, @Nullable String var3)
public void processAddVelocityInstructionvoid processAddVelocityInstruction(@Nonnull Vector3d var1, @Nullable VelocityConfig var2)
public void processSetVelocityInstructionvoid processSetVelocityInstruction(@Nonnull Vector3d var1, @Nullable VelocityConfig var2)
public void removedvoid removed(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
public boolean requiresLeashPositionboolean requiresLeashPosition()
private void scaleSummedDistanceLegacyvoid scaleSummedDistanceLegacy(@Nonnull Rotation3f var1, @Nonnull Steering var2)
private void scaleSummedDistancesPushvoid scaleSummedDistancesPush(@Nonnull Vector3d var1, @Nonnull Rotation3f var2, @Nonnull Steering var3, @Nonnull CommandBuffer<EntityStore> var4)
public boolean setActiveMotionControllerboolean setActiveMotionController(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull String var3, @Nonnull ComponentAccessor<EntityStore> var4)
public void setActiveMotionControllervoid setActiveMotionController(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull MotionController var3, @Nonnull ComponentAccessor<EntityStore> var4)
public void setArmorvoid setArmor(@Nonnull NPCEntity var1, @Nullable String[] var2)
public void setBackingAwayvoid setBackingAway(boolean var1)
public void setDeathItemsDroppedvoid setDeathItemsDropped()
public void setMarkedTargetvoid setMarkedTarget(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull String var3, @Nonnull Ref<EntityStore> var4)
public void setReachedTerminalActionvoid setReachedTerminalAction(boolean var1)
public void setRoleChangeRequestedvoid setRoleChangeRequested()
public void setRoleIndexvoid setRoleIndex(@Nonnull Holder<EntityStore> var1, int var2, @Nonnull String var3)
public void setVelocityvoid setVelocity(@Nonnull Vector3d var1, @Nullable VelocityConfig var2, boolean var3)
public void spawnedvoid spawned(@Nonnull Holder<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull Store<EntityStore> var3)
switch switch(this.separationMode)
switch switch(this.separationMode)
public void teleportedvoid teleported(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull World var3, @Nonnull World var4)
public void tickvoid tick(@Nonnull Ref<EntityStore> var1, float var2, @Nonnull Store<EntityStore> var3)
public void unloadedvoid unloaded(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
public void updateMotionControllersvoid updateMotionControllers(@Nullable Ref<EntityStore> var1, @Nullable Model var2, @Nullable Box var3, @Nullable ComponentAccessor<EntityStore> var4)
public void updateMovementStatevoid updateMovementState(@Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, @Nonnull Vector3d var3, @Nonnull ComponentAccessor<EntityStore> var4)
while while(true)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.role;

class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.random.RandomExtra;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.TrigMathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.MovementStates;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.modules.debug.DebugUtils;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HealthRegenState;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.item.ItemModule;
class="kw">import com.hypixel.hytale.server.core.modules.splitvelocity.VelocityConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.instructions.BodyMotion;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.instructions.IndexedInstructions;
class="kw">import com.hypixel.hytale.server.npc.instructions.Instruction;
class="kw">import com.hypixel.hytale.server.npc.movement.GroupSteeringAccumulator;
class="kw">import com.hypixel.hytale.server.npc.movement.Steering;
class="kw">import com.hypixel.hytale.server.npc.movement.constraints.RelaxedConstraint;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.MotionController;
class="kw">import com.hypixel.hytale.server.npc.movement.steeringforces.SteeringForceAvoidCollision;
class="kw">import com.hypixel.hytale.server.npc.role.builders.BuilderRole;
class="kw">import com.hypixel.hytale.server.npc.role.support.CombatSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.DebugSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.DisplayNameSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.EntitySupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.FlagsComponent;
class="kw">import com.hypixel.hytale.server.npc.role.support.MarkedEntitySupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.MotionContextSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.PlayerTaskSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.PositionCache;
class="kw">import com.hypixel.hytale.server.npc.role.support.StateSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.WorldSupport;
class="kw">import com.hypixel.hytale.server.npc.statetransition.StateTransitionController;
class="kw">import com.hypixel.hytale.server.npc.util.ComponentInfo;
class="kw">import com.hypixel.hytale.server.npc.util.IAnnotatedComponent;
class="kw">import com.hypixel.hytale.server.npc.util.IAnnotatedComponentCollection;
class="kw">import com.hypixel.hytale.server.npc.util.InventoryHelper;
class="kw">import com.hypixel.hytale.server.npc.util.NPCPhysicsMath;
class="kw">import com.hypixel.hytale.server.npc.util.VisHelper;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
class="kw">import java.util.Arrays;
class="kw">import java.util.EnumSet;
class="kw">import java.util.HashMap;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.function.Supplier;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class Role class="kw">implements IAnnotatedComponentCollection {
   class="kw">public class="kw">static class="kw">final boolean DEBUG_APPLIED_FORCES = false;
   class="kw">public class="kw">static class="kw">final double INTERACTION_PLAYER_DISTANCE = 10.0;
   class="kw">public class="kw">static class="kw">final double RANDOMIZE_OFFSET_MAX_DISTANCE = 0.001;
   class="kw">public class="kw">static class="kw">final double RANDOMIZE_OFFSET_SQUARED_MAX_DISTANCE = 1.0E-6;
   class="kw">private class="kw">static class="kw">final double MIN_SEPARATION_SUMMED_SQUARED = 0.010000000000000002;
   class="kw">protected class="kw">final int initialMaxHealth;
   class="kw">protected class="kw">final double collisionProbeDistance;
   class="kw">protected class="kw">final double collisionRadius;
   class="kw">protected class="kw">final double collisionForceFalloff;
   class="kw">protected class="kw">final float collisionViewAngle;
   class="kw">protected class="kw">final float collisionViewHalfAngleCosine;
   class="kw">protected class="kw">final Steering bodySteering = new Steering();
   class="kw">protected class="kw">final Steering headSteering = new Steering();
   class="kw">protected class="kw">final SteeringForceAvoidCollision steeringForceAvoidCollision = new SteeringForceAvoidCollision();
   class="kw">protected class="kw">final GroupSteeringAccumulator groupSteeringAccumulator = new GroupSteeringAccumulator();
   class="kw">protected class="kw">final Vector3d separationTempDistanceVector = new Vector3d();
   class="kw">protected class="kw">final Vector3d separationTempSteeringVector = new Vector3d();
   class="kw">protected class="kw">final Set<Ref<EntityStore>> ignoredEntitiesForAvoidance = new ReferenceOpenHashSet();
   class="kw">protected class="kw">final double entityAvoidanceStrength;
   class="kw">protected class="kw">final Role.AvoidanceMode avoidanceMode;
   class="kw">protected class="kw">final boolean isAvoidingEntities;
   class="kw">protected class="kw">final Role.SeparationMode separationMode;
   class="kw">protected class="kw">final boolean useOrientationHint;
   class="kw">protected class="kw">final boolean alwaysApplySeparation;
   class="kw">protected class="kw">final boolean normalizeDistances;
   class="kw">protected class="kw">final double separationDistance;
   class="kw">protected class="kw">final double separationWeight;
   class="kw">protected class="kw">final double separationDistanceTarget;
   class="kw">protected class="kw">final double separationNearRadiusTarget;
   class="kw">protected class="kw">final double separationFarRadiusTarget;
   class="kw">protected class="kw">final boolean applySeparation;
   class="kw">protected class="kw">final double separationSafeDistanceMultiplier;
   class="kw">protected class="kw">final double separationLegacySteeringStrength;
   class="kw">protected class="kw">final double separationPushSteeringStrength;
   class="kw">protected class="kw">final double separationPushDistanceWeightDefault;
   class="kw">protected class="kw">final double separationPushDistanceWeightTarget;
   class="kw">protected class="kw">final double separationPushDistanceWeightAttacker;
   class="kw">protected class="kw">final double separationPushSpeedScale;
   class="kw">protected class="kw">final Vector3d lastSeparationSteering = new Vector3d();
   class="kw">protected int separationSummedCount;
   class="kw">protected class="kw">final Vector3d separationSummedDistances = new Vector3d();
   @Nullable
   class="kw">protected class="kw">final float[] headPitchAngleRange;
   class="kw">protected class="kw">final boolean stayInEnvironment;
   class="kw">protected class="kw">final String allowedEnvironments;
   @Nullable
   class="kw">protected class="kw">final String[] flockSpawnTypes;
   class="kw">protected class="kw">final boolean flockSpawnTypesRandom;
   @Nonnull
   class="kw">protected class="kw">final String[] flockAllowedRoles;
   class="kw">protected class="kw">final boolean canLeadFlock;
   class="kw">protected class="kw">final double flockWeightAlignment;
   class="kw">protected class="kw">final double flockWeightSeparation;
   class="kw">protected class="kw">final double flockWeightCohesion;
   class="kw">protected class="kw">final double flockInfluenceRange;
   class="kw">protected class="kw">final boolean corpseStaysInFlock;
   class="kw">protected class="kw">final double inertia;
   class="kw">protected class="kw">final double knockbackScale;
   class="kw">protected class="kw">final boolean breathesInAir;
   class="kw">protected class="kw">final boolean breathesInWater;
   class="kw">protected class="kw">final boolean pickupDropOnDeath;
   @Nullable
   class="kw">protected class="kw">final String[] hotbarItems;
   @Nullable
   class="kw">protected class="kw">final String[] offHandItems;
   class="kw">protected class="kw">final double deathAnimationTime;
   class="kw">protected class="kw">final String deathParticles;
   class="kw">protected class="kw">final boolean dropDeathItemsInstantly;
   class="kw">protected class="kw">final float despawnAnimationTime;
   class="kw">protected class="kw">final String dropListId;
   @Nullable
   class="kw">protected class="kw">final String deathInteraction;
   class="kw">protected class="kw">final boolean invulnerable;
   class="kw">protected class="kw">final int inventorySlots;
   class="kw">protected class="kw">final String inventoryContentsDropList;
   class="kw">protected class="kw">final int hotbarSlots;
   class="kw">protected class="kw">final int offHandSlots;
   class="kw">protected class="kw">final byte defaultOffHandSlot;
   @Nullable
   class="kw">protected class="kw">final String balanceAsset;
   @Nullable
   class="kw">protected class="kw">final Map<String, String> interactionVars;
   class="kw">protected int roleIndex;
   class="kw">protected String roleName;
   class="kw">protected String appearance;
   @Nonnull
   class="kw">protected Map<String, MotionController> motionControllers = new HashMap<>();
   @Nullable
   class="kw">protected String initialMotionControllerName;
   class="kw">protected MotionController activeMotionController;
   class="kw">protected int[] flockSpawnTypeIndices;
   class="kw">protected boolean requiresLeashPosition;
   class="kw">protected boolean hasReachedTerminalAction;
   @Nullable
   class="kw">protected String[] armor;
   class="kw">protected Instruction rootInstruction;
   @Nullable
   class="kw">protected Instruction lastBodyMotionStep;
   @Nullable
   class="kw">protected Instruction lastHeadMotionStep;
   class="kw">protected IndexedInstructions indexedInstructions;
   @Nullable
   class="kw">protected Instruction interactionInstruction;
   @Nullable
   class="kw">protected Instruction deathInstruction;
   class="kw">protected boolean roleChangeRequested;
   class="kw">protected class="kw">final boolean isMemory;
   class="kw">protected class="kw">final String memoriesNameOverride;
   class="kw">protected class="kw">final boolean isMemoriesNameOverriden;
   class="kw">protected class="kw">final float spawnLockTime;
   class="kw">protected class="kw">final String nameTranslationKey;
   class="kw">protected boolean backingAway;
   class="kw">protected boolean deathItemsDropped;

   @Nonnull
   class="kw">public class="kw">static Role createAndAttach(@Nonnull Holder<EntityStore> var0, @Nonnull BuilderRole var1, @Nonnull BuilderSupport var2) {
      CombatSupport var3 = new CombatSupport(var1, var2);
      StateSupport var4 = new StateSupport(var1, var2);
      WorldSupport var5 = new WorldSupport(var1, var2);
      EntitySupport var6 = new EntitySupport();
      PositionCache var7 = new PositionCache(var2.getRoleStats());
      var7.setOpaqueBlockSet(var1.getOpaqueBlockSet());
      DebugSupport var8 = new DebugSupport(var1);
      FlagsComponent var9 = new FlagsComponent();
      DisplayNameSupport var10 = new DisplayNameSupport();
      var10.setDisplayNames(var1.getDisplayNames());
      MotionContextSupport var11 = new MotionContextSupport();
      PlayerTaskSupport var12 = new PlayerTaskSupport();
      HealthRegenState var13 = new HealthRegenState();
      var0.putComponent(CombatSupport.getComponentType(), var3);
      var0.putComponent(StateSupport.getComponentType(), var4);
      if (var0.getComponent(MarkedEntitySupport.getComponentType()) == null) {
         var0.putComponent(MarkedEntitySupport.getComponentType(), new MarkedEntitySupport());
      }

      var0.putComponent(WorldSupport.getComponentType(), var5);
      var0.putComponent(EntitySupport.getComponentType(), var6);
      var0.putComponent(PositionCache.getComponentType(), var7);
      var0.putComponent(DebugSupport.getComponentType(), var8);
      var0.putComponent(FlagsComponent.getComponentType(), var9);
      var0.putComponent(DisplayNameSupport.getComponentType(), var10);
      var0.putComponent(MotionContextSupport.getComponentType(), var11);
      var0.putComponent(PlayerTaskSupport.getComponentType(), var12);
      var0.putComponent(HealthRegenState.getComponentType(), var13);
      Role var14 = new Role(var1, var2);
      var14.postRoleBuilt(var0, var2);
      var14.preInitMotionControllers(var8, var1.getMotionControllerMap(var2), var1.getInitialMotionController(var2));
      class="kw">return var14;
   }

   class="kw">private Role(@Nonnull BuilderRole var1, @Nonnull BuilderSupport var2) {
      this.initialMaxHealth = var1.getMaxHealth(var2);
      this.nameTranslationKey = var1.getNameTranslationKey(var2);
      this.appearance = var1.getAppearance(var2);
      this.hotbarItems = var1.getHotbarItems(var2);
      this.offHandItems = var1.getOffHandItems(var2);
      this.defaultOffHandSlot = var1.getDefaultOffHandSlot(var2);
      this.inventoryContentsDropList = var1.getInventoryItemsDropList(var2);
      this.armor = var1.getArmor();
      this.inertia = var1.getInertia();

      for (MotionController var4 : this.motionControllers.values()) {
         var4.setInertia(this.inertia);
      }

      this.knockbackScale = var1.getKnockbackScale(var2);

      for (MotionController var7 : this.motionControllers.values()) {
         var7.setKnockbackScale(this.knockbackScale);
      }

      this.dropListId = var1.getDropListId(var2);
      this.isAvoidingEntities = var1.isAvoidingEntities();
      this.avoidanceMode = var1.getAvoidanceMode(var2);
      this.collisionProbeDistance = var1.getCollisionDistance();
      this.collisionForceFalloff = var1.getCollisionForceFalloff();
      this.collisionRadius = var1.getCollisionRadius();
      this.collisionViewAngle = var1.getCollisionViewAngle();
      this.collisionViewHalfAngleCosine = TrigMathUtil.cos(this.collisionViewAngle / 2.0F);
      this.separationMode = var1.getSeparationMode(var2);
      this.separationDistance = var1.getSeparationDistance(var2);
      this.separationWeight = var1.getSeparationWeight(var2);
      this.separationDistanceTarget = var1.getSeparationDistanceTarget(var2);
      this.separationNearRadiusTarget = var1.getSeparationNearRadiusTarget(var2);
      this.separationFarRadiusTarget = var1.getSeparationFarRadiusTarget(var2);
      this.applySeparation = var1.isApplySeparation(var2);
      this.separationSafeDistanceMultiplier = var1.getSeparationSafeDistanceMultiplier(var2);
      this.separationLegacySteeringStrength = var1.getSeparationLegacySteeringStrength(var2);
      this.separationPushSteeringStrength = var1.getSeparationPushSteeringStrength(var2);
      this.separationPushDistanceWeightDefault = var1.getSeparationPushDistanceWeightDefault(var2);
      this.separationPushDistanceWeightTarget = var1.getSeparationPushDistanceWeightTarget(var2);
      this.separationPushDistanceWeightAttacker = var1.getSeparationPushDistanceWeightAttacker(var2);
      this.separationPushSpeedScale = var1.getSeparationPushSpeedScale(var2);
      this.useOrientationHint = var1.getOverrideUseOrientationHint(var2).evaluate(this.separationMode != Role.SeparationMode.Legacy);
      this.alwaysApplySeparation = var1.getOverrideAlwaysSeparate(var2).evaluate(this.separationMode != Role.SeparationMode.Legacy);
      this.normalizeDistances = var1.getOverrideNormalizeDistances(var2).evaluate(this.separationMode != Role.SeparationMode.Legacy);
      if (var1.isOverridingHeadPitchAngle(var2)) {
         this.headPitchAngleRange = var1.getHeadPitchAngleRange(var2);
      } else {
         this.headPitchAngleRange = null;
      }

      this.stayInEnvironment = var1.isStayingInEnvironment();
      this.allowedEnvironments = var1.getAllowedEnvironments();
      this.entityAvoidanceStrength = var1.getEntityAvoidanceStrength();
      this.flockSpawnTypes = var1.getFlockSpawnTypes(var2);
      this.flockSpawnTypesRandom = var1.isFlockSpawnTypeRandom(var2);
      this.flockAllowedRoles = var1.getFlockAllowedRoles(var2);
      this.canLeadFlock = var1.isCanLeadFlock(var2);
      this.flockWeightAlignment = var1.getFlockWeightAlignment();
      this.flockWeightSeparation = var1.getFlockWeightSeparation();
      this.flockWeightCohesion = var1.getFlockWeightCohesion();
      this.flockInfluenceRange = var1.getFlockInfluenceRange();
      this.invulnerable = var1.isInvulnerable(var2);
      this.breathesInAir = var1.breathesInAir(var2.getExecutionContext(), null);
      this.breathesInWater = var1.breathesInWater(var2.getExecutionContext(), null);
      this.pickupDropOnDeath = var1.isPickupDropOnDeath();
      this.deathAnimationTime = var1.getDeathAnimationTime(var2);
      this.deathParticles = var1.getDeathParticles(var2);
      this.dropDeathItemsInstantly = var1.isDropDeathItemsInstantly(var2);
      this.deathInteraction = var1.getDeathInteraction(var2);
      this.despawnAnimationTime = var1.getDespawnAnimationTime();
      this.inventorySlots = var1.getInventorySlots();
      this.hotbarSlots = var1.getHotbarSlots();
      this.offHandSlots = var1.getOffHandSlots();
      this.corpseStaysInFlock = var1.isCorpseStaysInFlock();
      this.balanceAsset = var1.getBalanceAsset(var2);
      this.interactionVars = var1.getInteractionVars(var2);
      this.isMemory = var1.isMemory(var2.getExecutionContext());
      this.memoriesNameOverride = var1.getMemoriesNameOverride(var2.getExecutionContext());
      this.isMemoriesNameOverriden = this.memoriesNameOverride != null && !this.memoriesNameOverride.isEmpty();
      this.spawnLockTime = var1.getSpawnLockTime(var2);
      DisplayNameSupport.setRandomDisplayName(var2.getHolder(), var1.getDisplayNames(), false);
      List var6 = var1.getInstructionList(var2);
      if (var6 == null) {
         var6 = new ObjectArrayList();
      }

      Instruction[] var8 = var6.toArray(Instruction[]::new);
      this.rootInstruction = Instruction.createRootInstruction(var8, var2);
      this.interactionInstruction = var1.getInteractionInstruction(var2);
      this.deathInstruction = var1.getDeathInstruction(var2);
      var1.registerStateEvaluator(var2);
      if (this.interactionInstruction != null) {
         var2.trackInteractions();
      }
   }

   class="kw">public int getInitialMaxHealth() {
      class="kw">return this.initialMaxHealth;
   }

   class="kw">public boolean isAvoidingEntities() {
      class="kw">return this.isAvoidingEntities;
   }

   class="kw">public double getCollisionProbeDistance() {
      class="kw">return this.collisionProbeDistance;
   }

   class="kw">public boolean isApplySeparation() {
      class="kw">return this.applySeparation;
   }

   class="kw">public double getSeparationDistance() {
      class="kw">return this.separationDistance;
   }

   class="kw">public Instruction getRootInstruction() {
      class="kw">return this.rootInstruction;
   }

   @Nullable
   class="kw">public Instruction getInteractionInstruction() {
      class="kw">return this.interactionInstruction;
   }

   @Nullable
   class="kw">public Instruction getDeathInstruction() {
      class="kw">return this.deathInstruction;
   }

   @Nonnull
   class="kw">public Steering getBodySteering() {
      class="kw">return this.bodySteering;
   }

   @Nonnull
   class="kw">public Steering getHeadSteering() {
      class="kw">return this.headSteering;
   }

   @Nonnull
   class="kw">public Set<Ref<EntityStore>> getIgnoredEntitiesForAvoidance() {
      class="kw">return this.ignoredEntitiesForAvoidance;
   }

   class="kw">public String getDropListId() {
      class="kw">return this.dropListId;
   }

   @Nullable
   class="kw">public String getBalanceAsset() {
      class="kw">return this.balanceAsset;
   }

   @Nullable
   class="kw">public Map<String, String> getInteractionVars() {
      class="kw">return this.interactionVars;
   }

   class="kw">public boolean isMemory() {
      class="kw">return this.isMemory;
   }

   class="kw">public String getMemoriesNameOverride() {
      class="kw">return this.memoriesNameOverride;
   }

   class="kw">public String getNameTranslationKey() {
      class="kw">return this.nameTranslationKey;
   }

   class="kw">public boolean isMemoriesNameOverriden() {
      class="kw">return this.isMemoriesNameOverriden;
   }

   class="kw">public float getSpawnLockTime() {
      class="kw">return this.spawnLockTime;
   }

   class="kw">public void postRoleBuilt(@Nonnull Holder<EntityStore> var1, @Nonnull BuilderSupport var2) {
      this.requiresLeashPosition = var2.requiresLeashPosition();
      var1.getComponent(FlagsComponent.getComponentType()).setFlags(var2.allocateFlags());
      this.indexedInstructions = new IndexedInstructions(var2.getInstructionSlotMappings());
      var1.getComponent(StateSupport.getComponentType()).postRoleBuilt(var2);
      var1.getComponent(WorldSupport.getComponentType()).postRoleBuilt(var2);
      var1.getComponent(EntitySupport.getComponentType()).postRoleBuilt(var2);
      var1.getComponent(MarkedEntitySupport.getComponentType()).postRoleBuilder(var2);
      this.rootInstruction.setContext(this, 0);
   }

   @Nonnull
   class="kw">public ExecutionSupport acquireExecutionSupport(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      ExecutionSupport var3 = ExecutionSupport.acquire();
      var3.populateFromEntity(var1, var2);
      var3.setRoleIndex(this.roleIndex);
      var3.setName(this.roleName);
      var3.setIndexedInstructions(this.indexedInstructions);
      class="kw">return var3;
   }

   class="kw">public void loaded(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      ExecutionSupport var3 = this.acquireExecutionSupport(var1, var2);

      try {
         this.rootInstruction.loaded(var3);
         if (this.interactionInstruction != null) {
            this.interactionInstruction.loaded(var3);
         }

         if (this.deathInstruction != null) {
            this.deathInstruction.loaded(var3);
         }

         StateTransitionController var4 = var3.getStateSupport().getStateTransitionController();
         if (var4 != null) {
            var4.loaded(var3);
         }
      } class="kw">finally {
         var3.clearForReuse();
      }
   }

   class="kw">public void spawned(@Nonnull Holder<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull Store<EntityStore> var3) {
      MotionController var4 = this.activeMotionController;
      if (var4 != null) {
         var4.spawned();
      }

      var1.getComponent(DisplayNameSupport.getComponentType()).pickRandomDisplayName(var1, true);
      ExecutionSupport var5 = ExecutionSupport.acquire();
      var5.populateFromHolder(var1);
      var5.setRoleIndex(this.roleIndex);
      var5.setName(this.roleName);
      var5.setIndexedInstructions(this.indexedInstructions);

      try {
         this.rootInstruction.spawned(var5);
         if (this.interactionInstruction != null) {
            this.interactionInstruction.spawned(var5);
         }

         if (this.deathInstruction != null) {
            this.deathInstruction.spawned(var5);
         }

         StateTransitionController var6 = var5.getStateSupport().getStateTransitionController();
         if (var6 != null) {
            var6.spawned(var5);
         }
      } class="kw">finally {
         var5.clearForReuse();
      }

      this.initialiseInventories(var2, var1, var3);
   }

   class="kw">public void unloaded(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      ExecutionSupport var3 = this.acquireExecutionSupport(var1, var2);

      try {
         var3.getEntitySupport().unloaded();
         var3.getWorldSupport().unloaded(var1);
         var3.getMarkedEntitySupport().unloaded();
         this.rootInstruction.unloaded(var3);
         if (this.interactionInstruction != null) {
            this.interactionInstruction.unloaded(var3);
         }

         if (this.deathInstruction != null) {
            this.deathInstruction.unloaded(var3);
         }

         StateTransitionController var4 = var3.getStateSupport().getStateTransitionController();
         if (var4 != null) {
            var4.unloaded(var3);
         }
      } class="kw">finally {
         var3.clearForReuse();
      }
   }

   class="kw">public void removed(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      ExecutionSupport var3 = this.acquireExecutionSupport(var1, var2);

      try {
         var3.getWorldSupport().resetAllBlockSensors(var1);
         this.rootInstruction.removed(var3);
         if (this.interactionInstruction != null) {
            this.interactionInstruction.removed(var3);
         }

         if (this.deathInstruction != null) {
            this.deathInstruction.removed(var3);
         }

         StateTransitionController var4 = var3.getStateSupport().getStateTransitionController();
         if (var4 != null) {
            var4.removed(var3);
         }
      } class="kw">finally {
         var3.clearForReuse();
      }
   }

   class="kw">public void teleported(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull World var3, @Nonnull World var4) {
      ExecutionSupport var5 = this.acquireExecutionSupport(var1, var2);

      try {
         this.rootInstruction.teleported(var5, var3, var4);
         if (this.interactionInstruction != null) {
            this.interactionInstruction.teleported(var5, var3, var4);
         }

         if (this.deathInstruction != null) {
            this.deathInstruction.teleported(var5, var3, var4);
         }

         StateTransitionController var6 = var5.getStateSupport().getStateTransitionController();
         if (var6 != null) {
            var6.teleported(var5, var3, var4);
         }
      } class="kw">finally {
         var5.clearForReuse();
      }
   }

   class="kw">public String getAppearanceName() {
      class="kw">return this.appearance;
   }

   class="kw">public MotionController getActiveMotionController() {
      class="kw">return this.activeMotionController;
   }

   class="kw">public boolean isRoleChangeRequested() {
      class="kw">return this.roleChangeRequested;
   }

   class="kw">public void setRoleChangeRequested() {
      this.roleChangeRequested = true;
   }

   class="kw">public boolean setActiveMotionController(
      @Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull String var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      MotionController var5 = this.motionControllers.get(var3);
      if (var5 == null) {
         NPCPlugin.get()
            .getLogger()
            .at(Level.SEVERE)
            .log("Failed to set MotionController for NPC of type '%s': MotionController '%s' not found! ", this.roleName, var3);
         class="kw">return false;
      } else {
         this.setActiveMotionController(var1, var2, var5, var4);
         class="kw">return true;
      }
   }

   class="kw">public void setActiveMotionController(
      @Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull MotionController var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (this.activeMotionController != var3) {
         if (this.activeMotionController != null) {
            this.activeMotionController.deactivate();
         }

         this.activeMotionController = var3;
         MotionContextSupport var5 = var4.getComponent(var1, MotionContextSupport.getComponentType());
         assert var5 != null;
         var5.setActiveMotionController(var3);
         this.activeMotionController.activate();
         this.motionControllerChanged(var1, var2, this.activeMotionController, var4);
      }
   }

   class="kw">public boolean hasMotionController(@Nonnull String var1) {
      class="kw">return this.motionControllers.containsKey(var1);
   }

   class="kw">protected void motionControllerChanged(
      @Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nullable MotionController var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      var2.setActiveMotionControllerName(var3 != null ? var3.getType() : null);
      this.rootInstruction.motionControllerChanged(var1, var2, var3, var4);
      if (this.deathInstruction != null) {
         this.deathInstruction.motionControllerChanged(var1, var2, var3, var4);
      }

      if (this.interactionInstruction != null) {
         this.interactionInstruction.motionControllerChanged(var1, var2, var3, var4);
      }

      StateTransitionController var5 = StateSupport.get(var1, var4).getStateTransitionController();
      if (var5 != null) {
         var5.motionControllerChanged(var1, var2, var3, var4);
      }
   }

   class="kw">public void preInitMotionControllers(@Nonnull DebugSupport var1, @Nonnull Map<String, MotionController> var2, @Nullable String var3) {
      this.motionControllers = var2;
      this.initialMotionControllerName = var3;

      for (Entry var5 : this.motionControllers.entrySet()) {
         var1.registerDebugFlagsListener(var5.getValue());
      }

      this.updateMotionControllers(null, null, null, null);
   }

   class="kw">public void activateInitialMotionController(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull NPCEntity var3) {
      if (this.activeMotionController == null) {
         if (!this.motionControllers.isEmpty()) {
            if (this.initialMotionControllerName == null
               || !this.hasMotionController(this.initialMotionControllerName)
               || !this.setActiveMotionController(var1, var3, this.initialMotionControllerName, var2)) {
               this.setActiveMotionController(var1, var3, RandomExtra.randomElement(new ObjectArrayList(this.motionControllers.values())), var2);
            }
         }
      }
   }

   class="kw">public void updateMotionControllers(@Nullable Ref<EntityStore> var1, @Nullable Model var2, @Nullable Box var3, @Nullable ComponentAccessor<EntityStore> var4) {
      for (MotionController var6 : this.motionControllers.values()) {
         var6.setRole(this);
         var6.setInertia(this.inertia);
         var6.setKnockbackScale(this.knockbackScale);
         var6.setHeadPitchAngleRange(this.headPitchAngleRange);
         if (var3 != null && var2 != null) {
            var6.updateModelParameters(var1, var2, var3, var4);
            var6.updatePhysicsValues(var2.getPhysicsValues());
         }
      }
   }

   class="kw">public void updateMovementState(
      @Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, @Nonnull Vector3d var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (this.activeMotionController != null) {
         this.activeMotionController.updateMovementState(var1, var2, this.bodySteering, var3, var4);
      }
   }

   class="kw">public void tick(@Nonnull Ref<EntityStore> var1, float var2, @Nonnull Store<EntityStore> var3) {
      ExecutionSupport var4 = this.acquireExecutionSupport(var1, var3);

      try {
         var4.getEntitySupport().tickDeferredActions(var1, var4, var2, var3);
         this.computeActionsAndSteering(var1, var4, var2, this.bodySteering, this.headSteering, var3);
      } class="kw">finally {
         var4.clearForReuse();
      }
   }

   class="kw">protected void computeActionsAndSteering(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull ExecutionSupport var2,
      double var3,
      @Nonnull Steering var5,
      @Nonnull Steering var6,
      @Nonnull Store<EntityStore> var7
   ) {
      DebugSupport var8 = var2.getDebugSupport();
      if (var8.isVisSensorRanges()) {
         var8.beginSensorVisualization();
      }

      boolean var9 = var7.getArchetype(var1).contains(DeathComponent.getComponentType());
      if (var9) {
         if (this.deathInstruction != null && this.deathInstruction.matches(var1, var2, var3, var7)) {
            this.deathInstruction.execute(var1, var2, var3, var7);
         }
      } else {
         StateSupport var10 = var2.getStateSupport();
         if (this.interactionInstruction != null) {
            var2.getPositionCache().forEachPlayer((var1x, var3x, var4, var5x, var6x) -> {
               var4.getStateSupport().setInteractionIterationTarget(var3x);
               assert this.interactionInstruction != null;
               if (this.interactionInstruction.matches(var5x, var4, var1x, var6x)) {
                  this.interactionInstruction.execute(var5x, var4, var1x, var6x);
               }
            }, var2, var1, var7, var3, var7);
            var10.setInteractionIterationTarget(null);
            var2.getPlayerTaskSupport().clearTargetPlayerActiveTasks();
         }

         this.activeMotionController.beforeInstructionSensorsAndActions(var3);
         MotionContextSupport var11 = var2.getMotionContextSupport();
         if (!var10.runTransitionActions(var1, var2, var3, var7)) {
            var11.clearNextBodyMotionStep();
            var11.clearNextHeadMotionStep();
            this.rootInstruction.execute(var1, var2, var3, var7);
         } else {
            if (var10.isClearHeadMotion()) {
               var11.clearNextHeadMotionStep();
            }

            if (var10.isClearBodyMotion()) {
               var11.clearNextBodyMotionStep();
            }
         }

         NPCEntity var12 = var7.getComponent(var1, NPCEntity.getComponentType());
         assert var12 != null;
         if (!var12.isPlayingDespawnAnim()) {
            this.activeMotionController.beforeInstructionMotion(var3);
            Instruction var13 = var11.getNextBodyMotionStep();
            if (var13 != this.lastBodyMotionStep) {
               if (this.lastBodyMotionStep != null) {
                  this.lastBodyMotionStep.getBodyMotion().deactivate(var1, var2, var7);
                  this.lastBodyMotionStep.onEndMotion();
               }

               if (var13 != null) {
                  var13.getBodyMotion().activate(var1, var2, var7);
               }
            }

            this.lastBodyMotionStep = var13;
            Instruction var14 = var11.getNextHeadMotionStep();
            if (var14 != this.lastHeadMotionStep) {
               if (this.lastHeadMotionStep != null) {
                  this.lastHeadMotionStep.getHeadMotion().deactivate(var1, var2, var7);
                  this.lastHeadMotionStep.onEndMotion();
               }

               if (var14 != null) {
                  var14.getHeadMotion().activate(var1, var2, var7);
               }
            }

            this.lastHeadMotionStep = var14;
            if (var13 != null) {
               var13.getBodyMotion().computeSteering(var1, var2, var13.getSensor().getSensorInfo(), var3, var5, var7);
            }

            if (var14 != null) {
               var14.getHeadMotion().computeSteering(var1, var2, var14.getSensor().getSensorInfo(), var3, var6, var7);
            }
         }
      }
   }

   class="kw">public void blendSeparation(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Vector3d var2,
      @Nonnull Rotation3f var3,
      @Nonnull Steering var4,
      @Nonnull ComponentType<EntityStore, TransformComponent> var5,
      @Nonnull CommandBuffer<EntityStore> var6
   ) {
      this.lastSeparationSteering.zero();
      Ref var7 = MarkedEntitySupport.get(var1, var6).getTargetReferenceToIgnoreForAvoidance();
      Ref var8 = var7 != null && var7.isValid() ? var7 : null;
      this.separationSummedDistances.zero();
      this.separationSummedCount = 0;
      class="kw">switch (this.separationMode) {
         case Legacy:
            this.computeSummedDistanceLegacy(var1, var2, var5, var6, var8, this.separationMode);
            break;
         case Push:
            this.computeSummedDistancePush(var1, var2, var5, var6, var8);
      }

      if (DebugSupport.get(var1, var6).isDebugFlagSet(RoleDebugFlags.VisSeparationSummed)) {
         World var9 = var6.getExternalData().getWorld();
         Vector3d var10 = new Vector3d(this.separationSummedDistances);
         VisHelper.renderDebugVector(var2, var10, DebugUtils.COLOR_BLACK, var9);
      }

      if (this.separationSummedCount != 0) {
         if (!(this.separationSummedDistances.lengthSquared() < 0.010000000000000002)) {
            class="kw">switch (this.separationMode) {
               case Legacy:
                  this.scaleSummedDistanceLegacy(var3, var4);
                  break;
               case Push:
                  this.scaleSummedDistancesPush(var2, var3, var4, var6);
            }

            if (this.useOrientationHint) {
               var4.setDirectionHint(var3);
            }
         }
      }
   }

   class="kw">private void computeSummedDistanceLegacy(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Vector3d var2,
      @Nonnull ComponentType<EntityStore, TransformComponent> var3,
      @Nonnull CommandBuffer<EntityStore> var4,
      @Nullable Ref<EntityStore> var5,
      Role.SeparationMode var6
   ) {
      double var7 = this.separationDistance;
      if (var5 != null && var5.isValid()) {
         TransformComponent var9 = var4.getComponent(var5, var3);
         assert var9 != null;
         double var10 = var9.getPosition().distanceSquared(var2);
         if (var10 <= this.separationNearRadiusTarget * this.separationNearRadiusTarget) {
            var7 = this.separationDistanceTarget;
         } else if (var10 < this.separationFarRadiusTarget * this.separationFarRadiusTarget) {
            double var12 = (Math.sqrt(var10) - this.separationNearRadiusTarget) / (this.separationFarRadiusTarget - this.separationNearRadiusTarget);
            var7 = NPCPhysicsMath.lerp(this.separationDistanceTarget, this.separationDistance, var12);
         }
      }

      this.groupSteeringAccumulator.setComponentSelector(this.activeMotionController.getComponentSelector());
      this.groupSteeringAccumulator.setMaxRange(var7);
      this.groupSteeringAccumulator.setViewConeHalfAngleCosine(this.collisionViewHalfAngleCosine);
      this.groupSteeringAccumulator.setNormalizeDistances(this.normalizeDistances);
      this.groupSteeringAccumulator.begin(var1, var4);
      PositionCache.get(var1, var4)
         .forEachEntityInAvoidanceRange(
            this.ignoredEntitiesForAvoidance,
            (var1x, var2x, var3x, var4x) -> var2x.processEntity(var1x, this.separationWeight, 1.0, 1.0, var4x),
            this.groupSteeringAccumulator,
            this,
            var4
         );
      this.groupSteeringAccumulator.end();
      this.separationSummedDistances.set(this.groupSteeringAccumulator.getSumOfDistances());
      this.separationSummedCount = this.groupSteeringAccumulator.getCount();
   }

   class="kw">private void scaleSummedDistanceLegacy(@Nonnull Rotation3f var1, @Nonnull Steering var2) {
      double var3 = var2.getSpeed();
      this.separationTempDistanceVector.set(this.separationSummedDistances).normalize(-this.separationLegacySteeringStrength);
      if (var3 > 0.0) {
         this.separationTempDistanceVector.add(var2.getTranslation());
         this.separationTempDistanceVector.normalize(var3);
      } else if (this.alwaysApplySeparation) {
         this.separationTempDistanceVector.add(var2.getTranslation());
      }

      this.lastSeparationSteering.set(this.separationTempDistanceVector).sub(var2.getTranslation());
      var2.setTranslation(this.separationTempDistanceVector);
   }

   class="kw">private void computeSummedDistancePush(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Vector3d var2,
      @Nonnull ComponentType<EntityStore, TransformComponent> var3,
      @Nonnull CommandBuffer<EntityStore> var4,
      @Nullable Ref<EntityStore> var5
   ) {
      double var6 = var2.x();
      double var8 = var2.y();
      double var10 = var2.z();
      BodyMotion var12 = this.getLastBodySteeringMotion();
      Ref var13 = var12 != null ? var12.getDesiredTargetEntity() : null;
      Ref var14 = var13 != null && var13.isValid() ? var13 : null;
      double var15 = var14 != null ? var12.getDesiredTargetDistance() : Double.MAX_VALUE;
      double var17 = var15 * this.separationSafeDistanceMultiplier;
      boolean var19 = var17 < this.separationDistance;
      double var20 = this.separationDistance * this.separationDistance;
      Vector3d var22;
      if (var14 != null) {
         TransformComponent var23 = var4.getComponent(var14, var3);
         assert var23 != null;
         var22 = var23.getPosition();
      } else {
         var22 = null;
      }

      PositionCache.get(var1, var4).forEachEntityInAvoidanceRange(this.ignoredEntitiesForAvoidance, (var19x, var20x, var21, var22x) -> {
         if (var1 != var19x) {
            if (var5 != var19x) {
               TransformComponent var23 = var22x.getComponent(var19x, var3);
               assert var23 != null;
               Vector3d var24 = var23.getPosition();
               double var25 = this.separationDistance;
               double var27 = this.separationPushDistanceWeightDefault;
               if (var19) {
                  if (var19x == var14) {
                     double var29 = NPCPhysicsMath.distanceSquaredWithSelector(var22, var2, var20x);
                     if (var29 <= var20) {
                        var25 = Math.max(Math.sqrt(var29) * this.separationSafeDistanceMultiplier, var17);
                        var27 = this.separationPushDistanceWeightTarget;
                     }
                  } else if (var22 != null && NPCPhysicsMath.distanceSquaredWithSelector(var24, var22, var20x) <= var20) {
                     var25 = var17;
                     var27 = this.separationPushDistanceWeightAttacker;
                  }
               }

               double var41 = (var24.x() - var6) * var20x.x;
               double var31 = (var24.y() - var8) * var20x.y;
               double var33 = (var24.z() - var10) * var20x.z;
               double var35 = NPCPhysicsMath.dotProduct(var41, var31, var33);
               if (!(var35 > var25 * var25)) {
                  double var37;
                  if (var35 < 1.0E-6) {
                     while (true) {
                        var41 = RandomExtra.randomRange(-1.0, 1.0) * var20x.x;
                        var31 = RandomExtra.randomRange(-1.0, 1.0) * var20x.y;
                        var33 = RandomExtra.randomRange(-1.0, 1.0) * var20x.z;
                        var35 = NPCPhysicsMath.dotProduct(var41, var31, var33);
                        if (!(var35 < 1.0E-6)) {
                           double var39 = 0.001 / Math.sqrt(var35);
                           var41 *= var39;
                           var31 *= var39;
                           var33 *= var39;
                           var37 = 0.001;
                           break;
                        }
                     }
                  } else {
                     var37 = Math.sqrt(var35);
                  }

                  var35 = var37 / var25;
                  var35 = 1.0 - Math.pow(var35, var27);
                  var35 /= var37;
                  var41 *= var35;
                  var31 *= var35;
                  var33 *= var35;
                  if (DebugSupport.get(var1, var4).isDebugFlagSet(RoleDebugFlags.VisSeparationTargets)) {
                     World var52 = var4.getExternalData().getWorld();
                     VisHelper.renderDebugSphere(var24, var25, var25 == this.separationDistance ? DebugUtils.COLOR_WHITE : DebugUtils.COLOR_CYAN, var52);
                     Vector3d var40 = new Vector3d(var41, var31, var33);
                     VisHelper.renderDebugVector(var2, var40, DebugUtils.COLOR_YELLOW, var52);
                  }

                  this.separationSummedDistances.add(var41, var31, var33);
                  this.separationSummedCount++;
               }
            }
         }
      }, this.activeMotionController.getComponentSelector(), this, var4);
   }

   class="kw">private void scaleSummedDistancesPush(@Nonnull Vector3d var1, @Nonnull Rotation3f var2, @Nonnull Steering var3, @Nonnull CommandBuffer<EntityStore> var4) {
      this.separationTempDistanceVector.set(this.separationSummedDistances).mul(this.activeMotionController.getComponentSelector());
      double var5 = this.separationTempDistanceVector.lengthSquared();
      if (var5 > 1.0) {
         this.separationTempDistanceVector.normalize();
      }

      this.separationTempDistanceVector.mul(-this.separationPushSteeringStrength);
      this.separationTempSteeringVector.set(var3.getTranslation()).mul(this.activeMotionController.getComponentSelector());
      double var7 = this.separationTempSteeringVector.lengthSquared();
      if (var7 < 1.0000000000000002E-10) {
         if (!this.alwaysApplySeparation) {
            class="kw">return;
         }

         var3.setTranslation(this.separationTempDistanceVector);
         this.lastSeparationSteering.set(this.separationTempDistanceVector);
      } else {
         double var9 = Math.pow(var7, this.separationPushSpeedScale * 0.5);
         this.separationTempDistanceVector.add(this.separationTempSteeringVector).normalize(var9).sub(this.separationTempSteeringVector);
         this.separationTempSteeringVector.set(var3.getTranslation()).add(this.separationTempDistanceVector);
         if (this.separationTempSteeringVector.lengthSquared() > 1.0) {
            this.separationTempSteeringVector.normalize();
         }

         var3.setTranslation(this.separationTempSteeringVector);
         this.lastSeparationSteering.set(this.separationTempDistanceVector);
      }
   }

   @Nonnull
   class="kw">public Vector3d getLastSeparationSteering() {
      class="kw">return this.lastSeparationSteering;
   }

   class="kw">public void blendAvoidance(
      @Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull Rotation3f var3, @Nonnull Steering var4, @Nonnull CommandBuffer<EntityStore> var5
   ) {
      this.steeringForceAvoidCollision.setDebug(DebugSupport.get(var1, var5).isDebugRoleSteering());
      this.steeringForceAvoidCollision.setAvoidanceMode(this.avoidanceMode);
      this.steeringForceAvoidCollision.setSelf(var1, var2, var5);
      if (!this.activeMotionController.estimateVelocity(var4, this.steeringForceAvoidCollision.getSelfVelocity())) {
         this.steeringForceAvoidCollision.setVelocityFromEntity(var1, var5);
      }

      if (this.collisionRadius >= 0.0) {
         this.steeringForceAvoidCollision.setSelfRadius(this.collisionRadius);
      }

      this.steeringForceAvoidCollision.setMaxDistance(this.collisionProbeDistance);
      this.steeringForceAvoidCollision.setFalloff(this.collisionForceFalloff);
      this.steeringForceAvoidCollision.setComponentSelector(this.activeMotionController.getComponentSelector());
      this.steeringForceAvoidCollision.reset();
      PositionCache.get(var1, var5)
         .forEachEntityInAvoidanceRange(
            this.ignoredEntitiesForAvoidance, (var0, var1x, var2x) -> var1x.add(var0, var2x), this.steeringForceAvoidCollision, var5
         );
      this.steeringForceAvoidCollision.compute(var4);
   }

   @Nonnull
   class="kw">public Vector3d getLastAvoidanceSteering() {
      class="kw">return this.steeringForceAvoidCollision.getLastSteeringDirection();
   }

   class="kw">public String getRoleName() {
      class="kw">return this.roleName;
   }

   class="kw">public int getRoleIndex() {
      class="kw">return this.roleIndex;
   }

   class="kw">public void setRoleIndex(@Nonnull Holder<EntityStore> var1, int var2, @Nonnull String var3) {
      this.roleIndex = var2;
      this.roleName = var3;
      var1.getComponent(PositionCache.getComponentType()).setRoleIndex(var2);
      var1.getComponent(CombatSupport.getComponentType()).setRoleIndex(var2);
   }

   class="kw">public boolean isInvulnerable() {
      class="kw">return this.invulnerable;
   }

   class="kw">public boolean isBreathesInAir() {
      class="kw">return this.breathesInAir;
   }

   class="kw">public boolean isBreathesInWater() {
      class="kw">return this.breathesInWater;
   }

   class="kw">public double getInertia() {
      class="kw">return this.inertia;
   }

   class="kw">public double getKnockbackScale() {
      class="kw">return this.knockbackScale;
   }

   class="kw">public boolean canBreathe(@Nonnull BlockMaterial var1, int var2) {
      class="kw">return this.invulnerable ? true : this.couldBreathe(var1, var2);
   }

   class="kw">public boolean couldBreathe(@Nonnull BlockMaterial var1, int var2) {
      if (var2 != 0) {
         class="kw">return this.breathesInWater;
      } else {
         class="kw">return var1 == BlockMaterial.Empty ? this.breathesInAir : false;
      }
   }

   class="kw">public boolean couldBreatheCached(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      class="kw">return PositionCache.get(var1, var2).couldBreatheCached();
   }

   class="kw">public void addVelocity(@Nonnull Vector3d var1, @Nullable VelocityConfig var2) {
      if (this.activeMotionController != null) {
         this.activeMotionController.addVelocity(var1, var2);
      }
   }

   class="kw">public void setVelocity(@Nonnull Vector3d var1, @Nullable VelocityConfig var2, boolean var3) {
      if (this.activeMotionController != null) {
         this.activeMotionController.setVelocity(var1, var2, var3);
      }
   }

   class="kw">public void processAddVelocityInstruction(@Nonnull Vector3d var1, @Nullable VelocityConfig var2) {
      if (this.activeMotionController != null) {
         this.activeMotionController.addVelocity(var1, var2);
      }
   }

   class="kw">public void processSetVelocityInstruction(@Nonnull Vector3d var1, @Nullable VelocityConfig var2) {
      if (this.activeMotionController != null) {
         this.activeMotionController.setVelocity(Vector3dUtil.ZERO, null, false);
         this.activeMotionController.addVelocity(var1, var2);
      }
   }

   class="kw">public boolean isOnGround() {
      class="kw">return this.activeMotionController != null && this.activeMotionController.onGround();
   }

   class="kw">public void setArmor(@Nonnull NPCEntity var1, @Nullable String[] var2) {
      this.armor = var2;
   }

   class="kw">public boolean isPickupDropOnDeath() {
      class="kw">return this.pickupDropOnDeath;
   }

   class="kw">public boolean requiresLeashPosition() {
      class="kw">return this.requiresLeashPosition;
   }

   class="kw">public void clearOnce(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      this.rootInstruction.clearOnce();
      if (this.interactionInstruction != null) {
         this.interactionInstruction.clearOnce();
      }

      if (this.deathInstruction != null) {
         this.deathInstruction.clearOnce();
      }

      StateSupport.get(var1, var2).pollNeedClearOnce();
   }

   class="kw">public void clearOnceIfNeeded(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      StateSupport var3 = StateSupport.get(var1, var2);
      if (var3.pollNeedClearOnce()) {
         this.clearOnce(var1, var2);
         var3.resetLocalStateMachines();
      }
   }

   class="kw">public void setMarkedTarget(
      @Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull String var3, @Nonnull Ref<EntityStore> var4
   ) {
      MarkedEntitySupport.get(var1, var2).setMarkedEntity(var3, var4);
   }

   class="kw">public boolean isIgnoredForAvoidance(@Nonnull Ref<EntityStore> var1) {
      class="kw">return this.ignoredEntitiesForAvoidance.contains(var1);
   }

   class="kw">public Role.AvoidanceMode getAvoidanceMode() {
      class="kw">return this.avoidanceMode;
   }

   class="kw">public double getCollisionRadius() {
      class="kw">return this.collisionRadius;
   }

   class="kw">public int[] getFlockSpawnTypes() {
      if (this.flockSpawnTypeIndices != null) {
         class="kw">return this.flockSpawnTypeIndices;
      }

      int var1 = this.flockSpawnTypes == null ? 0 : this.flockSpawnTypes.length;
      this.flockSpawnTypeIndices = new int[var1];

      for (int var2 = 0; var2 < var1; var2++) {
         String var3 = this.flockSpawnTypes[var2];
         int var4 = NPCPlugin.get().getIndex(var3);
         if (var4 == Integer.MIN_VALUE) {
            throw new IllegalStateException(String.format("Role %s contains unknown FlockSpawnTypes NPC %s", this.roleName, var3));
         }

         this.flockSpawnTypeIndices[var2] = var4;
      }

      class="kw">return this.flockSpawnTypeIndices;
   }

   @Nonnull
   class="kw">public String[] getFlockAllowedRoles() {
      class="kw">return this.flockAllowedRoles != null ? Arrays.copyOf(this.flockAllowedRoles, this.flockAllowedRoles.length) : ArrayUtil.EMPTY_STRING_ARRAY;
   }

   class="kw">public boolean isFlockSpawnTypesRandom() {
      class="kw">return this.flockSpawnTypesRandom;
   }

   class="kw">public boolean isCanLeadFlock() {
      class="kw">return this.canLeadFlock;
   }

   class="kw">public double getFlockInfluenceRange() {
      class="kw">return this.flockInfluenceRange;
   }

   class="kw">public double getDeathAnimationTime() {
      class="kw">return this.deathAnimationTime;
   }

   @Nullable
   class="kw">public String getDeathParticles() {
      class="kw">return this.deathParticles;
   }

   class="kw">public boolean isDropDeathItemsInstantly() {
      class="kw">return this.dropDeathItemsInstantly;
   }

   class="kw">public boolean hasDroppedDeathItems() {
      class="kw">return this.deathItemsDropped;
   }

   class="kw">public void setDeathItemsDropped() {
      this.deathItemsDropped = true;
   }

   @Nullable
   class="kw">public String getDeathInteraction() {
      class="kw">return this.deathInteraction;
   }

   class="kw">public float getDespawnAnimationTime() {
      class="kw">return this.despawnAnimationTime;
   }

   class="kw">public void setReachedTerminalAction(boolean var1) {
      this.hasReachedTerminalAction = var1;
   }

   class="kw">public boolean hasReachedTerminalAction() {
      class="kw">return this.hasReachedTerminalAction;
   }

   class="kw">public boolean isBackingAway() {
      class="kw">return this.backingAway;
   }

   class="kw">public void setBackingAway(boolean var1) {
      this.backingAway = var1;
   }

   @Nullable
   class="kw">public String getSteeringMotionName() {
      BodyMotion var1 = this.getLastBodySteeringMotion();
      class="kw">return var1 == null ? null : var1.getClass().getSimpleName();
   }

   @Nullable
   class="kw">public BodyMotion getLastBodySteeringMotion() {
      if (this.lastBodyMotionStep == null) {
         class="kw">return null;
      }

      BodyMotion var1 = this.lastBodyMotionStep.getBodyMotion();
      class="kw">return var1 == null ? null : var1.getSteeringMotion();
   }

   @Nullable
   class="kw">public EnumSet<RelaxedConstraint> getSteeringRelaxedConstraints() {
      BodyMotion var1 = this.getLastBodySteeringMotion();
      class="kw">return var1 == null ? null : var1.getRelaxedConstraints();
   }

   @Override
   class="kw">public int componentCount() {
      class="kw">return 1;
   }

   @Override
   class="kw">public IAnnotatedComponent getComponent(int var1) {
      class="kw">return this.rootInstruction;
   }

   @Override
   class="kw">public void getInfo(ExecutionSupport var1, ComponentInfo var2) {
   }

   @Override
   class="kw">public int getIndex() {
      throw new UnsupportedOperationException("Roles do not have component indexes!");
   }

   @Override
   class="kw">public void setContext(IAnnotatedComponent var1, int var2) {
      throw new UnsupportedOperationException("Roles do not have parent contexts!");
   }

   @Nullable
   @Override
   class="kw">public IAnnotatedComponent getParent() {
      class="kw">return null;
   }

   @Override
   class="kw">public String getLabel() {
      class="kw">return this.roleName;
   }

   class="kw">private void initialiseInventories(@Nonnull NPCEntity var1, @Nonnull Holder<EntityStore> var2, @Nonnull Store<EntityStore> var3) {
      List var4 = null;
      if (this.inventoryContentsDropList != null) {
         ItemModule var5 = ItemModule.get();
         if (var5.isEnabled()) {
            var4 = var5.getRandomItemDrops(this.inventoryContentsDropList);
         }
      }

      int var10 = var4 != null && var4.size() > this.inventorySlots ? var4.size() : this.inventorySlots;
      if (var10 > 0 || this.hotbarSlots > 3 || this.offHandSlots > 0) {
         ObjectArrayList var6 = new ObjectArrayList();
         InventoryComponent.Hotbar var7 = var2.getComponent(InventoryComponent.Hotbar.getComponentType());
         if (var7 != null) {
            var7.ensureCapacity((short)this.hotbarSlots, var6);
         }

         InventoryComponent.Utility var8 = var2.getComponent(InventoryComponent.Utility.getComponentType());
         if (var8 != null) {
            var8.ensureCapacity((short)this.offHandSlots, var6);
         }

         InventoryComponent.Storage var9 = var2.getComponent(InventoryComponent.Storage.getComponentType());
         if (var9 != null) {
            var9.ensureCapacity((short)var10, var6);
         }
      }

      if (var4 != null) {
         InventoryComponent.Storage var11 = var2.getComponent(InventoryComponent.Storage.getComponentType());
         if (var11 != null) {
            for (ItemStack var14 : var4) {
               var11.getInventory().addItemStack(var14);
            }
         }
      }

      this.initialiseItemsAndArmor(var2, var1, var3);
      if (this.defaultOffHandSlot >= 0) {
         InventoryComponent.Utility var12 = var2.getComponent(InventoryComponent.Utility.getComponentType());
         if (var12 != null && this.defaultOffHandSlot != var12.getActiveSlot() && this.defaultOffHandSlot < var12.getInventory().getCapacity()) {
            var12.setActiveSlot(this.defaultOffHandSlot, var2, var3);
         }
      }
   }

   class="kw">private void initialiseInventories(@Nonnull NPCEntity var1, @Nonnull ComponentAccessor<EntityStore> var2, @Nonnull Ref<EntityStore> var3) {
      List var4 = null;
      if (this.inventoryContentsDropList != null) {
         ItemModule var5 = ItemModule.get();
         if (var5.isEnabled()) {
            var4 = var5.getRandomItemDrops(this.inventoryContentsDropList);
         }
      }

      int var10 = var4 != null && var4.size() > this.inventorySlots ? var4.size() : this.inventorySlots;
      if (var10 > 0 || this.hotbarSlots > 3 || this.offHandSlots > 0) {
         ObjectArrayList var6 = new ObjectArrayList();
         InventoryComponent.Hotbar var7 = var2.getComponent(var3, InventoryComponent.Hotbar.getComponentType());
         if (var7 != null) {
            var7.ensureCapacity((short)this.hotbarSlots, var6);
         }

         InventoryComponent.Utility var8 = var2.getComponent(var3, InventoryComponent.Utility.getComponentType());
         if (var8 != null) {
            var8.ensureCapacity((short)this.offHandSlots, var6);
         }

         InventoryComponent.Storage var9 = var2.getComponent(var3, InventoryComponent.Storage.getComponentType());
         if (var9 != null) {
            var9.ensureCapacity((short)var10, var6);
         }
      }

      if (var4 != null) {
         InventoryComponent.Storage var11 = var2.getComponent(var3, InventoryComponent.Storage.getComponentType());
         if (var11 != null) {
            for (ItemStack var13 : var4) {
               var11.getInventory().addItemStack(var13);
            }
         }
      }

      this.initialiseInventories(var3, var1, var2);
   }

   class="kw">private void initialiseItemsAndArmor(@Nonnull Holder<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull Store<EntityStore> var3) {
      if (this.hotbarItems != null && this.hotbarItems.length > 0) {
         InventoryComponent.Hotbar var4 = var1.getComponent(InventoryComponent.Hotbar.getComponentType());
         if (var4 != null && var4.getInventory().isEmpty()) {
            ItemContainer var5 = var4.getInventory();

            for (byte var6 = 0; var6 < this.hotbarItems.length; var6++) {
               String var7 = this.hotbarItems[var6];
               if (var7 != null) {
                  if (var7.startsWith("Droplist:")) {
                     if (var6 >= var5.getCapacity()) {
                        NPCPlugin.get().getLogger().at(Level.WARNING).log("Invalid hotbar slot %s. Max is %s", var6, var5.getCapacity() - 1);
                     } else {
                        List var8 = ItemModule.get().getRandomItemDrops(var7.substring("Droplist:".length()));
                        var5.setItemStackForSlot(var6, var8.get(RandomExtra.randomRange(var8.size())));
                     }
                  } else if (InventoryHelper.itemKeyExists(var7) && var6 < var5.getCapacity() && !InventoryHelper.matchesItem(var7, var5.getItemStack(var6))) {
                     ItemStack var17 = InventoryHelper.createItem(var7);
                     var5.setItemStackForSlot(var6, var17);
                  }
               }
            }
         }
      }

      if (this.offHandItems != null && this.offHandItems.length > 0) {
         InventoryComponent.Utility var9 = var1.getComponent(InventoryComponent.Utility.getComponentType());
         if (var9 != null) {
            ItemContainer var11 = var9.getInventory();

            for (byte var13 = 0; var13 < this.offHandItems.length; var13++) {
               String var15 = this.offHandItems[var13];
               if (InventoryHelper.itemKeyExists(var15) && var13 < var11.getCapacity() && !InventoryHelper.matchesItem(var15, var11.getItemStack(var13))) {
                  var11.setItemStackForSlot(var13, InventoryHelper.createItem(var15));
               }
            }
         }
      }

      if (this.armor != null) {
         InventoryComponent.Armor var10 = var1.getComponent(InventoryComponent.Armor.getComponentType());
         if (var10 != null) {
            for (String var18 : this.armor) {
               if (!InventoryHelper.useArmor(var10.getInventory(), var18)) {
                  NPCPlugin.get().getLogger().at(Level.WARNING).log("NPC of type '%s': Failed to use armor '%s'", var2.getRoleName(), var18);
               }
            }
         }
      }
   }

   class="kw">private void initialiseItemsAndArmor(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      if (this.hotbarItems != null && this.hotbarItems.length > 0) {
         InventoryComponent.Hotbar var4 = var3.getComponent(var1, InventoryComponent.Hotbar.getComponentType());
         if (var4 != null && var4.getInventory().isEmpty()) {
            for (byte var5 = 0; var5 < this.hotbarItems.length; var5++) {
               String var6 = this.hotbarItems[var5];
               if (var6 != null) {
                  if (var6.startsWith("Droplist:")) {
                     if (InventoryHelper.checkHotbarSlot(var1, var5, var3)) {
                        List var7 = ItemModule.get().getRandomItemDrops(var6.substring("Droplist:".length()));
                        var4.getInventory().setItemStackForSlot(var5, var7.get(RandomExtra.randomRange(var7.size())));
                     }
                  } else {
                     InventoryHelper.setHotbarItem(var1, var6, var5, var3);
                  }
               }
            }
         }
      }

      if (this.offHandItems != null && this.offHandItems.length > 0) {
         for (byte var9 = 0; var9 < this.offHandItems.length; var9++) {
            InventoryHelper.setOffHandItem(var1, this.offHandItems[var9], var9, var3);
         }
      }

      if (this.armor != null) {
         InventoryComponent.Armor var10 = var3.getComponent(var1, InventoryComponent.Armor.getComponentType());
         if (var10 != null) {
            for (String var8 : this.armor) {
               if (!InventoryHelper.useArmor(var10.getInventory(), var8)) {
                  NPCPlugin.get().getLogger().at(Level.WARNING).log("NPC of type '%s': Failed to use armor '%s'", var2.getRoleName(), var8);
               }
            }
         }
      }
   }

   class="kw">private void initialiseInventories(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      this.initialiseItemsAndArmor(var1, var2, var3);
      if (this.defaultOffHandSlot >= 0) {
         InventoryHelper.setOffHandSlot(var1, this.defaultOffHandSlot, var3);
      }
   }

   class="kw">public boolean isCorpseStaysInFlock() {
      class="kw">return this.corpseStaysInFlock;
   }

   class="kw">public void onLoadFromWorldGenOrPrefab(@Nonnull Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      var3.getComponent(var1, DisplayNameSupport.getComponentType()).pickRandomDisplayName(var1, true, var3);
      this.initialiseInventories(var2, var3, var1);
   }

   class="kw">public enum AvoidanceMode class="kw">implements Supplier<String> {
      Slowdown("Only slow down NPC"),
      Evade("Only evade"),
      Any("Any avoidance allowed");

      @Nonnull
      class="kw">private class="kw">final String description;

      AvoidanceMode(@Nonnull class="kw">final String nullxx) {
         this.description = nullxx;
      }

      @Nonnull
      class="kw">public String get() {
         class="kw">return this.description;
      }
   }

   class="kw">public enum SeparationMode class="kw">implements Supplier<String> {
      Legacy("Flock like separation force"),
      Push("Push away from all neighbours and also applied when no other steering happens");

      class="kw">private class="kw">final String description;

      SeparationMode(String nullxx) {
         this.description = nullxx;
      }

      class="kw">public String get() {
         class="kw">return this.description;
      }
   }
}