BuilderInstruction class

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

Файл: com/hypixel/hytale/server/npc/instructions/builders/BuilderInstruction.java

extends: BuilderBase<Instruction>

Поля (10)

МодификаторыТипИмя
final String[] ANTECEDENT
FeatureEvaluatorHelper var2
Sensor var2
var2
var2
ActionList var2
List var2
BuilderValidationHelper var3
Instruction[] var3
boolean var6

Методы (19)

МодификаторыВозвратСигнатура
abstract return new Instructionreturn new Instruction(this, var2, var3, var1)
public double getChancedouble getChance(@Nonnull BuilderSupport var1)
public String getTagString getTag()
public boolean hasActionsboolean hasActions()
public boolean hasBodyMotionboolean hasBodyMotion()
public boolean hasHeadMotionboolean hasHeadMotion()
public boolean hasNestedInstructionsboolean hasNestedInstructions()
if if(var2 == null)
if if(this.currentStateName != null)
if if(this.currentStateName != null)
if if(this.currentStateName != null)
if if(this.currentStateName != null)
if if(this.currentStateName != null)
if if(var2 == null)
if if(var2 != ActionList.EMPTY_ACTION_LIST)
public boolean isContinueAfterboolean isContinueAfter()
public boolean isInvertTreeModeResultboolean isInvertTreeModeResult(@Nonnull BuilderSupport var1)
public boolean isTreeModeboolean isTreeMode()
protected boolean requiresNameboolean requiresName()

Исходный код

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

