SeparationMode enum

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

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

implements: Supplier<String>

Поля (1)

МодификаторыТипИмя
private final String description

Методы (2)

МодификаторыВозвратСигнатура
abstract Push Push("Push away from all neighbours and also applied when no other steering happens")
public String getpublic String get()

Исходный код

Показать/скрыть
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;
      }
   }
}