ChainingInteraction class

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

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

extends: Interaction

Поля (41)

МодификаторыТипИмя
final HytaleLogger LOGGER
private final int index
private long lastAttack
private final Object2IntMap<String> map
private final Object2IntMap<String> namedMap
String[] var1
long var1
ChainingInteraction.Data var1
ChainingInteraction.Data var10
boolean var10
String var10
String var10
String var11
int var11
Object2IntMap var11
Object2IntMap var12
int var12
var12
var12
int var2
com.hypixel.hytale.protocol.ChainingInteraction var2
ChainingInteraction.ChainingTag var2
Label[] var3
int[] var3
int var5
InteractionSyncData var6
float var6
CommandBuffer var6
Interaction var6
InteractionSyncData var7
int var7
var7
Ref var7
Interaction var7
CommandBuffer var8
float var8
ChainingInteraction.Data var8
Label var8
Ref var9
boolean var9
InteractionSyncData var9

Методы (32)

МодификаторыВозвратСигнатура
private ChainingTagprivate ChainingTag(int var1)
public Datapublic Data()
public Component<EntityStore> clonepublic Component<EntityStore> clone()
public boolean equalspublic boolean equals(@Nullable Object var1)
for for(int var2 = 0; var2 < var1.length; var2++)
for for(int var4 = 0; var4 < var3.length; var4++)
for for(int var5 = 0; var5 < this.next.length; var5++)
for for(int var9 = 0; var9 < this.sortedFlagKeys.length; var9++)
for for(int var3 = 0; var3 < this.next.length; var3++)
for for(int var4 = 0; var4 < this.next.length; var4++)
public static ComponentType<EntityStore, ChainingInteraction.Data> getComponentTypepublic static ComponentType<EntityStore, ChainingInteraction.Data> getComponentType()
public int getIndexpublic int getIndex()
public Object2IntMap<String> getNamedMappublic Object2IntMap<String> getNamedMap()
public float getTimeSinceLastAttackInSecondspublic float getTimeSinceLastAttackInSeconds()
public int hashCodepublic int hashCode()
if if(var0.flags != null)
if if(var6.flagIndex != -1)
if if(this.sortedFlagKeys != null && var6.flagIndex >= 0 && var6.flagIndex < this.sortedFlagKeys.length)
if if(var8 != null)
if if(var10 != null)
if if(var6 == 0.0F)
if if(var7 >= this.next.length)
if if(var1)
if if(var8 != null)
if if(++var12 >= this.next.length)
if if(this.flags != null)
if if(this.flags != null)
if if(this == var1)
if if(this.lastAttack == 0L)
private boolean isAcceptedChainIndexboolean isAcceptedChainIndex(int var1, @Nonnull Object2IntMap<String> var2, @Nonnull String var3, @Nonnull ChainingInteraction.Data var4)
public static ChainingInteraction.ChainingTag ofpublic static ChainingInteraction.ChainingTag of(int var0)
public String toStringpublic String toString()

Исходный код

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