SingletonStateMap class

Пакет: com.hypixel.hytale.server.npc.asset.builder

Файл: com/hypixel/hytale/server/npc/asset/builder/StateMappingHelper.java

implements: StateMappingHelper.IStateMap

Поля (1)

МодификаторыТипИмя
private final String stateName

Методы (9)

МодификаторыВозвратСигнатура
public int getAndPutRequirerIndexpublic int getAndPutRequirerIndex(String var1)
public int getAndPutSensorIndexpublic int getAndPutSensorIndex(String var1)
public int getAndPutSetterIndexpublic int getAndPutSetterIndex(String var1)
public int getStateIndexpublic int getStateIndex(@Nonnull String var1)
public String getStateNamepublic String getStateName(int var1)
public boolean isEmptypublic boolean isEmpty()
public void optimisepublic void optimise()
public int sizepublic int size()
public void validatepublic void validate(String var1, String var2, List<String> var3)

Исходный код

Показать/скрыть
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();
      }
   }
}