BuilderRole class

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

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

extends: SupportConfigBuilder<Role>

implements: ISpawnableWithModel, SpawnEffect, RoleBuilder

Поля (29)

МодификаторыТипИмя
final double[] DEFAULT_HEAD_PITCH_RANGE
BuilderInfo var1
int var1
BuilderFactory var10
BuilderMotionControllerBase var11
String[] var13
boolean var15
var15
var15
boolean var16
var16
boolean var17
StateEvaluator var2
Builder var2
double[] var2
String var2
SpawnTestResult var3
Builder var5
NPCPlugin var5
boolean var6
var6
var6
String[] var6
String[] var7
boolean var7
var7
var7
String[] var8
String var9

Методы (72)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown key! " + this.opaqueBlockSet)
for for(String var11 : var6)
for for(String var12 : var13)
public String getAllowedEnvironmentsString getAllowedEnvironments()
public String getAppearanceString getAppearance(@Nonnull BuilderSupport var1)
public String[] getArmorString[] getArmor()
public Role.AvoidanceMode getAvoidanceModeRole.AvoidanceMode getAvoidanceMode(BuilderSupport var1)
public double getCollisionDistancedouble getCollisionDistance()
public double getCollisionForceFalloffdouble getCollisionForceFalloff()
public double getCollisionRadiusdouble getCollisionRadius()
public float getCollisionViewAnglefloat getCollisionViewAngle()
public double getDeathAnimationTimedouble getDeathAnimationTime(@Nonnull BuilderSupport var1)
public String getDeathParticlesString getDeathParticles(@Nonnull BuilderSupport var1)
public byte getDefaultOffHandSlotbyte getDefaultOffHandSlot(@Nonnull BuilderSupport var1)
public float getDespawnAnimationTimefloat getDespawnAnimationTime()
public String getDropListIdString getDropListId(@Nonnull BuilderSupport var1)
public double getEntityAvoidanceStrengthdouble getEntityAvoidanceStrength()
public double getFlockInfluenceRangedouble getFlockInfluenceRange()
public double getFlockWeightAlignmentdouble getFlockWeightAlignment()
public double getFlockWeightCohesiondouble getFlockWeightCohesion()
public double getFlockWeightSeparationdouble getFlockWeightSeparation()
public float[] getHeadPitchAngleRangefloat[] getHeadPitchAngleRange(@Nonnull BuilderSupport var1)
public int getHotbarSlotsint getHotbarSlots()
public double getInertiadouble getInertia()
public String getInitialMotionControllerString getInitialMotionController(@Nonnull BuilderSupport var1)
public String getInventoryItemsDropListString getInventoryItemsDropList(@Nonnull BuilderSupport var1)
public int getInventorySlotsint getInventorySlots()
public double getKnockbackScaledouble getKnockbackScale(@Nonnull BuilderSupport var1)
public int getMaxHealthint getMaxHealth(@Nonnull BuilderSupport var1)
public String getMemoriesNameOverrideString getMemoriesNameOverride(ExecutionContext var1)
public String getNameTranslationKeyString getNameTranslationKey(BuilderSupport var1)
public int getOffHandSlotsint getOffHandSlots()
public int getOpaqueBlockSetint getOpaqueBlockSet()
public FeatureOverride getOverrideAlwaysSeparateFeatureOverride getOverrideAlwaysSeparate(BuilderSupport var1)
public FeatureOverride getOverrideNormalizeDistancesFeatureOverride getOverrideNormalizeDistances(BuilderSupport var1)
public FeatureOverride getOverrideUseOrientationHintFeatureOverride getOverrideUseOrientationHint(BuilderSupport var1)
public double getSeparationDistancedouble getSeparationDistance(BuilderSupport var1)
public double getSeparationDistanceTargetdouble getSeparationDistanceTarget(BuilderSupport var1)
public double getSeparationFarRadiusTargetdouble getSeparationFarRadiusTarget(BuilderSupport var1)
public double getSeparationLegacySteeringStrengthdouble getSeparationLegacySteeringStrength(BuilderSupport var1)
public Role.SeparationMode getSeparationModeRole.SeparationMode getSeparationMode(BuilderSupport var1)
public double getSeparationNearRadiusTargetdouble getSeparationNearRadiusTarget(BuilderSupport var1)
public double getSeparationPushDistanceWeightAttackerdouble getSeparationPushDistanceWeightAttacker(BuilderSupport var1)
public double getSeparationPushDistanceWeightDefaultdouble getSeparationPushDistanceWeightDefault(BuilderSupport var1)
public double getSeparationPushDistanceWeightTargetdouble getSeparationPushDistanceWeightTarget(BuilderSupport var1)
public double getSeparationPushSpeedScaledouble getSeparationPushSpeedScale(BuilderSupport var1)
public double getSeparationPushSteeringStrengthdouble getSeparationPushSteeringStrength(BuilderSupport var1)
public double getSeparationSafeDistanceMultiplierdouble getSeparationSafeDistanceMultiplier(BuilderSupport var1)
public double getSeparationWeightdouble getSeparationWeight(BuilderSupport var1)
public float getSpawnLockTimefloat getSpawnLockTime(BuilderSupport var1)
if if(var9 != null)
if if(var2 != null)
if if(var2 instanceof ISpawnable)
if if(var3 != SpawnTestResult.TEST_OK)
if if(var5 instanceof ISpawnable)
if if(var1 == Integer.MIN_VALUE)
if if(var6 != null)
if if(var13 != null)
if if(!var7)
public boolean isApplySeparationboolean isApplySeparation(BuilderSupport var1)
public boolean isAvoidanceFallCheckboolean isAvoidanceFallCheck(BuilderSupport var1)
public boolean isAvoidingEntitiesboolean isAvoidingEntities()
public boolean isCanLeadFlockboolean isCanLeadFlock(@Nonnull BuilderSupport var1)
public boolean isCorpseStaysInFlockboolean isCorpseStaysInFlock()
public boolean isDropDeathItemsInstantlyboolean isDropDeathItemsInstantly(@Nonnull BuilderSupport var1)
public boolean isFlockSpawnTypeRandomboolean isFlockSpawnTypeRandom(@Nonnull BuilderSupport var1)
public boolean isInvulnerableboolean isInvulnerable(BuilderSupport var1)
public boolean isMemoryboolean isMemory(ExecutionContext var1)
public boolean isOverridingHeadPitchAngleboolean isOverridingHeadPitchAngle(@Nonnull BuilderSupport var1)
public boolean isPickupDropOnDeathboolean isPickupDropOnDeath()
public boolean isStayingInEnvironmentboolean isStayingInEnvironment()
public void registerStateEvaluatorvoid registerStateEvaluator(@Nonnull BuilderSupport var1)

Исходный код

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

