Data class

Пакет: com.hypixel.hytale.server.core.modules.interaction.interaction.config.client

Файл: com/hypixel/hytale/server/core/modules/interaction/interaction/config/client/ChainingInteraction.java

implements: Component<EntityStore>

Поля (5)

МодификаторыТипИмя
private long lastAttack
private final Object2IntMap<String> map
private final Object2IntMap<String> namedMap
long var1
ChainingInteraction.Data var1

Методы (5)

МодификаторыВозвратСигнатура
public Component<EntityStore> clonepublic Component<EntityStore> clone()
public static ComponentType<EntityStore, ChainingInteraction.Data> getComponentTypepublic static ComponentType<EntityStore, ChainingInteraction.Data> getComponentType()
public Object2IntMap<String> getNamedMappublic Object2IntMap<String> getNamedMap()
public float getTimeSinceLastAttackInSecondspublic float getTimeSinceLastAttackInSeconds()
if if(this.lastAttack == 0L)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.interaction.interaction.config.client;

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.codecs.map.MapCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.InteractionState;
class="kw">import com.hypixel.hytale.protocol.InteractionSyncData;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.WaitForDataFrom;
class="kw">import com.hypixel.hytale.server.core.entity.EntityUtils;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionContext;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionManager;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.InteractionModule;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.data.Collector;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.data.CollectorTag;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.Label;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.OperationsBuilder;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import java.util.Arrays;
class="kw">import java.util.HashMap;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class ChainingInteraction class="kw">extends Interaction {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<ChainingInteraction> CODEC = BuilderCodec.builder(
         ChainingInteraction.class, ChainingInteraction::new, Interaction.ABSTRACT_CODEC
      )
      .documentation("Runs one of the entries in `Next` based on how many times this interaction was run before the `ChainingAllowance` timer was reset.")
      .<Double>appendInherited(
         new KeyedCodec<>("ChainingAllowance", Codec.DOUBLE),
         (var0, var1) -> var0.chainingAllowance = var1.floatValue(),
         var0 -> (double)var0.chainingAllowance,
         (var0, var1) -> var0.chainingAllowance = var1.chainingAllowance
      )
      .documentation(
         "Time in seconds that the user has to run this interaction again in order to hit the next chain entry.\nResets the timer each time the interaction is reached."
      )
      .add()
      .<String[]>appendInherited(
         new KeyedCodec<>("Next", new ArrayCodec<>(Interaction.CHILD_ASSET_CODEC, String[]::new)),
         (var0, var1) -> var0.next = var1,
         var0 -> var0.next,
         (var0, var1) -> var0.next = var1.next
      )
      .addValidator(Validators.nonNull())
      .addValidator(Validators.nonNullArrayElements())
      .addValidatorLate(() -> Interaction.VALIDATOR_CACHE.getArrayValidator().late())
      .add()
      .appendInherited(
         new KeyedCodec<>("ChainId", Codec.STRING), (var0, var1) -> var0.chainId = var1, var0 -> var0.chainId, (var0, var1) -> var0.chainId = var1.chainId
      )
      .add()
      .<Map>appendInherited(
         new KeyedCodec<>("Flags", new MapCodec<>(CHILD_ASSET_CODEC, HashMap::new)),
         (var0, var1) -> var0.flags = var1,
         var0 -> var0.flags,
         (var0, var1) -> var0.flags = var1.flags
      )
      .addValidatorLate(() -> Interaction.VALIDATOR_CACHE.getMapValueValidator().late())
      .add()
      .afterDecode(var0 -> {
         if (var0.flags != null) {
            String[] var1 = var0.sortedFlagKeys = var0.flags.keySet().toArray(String[]::new);
            Arrays.sort(var1);
            var0.flagIndex = new Object2IntOpenHashMap();

            for (int var2 = 0; var2 < var1.length; var2++) {
               var0.flagIndex.put(var1[var2], var2);
            }
         }
      })
      .build();
   class="kw">protected String chainId;
   class="kw">protected float chainingAllowance;
   class="kw">protected String[] next;
   @Nullable
   class="kw">protected Map<String, String> flags;
   @Nullable
   class="kw">protected Object2IntMap<String> flagIndex;
   class="kw">private String[] sortedFlagKeys;
   class="kw">private class="kw">static class="kw">final float MAX_GRACE_SECONDS = 0.5F;
   class="kw">private class="kw">static class="kw">final float GRACE_RATIO = 0.25F;

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

   @Nonnull
   @Override
   class="kw">public WaitForDataFrom getWaitForDataFrom() {
      class="kw">return WaitForDataFrom.Client;
   }

