BuilderBodyMotionCharge class

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

Файл: com/hypixel/hytale/server/npc/corecomponents/combat/builders/BuilderBodyMotionCharge.java

extends: BuilderBodyMotionBase

Поля (21)

МодификаторыТипИмя
final double[] DEFAULT_LOCKED_ON_DURATION_RANGE
int var1
IntSet var10
IntSet var11
IntIterator var12
int var13
String var2
String var2
String var2
String var2
String var2
int var3
int var3
String var4
var4
String var5
var5
int var6
int var7
BlockSetModule var8
Int2ObjectMap var9

Методы (31)

МодификаторыВозвратСигнатура
abstract return new BodyMotionChargereturn new BodyMotionCharge(this, var1)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown BlockSet: " + var2)
static double frequencyToDurationdouble frequencyToDuration(int var0)
public double getChargeAbsoluteSpeeddouble getChargeAbsoluteSpeed(@Nonnull BuilderSupport var1)
public double getChargeAccelerationdouble getChargeAcceleration(@Nonnull BuilderSupport var1)
public double getChargeRelativeSpeeddouble getChargeRelativeSpeed(@Nonnull BuilderSupport var1)
public double getClimbSlopedouble getClimbSlope(@Nonnull BuilderSupport var1)
public double getDropSlopedouble getDropSlope(@Nonnull BuilderSupport var1)
public double getHorizontalSkipGapWidthdouble getHorizontalSkipGapWidth(@Nonnull BuilderSupport var1)
public int getIgnoredBlockSetint getIgnoredBlockSet(@Nonnull BuilderSupport var1)
public double getKnockbackThresholddouble getKnockbackThreshold(@Nonnull BuilderSupport var1)
public double getLockedOnHalfAngleRadiansdouble getLockedOnHalfAngleRadians(@Nonnull BuilderSupport var1)
public double getProbeChargeRecomputeDistancedouble getProbeChargeRecomputeDistance(@Nonnull BuilderSupport var1)
public double getProbeMaxIntervaldouble getProbeMaxInterval(@Nonnull BuilderSupport var1)
public double getProbeMinDirectionChangeRadiansdouble getProbeMinDirectionChangeRadians(@Nonnull BuilderSupport var1)
public double getProbeMinIntervaldouble getProbeMinInterval(@Nonnull BuilderSupport var1)
public double getRelativeTurnSpeeddouble getRelativeTurnSpeed(@Nonnull BuilderSupport var1)
public int getRemovedBlockSetint getRemovedBlockSet(@Nonnull BuilderSupport var1)
public double getRepeatCollisionIgnoreDurationdouble getRepeatCollisionIgnoreDuration(@Nonnull BuilderSupport var1)
public double getWindingUpRelativeTurnSpeeddouble getWindingUpRelativeTurnSpeed(@Nonnull BuilderSupport var1)
if if(var3 == Integer.MIN_VALUE)
if if(var3 == Integer.MIN_VALUE)
if if(var0 <= 0)
if if(var6 != Integer.MIN_VALUE && var7 != Integer.MIN_VALUE)
if if(var8 == null)
if if(var10 != null && var11 != null)
public boolean isClearOnceOnStateChangeboolean isClearOnceOnStateChange(@Nonnull BuilderSupport var1)
public boolean isEntityStopsChargeboolean isEntityStopsCharge(@Nonnull BuilderSupport var1)
public boolean isIgnoredBlockSetTriggersboolean isIgnoredBlockSetTriggers(@Nonnull BuilderSupport var1)
public boolean isWindingUpUninterruptableboolean isWindingUpUninterruptable(@Nonnull BuilderSupport var1)
private boolean validateRemovedBlockSetSubsetboolean validateRemovedBlockSetSubset(String var1, ExecutionContext var2, @Nonnull List<String> var3)

Исходный код

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