class="kw">import com.google.gson.JsonElement;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockset.config.BlockSet;
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.Builder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderCodecObjectHelper;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderCombatConfig;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptorState;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderFactory;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderInfo;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderObjectListHelper;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderObjectReferenceHelper;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderTemplateInteractionVars;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderValidationHelper;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.FeatureEvaluatorHelper;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.FeatureOverride;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.InstructionContextHelper;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.InstructionType;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.SupportConfigBuilder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.AssetArrayHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.AssetHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.BooleanHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.DoubleHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.EnumHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.FloatHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.IntHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.NumberArrayHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.StringArrayHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.StringHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.AssetValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleRangeValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleSequenceValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleSingleValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.IntRangeValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.IntSingleValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.StringArrayNoEmptyStringsValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.StringNotEmptyValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.StringNullOrNotEmptyValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.asset.BlockSetExistsValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.asset.ItemDropListExistsValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.asset.ItemExistsValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.asset.ModelExistsValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.asset.ParticleSystemExistsValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.asset.RootInteractionValidator;
class="kw">import com.hypixel.hytale.server.npc.config.balancing.BalanceAsset;
class="kw">import com.hypixel.hytale.server.npc.decisionmaker.stateevaluator.StateEvaluator;
class="kw">import com.hypixel.hytale.server.npc.instructions.Instruction;
class="kw">import com.hypixel.hytale.server.npc.movement.MovementMode;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.BuilderMotionControllerMapUtil;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.MotionController;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.builders.BuilderMotionControllerBase;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.role.SpawnEffect;
class="kw">import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
class="kw">import com.hypixel.hytale.server.npc.util.expression.Scope;
class="kw">import com.hypixel.hytale.server.npc.validators.NPCLoadTimeValidationHelper;
class="kw">import com.hypixel.hytale.server.spawning.ISpawnable;
class="kw">import com.hypixel.hytale.server.spawning.ISpawnableWithModel;
class="kw">import com.hypixel.hytale.server.spawning.SpawnTestResult;
class="kw">import com.hypixel.hytale.server.spawning.SpawningContext;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Set;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class BuilderRole class="kw">extends SupportConfigBuilder<Role> class="kw">implements ISpawnableWithModel, SpawnEffect, RoleBuilder {
   class="kw">protected class="kw">static class="kw">final double[] DEFAULT_HEAD_PITCH_RANGE = new double[]{-89.0, 89.0};
   class="kw">protected String[] displayNames;
   class="kw">protected class="kw">final AssetHolder appearance = new AssetHolder();
   class="kw">protected class="kw">final AssetHolder dropListId = new AssetHolder();
   class="kw">protected class="kw">final IntHolder maxHealth = new IntHolder();
   class="kw">protected double inertia;
   class="kw">protected class="kw">final DoubleHolder knockbackScale = new DoubleHolder();
   class="kw">protected String opaqueBlockSet;
   class="kw">protected boolean applyAvoidance;
   class="kw">protected double entityAvoidanceStrength;
   class="kw">protected double collisionDistance;
   class="kw">protected double collisionForceFalloff;
   class="kw">protected double collisionRadius;
   class="kw">protected float collisionViewAngle;
   class="kw">protected class="kw">final DoubleHolder separationDistance = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationWeight = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationDistanceTarget = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationNearRadiusTarget = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationFarRadiusTarget = new DoubleHolder();
   class="kw">protected class="kw">final BooleanHolder applySeparation = new BooleanHolder();
   class="kw">protected class="kw">final BooleanHolder avoidanceFallCheck = new BooleanHolder();
   class="kw">protected class="kw">final EnumHolder<Role.AvoidanceMode> avoidanceMode = new EnumHolder<>();
   class="kw">protected class="kw">final EnumHolder<Role.SeparationMode> separationMode = new EnumHolder<>();
   class="kw">protected class="kw">final EnumHolder<FeatureOverride> featureOverrideOrientationHint = new EnumHolder<>();
   class="kw">protected class="kw">final EnumHolder<FeatureOverride> featureOverrideAlwaysSeparate = new EnumHolder<>();
   class="kw">protected class="kw">final EnumHolder<FeatureOverride> featureOverrideNormalizeDistances = new EnumHolder<>();
   class="kw">protected class="kw">final DoubleHolder separationSafeDistanceMultiplier = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationLegacySteeringStrength = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationPushSteeringStrength = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationPushDistanceWeightDefault = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationPushDistanceWeightTarget = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationPushDistanceWeightAttacker = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder separationPushSpeedScale = new DoubleHolder();
   class="kw">protected boolean stayInEnvironment;
   class="kw">protected String allowedEnvironments;
   class="kw">protected class="kw">final StringArrayHolder flockSpawnTypes = new StringArrayHolder();
   class="kw">protected class="kw">final BooleanHolder flockSpawnTypeRandom = new BooleanHolder();
   class="kw">protected class="kw">final StringArrayHolder flockAllowedRoles = new StringArrayHolder();
   class="kw">protected class="kw">final BooleanHolder canLeadFlock = new BooleanHolder();
   class="kw">protected class="kw">final FloatHolder spawnLockTime = new FloatHolder();
   class="kw">protected double flockWeightAlignment;
   class="kw">protected double flockWeightSeparation;
   class="kw">protected double flockWeightCohesion;
   class="kw">protected double flockInfluenceRange;
   class="kw">protected boolean corpseStaysInFlock;
   class="kw">protected class="kw">final BooleanHolder invulnerable = new BooleanHolder();
   class="kw">protected class="kw">final BooleanHolder breathesInAir = new BooleanHolder();
   class="kw">protected class="kw">final BooleanHolder breathesInWater = new BooleanHolder();
   class="kw">protected class="kw">final AssetArrayHolder hotbarItems = new AssetArrayHolder();
   class="kw">protected class="kw">final AssetArrayHolder offHandItems = new AssetArrayHolder();
   class="kw">protected class="kw">final AssetHolder inventoryItemsDropList = new AssetHolder();
   class="kw">protected class="kw">final IntHolder defaultOffHandSlot = new IntHolder();
   class="kw">protected boolean pickupDropOnDeath;
   class="kw">protected String[] armor;
   class="kw">protected class="kw">final DoubleHolder deathAnimationTime = new DoubleHolder();
   class="kw">protected class="kw">final AssetHolder deathParticles = new AssetHolder();
   class="kw">protected class="kw">final BooleanHolder dropDeathItemsInstantly = new BooleanHolder();
   class="kw">protected float despawnAnimationTime;
   @Nonnull
   class="kw">protected AssetHolder deathInteraction = new AssetHolder();
   class="kw">protected class="kw">final AssetHolder spawnParticles = new AssetHolder();
   class="kw">protected class="kw">final NumberArrayHolder spawnParticleOffset = new NumberArrayHolder();
   class="kw">protected class="kw">final StringHolder spawnParticlesTargetNode = new StringHolder();
   class="kw">protected class="kw">final BooleanHolder spawnParticlesDetached = new BooleanHolder();
   class="kw">protected double spawnViewDistance;
   class="kw">protected int inventorySlots;
   class="kw">protected int hotbarSlots;
   class="kw">protected int offHandSlots;
   class="kw">protected class="kw">final BuilderObjectReferenceHelper<Map<String, MotionController>> motionControllers = new BuilderObjectReferenceHelper<>(
      BuilderMotionControllerMapUtil.CLASS_REFERENCE, this
   );
   class="kw">protected class="kw">final BuilderObjectListHelper<Instruction> instructionList = new BuilderObjectListHelper<>(Instruction.class, this);
   class="kw">protected class="kw">final BuilderObjectReferenceHelper<Instruction> interactionInstruction = new BuilderObjectReferenceHelper<>(Instruction.class, this);
   class="kw">protected class="kw">final BuilderObjectReferenceHelper<Instruction> deathInstruction = new BuilderObjectReferenceHelper<>(Instruction.class, this);
   class="kw">protected class="kw">final StringHolder initialMotionController = new StringHolder();
   class="kw">protected class="kw">final BuilderCodecObjectHelper<StateEvaluator> stateEvaluator = new BuilderCodecObjectHelper<>(StateEvaluator.class, StateEvaluator.CODEC, null);
   class="kw">protected class="kw">final BuilderCombatConfig combatConfig = new BuilderCombatConfig(BalanceAsset.CHILD_ASSET_CODEC, BalanceAsset.VALIDATOR_CACHE.getValidator());
   class="kw">protected class="kw">final BuilderTemplateInteractionVars interactionVars = new BuilderTemplateInteractionVars();
   class="kw">protected class="kw">final BooleanHolder isMemory = new BooleanHolder();
   class="kw">protected class="kw">final StringHolder memoriesCategory = new StringHolder();
   class="kw">protected class="kw">final StringHolder memoriesNameOverride = new StringHolder();
   class="kw">protected class="kw">final StringHolder nameTranslationKey = new StringHolder();
   class="kw">protected class="kw">final NumberArrayHolder headPitchAngleRange = new NumberArrayHolder();
   class="kw">protected class="kw">final BooleanHolder overrideHeadPitchAngle = new BooleanHolder();