   @Override
   class="kw">protected void tick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
      InteractionSyncData var6 = var4.getClientState();
      assert var6 != null;
      InteractionSyncData var7 = var4.getState();
      if (var6.flagIndex != -1) {
         if (this.sortedFlagKeys != null && var6.flagIndex >= 0 && var6.flagIndex < this.sortedFlagKeys.length) {
            var7.state = InteractionState.Finished;
            var4.jump(var4.getLabel(this.next.length + var6.flagIndex));
         } else {
            LOGGER.at(Level.WARNING)
               .log(
                  "%s sent out-of-bounds flagIndex %d (max %d)",
                  EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
                  var6.flagIndex,
                  this.sortedFlagKeys != null ? this.sortedFlagKeys.length : 0
               );
            var7.state = InteractionState.Failed;
         }
      } else if (var6.chainingIndex == -1) {
         var7.state = InteractionState.NotFinished;
      } else if (var6.chainingIndex >= 0 && var6.chainingIndex < this.next.length) {
         CommandBuffer var8 = var4.getCommandBuffer();
         if (var8 != null) {
            Ref var9 = var4.getEntity();
            if (var8.getComponent(var9, Player.getComponentType()) != null) {
               ChainingInteraction.Data var10 = var8.ensureAndGetComponent(var9, ChainingInteraction.Data.getComponentType());
               if (var10 != null) {
                  String var11 = this.chainId == null ? this.id : this.chainId;
                  Object2IntMap var12 = this.chainId == null ? var10.map : var10.namedMap;
                  if (!this.isAcceptedChainIndex(var6.chainingIndex, var12, var11, var10)) {
                     LOGGER.at(Level.WARNING)
                        .log(
                           "%s sent unexpected chainingIndex %d for chain '%s'",
                           EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
                           var6.chainingIndex,
                           var11
                        );
                  }

                  var12.put(var11, var6.chainingIndex);
                  var10.lastAttack = System.nanoTime();
               }
            }
         }

         var7.state = InteractionState.Finished;
         var4.jump(var4.getLabel(var6.chainingIndex));
      } else {
         LOGGER.at(Level.WARNING)
            .log(
               "%s sent out-of-bounds chainingIndex %d (max %d)",
               EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
               var6.chainingIndex,
               this.next.length
            );
         var7.state = InteractionState.Failed;
      }
   }

   class="kw">private boolean isAcceptedChainIndex(int var1, @Nonnull Object2IntMap<String> var2, @Nonnull String var3, @Nonnull ChainingInteraction.Data var4) {
      int var5 = var2.getInt(var3);
      float var6 = var4.getTimeSinceLastAttackInSeconds();
      if (var6 == 0.0F) {
         class="kw">return var1 == 0;
      }

      int var7 = var5 + 1;
      if (var7 >= this.next.length) {
         var7 = 0;
      }

      float var8 = Math.min(0.5F, this.chainingAllowance * 0.25F);
      boolean var9 = this.chainingAllowance > 0.0F && var6 > this.chainingAllowance;
      boolean var10 = this.chainingAllowance > 0.0F && var6 > this.chainingAllowance - var8 && var6 <= this.chainingAllowance + var8;
      int var11 = var9 ? 0 : var7;
      class="kw">return !var10 ? var1 == var11 : var1 == 0 || var1 == var7;
   }

   @Override
   class="kw">protected void simulateTick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
      if (var1) {
         CommandBuffer var6 = var4.getCommandBuffer();
         assert var6 != null;
         Ref var7 = var4.getEntity();
         ChainingInteraction.Data var8 = var6.getComponent(var7, ChainingInteraction.Data.getComponentType());
         if (var8 != null) {
            InteractionSyncData var9 = var4.getState();
            String var10 = this.chainId == null ? this.id : this.chainId;
            Object2IntMap var11 = this.chainId == null ? var8.map : var8.namedMap;
            int var12 = var11.getInt(var10);
            if (++var12 >= this.next.length) {
               var12 = 0;
            }

            if (this.chainingAllowance > 0.0F && var8.getTimeSinceLastAttackInSeconds() > this.chainingAllowance) {
               var12 = 0;
            }

            var11.put(var10, var12);
            var9.chainingIndex = var12;
            var9.state = InteractionState.Finished;
            var4.jump(var4.getLabel(var12));
            var8.lastAttack = System.nanoTime();
         }
      }
   }

   @Override
   class="kw">public void compile(@Nonnull OperationsBuilder var1) {
      int var2 = this.next.length + (this.sortedFlagKeys != null ? this.sortedFlagKeys.length : 0);
      Label[] var3 = new Label[var2];

      for (int var4 = 0; var4 < var3.length; var4++) {
         var3[var4] = var1.createUnresolvedLabel();
      }

      var1.addOperation(this, var3);
      Label var8 = var1.createUnresolvedLabel();

      for (int var5 = 0; var5 < this.next.length; var5++) {
         var1.resolveLabel(var3[var5]);
         Interaction var6 = Interaction.getInteractionOrUnknown(this.next[var5]);
         var6.compile(var1);
         var1.jump(var8);
      }

      if (this.flags != null) {
         for (int var9 = 0; var9 < this.sortedFlagKeys.length; var9++) {
            String var10 = this.sortedFlagKeys[var9];
            var1.resolveLabel(var3[this.next.length + var9]);
            Interaction var7 = Interaction.getInteractionOrUnknown(this.flags.get(var10));
            var7.compile(var1);
            var1.jump(var8);
         }
      }

      var1.resolveLabel(var8);
   }

   @Override
   class="kw">public boolean walk(@Nonnull Collector var1, @Nonnull InteractionContext var2) {
      for (int var3 = 0; var3 < this.next.length; var3++) {
         if (InteractionManager.walkInteraction(var1, var2, ChainingInteraction.ChainingTag.of(var3), this.next[var3])) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   @Nonnull
   @Override
   class="kw">protected com.hypixel.hytale.protocol.Interaction generatePacket() {
      class="kw">return new com.hypixel.hytale.protocol.ChainingInteraction();
   }

   @Override
   class="kw">protected void configurePacket(com.hypixel.hytale.protocol.Interaction var1) {
      super.configurePacket(var1);
      com.hypixel.hytale.protocol.ChainingInteraction var2 = (com.hypixel.hytale.protocol.ChainingInteraction)var1;
      var2.chainingAllowance = this.chainingAllowance;
      int[] var3 = var2.chainingNext = new int[this.next.length];

      for (int var4 = 0; var4 < this.next.length; var4++) {
         var3[var4] = Interaction.getInteractionIdOrUnknown(this.next[var4]);
      }

      if (this.flags != null) {
         var2.flags = new Object2IntOpenHashMap();

         for (Entry var5 : this.flags.entrySet()) {
            var2.flags.put(var5.getKey(), Interaction.getInteractionIdOrUnknown(var5.getValue()));
         }
      }

      var2.chainId = this.chainId;
   }

   @Override
   class="kw">public boolean needsRemoteSync() {
      class="kw">return true;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "ChainingInteraction{chainingAllowance=" + this.chainingAllowance + ", next=" + Arrays.toString(this.next) + "} " + super.toString();
   }

   class="kw">public class="kw">static class="kw">final class ChainingTag class="kw">implements CollectorTag {
      class="kw">private class="kw">final int index;

      class="kw">private ChainingTag(int var1) {
         this.index = var1;
      }

      class="kw">public int getIndex() {
         class="kw">return this.index;
      }

      @Override
      class="kw">public boolean equals(@Nullable Object var1) {
         if (this == var1) {
            class="kw">return true;
         } else if (var1 != null && this.getClass() == var1.getClass()) {
            ChainingInteraction.ChainingTag var2 = (ChainingInteraction.ChainingTag)var1;
            class="kw">return this.index == var2.index;
         } else {
            class="kw">return false;
         }
      }

      @Override
      class="kw">public int hashCode() {
         class="kw">return this.index;
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return "ChainingTag{index=" + this.index + "}";
      }

      @Nonnull
      class="kw">public class="kw">static ChainingInteraction.ChainingTag of(int var0) {
         class="kw">return new ChainingInteraction.ChainingTag(var0);
      }
   }

   class="kw">public class="kw">static class Data class="kw">implements Component<EntityStore> {
      class="kw">private class="kw">final Object2IntMap<String> map = new Object2IntOpenHashMap();
      class="kw">private class="kw">final Object2IntMap<String> namedMap = new Object2IntOpenHashMap();
      class="kw">private long lastAttack;

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

      class="kw">public class="kw">static ComponentType<EntityStore, ChainingInteraction.Data> getComponentType() {
         class="kw">return InteractionModule.get().getChainingDataComponent();
      }

      class="kw">public float getTimeSinceLastAttackInSeconds() {
         if (this.lastAttack == 0L) {
            class="kw">return 0.0F;
         }

         long var1 = System.nanoTime() - this.lastAttack;
         class="kw">return (float)var1 / 1.0E9F;
      }

      @Nonnull
      class="kw">public Object2IntMap<String> getNamedMap() {
         class="kw">return this.namedMap;
      }

      @Nonnull
      @Override
      class="kw">public Component<EntityStore> clone() {
         ChainingInteraction.Data var1 = new ChainingInteraction.Data();
         var1.map.putAll(this.map);
         var1.namedMap.putAll(this.namedMap);
         var1.lastAttack = this.lastAttack;
         class="kw">return var1;
      }
   }
}