class="kw">import com.google.gson.JsonElement;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.Builder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderBase;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptorState;
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.BuilderValidationHelper;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.FeatureEvaluatorHelper;
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.validators.DoubleSingleValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.StringNullOrNotEmptyValidator;
class="kw">import com.hypixel.hytale.server.npc.instructions.ActionList;
class="kw">import com.hypixel.hytale.server.npc.instructions.BodyMotion;
class="kw">import com.hypixel.hytale.server.npc.instructions.HeadMotion;
class="kw">import com.hypixel.hytale.server.npc.instructions.Instruction;
class="kw">import com.hypixel.hytale.server.npc.instructions.Sensor;
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 java.util.List;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class BuilderInstruction class="kw">extends BuilderBase<Instruction> {
   class="kw">public class="kw">static class="kw">final String[] ANTECEDENT = new String[]{"TreeMode"};
   class="kw">public class="kw">static class="kw">final String[] SUBSEQUENT = new String[]{"Continue"};
   class="kw">protected class="kw">final BuilderObjectReferenceHelper<Sensor> sensorBuilderObjectReferenceHelper = new BuilderObjectReferenceHelper<>(Sensor.class, this);
   class="kw">protected class="kw">final BuilderObjectReferenceHelper<BodyMotion> bodyMotionBuilderObjectReferenceHelper = new BuilderObjectReferenceHelper<>(BodyMotion.class, this);
   class="kw">protected class="kw">final BuilderObjectReferenceHelper<HeadMotion> headMotionBuilderObjectReferenceHelper = new BuilderObjectReferenceHelper<>(HeadMotion.class, this);
   class="kw">protected class="kw">final BuilderObjectReferenceHelper<ActionList> actionsBuilderObjectReferenceHelper = new BuilderObjectReferenceHelper<>(ActionList.class, this);
   class="kw">protected class="kw">final BuilderObjectListHelper<Instruction> steps = new BuilderObjectListHelper<>(Instruction.class, this);
   class="kw">protected String name;
   class="kw">protected String tag;
   class="kw">protected boolean continueAfter;
   class="kw">protected class="kw">final DoubleHolder chance = new DoubleHolder();
   class="kw">protected class="kw">final BooleanHolder enabled = new BooleanHolder();
   class="kw">protected boolean actionsBlocking;
   class="kw">protected boolean actionsAtomic;
   class="kw">protected boolean treeMode;
   class="kw">protected class="kw">final BooleanHolder invertTreeModeResult = new BooleanHolder();
   class="kw">protected String currentStateName;

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

   @Nonnull
   @Override
   class="kw">public String getShortDescription() {
      class="kw">return "An instruction with Sensor, and Motions and Actions, or a list of nested instructions.";
   }

   @Nonnull
   @Override
   class="kw">public String getLongDescription() {
      class="kw">return "An instruction with Sensor, and Motions and Actions, or a list of nested instructions.";
   }

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

   @Nonnull
   @Override
   class="kw">public Builder<Instruction> readConfig(@Nonnull JsonElement var1) {
      FeatureEvaluatorHelper var2 = new FeatureEvaluatorHelper();
      BuilderValidationHelper var3 = new BuilderValidationHelper(
         this.fileName, var2, this.internalReferenceResolver, this.stateHelper, this.instructionContextHelper, this.extraInfo, this.evaluators, this.readErrors
      );
      if (this.requiresName()) {
         this.requireString(var1, "Name", var1x -> this.name = var1x, null, BuilderDescriptorState.Stable, "Name for referencing", null);
      } else {
         this.getString(var1, "Name", var1x -> this.name = var1x, null, null, BuilderDescriptorState.Stable, "Optional name for descriptor", null);
      }

      this.increaseDepth();
      this.getString(
         var1,
         "Tag",
         var1x -> this.tag = var1x,
         null,
         StringNullOrNotEmptyValidator.get(),
         BuilderDescriptorState.Experimental,
         "Internal identifier tag for debugging",
         null
      );
      this.getBoolean(var1, "Enabled", this.enabled, true, BuilderDescriptorState.Stable, "Whether this instruction should be enabled on the NPC", null);
      this.getObject(
         var1,
         "Sensor",
         this.sensorBuilderObjectReferenceHelper,
         BuilderDescriptorState.Stable,
         "Sensor for testing if instruction can be applied",
         "Sensor for testing if instruction can be applied. If not supplied, will always match",
         var3
      );
      var2.lock();
      this.getObject(var1, "BodyMotion", this.bodyMotionBuilderObjectReferenceHelper, BuilderDescriptorState.Stable, "Body motion to be executed", null, var3);
      this.getObject(var1, "HeadMotion", this.headMotionBuilderObjectReferenceHelper, BuilderDescriptorState.Stable, "Head motion to be executed", null, var3);
      this.getObject(var1, "Actions", this.actionsBuilderObjectReferenceHelper, BuilderDescriptorState.Stable, "Actions to be executed", null, var3);
      this.getBoolean(
         var1,
         "ActionsBlocking",
         var1x -> this.actionsBlocking = var1x,
         false,
         BuilderDescriptorState.Stable,
         "Do not execute an action unless the previous action could execute",
         null
      );
      this.getBoolean(
         var1,
         "ActionsAtomic",
         var1x -> this.actionsAtomic = var1x,
         false,
         BuilderDescriptorState.Stable,
         "Only execute actions if all actions can be executed",
         null
      );
      this.getArray(
         var1,
         "Instructions",
         this.steps,
         null,
         BuilderDescriptorState.Stable,
         "Optional nested list of instructions",
         null,
         new BuilderValidationHelper(
            this.fileName,
            null,
            this.internalReferenceResolver,
            this.stateHelper,
            this.instructionContextHelper,
            this.extraInfo,
            this.evaluators,
            this.readErrors
         )
      );
      this.getBoolean(
         var1,
         "Continue",
         var1x -> this.continueAfter = var1x,
         false,
         BuilderDescriptorState.WorkInProgress,
         "Continue after this instruction was executed",
         null
      );
      this.getDouble(
         var1,
         "Weight",
         this.chance,
         1.0,
         DoubleSingleValidator.greater0(),
         BuilderDescriptorState.Stable,
         "Weighted chance of picking this instruction in a random instruction",
         null
      );
      this.getBoolean(
         var1,
         "TreeMode",
         var1x -> this.treeMode = var1x,
         false,
         BuilderDescriptorState.Stable,
         "Whether this instruction and its contents should be treated like a traditional behaviour tree.",
         "Whether this instruction and its contents should be treated like a traditional behaviour tree, i.e. will class="kw">continue if all child instructions fail"
      );
      this.getBoolean(
         var1,
         "InvertTreeModeResult",
         this.invertTreeModeResult,
         false,
         BuilderDescriptorState.Stable,
         "Whether or not to invert the result of TreeMode evaluation when passing up to parent TreeMode instructions",
         null
      );
      this.decreaseDepth();
      this.validateOneOrNonePresent("BodyMotion", this.bodyMotionBuilderObjectReferenceHelper, "Instructions", this.steps);
      this.validateOneOrNonePresent("HeadMotion", this.headMotionBuilderObjectReferenceHelper, "Instructions", this.steps);
      this.validateOneOrNonePresent("Actions", this.actionsBuilderObjectReferenceHelper, "Instructions", this.steps);
      this.validateBooleanImplicationAnyAntecedent(ANTECEDENT, new boolean[]{this.treeMode}, true, SUBSEQUENT, new boolean[]{this.continueAfter}, false);
      class="kw">return this;
   }

   @Nullable
   class="kw">public Instruction build(@Nonnull BuilderSupport var1) {
      if (!this.enabled.get(var1.getExecutionContext())) {
         class="kw">return null;
      }

      Sensor var2;
      if (this.sensorBuilderObjectReferenceHelper.isPresent()) {
         var2 = this.getSensor(var1);
         if (var2 == null) {
            class="kw">return null;
         }
      } else {
         var2 = Sensor.NULL;
      }

      if (this.currentStateName != null) {
         var1.pushCurrentStateName(this.currentStateName);
      }

      Instruction[] var3 = this.hasNestedInstructions() ? this.getSteps(var1) : null;
      if (var3 == null && !this.hasActions() && !this.hasBodyMotion() && !this.hasHeadMotion()) {
         if (this.currentStateName != null) {
            var1.popCurrentStateName();
         }

         class="kw">return null;
      } else {
         if (this.currentStateName != null) {
            var1.popCurrentStateName();
         }

         class="kw">return new Instruction(this, var2, var3, var1);
      }
   }

   @Override
   class="kw">public boolean validate(String var1, @Nonnull NPCLoadTimeValidationHelper var2, @Nonnull ExecutionContext var3, Scope var4, @Nonnull List<String> var5) {
      if (!this.enabled.get(var3)) {
         class="kw">return true;
      }

      if (this.currentStateName != null) {
         var2.pushCurrentStateName(this.currentStateName);
      }

      boolean var6 = this.sensorBuilderObjectReferenceHelper.validate(var1, var2, this.builderManager, var3, var4, var5)
         & this.bodyMotionBuilderObjectReferenceHelper.validate(var1, var2, this.builderManager, var3, var4, var5)
         & this.headMotionBuilderObjectReferenceHelper.validate(var1, var2, this.builderManager, var3, var4, var5)
         & this.actionsBuilderObjectReferenceHelper.validate(var1, var2, this.builderManager, var3, var4, var5);
      var2.pushPrecedingScope();
      var6 &= this.steps.validate(var1, var2, this.builderManager, var3, var4, var5);
      var2.popPrecedingScope();
      if (this.currentStateName != null) {
         var2.popCurrentStateName();
      }

      var2.clearParentSensorOnce();
      class="kw">return var6;
   }

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

   @Override
   class="kw">public class="kw">final boolean isEnabled(ExecutionContext var1) {
      class="kw">return this.enabled.get(var1);
   }

   @Override
   class="kw">public void setCurrentStateName(String var1) {
      this.currentStateName = var1;
   }

   class="kw">public boolean hasActions() {
      class="kw">return this.actionsBuilderObjectReferenceHelper.isPresent();
   }

   class="kw">public boolean hasBodyMotion() {
      class="kw">return this.bodyMotionBuilderObjectReferenceHelper.isPresent();
   }

   class="kw">public boolean hasHeadMotion() {
      class="kw">return this.headMotionBuilderObjectReferenceHelper.isPresent();
   }

   class="kw">public boolean hasNestedInstructions() {
      class="kw">return this.steps.isPresent() && !this.steps.hasNoElements();
   }

   @Nullable
   class="kw">public Sensor getSensor(@Nonnull BuilderSupport var1) {
      class="kw">return this.sensorBuilderObjectReferenceHelper.build(var1);
   }

   @Nullable
   class="kw">public BodyMotion getBodyMotion(@Nonnull BuilderSupport var1) {
      class="kw">return this.bodyMotionBuilderObjectReferenceHelper.build(var1);
   }

   @Nullable
   class="kw">public HeadMotion getHeadMotion(@Nonnull BuilderSupport var1) {
      class="kw">return this.headMotionBuilderObjectReferenceHelper.build(var1);
   }

   @Nonnull
   class="kw">public ActionList getActionList(@Nonnull BuilderSupport var1) {
      ActionList var2 = this.actionsBuilderObjectReferenceHelper.build(var1);
      if (var2 == null) {
         class="kw">return ActionList.EMPTY_ACTION_LIST;
      }

      if (var2 != ActionList.EMPTY_ACTION_LIST) {
         var2.setAtomic(this.actionsAtomic);
         var2.setBlocking(this.actionsBlocking);
      }

      class="kw">return var2;
   }

   @Nonnull
   class="kw">public Instruction[] getSteps(@Nonnull BuilderSupport var1) {
      List var2 = this.steps.build(var1);
      class="kw">return var2 == null ? Instruction.EMPTY_ARRAY : var2.toArray(Instruction[]::new);
   }

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

   class="kw">public String getTag() {
      class="kw">return this.tag;
   }

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

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

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

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

   class="kw">protected boolean requiresName() {
      class="kw">return false;
   }
}