   class="kw">public BuilderRole() {
   }

   @Override
   class="kw">public boolean isSpawnable() {
      class="kw">return true;
   }

   @Nonnull
   @Override
   class="kw">public String getShortDescription() {
      class="kw">return "Generic role for NPC";
   }

   @Nonnull
   @Override
   class="kw">public String getLongDescription() {
      class="kw">return "Generic role for NPC with a core planner and list of Motion controllers.";
   }

   @Nonnull
   @Override
   class="kw">public BuilderDescriptorState getBuilderDescriptorState() {
      class="kw">return BuilderDescriptorState.Stable;
   }

   @Nonnull
   class="kw">public Role build(@Nonnull BuilderSupport var1) {
      throw new UnsupportedOperationException("Use BuilderRole.createAndAttach(holder, builderSupport) - Role requires entity context");
   }

   @Nonnull
   @Override
   class="kw">public Role createAndAttach(@Nonnull Holder<EntityStore> var1, @Nonnull BuilderSupport var2) {
      class="kw">return Role.createAndAttach(var1, this, var2);
   }

   @Override
   class="kw">public boolean validate(String var1, @Nonnull NPCLoadTimeValidationHelper var2, @Nonnull ExecutionContext var3, Scope var4, @Nonnull List<String> var5) {
      var2.setInventorySizes(this.inventorySlots, this.hotbarSlots, this.offHandSlots);

      boolean var6;
      try {
         String[] var7 = this.hotbarItems.get(var3);
         var6 = var7 == null || var7.length == 0 || var2.validateHotbarHasSlot(var7.length - 1, "HotbarItems", var5);
      } catch (IllegalStateException var14) {
         var5.add(String.format("%s: %s", var1, var14.getMessage()));
         var6 = false;
      }

      boolean var15;
      try {
         String[] var8 = this.offHandItems.get(var3);
         var15 = (var8 == null || var8.length == 0 || var2.validateOffHandHasSlot(var8.length - 1, "OffHandItems", var5))
            & var2.validateOffHandHasSlot(this.defaultOffHandSlot.get(var3), "DefaultOffHandSlot", var5);
      } catch (IllegalStateException var13) {
         var5.add(String.format("%s: %s", var1, var13.getMessage()));
         var15 = false;
      }

      boolean var16 = true;
      String var9 = this.initialMotionController.get(var3);
      if (var9 != null) {
         BuilderFactory var10 = this.builderManager.getFactory(MotionController.class);

         try {
            BuilderMotionControllerBase var11 = (BuilderMotionControllerBase)var10.createBuilder(var9);
            var2.requireMotionControllerType(var11.getClassType());
         } catch (IllegalArgumentException var12) {
            var5.add(String.format("%s: Unable to set InitialMotionController to %s as no such MotionController exists", var1, var9));
            var16 = false;
         }
      }

      var2.pushPrecedingScope();
      boolean var17 = this.instructionList.validate(var1, var2, this.builderManager, var3, var4, var5);
      var2.popPrecedingScope();
      class="kw">return super.validate(var1, var2, var3, var4, var5)
         & var6
         & var15
         & var16
         & var17
         & this.interactionInstruction.validate(var1, var2, this.builderManager, var3, var4, var5)
         & this.deathInstruction.validate(var1, var2, this.builderManager, var3, var4, var5)
         & this.stateTransitionController.validate(var1, var2, this.builderManager, var3, var4, var5)
         & this.motionControllers.validate(var1, var2, this.builderManager, var3, var4, var5)
         & this.combatConfig.validate(var1, var2, var3, var5);
   }

