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