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;
}
}