   @Nonnull
   class="kw">public BuilderRole readConfig(@Nonnull JsonElement var1) {
      super.readConfig(var1);
      this.setNotComponent();
      this.requireInt(var1, "MaxHealth", this.maxHealth, IntSingleValidator.greater0(), BuilderDescriptorState.Stable, "Max health", null);
      this.requireAsset(var1, "Appearance", this.appearance, ModelExistsValidator.required(), BuilderDescriptorState.Stable, "Model to use for rendering", null);
      this.getStringArray(
         var1,
         "DisplayNames",
         var1x -> this.displayNames = var1x,
         null,
         null,
         StringArrayNoEmptyStringsValidator.get(),
         BuilderDescriptorState.Stable,
         "List of possible display names to choose from",
         null
      );
      this.requireString(
         var1,
         "NameTranslationKey",
         this.nameTranslationKey,
         StringNotEmptyValidator.get(),
         BuilderDescriptorState.Stable,
         "The translation key for this NPC's name",
         null
      );
      this.getAsset(
         var1,
         "OpaqueBlockSet",
         var1x -> this.opaqueBlockSet = var1x,
         "Opaque",
         BlockSetExistsValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Blocks blocking line of sight",
         null
      );
      this.getDouble(
         var1, "Inertia", var1x -> this.inertia = var1x, 1.0, DoubleSingleValidator.greater(0.1), BuilderDescriptorState.Experimental, "Inertia", null
      );
      this.getDouble(
         var1,
         "KnockbackScale",
         this.knockbackScale,
         1.0,
         DoubleSingleValidator.greaterEqual0(),
         BuilderDescriptorState.Stable,
         "Scale factor for knockback",
         "Scale factor for knockback. Values greater 1 increase knockback. Smaller values decrease it."
      );
      this.getInt(
         var1,
         "InventorySize",
         var1x -> this.inventorySlots = var1x,
         0,
         IntRangeValidator.between(0, 36),
         BuilderDescriptorState.Stable,
         "Number of available inventory slots",
         null
      );
      this.getInt(
         var1,
         "HotbarSize",
         var1x -> this.hotbarSlots = var1x,
         3,
         IntRangeValidator.between(3, 8),
         BuilderDescriptorState.Stable,
         "Number of available hotbar slots",
         null
      );
      this.getInt(
         var1,
         "OffHandSlots",
         var1x -> this.offHandSlots = var1x,
         0,
         IntRangeValidator.between(0, 4),
         BuilderDescriptorState.Stable,
         "The number of slots for off-hand items",
         null
      );
      this.getAssetArray(
         var1,
         "HotbarItems",
         this.hotbarItems,
         null,
         0,
         8,
         ItemExistsValidator.orDroplistWithConfig(AssetValidator.ListCanBeEmpty),
         BuilderDescriptorState.Stable,
         "Hotbar items (e.g. primary weapon, secondary weapon, etc)",
         null
      );
      this.getAssetArray(
         var1,
         "OffHandItems",
         this.offHandItems,
         null,
         0,
         8,
         ItemExistsValidator.withConfig(AssetValidator.ListCanBeEmpty),
         BuilderDescriptorState.Stable,
         "Off-hand items (e.g. shields, torches, etc)",
         null
      );
      this.getAsset(
         var1,
         "PossibleInventoryItems",
         this.inventoryItemsDropList,
         null,
         ItemDropListExistsValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "A droplist defining the possible items the NPCs inventory could contain",
         null
      );
      this.getInt(
         var1,
         "DefaultOffHandSlot",
         this.defaultOffHandSlot,
         -1,
         IntRangeValidator.between(-1, 4),
         BuilderDescriptorState.Stable,
         "The class="kw">default off-hand item slot (-1 is empty)",
         null
      );
      this.getAssetArray(
         var1,
         "Armor",
         var1x -> this.armor = var1x,
         null,
         null,
         ItemExistsValidator.withConfig(AssetValidator.ListCanBeEmpty),
         BuilderDescriptorState.WorkInProgress,
         "Armor items",
         null
      );
      this.getAsset(
         var1,
         "DropList",
         this.dropListId,
         null,
         ItemDropListExistsValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Drop list to spawn when killed",
         null
      );
      this.getDouble(
         var1,
         "CollisionDistance",
         var1x -> this.collisionDistance = var1x,
         5.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Stable,
         "Collision lookahead",
         null
      );
      this.getDouble(
         var1,
         "CollisionForceFalloff",
         var1x -> this.collisionForceFalloff = var1x,
         2.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Falloff rate for collision force",
         null
      );
      this.getDouble(
         var1, "CollisionRadius", var1x -> this.collisionRadius = var1x, -1.0, null, BuilderDescriptorState.Experimental, "Collision radius override", null
      );
      this.getFloat(
         var1,
         "CollisionViewAngle",
         var1x -> this.collisionViewAngle = var1x,
         320.0F,
         DoubleRangeValidator.between(0.0, 360.0),
         BuilderDescriptorState.Experimental,
         "Collision detection view cone",
         null
      );
      this.getDouble(
         var1,
         "SeparationDistance",
         this.separationDistance,
         3.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Desired separation distance",
         null
      );
      this.getDouble(
         var1,
         "SeparationWeight",
         this.separationWeight,
         1.0,
         DoubleSingleValidator.greaterEqual0(),
         BuilderDescriptorState.Experimental,
         "Blend factor separation",
         null
      );
      this.getDouble(
         var1,
         "SeparationDistanceTarget",
         this.separationDistanceTarget,
         1.0,
         DoubleSingleValidator.greaterEqual0(),
         BuilderDescriptorState.Experimental,
         "Desired separation distance when close to target",
         null
      );
      this.getDouble(
         var1,
         "SeparationNearRadiusTarget",
         this.separationNearRadiusTarget,
         1.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Distance when using SeparationDistanceTarget",
         null
      );
      this.getDouble(
         var1,
         "SeparationFarRadiusTarget",
         this.separationFarRadiusTarget,
         5.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Use normal separation distance from further than this distance",
         null
      );
      this.getBoolean(
         var1, "ApplyAvoidance", var1x -> this.applyAvoidance = var1x, false, BuilderDescriptorState.Experimental, "Apply avoidance steering force", null
      );
      this.getBoolean(
         var1,
         "AvoidanceFallCheck",
         this.avoidanceFallCheck,
         false,
         BuilderDescriptorState.Deprecated,
         "Deprecated no-op retained for backwards compatibility",
         null
      );
      this.getBoolean(var1, "ApplySeparation", this.applySeparation, false, BuilderDescriptorState.Experimental, "Apply separation steering force", null);
      this.getEnum(
         var1,
         "AvoidanceMode",
         this.avoidanceMode,
         Role.AvoidanceMode.class,
         Role.AvoidanceMode.Any,
         BuilderDescriptorState.Experimental,
         "Abilities to use for avoidance",
         null
      );
      this.getEnum(
         var1,
         "SeparationMode",
         this.separationMode,
         Role.SeparationMode.class,
         Role.SeparationMode.Legacy,
         BuilderDescriptorState.Experimental,
         "Mode for separation calculation",
         null
      );
      this.getDouble(
         var1,
         "SeparationPushSafeDistanceMultiplier",
         this.separationSafeDistanceMultiplier,
         0.8,
         DoubleRangeValidator.between01(),
         BuilderDescriptorState.Experimental,
         "Push Mode: Multiplier to reduce target distance to avoid NPC jittering close to target",
         null
      );
      this.getDouble(
         var1,
         "SeparationLegacySteeringStrength",
         this.separationLegacySteeringStrength,
         0.5,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Legacy mode: Separation steering strength",
         null
      );
      this.getDouble(
         var1,
         "SeparationPushSteeringStrength",
         this.separationPushSteeringStrength,
         0.8,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Push mode: Separation steering strength",
         null
      );
      this.getDouble(
         var1,
         "SeparationPushDistanceWeightDefault",
         this.separationPushDistanceWeightDefault,
         1.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Push mode: falloff exponent for separation distance",
         null
      );
      this.getDouble(
         var1,
         "SeparationPushDistanceWeightTarget",
         this.separationPushDistanceWeightTarget,
         8.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Push mode: falloff exponent when NPC is close to motion target",
         null
      );
      this.getDouble(
         var1,
         "SeparationPushDistanceWeightAttacker",
         this.separationPushDistanceWeightAttacker,
         8.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Push mode: falloff exponent towards other potential attackers when close to motion target",
         null
      );
      this.getDouble(
         var1,
         "SeparationPushSpeedScale",
         this.separationPushSpeedScale,
         0.5,
         DoubleRangeValidator.fromExclToIncl(0.0, 1.0),
         BuilderDescriptorState.Experimental,
         "Push mode: scale to increase smaller speeds for separation",
         null
      );
      this.getOverride(
         var1,
         "SeparationOverrideOrientation",
         this.featureOverrideOrientationHint,
         BuilderDescriptorState.Experimental,
         "Whether to override orientation of NPC when separating",
         null
      );
      this.getOverride(
         var1,
         "SeparationOverrideAlwaysSeparate",
         this.featureOverrideAlwaysSeparate,
         BuilderDescriptorState.Experimental,
         "Whether to separate even if the NPC would rest",
         null
      );
      this.getOverride(
         var1,
         "SeparationOverrideNormalizeDistances",
         this.featureOverrideNormalizeDistances,
         BuilderDescriptorState.Experimental,
         "Whether to normalize distances when summing distances",
         null
      );
      this.getDouble(
         var1,
         "EntityAvoidanceStrength",
         var1x -> this.entityAvoidanceStrength = var1x,
         1.0,
         DoubleSingleValidator.greaterEqual0(),
         BuilderDescriptorState.Experimental,
         "Blending factor avoidance",
         null
      );
      this.getBoolean(
         var1, "StayInEnvironment", var1x -> this.stayInEnvironment = var1x, false, BuilderDescriptorState.Experimental, "Stay in spawning environment", null
      );
      this.getString(
         var1,
         "AllowedEnvironments",
         var1x -> this.allowedEnvironments = var1x,
         null,
         StringNullOrNotEmptyValidator.get(),
         BuilderDescriptorState.Experimental,
         "Allowed environment to walk in",
         null
      );
      this.getStringArray(
         var1,
         "FlockSpawnTypes",
         this.flockSpawnTypes,
         null,
         0,
         Integer.MAX_VALUE,
         StringArrayNoEmptyStringsValidator.get(),
         BuilderDescriptorState.WorkInProgress,
         "Types of NPC this flock should consist off",
         null
      );
      this.getBoolean(
         var1,
         "FlockSpawnTypesRandom",
         this.flockSpawnTypeRandom,
         false,
         BuilderDescriptorState.WorkInProgress,
         "Create a randomized flock if true else spawn in order of FlockSpawnTypes",
         null
      );
      this.getStringArray(
         var1,
         "FlockAllowedNPC",
         this.flockAllowedRoles,
         null,
         0,
         Integer.MAX_VALUE,
         StringArrayNoEmptyStringsValidator.get(),
         BuilderDescriptorState.Experimental,
         "List of NPCs allowed in flock",
         null
      );
      this.getBoolean(var1, "FlockCanLead", this.canLeadFlock, false, BuilderDescriptorState.Experimental, "This NPC can be flock leader", null);
      this.getDouble(
         var1,
         "FlockWeightAlignment",
         var1x -> this.flockWeightAlignment = var1x,
         1.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Blending flock alignment",
         null
      );
      this.getDouble(
         var1,
         "FlockWeightSeparation",
         var1x -> this.flockWeightSeparation = var1x,
         1.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Blending flock separation",
         null
      );
      this.getDouble(
         var1,
         "FlockWeightCohesion",
         var1x -> this.flockWeightCohesion = var1x,
         1.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Blending flock cohesion",
         null
      );
      this.getDouble(
         var1,
         "FlockInfluenceRange",
         var1x -> this.flockInfluenceRange = var1x,
         10.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "Influence radius flock forces",
         null
      );
      this.getCodecObject(
         var1, "CombatConfig", this.combatConfig, BuilderDescriptorState.Stable, "The combat configuration providing optional combat action evaluator", null
      );
      this.getBoolean(var1, "Invulnerable", this.invulnerable, false, BuilderDescriptorState.Stable, "Makes NPC ignore damage", null);
      this.getBoolean(var1, "BreathesInAir", this.breathesInAir, true, BuilderDescriptorState.WorkInProgress, "Can breath in air", null);
      this.getBoolean(var1, "BreathesInWater", this.breathesInWater, false, BuilderDescriptorState.WorkInProgress, "Can breath in fluid/water", null);
      this.getBoolean(
         var1, "PickupDropOnDeath", var1x -> this.pickupDropOnDeath = var1x, false, BuilderDescriptorState.Stable, "Drop last picked item on death", null
      );
      this.getDouble(
         var1,
         "DeathAnimationTime",
         this.deathAnimationTime,
         1.5,
         DoubleSingleValidator.greaterEqual0(),
         BuilderDescriptorState.Experimental,
         "How long to let the death animation play before removing",
         null
      );
      this.getAsset(
         var1,
         "DeathParticles",
         this.deathParticles,
         "Effect_Death",
         ParticleSystemExistsValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Particles to play when the NPC corpse is removed.",
         null
      );
      this.getBoolean(
         var1,
         "DropDeathItemsInstantly",
         this.dropDeathItemsInstantly,
         false,
         BuilderDescriptorState.Stable,
         "Whether or not to drop death items instantly on death, or when the body disappears.",
         null
      );
      this.getAsset(
         var1,
         "DeathInteraction",
         this.deathInteraction,
         null,
         RootInteractionValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Experimental,
         "Interaction to run on death",
         null
      );
      this.getFloat(
         var1,
         "DespawnAnimationTime",
         var1x -> this.despawnAnimationTime = var1x,
         0.8F,
         DoubleSingleValidator.greaterEqual0(),
         BuilderDescriptorState.Experimental,
         "How long to let the despawn animation play before removing",
         null
      );
      this.getAsset(
         var1,
         "SpawnParticles",
         this.spawnParticles,
         null,
         ParticleSystemExistsValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Experimental,
         "Particle system when spawning",
         null
      );
      this.getVector3d(
         var1,
         "SpawnParticlesOffset",
         this.spawnParticleOffset,
         null,
         null,
         BuilderDescriptorState.Experimental,
         "Displacement from foot point to spawn relative to NPC heading",
         null
      );
      this.getString(
         var1, "SpawnParticlesTargetNode", this.spawnParticlesTargetNode, null, null, BuilderDescriptorState.Stable, "Target node for spawn particles", null
      );
      this.getBoolean(
         var1,
         "SpawnParticlesDetached",
         this.spawnParticlesDetached,
         true,
         BuilderDescriptorState.Stable,
         "Whether spawn particles should be attached to the model or not",
         null
      );
      this.getDouble(
         var1,
         "SpawnViewDistance",
         var1x -> this.spawnViewDistance = var1x,
         75.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Experimental,
         "View distance for spawn particle",
         null
      );
      this.getBoolean(
         var1,
         "CorpseStaysInFlock",
         var1x -> this.corpseStaysInFlock = var1x,
         false,
         BuilderDescriptorState.Stable,
         "Whether the NPC should stay in the flock until corpse removal or be removed at the moment of death",
         null
      );
      this.getBoolean(
         var1,
         "OverrideHeadPitchAngle",
         this.overrideHeadPitchAngle,
         true,
         BuilderDescriptorState.Experimental,
         "Whether to override the head pitch angle range",
         null
      );
      this.getDoubleRange(
         var1,
         "HeadPitchAngleRange",
         this.headPitchAngleRange,
         DEFAULT_HEAD_PITCH_RANGE,
         DoubleSequenceValidator.betweenWeaklyMonotonic(-90.0, 90.0),
         BuilderDescriptorState.Experimental,
         "Head rotation pitch range to be used instead of model camera settings",
         null
      );
      this.validateAny(this.breathesInAir, this.breathesInWater);
      this.requireObject(
         var1,
         "MotionControllerList",
         this.motionControllers,
         BuilderDescriptorState.Stable,
         "Motion controllers",
         null,
         new BuilderValidationHelper(this.fileName, null, this.internalReferenceResolver, null, null, this.extraInfo, this.evaluators, this.readErrors)
      );
      this.getArray(
         var1,
         "Instructions",
         this.instructionList,
         null,
         BuilderDescriptorState.WorkInProgress,
         "List of instructions",
         null,
         new BuilderValidationHelper(
            this.fileName,
            null,
            this.internalReferenceResolver,
            this.stateHelper,
            new InstructionContextHelper(InstructionType.Default),
            this.extraInfo,
            this.evaluators,
            this.readErrors
         )
      );
      this.getObject(
         var1,
         "InteractionInstruction",
         this.interactionInstruction,
         BuilderDescriptorState.Stable,
         "Interaction instruction",
         "An instruction designed to evaluate and set which players can interact with an NPC, along with setting correct states upon interaction",
         new BuilderValidationHelper(
            this.fileName,
            null,
            this.internalReferenceResolver,
            this.stateHelper,
            new InstructionContextHelper(InstructionType.Interaction),
            this.extraInfo,
            this.evaluators,
            this.readErrors
         )
      );
      this.getObject(
         var1,
         "DeathInstruction",
         this.deathInstruction,
         BuilderDescriptorState.Stable,
         "Death instruction",
         "An instruction which will run only when the NPC is dead until they are removed",
         new BuilderValidationHelper(
            this.fileName,
            null,
            this.internalReferenceResolver,
            this.stateHelper,
            new InstructionContextHelper(InstructionType.Death),
            this.extraInfo,
            this.evaluators,
            this.readErrors
         )
      );
      this.getObject(
         var1,
         "StateTransitions",
         this.stateTransitionController,
         BuilderDescriptorState.Stable,
         "State transition actions",
         "A set of state transitions and the actions that will be executed during them",
         new BuilderValidationHelper(
            this.fileName,
            new FeatureEvaluatorHelper().lock(),
            this.internalReferenceResolver,
            this.stateHelper,
            new InstructionContextHelper(InstructionType.StateTransitions),
            this.extraInfo,
            this.evaluators,
            this.readErrors
         )
      );
      this.getCodecObject(var1, "StateEvaluator", this.stateEvaluator, BuilderDescriptorState.Stable, "A state evaluator", null);
      this.getString(
         var1,
         "InitialMotionController",
         this.initialMotionController,
         null,
         StringNullOrNotEmptyValidator.get(),
         BuilderDescriptorState.Stable,
         "The initial motion controller to set",
         "The initial motion controller to set. If omitted and there are multiple, one will be chosen at random."
      );
      this.getCodecObject(var1, "InteractionVars", this.interactionVars, BuilderDescriptorState.Stable, "Interaction vars to be used in interactions.", null);
      this.getBoolean(var1, "IsMemory", this.isMemory, false, BuilderDescriptorState.Stable, "Used to define if the NPC has a Memory to record.", null);
      this.getString(
         var1,
         "MemoriesCategory",
         this.memoriesCategory,
         "Other",
         StringNullOrNotEmptyValidator.get(),
         BuilderDescriptorState.Stable,
         "Category to put the NPC in, as part of the Memories Plugin",
         null
      );
      this.getString(
         var1, "MemoriesNameOverride", this.memoriesNameOverride, "", null, BuilderDescriptorState.Stable, "Overrides the Memory name when set.", null
      );
      this.getFloat(
         var1,
         "SpawnLockTime",
         this.spawnLockTime,
         1.5,
         DoubleSingleValidator.greaterEqual0(),
         BuilderDescriptorState.Stable,
         "How long the NPC should be locked and unable to perform behavior when first spawned",
         null
      );
      StateEvaluator var2 = this.stateEvaluator.build();
      if (var2 != null) {
         this.evaluators.add(var2);
         var2.prepareOptions(this.stateHelper);
         this.stateHelper.setHasStateEvaluator();
      }