class="kw">import com.google.gson.JsonElement;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockset.config.BlockSet;
class="kw">import com.hypixel.hytale.server.core.modules.blockset.BlockSetModule;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptorState;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.Feature;
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.IntHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.NumberArrayHolder;
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.IntRangeValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.RelationalOperator;
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.RootInteractionValidator;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderBodyMotionBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.BodyMotionCharge;
class="kw">import com.hypixel.hytale.server.npc.instructions.BodyMotion;
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 it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.IntIterator;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import java.util.List;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class BuilderBodyMotionCharge class="kw">extends BuilderBodyMotionBase {
   class="kw">public class="kw">static class="kw">final double[] DEFAULT_LOCKED_ON_DURATION_RANGE = new double[]{5.0, 5.0};
   class="kw">public class="kw">static class="kw">final double[] DEFAULT_WINDING_UP_DURATION_RANGE = new double[]{5.0, 5.0};
   class="kw">public class="kw">static class="kw">final double[] DEFAULT_POST_CHARGE_DURATION_RANGE = new double[]{2.0, 2.0};
   class="kw">protected class="kw">final DoubleHolder relativeTurnSpeed = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder windingUpRelativeTurnSpeed = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder chargeRelativeSpeed = new DoubleHolder();
   class="kw">protected class="kw">final NumberArrayHolder chargeDistanceRange = new NumberArrayHolder();
   class="kw">protected class="kw">final NumberArrayHolder lockedOnDurationRange = new NumberArrayHolder();
   class="kw">protected class="kw">final NumberArrayHolder windingUpDurationRange = new NumberArrayHolder();
   class="kw">protected class="kw">final NumberArrayHolder postChargeDurationRange = new NumberArrayHolder();
   class="kw">protected class="kw">final BooleanHolder windingUpUninterruptable = new BooleanHolder();
   class="kw">protected class="kw">final BooleanHolder clearOnceOnStateChange = new BooleanHolder();
   class="kw">protected class="kw">final DoubleHolder chargeAbsoluteSpeed = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder chargeAcceleration = new DoubleHolder();
   class="kw">protected class="kw">final BooleanHolder ignoredBlockSetTriggers = new BooleanHolder();
   class="kw">protected class="kw">final BooleanHolder entityStopsCharge = new BooleanHolder();
   class="kw">protected class="kw">final AssetHolder blockCollisionInteraction = new AssetHolder();
   class="kw">protected class="kw">final AssetHolder npcCollisionInteraction = new AssetHolder();
   class="kw">protected class="kw">final AssetHolder playerCollisionInteraction = new AssetHolder();
   class="kw">protected class="kw">final DoubleHolder repeatCollisionIgnoreDuration = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder climbSlope = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder dropSlope = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder horizontalSkipGapWidth = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder knockbackThreshold = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder probeChargeRecomputeDistance = new DoubleHolder();
   class="kw">protected class="kw">final IntHolder probeMinFrequency = new IntHolder();
   class="kw">protected class="kw">final IntHolder probeMaxFrequency = new IntHolder();
   class="kw">protected class="kw">final DoubleHolder probeMinDirectionChangeDegrees = new DoubleHolder();
   class="kw">protected class="kw">final DoubleHolder lockedOnToleranceAngleDegrees = new DoubleHolder();
   class="kw">protected class="kw">final AssetHolder ignoredBlockSet = new AssetHolder();
   class="kw">protected class="kw">final AssetHolder removedBlockSet = new AssetHolder();

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

   @Nonnull
   class="kw">public BodyMotion build(@Nonnull BuilderSupport var1) {
      class="kw">return new BodyMotionCharge(this, var1);
   }

   @Nonnull
   @Override
   class="kw">public String getShortDescription() {
      class="kw">return "Aim at a target and progress through locked-on, winding up, and charging motion states.";
   }

   @Nonnull
   @Override
   class="kw">public String getLongDescription() {
      class="kw">return this.getShortDescription();
   }

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

   @Nonnull
   class="kw">public BuilderBodyMotionCharge readConfig(@Nonnull JsonElement var1) {
      this.getDouble(
         var1,
         "RelativeTurnSpeed",
         this.relativeTurnSpeed,
         1.0,
         DoubleRangeValidator.between(0.0, 2.0),
         BuilderDescriptorState.Stable,
         "Relative turn speed while aiming and locked on",
         null
      );
      this.getDouble(
         var1,
         "LockedOnToleranceAngle",
         this.lockedOnToleranceAngleDegrees,
         15.0,
         DoubleRangeValidator.fromExclToIncl(0.0, 360.0),
         BuilderDescriptorState.Stable,
         "View cone angle where target is still considered locked on",
         null
      );
      this.getDoubleRange(
         var1,
         "LockedOnDurationRange",
         this.lockedOnDurationRange,
         DEFAULT_LOCKED_ON_DURATION_RANGE,
         DoubleSequenceValidator.betweenWeaklyMonotonic(0.0, Double.MAX_VALUE),
         BuilderDescriptorState.Stable,
         "Random interval range in seconds specifying minimum time target must be locked on before winding up",
         null
      );
      this.getDoubleRange(
         var1,
         "WindingUpDurationRange",
         this.windingUpDurationRange,
         DEFAULT_WINDING_UP_DURATION_RANGE,
         DoubleSequenceValidator.betweenWeaklyMonotonic(0.0, Double.MAX_VALUE),
         BuilderDescriptorState.Stable,
         "Random interval range in seconds specifying winding up time before charging",
         null
      );
      this.getDoubleRange(
         var1,
         "PostChargeDurationRange",
         this.postChargeDurationRange,
         DEFAULT_POST_CHARGE_DURATION_RANGE,
         DoubleSequenceValidator.betweenWeaklyMonotonic(0.0, Double.MAX_VALUE),
         BuilderDescriptorState.Stable,
         "Random interval range in seconds spent resting after an obstructed or finished charge",
         null
      );
      this.getBoolean(
         var1,
         "WindingUpUninterruptable",
         this.windingUpUninterruptable,
         true,
         BuilderDescriptorState.Stable,
         "When true, WindingUp is not interrupted by target loss or aim drift",
         null
      );
      this.getDouble(
         var1,
         "WindingUpRelativeTurnSpeed",
         this.windingUpRelativeTurnSpeed,
         1.0,
         DoubleRangeValidator.between(0.0, 2.0),
         BuilderDescriptorState.Stable,
         "Relative turn speed during WindingUp. Can be 0 to disable rotation in that phase",
         null
      );
      this.getDouble(
         var1,
         "ChargeRelativeSpeed",
         this.chargeRelativeSpeed,
         5.0,
         DoubleRangeValidator.between(0.0, 20.0),
         BuilderDescriptorState.Stable,
         "Relative forward movement speed toward the target during Charging",
         null
      );
      this.requireDoubleRange(
         var1,
         "ChargeDistanceRange",
         this.chargeDistanceRange,
         DoubleSequenceValidator.betweenWeaklyMonotonic(1.0, 50.0),
         BuilderDescriptorState.Stable,
         "Range used to pick a random maximum charge distance when a new aiming cycle starts",
         null
      );
      this.getAsset(
         var1,
         "IgnoredBlockSet",
         this.ignoredBlockSet,
         "",
         BlockSetExistsValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Blocks in this set are ignored by the charge probe (treated as non-colliding)",
         null
      );
      this.getAsset(
         var1,
         "RemovedBlockSet",
         this.removedBlockSet,
         "",
         BlockSetExistsValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Subset of IgnoredBlockSet expected to be removed by charge block hit actions. These blocks are treated as absent for charge probe breathability checks",
         null
      );
      this.getBoolean(
         var1,
         "ClearOnceOnStateChange",
         this.clearOnceOnStateChange,
         true,
         BuilderDescriptorState.Stable,
         "When true, calls clearOnce() on the parent instruction whenever the charge state changes",
         null
      );
      this.getDouble(
         var1,
         "ChargeAbsoluteSpeed",
         this.chargeAbsoluteSpeed,
         0.0,
         DoubleRangeValidator.between(0.0, 100.0),
         BuilderDescriptorState.Stable,
         "Maximum charge speed in blocks/s. 0 disables the cap and ChargeRelativeSpeed is used",
         null
      );
      this.validateExactlyOneZero(this.chargeRelativeSpeed, this.chargeAbsoluteSpeed);
      this.getDouble(
         var1,
         "ChargeAcceleration",
         this.chargeAcceleration,
         1000.0,
         DoubleRangeValidator.between(0.0, 10000.0),
         BuilderDescriptorState.Stable,
         "Linear acceleration in blocks/s^2 applied each tick during charging. Very high values reproduce the pre-existing near-instant ramp-up",
         null
      );
      this.getBoolean(
         var1,
         "IgnoredBlockSetTriggers",
         this.ignoredBlockSetTriggers,
         false,
         BuilderDescriptorState.Stable,
         "When true, blocks in IgnoredBlockSet still fire trigger/damage interactions during the rail step",
         null
      );
      this.getBoolean(
         var1,
         "EntityStopsCharge",
         this.entityStopsCharge,
         false,
         BuilderDescriptorState.Stable,
         "When true, the first entity (player or NPC) hit during the rail step clamps the charge and transitions to Obstructed. When false, entity hits are reported without stopping the charge",
         null
      );
      this.getAsset(
         var1,
         "BlockCollisionInteraction",
         this.blockCollisionInteraction,
         "",
         RootInteractionValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Optional interaction to execute immediately for each block collision during charging",
         null
      );
      this.getAsset(
         var1,
         "NPCCollisionInteraction",
         this.npcCollisionInteraction,
         "",
         RootInteractionValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Optional interaction to execute immediately for each NPC collision during charging",
         null
      );
      this.getAsset(
         var1,
         "PlayerCollisionInteraction",
         this.playerCollisionInteraction,
         "",
         RootInteractionValidator.withConfig(AssetValidator.CanBeEmpty),
         BuilderDescriptorState.Stable,
         "Optional interaction to execute immediately for each player collision during charging",
         null
      );
      this.getDouble(
         var1,
         "RepeatCollisionIgnoreDuration",
         this.repeatCollisionIgnoreDuration,
         0.2,
         DoubleRangeValidator.between(0.0, Double.MAX_VALUE),
         BuilderDescriptorState.Stable,
         "Duration in seconds for which repeat collisions with the same entity are ignored by BodyMotionCharge collision interactions and sensors",
         null
      );
      this.getDouble(
         var1,
         "ClimbSlope",
         this.climbSlope,
         2.0,
         DoubleRangeValidator.between(0.0, 10.0),
         BuilderDescriptorState.Stable,
         "Horizontal blocks per vertical block when smoothing CLIMB segments along the charge path. 0 disables climb smoothing; otherwise the climb starts as far back from the edge as a slope of this value allows (e.g. 2 = 2 horizontal blocks per 1 vertical block). The actual slope can become steeper but never shallower than this value",
         null
      );
      this.getDouble(
         var1,
         "DropSlope",
         this.dropSlope,
         2.0,
         DoubleRangeValidator.between(0.0, 10.0),
         BuilderDescriptorState.Stable,
         "Horizontal blocks per vertical block when smoothing DROP segments along the charge path. 0 disables drop smoothing; otherwise the drop lands as far past the edge as a slope of this value allows. The actual slope can become steeper but never shallower than this value",
         null
      );
      this.getDouble(
         var1,
         "HorizontalSkipGapWidth",
         this.horizontalSkipGapWidth,
         1.2,
         DoubleRangeValidator.between(0.0, 8.0),
         BuilderDescriptorState.Stable,
         "Maximum horizontal width (in blocks) the NPC may stride over while sloping a climb/drop or when collapsing a drop+climb dip whose endpoints are at the same height. 0 disables both shortcuts",
         null
      );
      this.getDouble(
         var1,
         "KnockbackThreshold",
         this.knockbackThreshold,
         0.0,
         DoubleRangeValidator.between(0.0, Double.MAX_VALUE),
         BuilderDescriptorState.Stable,
         "Threshold for external knockback magnitude while Charging. If the combined external velocity is below this value the knockback is ignored and cleared; otherwise Charging transitions to Knockback",
         null
      );
      this.getDouble(
         var1,
         "ProbeChargeRecomputeDistance",
         this.probeChargeRecomputeDistance,
         0.0,
         DoubleRangeValidator.between(-Double.MAX_VALUE, Double.MAX_VALUE),
         BuilderDescriptorState.Stable,
         "Interval in blocks during Charging for re-validating the walk path against world changes (2D motion controllers only). Must be > 0; values <= 0 disable mid-charge re-validation",
         null
      );
      this.getInt(
         var1,
         "ProbeMinFrequency",
         this.probeMinFrequency,
         2,
         IntRangeValidator.between(0, 30),
         BuilderDescriptorState.Stable,
         "Minimum frequency for executing the reachability test during updates. 0 means maximum frequency (as often as possible)",
         null
      );
      this.getInt(
         var1,
         "ProbeMaxFrequency",
         this.probeMaxFrequency,
         10,
         IntRangeValidator.between(0, 30),
         BuilderDescriptorState.Stable,
         "Maximum frequency for executing the reachability test during updates. 0 means maximum frequency (as often as possible)",
         null
      );
      this.validateIntRelation(this.probeMinFrequency, RelationalOperator.LessEqual, this.probeMaxFrequency);
      this.getDouble(
         var1,
         "ProbeMinDirectionChange",
         this.probeMinDirectionChangeDegrees,
         5.0,
         DoubleRangeValidator.between(0.0, 180.0),
         BuilderDescriptorState.Stable,
         "Minimum angular change to target in degrees required before executing another reachability test",
         null
      );
      this.requireFeature(Feature.AnyPosition);
      this.providePreceding(BodyMotionCharge.class);
      class="kw">return this;
   }

   @Override
   class="kw">public boolean validate(String var1, @Nonnull NPCLoadTimeValidationHelper var2, ExecutionContext var3, Scope var4, @Nonnull List<String> var5) {
      class="kw">return super.validate(var1, var2, var3, var4, var5) & this.validateRemovedBlockSetSubset(var1, var3, var5);
   }

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

   class="kw">public double getLockedOnHalfAngleRadians(@Nonnull BuilderSupport var1) {
      class="kw">return this.lockedOnToleranceAngleDegrees.get(var1.getExecutionContext()) / 2.0 * (float) (Math.PI / 180.0);
   }

   @Nonnull
   class="kw">public double[] getLockedOnDurationRange(@Nonnull BuilderSupport var1) {
      class="kw">return this.lockedOnDurationRange.get(var1.getExecutionContext());
   }

   @Nonnull
   class="kw">public double[] getWindingUpDurationRange(@Nonnull BuilderSupport var1) {
      class="kw">return this.windingUpDurationRange.get(var1.getExecutionContext());
   }

   @Nonnull
   class="kw">public double[] getPostChargeDurationRange(@Nonnull BuilderSupport var1) {
      class="kw">return this.postChargeDurationRange.get(var1.getExecutionContext());
   }

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

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

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

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

   @Nonnull
   class="kw">public double[] getChargeDistanceRange(@Nonnull BuilderSupport var1) {
      class="kw">return this.chargeDistanceRange.get(var1.getExecutionContext());
   }

   class="kw">public int getIgnoredBlockSet(@Nonnull BuilderSupport var1) {
      String var2 = this.ignoredBlockSet.get(var1.getExecutionContext());
      if (var2 != null && !var2.isEmpty()) {
         int var3 = BlockSet.getAssetMap().getIndex(var2);
         if (var3 == Integer.MIN_VALUE) {
            throw new IllegalArgumentException("Unknown BlockSet: " + var2);
         } else {
            class="kw">return var3;
         }
      } else {
         class="kw">return Integer.MIN_VALUE;
      }
   }

   class="kw">public int getRemovedBlockSet(@Nonnull BuilderSupport var1) {
      String var2 = this.removedBlockSet.get(var1.getExecutionContext());
      if (var2 != null && !var2.isEmpty()) {
         int var3 = BlockSet.getAssetMap().getIndex(var2);
         if (var3 == Integer.MIN_VALUE) {
            throw new IllegalArgumentException("Unknown BlockSet: " + var2);
         } else {
            class="kw">return var3;
         }
      } else {
         class="kw">return Integer.MIN_VALUE;
      }
   }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   class="kw">public double getProbeMinDirectionChangeRadians(@Nonnull BuilderSupport var1) {
      class="kw">return this.probeMinDirectionChangeDegrees.get(var1.getExecutionContext()) * (float) (Math.PI / 180.0);
   }

   class="kw">private class="kw">static double frequencyToDuration(int var0) {
      if (var0 <= 0) {
         class="kw">return 0.0;
      }

      int var1 = Math.min(var0, 30);
      class="kw">return 1.0 / var1;
   }

   class="kw">private boolean validateRemovedBlockSetSubset(String var1, ExecutionContext var2, @Nonnull List<String> var3) {
      String var4;
      String var5;
      try {
         var4 = this.removedBlockSet.get(var2);
         var5 = this.ignoredBlockSet.get(var2);
      } catch (RuntimeException var14) {
         var3.add(String.format("%s: %s", var1, var14.getMessage()));
         class="kw">return false;
      }

      if (var4 == null || var4.isEmpty()) {
         class="kw">return true;
      }

      if (var5 != null && !var5.isEmpty()) {
         int var6 = BlockSet.getAssetMap().getIndex(var4);
         int var7 = BlockSet.getAssetMap().getIndex(var5);
         if (var6 != Integer.MIN_VALUE && var7 != Integer.MIN_VALUE) {
            BlockSetModule var8 = BlockSetModule.getInstance();
            if (var8 == null) {
               class="kw">return true;
            }

            Int2ObjectMap var9 = var8.getBlockSets();
            IntSet var10 = (IntSet)var9.get(var6);
            IntSet var11 = (IntSet)var9.get(var7);
            if (var10 != null && var11 != null) {
               IntIterator var12 = var10.iterator();

               while (var12.hasNext()) {
                  int var13 = var12.nextInt();
                  if (!var11.contains(var13)) {
                     var3.add(String.format("%s: RemovedBlockSet '%s' must be a subset of IgnoredBlockSet '%s'", var1, var4, var5));
                     class="kw">return false;
                  }
               }

               class="kw">return true;
            } else {
               class="kw">return true;
            }
         } else {
            class="kw">return true;
         }
      } else {
         var3.add(String.format("%s: RemovedBlockSet '%s' requires IgnoredBlockSet to be configured", var1, var4));
         class="kw">return false;
      }
   }
}