StateDepth class
Пакет: com.hypixel.hytale.server.npc.asset.builder
Файл: com/hypixel/hytale/server/npc/asset/builder/StateMappingHelper.java
Поля (2)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final int |
depth |
|
private final String |
state |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.asset.builder;
class="kw">import com.google.gson.JsonArray;
class="kw">import com.google.gson.JsonElement;
class="kw">import com.google.gson.JsonObject;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.StateStringValidator;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.util.ArrayDeque;
class="kw">import java.util.BitSet;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.function.BiFunction;
class="kw">import java.util.function.Function;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class StateMappingHelper {
class="kw">public class="kw">static class="kw">final String DEFAULT_STATE = "start";
class="kw">public class="kw">static class="kw">final String DEFAULT_SUB_STATE = "Default";
class="kw">public class="kw">static class="kw">final String DEFAULT_STATE_PARAMETER = "DefaultState";
class="kw">public class="kw">static class="kw">final String STATE_CHANGE_RESET_PARAMETER = "ResetOnStateChange";
@Nullable
class="kw">private StateMappingHelper.StateMap mainStateMap = new StateMappingHelper.StateMap();
class="kw">private int[] allMainStates;
@Nullable
class="kw">private Int2ObjectOpenHashMap<StateMappingHelper.IStateMap> subStateMap = new Int2ObjectOpenHashMap();
class="kw">private int depth;
@Nullable
class="kw">private ArrayDeque<StateMappingHelper.StateDepth> currentParentState = new ArrayDeque<>();
class="kw">private boolean component = true;
class="kw">private boolean hasStateEvaluator;
class="kw">private boolean requiresStateEvaluator;
class="kw">private String defaultSubState;
class="kw">private String defaultComponentLocalState;
class="kw">private int defaultComponentLocalStateIndex;
class="kw">private boolean componentLocalStateAutoReset;
class="kw">private Object2IntOpenHashMap<String> componentImportStateMappings;
class="kw">private StateMappingHelper.SingletonStateMap singletonDefaultStateMap;
class="kw">public StateMappingHelper() {
}
class="kw">public int[] getAllMainStates() {
class="kw">return this.allMainStates;
}
class="kw">public int getHighestSubStateIndex(int var1) {
class="kw">return ((StateMappingHelper.IStateMap)this.subStateMap.get(var1)).size() - 1;
}
class="kw">public void getAndPutSensorIndex(String var1, String var2, @Nonnull BiConsumer<Integer, Integer> var3) {
this.currentParentState.push(new StateMappingHelper.StateDepth(this.depth, var1));
this.getAndPutIndex(var1, var2, var3, this.mainStateMap::getAndPutSensorIndex, (var1x, var2x) -> {
StateMappingHelper.IStateMap var3 = this.initialiseDefaultSubStates(var1x);
class="kw">return var3.getAndPutSensorIndex(var2x);
});
}
class="kw">public void getAndPutSetterIndex(String var1, String var2, @Nonnull BiConsumer<Integer, Integer> var3) {
this.getAndPutIndex(var1, var2, var3, this.mainStateMap::getAndPutSetterIndex, (var1x, var2x) -> {
StateMappingHelper.IStateMap var3 = this.initialiseDefaultSubStates(var1x);
class="kw">return var3.getAndPutSetterIndex(var2x);
});
}
class="kw">public void getAndPutStateRequirerIndex(String var1, String var2, @Nonnull BiConsumer<Integer, Integer> var3) {
this.getAndPutIndex(var1, var2, var3, this.mainStateMap::getAndPutRequirerIndex, (var1x, var2x) -> {
StateMappingHelper.IStateMap var3 = this.initialiseDefaultSubStates(var1x);
class="kw">return var3.getAndPutRequirerIndex(var2x);
});
}
class="kw">private void getAndPutIndex(
String var1,
@Nullable String var2,
@Nonnull BiConsumer<Integer, Integer> var3,
@Nonnull Function<String, Integer> var4,
@Nonnull BiFunction<Integer, String, Integer> var5
) {
Integer var6 = var4.apply(var1);
if (var2 == null) {
var3.accept(var6, -1);
} else {
Integer var7 = var5.apply(var6, var2);
var3.accept(var6, var7);
}
}
@Nonnull
class="kw">private StateMappingHelper.IStateMap initialiseDefaultSubStates(int var1) {
class="kw">return (StateMappingHelper.IStateMap)this.subStateMap.computeIfAbsent(var1, var1x -> {
StateMappingHelper.StateMap var2 = new StateMappingHelper.StateMap();
var2.getAndPutSensorIndex(this.defaultSubState);
var2.getAndPutSetterIndex(this.defaultSubState);
class="kw">return var2;
});
}
class="kw">public void validate(String var1, @Nonnull List<String> var2) {
this.mainStateMap.validate(var1, null, var2);
this.subStateMap.forEach((var3, var4) -> var4.validate(var1, this.mainStateMap.getStateName(var3), var2));
if (!this.hasStateEvaluator && this.requiresStateEvaluator) {
var2.add(String.format("%s: Expects a state evaluator but does not have one defined", var1));
}
}
class="kw">public int getStateIndex(String var1) {
class="kw">return this.mainStateMap.getStateIndex(var1);
}
class="kw">public int getSubStateIndex(int var1, String var2) {
class="kw">return ((StateMappingHelper.IStateMap)this.subStateMap.get(var1)).getStateIndex(var2);
}
class="kw">public String getStateName(int var1) {
class="kw">return this.mainStateMap.getStateName(var1);
}
class="kw">public String getSubStateName(int var1, int var2) {
class="kw">return ((StateMappingHelper.IStateMap)this.subStateMap.get(var1)).getStateName(var2);
}
@Nullable
class="kw">public String getCurrentParentState() {
class="kw">return this.currentParentState.isEmpty() ? null : this.currentParentState.peek().state;
}
class="kw">public void increaseDepth() {
this.depth++;
}
class="kw">public void decreaseDepth() {
this.depth--;
if (!this.currentParentState.isEmpty() && this.depth < this.currentParentState.peek().depth) {
this.currentParentState.pop();
}
}
class="kw">public void setDefaultSubState(String var1) {
this.defaultSubState = var1;
}
class="kw">public String getDefaultSubState() {
class="kw">return this.defaultSubState;
}
class="kw">public void setNotComponent() {
this.mainStateMap.getAndPutSensorIndex("start");
this.mainStateMap.getAndPutSetterIndex("start");
this.component = false;
}
class="kw">public boolean isComponent() {
class="kw">return this.component;
}
class="kw">public boolean hasComponentStates() {
class="kw">return this.component && this.mainStateMap != null;
}
class="kw">public void initialiseComponentState(@Nonnull BuilderSupport var1) {
var1.setToNewComponent();
var1.addComponentLocalStateMachine(this.defaultComponentLocalStateIndex);
if (this.componentLocalStateAutoReset) {
var1.setLocalStateMachineAutoReset();
}
}
class="kw">public void popComponentState(@Nonnull BuilderSupport var1) {
var1.popComponent();
}
class="kw">public void readComponentDefaultLocalState(@Nonnull JsonObject var1) {
String var2 = BuilderBase.readString(var1, "DefaultState", null);
if (var2 != null) {
StateStringValidator var3 = StateStringValidator.get();
if (!var3.test(var2)) {
throw new IllegalStateException(var3.errorMessage(var2));
}
if (var3.hasMainState()) {
throw new IllegalStateException(String.format("Default component local state must be defined with a '.' prefix: %s", var3.getMainState()));
}
this.defaultComponentLocalState = var3.getSubState();
this.defaultComponentLocalStateIndex = this.mainStateMap.getAndPutSetterIndex(this.defaultComponentLocalState);
}
JsonElement var4 = var1.get("ResetOnStateChange");
if (var4 != null) {
this.componentLocalStateAutoReset = BuilderBase.expectBooleanElement(var4, "ResetOnStateChange");
}
}
class="kw">public boolean hasDefaultLocalState() {
class="kw">return this.defaultComponentLocalState != null;
}
class="kw">public String getDefaultLocalState() {
class="kw">return this.defaultComponentLocalState;
}
class="kw">public void setComponentImportStateMappings(@Nonnull JsonArray var1) {
this.componentImportStateMappings = new Object2IntOpenHashMap();
this.componentImportStateMappings.defaultReturnValue(Integer.MIN_VALUE);
StateStringValidator var2 = StateStringValidator.mainStateOnly();
for (int var3 = 0; var3 < var1.size(); var3++) {
String var4 = var1.get(var3).getAsString();
if (!var2.test(var4)) {
throw new IllegalStateException(var2.errorMessage(var4));
}
this.getAndPutSensorIndex(var2.getMainState(), null, (var0, var1x) -> {});
this.componentImportStateMappings.put(var2.getMainState(), var3);
}
this.componentImportStateMappings.trim();
}
class="kw">public int getComponentImportStateIndex(String var1) {
class="kw">return this.componentImportStateMappings == null ? Integer.MIN_VALUE : this.componentImportStateMappings.getInt(var1);
}
class="kw">public int importedStateCount() {
class="kw">return this.componentImportStateMappings == null ? 0 : this.componentImportStateMappings.size();
}
class="kw">public void setRequiresStateEvaluator() {
this.requiresStateEvaluator = true;
}
class="kw">public void setHasStateEvaluator() {
this.hasStateEvaluator = true;
}
class="kw">public void optimise() {
this.currentParentState = null;
if (this.mainStateMap.isEmpty()) {
this.mainStateMap = null;
this.subStateMap = null;
} else {
ObjectIterator var1 = Int2ObjectMaps.fastIterator(this.subStateMap);
while (var1.hasNext()) {
Entry var2 = (Entry<StateMappingHelper.IStateMap>)var1.next();
StateMappingHelper.IStateMap var3 = (StateMappingHelper.IStateMap)var2.getValue();
if (var3.size() == 1) {
if (this.singletonDefaultStateMap == null) {
this.singletonDefaultStateMap = new StateMappingHelper.SingletonStateMap(this.defaultSubState);
}
var2.setValue(this.singletonDefaultStateMap);
} else {
var3.optimise();
}
}
this.subStateMap.trim();
this.mainStateMap.optimise();
this.allMainStates = this.mainStateMap.stateNameMap.keySet().toIntArray();
}
}
class="kw">private class="kw">interface IStateMap {
int getAndPutSensorIndex(String var1);
int getAndPutSetterIndex(String var1);
int getAndPutRequirerIndex(String var1);
int getStateIndex(String var1);
String getStateName(int var1);
void validate(String var1, String var2, List<String> var3);
boolean isEmpty();
int size();
void optimise();
}
class="kw">private class="kw">static class SingletonStateMap class="kw">implements StateMappingHelper.IStateMap {
class="kw">private class="kw">final String stateName;
class="kw">private SingletonStateMap(String var1) {
this.stateName = var1;
}
@Override
class="kw">public int getAndPutSensorIndex(String var1) {
class="kw">return 0;
}
@Override
class="kw">public int getAndPutSetterIndex(String var1) {
class="kw">return 0;
}
@Override
class="kw">public int getAndPutRequirerIndex(String var1) {
class="kw">return 0;
}
@Override
class="kw">public int getStateIndex(@Nonnull String var1) {
class="kw">return !var1.equals(this.stateName) ? Integer.MIN_VALUE : 0;
}
@Override
class="kw">public String getStateName(int var1) {
class="kw">return this.stateName;
}
@Override
class="kw">public void validate(String var1, String var2, List<String> var3) {
}
@Override
class="kw">public boolean isEmpty() {
class="kw">return false;
}
@Override
class="kw">public int size() {
class="kw">return 1;
}
@Override
class="kw">public void optimise() {
}
}
class="kw">private class="kw">static class StateDepth {
class="kw">private class="kw">final int depth;
class="kw">private class="kw">final String state;
class="kw">private StateDepth(int var1, String var2) {
this.depth = var1;
this.state = var2;
}
}
class="kw">private class="kw">static class StateMap class="kw">implements StateMappingHelper.IStateMap {
class="kw">private class="kw">final Int2ObjectOpenHashMap<String> stateNameMap = new Int2ObjectOpenHashMap();
@Nonnull
class="kw">private class="kw">final Object2IntOpenHashMap<String> stateIndexMap;
class="kw">private int stateIndexSource;
@Nullable
class="kw">private BitSet stateSensors = new BitSet();
@Nullable
class="kw">private BitSet stateSetters = new BitSet();
@Nullable
class="kw">private BitSet stateRequirers = new BitSet();
class="kw">private StateMap() {
this.stateIndexMap = new Object2IntOpenHashMap();
this.stateIndexMap.defaultReturnValue(Integer.MIN_VALUE);
}
class="kw">private int getOrCreateIndex(String var1) {
int var2 = this.stateIndexMap.getInt(var1);
if (var2 == Integer.MIN_VALUE) {
var2 = this.stateIndexSource++;
this.stateIndexMap.put(var1, var2);
this.stateNameMap.put(var2, var1);
}
class="kw">return var2;
}
@Override
class="kw">public int getAndPutSensorIndex(String var1) {
int var2 = this.getOrCreateIndex(var1);
this.stateSensors.set(var2);
class="kw">return var2;
}
@Override
class="kw">public int getAndPutSetterIndex(String var1) {
int var2 = this.getOrCreateIndex(var1);
this.stateSetters.set(var2);
class="kw">return var2;
}
@Override
class="kw">public int getAndPutRequirerIndex(String var1) {
int var2 = this.getOrCreateIndex(var1);
this.stateRequirers.set(var2);
class="kw">return var2;
}
@Override
class="kw">public int getStateIndex(String var1) {
Objects.requireNonNull(var1, "State must not be null when fetching index");
class="kw">return this.stateIndexMap.getInt(var1);
}
@Override
class="kw">public String getStateName(int var1) {
class="kw">return (String)this.stateNameMap.get(var1);
}
@Override
class="kw">public void validate(String var1, @Nullable String var2, @Nonnull List<String> var3) {
this.stateSetters.xor(this.stateSensors);
if (this.stateSetters.cardinality() > 0) {
var3.add(
String.format(
"%s: State sensor or State setter action/motion exists without accompanying state/setter: %s%s",
var1,
var2 != null ? var2 + "." : "",
this.stateNameMap.get(this.stateSetters.nextSetBit(0))
)
);
}
this.stateRequirers.andNot(this.stateSensors);
if (this.stateRequirers.cardinality() > 0) {
var3.add(
String.format(
"%s: State required by a parameter does not exist: %s%s",
var1,
var2 != null ? var2 + "." : "",
this.stateNameMap.get(this.stateRequirers.nextSetBit(0))
)
);
}
}
@Override
class="kw">public boolean isEmpty() {
class="kw">return this.stateNameMap.isEmpty();
}
@Override
class="kw">public int size() {
class="kw">return this.stateNameMap.size();
}
@Override
class="kw">public void optimise() {
this.stateSensors = null;
this.stateSetters = null;
this.stateRequirers = null;
this.stateNameMap.trim();
this.stateIndexMap.trim();
}
}
}