      class="kw">return this;
   }

   @Nonnull
   @Override
   class="kw">public String getIdentifier() {
      BuilderInfo var1 = NPCPlugin.get().getBuilderInfo(this);
      Objects.requireNonNull(var1, "Have builder but can't get builderInfo for it");
      class="kw">return var1.getKeyName();
   }

   @Nonnull
   @Override
   class="kw">public SpawnTestResult canSpawn(@Nonnull SpawningContext var1) {
      Builder var2 = this.motionControllers.getBuilder(this.builderManager, var1.getExecutionContext(), this);
      if (var2 class="kw">instanceof ISpawnable) {
         SpawnTestResult var3 = ((ISpawnable)var2).canSpawn(var1);
         if (var3 != SpawnTestResult.TEST_OK) {
            class="kw">return var3;
         }
      }

      class="kw">return SpawnTestResult.TEST_OK;
   }

   @Override
   class="kw">public boolean requiresSpawnDropHeightCheck(@Nonnull SpawningContext var1) {
      class="kw">return !(
         this.motionControllers.getBuilder(this.builderManager, var1.getExecutionContext(), this) class="kw">instanceof ISpawnable var3
            && !var3.requiresSpawnDropHeightCheck(var1)
      );
   }

   @Override
   class="kw">public void getMovementModes(
      @Nonnull SpawningContext var1, @Nonnull Set<MovementMode> var2, @Nonnull Set<MovementMode> var3, @Nonnull Set<MovementMode> var4
   ) {
      Builder var5 = this.motionControllers.getBuilder(this.builderManager, var1.getExecutionContext(), this);
      if (var5 class="kw">instanceof ISpawnable) {
         ((ISpawnable)var5).getMovementModes(var1, var2, var3, var4);
      }
   }

   @Nonnull
   @Override
   class="kw">public Class<Role> category() {
      class="kw">return Role.class;
   }

   @Override
   class="kw">public String getSpawnModelName(ExecutionContext var1, Scope var2) {
      class="kw">return this.appearance.get(var1);
   }

   @Nullable
   @Override
   class="kw">public Scope createModifierScope(ExecutionContext var1) {
      class="kw">return null;
   }

   @Nonnull
   @Override
   class="kw">public Scope createExecutionScope() {
      class="kw">return this.getBuilderParameters().createScope();
   }

   @Override
   class="kw">public void markNeedsReload() {
      NPCPlugin.get().setRoleBuilderNeedsReload(this);
   }

   @Override
   class="kw">public String getSpawnParticles(@Nonnull BuilderSupport var1) {
      class="kw">return this.spawnParticles.get(var1.getExecutionContext());
   }

   @Override
   class="kw">public Vector3d getSpawnParticleOffset(@Nonnull BuilderSupport var1) {
      class="kw">return createVector3d(this.spawnParticleOffset.get(var1.getExecutionContext()), Vector3d::new);
   }

   @Override
   class="kw">public String getSpawnParticleTargetNode(@Nonnull BuilderSupport var1) {
      class="kw">return this.spawnParticlesTargetNode.get(var1.getExecutionContext());
   }

   @Override
   class="kw">public boolean isSpawnParticleDetached(@Nonnull BuilderSupport var1) {
      class="kw">return this.spawnParticlesDetached.get(var1.getExecutionContext());
   }

   @Override
   class="kw">public double getSpawnViewDistance() {
      class="kw">return this.spawnViewDistance;
   }

   @Override
   class="kw">public class="kw">final boolean isEnabled(ExecutionContext var1) {
      class="kw">return true;
   }

   class="kw">public int getMaxHealth(@Nonnull BuilderSupport var1) {
      class="kw">return this.maxHealth.get(var1.getExecutionContext());
   }

   @Nullable
   class="kw">public String[] getDisplayNames() {
      class="kw">return this.displayNames;
   }

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

   class="kw">public String getAppearance(@Nonnull BuilderSupport var1) {
      class="kw">return this.appearance.get(var1.getExecutionContext());
   }

   @Override
   class="kw">public boolean breathesInAir(@Nonnull ExecutionContext var1, @Nullable Scope var2) {
      class="kw">return this.breathesInAir.get(var1);
   }

   @Override
   class="kw">public boolean breathesInWater(@Nonnull ExecutionContext var1, @Nullable Scope var2) {
      class="kw">return this.breathesInWater.get(var1);
   }

   class="kw">public int getOpaqueBlockSet() {
      int var1 = BlockSet.getAssetMap().getIndex(this.opaqueBlockSet);
      if (var1 == Integer.MIN_VALUE) {
         throw new IllegalArgumentException("Unknown key! " + this.opaqueBlockSet);
      } else {
         class="kw">return var1;
      }
   }

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

   class="kw">public double getKnockbackScale(@Nonnull BuilderSupport var1) {
      class="kw">return this.knockbackScale.get(var1.getExecutionContext());
   }

   @Nullable
   class="kw">public String[] getHotbarItems(@Nonnull BuilderSupport var1) {
      class="kw">return this.hotbarItems.get(var1.getExecutionContext());
   }

   @Nullable
   class="kw">public String[] getOffHandItems(@Nonnull BuilderSupport var1) {
      class="kw">return this.offHandItems.get(var1.getExecutionContext());
   }

   class="kw">public String getInventoryItemsDropList(@Nonnull BuilderSupport var1) {
      class="kw">return this.inventoryItemsDropList.get(var1.getExecutionContext());
   }

   class="kw">public String[] getArmor() {
      class="kw">return this.armor;
   }

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

   class="kw">public String getDropListId(@Nonnull BuilderSupport var1) {
      class="kw">return this.dropListId.get(var1.getExecutionContext());
   }

   class="kw">public double getCollisionDistance() {
      class="kw">return this.collisionDistance;
   }

   class="kw">public double getCollisionForceFalloff() {
      class="kw">return this.collisionForceFalloff;
   }

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

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

   class="kw">public Role.SeparationMode getSeparationMode(BuilderSupport var1) {
      class="kw">return this.separationMode.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationSafeDistanceMultiplier(BuilderSupport var1) {
      class="kw">return this.separationSafeDistanceMultiplier.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationLegacySteeringStrength(BuilderSupport var1) {
      class="kw">return this.separationLegacySteeringStrength.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationPushSteeringStrength(BuilderSupport var1) {
      class="kw">return this.separationPushSteeringStrength.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationPushDistanceWeightDefault(BuilderSupport var1) {
      class="kw">return this.separationPushDistanceWeightDefault.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationPushDistanceWeightTarget(BuilderSupport var1) {
      class="kw">return this.separationPushDistanceWeightTarget.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationPushDistanceWeightAttacker(BuilderSupport var1) {
      class="kw">return this.separationPushDistanceWeightAttacker.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationPushSpeedScale(BuilderSupport var1) {
      class="kw">return this.separationPushSpeedScale.get(var1.getExecutionContext());
   }

   class="kw">public FeatureOverride getOverrideUseOrientationHint(BuilderSupport var1) {
      class="kw">return this.featureOverrideOrientationHint.get(var1.getExecutionContext());
   }

   class="kw">public FeatureOverride getOverrideAlwaysSeparate(BuilderSupport var1) {
      class="kw">return this.featureOverrideAlwaysSeparate.get(var1.getExecutionContext());
   }

   class="kw">public FeatureOverride getOverrideNormalizeDistances(BuilderSupport var1) {
      class="kw">return this.featureOverrideNormalizeDistances.get(var1.getExecutionContext());
   }

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

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

   class="kw">public double getSeparationWeight(BuilderSupport var1) {
      class="kw">return this.separationWeight.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationDistanceTarget(BuilderSupport var1) {
      class="kw">return this.separationDistanceTarget.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationNearRadiusTarget(BuilderSupport var1) {
      class="kw">return this.separationNearRadiusTarget.get(var1.getExecutionContext());
   }

   class="kw">public double getSeparationFarRadiusTarget(BuilderSupport var1) {
      class="kw">return this.separationFarRadiusTarget.get(var1.getExecutionContext());
   }

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

   class="kw">public boolean isAvoidanceFallCheck(BuilderSupport var1) {
      class="kw">return this.avoidanceFallCheck.get(var1.getExecutionContext());
   }

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

   class="kw">public String getAllowedEnvironments() {
      class="kw">return this.allowedEnvironments;
   }

   class="kw">public double getEntityAvoidanceStrength() {
      class="kw">return this.entityAvoidanceStrength;
   }

   class="kw">public boolean isOverridingHeadPitchAngle(@Nonnull BuilderSupport var1) {
      class="kw">return this.overrideHeadPitchAngle.get(var1.getExecutionContext());
   }

   class="kw">public float[] getHeadPitchAngleRange(@Nonnull BuilderSupport var1) {
      double[] var2 = this.headPitchAngleRange.get(var1.getExecutionContext());
      class="kw">return new float[]{(float)(var2[0] * (float) (Math.PI / 180.0)), (float)(var2[1] * (float) (Math.PI / 180.0))};
   }

   @Nullable
   class="kw">public String[] getFlockSpawnTypes(@Nonnull BuilderSupport var1) {
      class="kw">return this.flockSpawnTypes.get(var1.getExecutionContext());
   }

   class="kw">public boolean isFlockSpawnTypeRandom(@Nonnull BuilderSupport var1) {
      class="kw">return this.flockSpawnTypeRandom.get(var1.getExecutionContext());
   }

   @Nonnull
   class="kw">public String[] getFlockAllowedRoles(@Nonnull BuilderSupport var1) {
      class="kw">return this.nonNull(this.flockAllowedRoles.get(var1.getExecutionContext()));
   }

   class="kw">public boolean isCanLeadFlock(@Nonnull BuilderSupport var1) {
      class="kw">return this.canLeadFlock.get(var1.getExecutionContext());
   }

   class="kw">public double getFlockWeightAlignment() {
      class="kw">return this.flockWeightAlignment;
   }

   class="kw">public double getFlockWeightSeparation() {
      class="kw">return this.flockWeightSeparation;
   }

   class="kw">public double getFlockWeightCohesion() {
      class="kw">return this.flockWeightCohesion;
   }

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

   class="kw">public float getCollisionViewAngle() {
      class="kw">return (float) (Math.PI / 180.0) * this.collisionViewAngle;
   }

   @Nullable
   class="kw">public String getBalanceAsset(@Nonnull BuilderSupport var1) {
      class="kw">return this.combatConfig.build(var1.getExecutionContext());
   }

   class="kw">public double getDeathAnimationTime(@Nonnull BuilderSupport var1) {
      class="kw">return this.deathAnimationTime.get(var1.getExecutionContext());
   }

   class="kw">public String getDeathParticles(@Nonnull BuilderSupport var1) {
      class="kw">return this.deathParticles.get(var1.getExecutionContext());
   }

   class="kw">public boolean isDropDeathItemsInstantly(@Nonnull BuilderSupport var1) {
      class="kw">return this.dropDeathItemsInstantly.get(var1.getExecutionContext());
   }

   @Nullable
   class="kw">public String getDeathInteraction(@Nonnull BuilderSupport var1) {
      String var2 = this.deathInteraction.get(var1.getExecutionContext());
      class="kw">return var2 != null && !var2.isEmpty() ? var2 : null;
   }

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

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

   class="kw">public int getInventorySlots() {
      class="kw">return this.inventorySlots;
   }

   class="kw">public int getHotbarSlots() {
      class="kw">return this.hotbarSlots;
   }

   class="kw">public int getOffHandSlots() {
      class="kw">return this.offHandSlots;
   }

   class="kw">public byte getDefaultOffHandSlot(@Nonnull BuilderSupport var1) {
      class="kw">return (byte)this.defaultOffHandSlot.get(var1.getExecutionContext());
   }

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

   @Nullable
   class="kw">public Map<String, MotionController> getMotionControllerMap(@Nonnull BuilderSupport var1) {
      class="kw">return this.motionControllers.build(var1);
   }

   class="kw">public String getInitialMotionController(@Nonnull BuilderSupport var1) {
      class="kw">return this.initialMotionController.get(var1.getExecutionContext());
   }

   @Nullable
   class="kw">public List<Instruction> getInstructionList(@Nonnull BuilderSupport var1) {
      var1.setCurrentInstructionContext(InstructionType.Default);
      class="kw">return this.instructionList.build(var1);
   }

   @Nullable
   class="kw">public Instruction getInteractionInstruction(@Nonnull BuilderSupport var1) {
      var1.setCurrentInstructionContext(InstructionType.Interaction);
      class="kw">return this.interactionInstruction.build(var1);
   }

   @Nullable
   class="kw">public Instruction getDeathInstruction(@Nonnull BuilderSupport var1) {
      var1.setCurrentInstructionContext(InstructionType.Death);
      class="kw">return this.deathInstruction.build(var1);
   }

   class="kw">public void registerStateEvaluator(@Nonnull BuilderSupport var1) {
      var1.setStateEvaluator(this.stateEvaluator.build());
   }

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

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

   @Override
   class="kw">public boolean isMemory(ExecutionContext var1, Scope var2) {
      class="kw">return this.isMemory.get(var1);
   }

   @Override
   class="kw">public String getMemoriesCategory(ExecutionContext var1, Scope var2) {
      class="kw">return this.memoriesCategory.get(var1);
   }

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

   @Override
   class="kw">public String getMemoriesNameOverride(ExecutionContext var1, @Nullable Scope var2) {
      class="kw">return this.memoriesNameOverride.get(var1);
   }

   @Nonnull
   @Override
   class="kw">public String getNameTranslationKey(ExecutionContext var1, @Nullable Scope var2) {
      class="kw">return this.nameTranslationKey.get(var1);
   }

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

   @Override
   class="kw">protected void runLoadTimeValidationHelper0(String var1, NPCLoadTimeValidationHelper var2, ExecutionContext var3, @Nonnull List<String> var4) {
      NPCPlugin var5 = NPCPlugin.get();
      String[] var6 = this.flockSpawnTypes.get(var3);
      boolean var7 = true;
      if (var6 != null) {
         for (String var11 : var6) {
            if (!var5.hasRoleName(var11)) {
               var7 = false;
               var4.add(String.format("%s: No such role '%s' for %s", var1, var11, this.flockSpawnTypes.getName()));
            }
         }
      }

      String[] var13 = this.flockAllowedRoles.get(var3);
      if (var13 != null) {
         for (String var12 : var13) {
            if (!var5.hasRoleName(var12)) {
               var7 = false;
               var4.add(String.format("%s: No such role '%s' for %s", var1, var12, this.flockAllowedRoles.getName()));
            }
         }
      }

      if (!var7) {
         throw new IllegalStateException(
            String.format("Invalid roles referenced for %s or %s", this.flockSpawnTypes.getName(), this.flockAllowedRoles.getName())
         );
      }
   }
}