SnapshotSource enum

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

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

Поля (1)

МодификаторыТипИмя
CLIENT

Исходный код

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

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.EnumCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.lookup.CodecMapCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.protocol.BlockPosition;
class="kw">import com.hypixel.hytale.protocol.EntityMatcherType;
class="kw">import com.hypixel.hytale.protocol.FailOnType;
class="kw">import com.hypixel.hytale.protocol.InteractionChainData;
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.SelectedHitEntity;
class="kw">import com.hypixel.hytale.protocol.WaitForDataFrom;
class="kw">import com.hypixel.hytale.server.core.entity.EntitySnapshot;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionChain;
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.io.NetworkSerializable;
class="kw">import com.hypixel.hytale.server.core.meta.DynamicMetaStore;
class="kw">import com.hypixel.hytale.server.core.meta.MetaKey;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
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.RootInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.SimpleInteraction;
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.config.data.StringTag;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.selector.ClientSourcedSelector;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.selector.Selector;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.selector.SelectorType;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.PositionUtil;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.util.ArrayList;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector4d;

class="kw">public class SelectInteraction class="kw">extends SimpleInteraction {
   class="kw">public class="kw">static boolean SHOW_VISUAL_DEBUG;
   @Nonnull
   class="kw">public class="kw">static SelectInteraction.SnapshotSource SNAPSHOT_SOURCE = SelectInteraction.SnapshotSource.CLIENT;
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<SelectInteraction> CODEC = BuilderCodec.builder(SelectInteraction.class, SelectInteraction::new, SimpleInteraction.CODEC)
      .documentation(
         "An interaction that can be used to find entities/blocks within a given area.\n\nThis runs the given `Selector` every tick this interactions runs for, the selector may change the search area over time (based on `RunTime`). e.g. to trace out an arc of a sword swing.\n\nWhen an entity/block is found this interaction will run a set of interactions (as defined by `HitEntity`/`HitBlock`) **per a entity/block**, this will not interrupt the selector and it will class="kw">continue searching until the select interaction completes.\n\nThis interaction does not wait for any forked interaction chains from `HitEntity`/`HitBlock` to complete before finishing itself."
      )
      .<SelectorType>appendInherited(
         new KeyedCodec<>("Selector", SelectorType.CODEC),
         (var0, var1) -> var0.selector = var1,
         var0 -> var0.selector,
         (var0, var1) -> var0.selector = var1.selector
      )
      .documentation("The selector to use to find entities and blocks in an area.\nThe selector may be spread over the duration `RunTime`.")
      .addValidator(Validators.nonNull())
      .add()
      .<String>appendInherited(
         new KeyedCodec<>("HitEntity", RootInteraction.CHILD_ASSET_CODEC),
         (var0, var1) -> var0.hitEntity = var1,
         var0 -> var0.hitEntity,
         (var0, var1) -> var0.hitEntity = var1.hitEntity
      )
      .documentation(
         "The interactions to fork into when an entity is hit by the selector.\nThe hit entity will be the target of the interaction chain.\n\nAn entity cannot be hit multiple times by a single selector."
      )
      .addValidatorLate(() -> RootInteraction.VALIDATOR_CACHE.getValidator().late())
      .add()
      .<SelectInteraction.HitEntity[]>appendInherited(
         new KeyedCodec<>("HitEntityRules", new ArrayCodec<>(SelectInteraction.HitEntity.CODEC, SelectInteraction.HitEntity[]::new)),
         (var0, var1) -> var0.hitEntityRules = var1,
         var0 -> var0.hitEntityRules,
         (var0, var1) -> var0.hitEntityRules = var1.hitEntityRules
      )
      .documentation("Tests any hit entity with the given rules, running a fork for the last one matched.\nThis overrides `HitEntity` if any match.")
      .add()
      .<String>appendInherited(
         new KeyedCodec<>("HitBlock", RootInteraction.CHILD_ASSET_CODEC),
         (var0, var1) -> var0.hitBlock = var1,
         var0 -> var0.hitBlock,
         (var0, var1) -> var0.hitBlock = var1.hitBlock
      )
      .documentation(
         "The interactions to fork into when a block is hit by the selector.\nThe hit block will be the target of the interaction chain.\n\nA block cannot be hit multiple times by a single selector."
      )
      .addValidatorLate(() -> RootInteraction.VALIDATOR_CACHE.getValidator().late())
      .add()
      .<FailOnType>append(new KeyedCodec<>("FailOn", new EnumCodec<>(FailOnType.class)), (var0, var1) -> var0.failOn = var1, var0 -> var0.failOn)
      .documentation("Changes what causes the Failed case to run")
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("IgnoreOwner", Codec.BOOLEAN),
         (var0, var1) -> var0.ignoreOwner = var1,
         var0 -> var0.ignoreOwner,
         (var0, var1) -> var0.ignoreOwner = var1.ignoreOwner
      )
      .documentation(
         "Determines whether the owner of the affiliated entity should be ignored in the selection.\n\nFor example, ignoring the thrower of a projectile."
      )
      .add()
      .<Integer>appendInherited(
         new KeyedCodec<>("MaxTargets", Codec.INTEGER),
         (var0, var1) -> var0.maxTargets = var1,
         var0 -> var0.maxTargets,
         (var0, var1) -> var0.maxTargets = var1.maxTargets
      )
      .documentation("Maximum number of targets to select for running interactions (uses reservoir sampling).")
      .add()
      .build();
   @Nonnull
   class="kw">public class="kw">static class="kw">final MetaKey<IntSet> HIT_ENTITIES = META_REGISTRY.registerMetaObject(var0 -> new IntOpenHashSet());
   @Nonnull
   class="kw">public class="kw">static class="kw">final MetaKey<Set<BlockPosition>> HIT_BLOCKS = META_REGISTRY.registerMetaObject(var0 -> new HashSet<>());
   @Nonnull
   class="kw">public class="kw">static class="kw">final MetaKey<DynamicMetaStore<Interaction>> SELECT_META_STORE = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">private class="kw">static class="kw">final MetaKey<Selector> ENTITY_SELECTOR = META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">protected SelectorType selector;
   @Nullable
   class="kw">protected String hitEntity;
   @Nullable
   class="kw">protected SelectInteraction.HitEntity[] hitEntityRules;
   @Nullable
   class="kw">protected String hitBlock;
   @Nonnull
   class="kw">protected FailOnType failOn = FailOnType.Neither;
   class="kw">protected boolean ignoreOwner = true;
   class="kw">protected int maxTargets;
   class="kw">private class="kw">static class="kw">final StringTag TAG_HIT_ENTITY = StringTag.of("HitEntity");
   class="kw">private class="kw">static class="kw">final StringTag TAG_HIT_BLOCK = StringTag.of("HitBlock");

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

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

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

   @Override
   class="kw">protected void tick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
      Ref var6 = var4.getEntity();
      CommandBuffer var7 = var4.getCommandBuffer();
      assert var7 != null;
      DynamicMetaStore var8 = var4.getInstanceStore();
      Player var9 = var7.getComponent(var6, Player.getComponentType());
      if (var1) {
         Selector var10 = this.selector.newSelector();
         if (var9 != null && SNAPSHOT_SOURCE == SelectInteraction.SnapshotSource.CLIENT) {
            var10 = new ClientSourcedSelector(var10, var4);
         }

         var8.putMetaObject(ENTITY_SELECTOR, var10);
         if ((var9 == null || SNAPSHOT_SOURCE != SelectInteraction.SnapshotSource.CLIENT) && var2 <= 0.0F && this.getRunTime() > 0.0F) {
            class="kw">return;
         }
      }

      Selector var21 = var8.getMetaObject(ENTITY_SELECTOR);
      var21.tick(var7, var4.getEntity(), Math.min(var2, this.getRunTime()), this.getRunTime());
      boolean var11 = this.hitEntity != null || this.hitEntityRules != null;
      if (var11) {
         IntSet var12 = var8.getMetaObject(HIT_ENTITIES);
         ArrayList var13 = new ArrayList<>();
         var21.selectTargetEntities(var7, var4.getEntity(), (var5x, var6x) -> {
            NetworkId var7 = var5x.getStore().getComponent(var5x, NetworkId.getComponentType());
            if (var7 != null) {
               int var8 = var7.getId();
               if (var12.add(var8)) {
                  String var9 = this.hitEntity;
                  if (var9 != null && isTargetInvulnerable(var7, var6, var5x)) {
                     var9 = null;
                  }

                  if (this.hitEntityRules != null) {
                     label40:
                     for (SelectInteraction.HitEntity var13 : this.hitEntityRules) {
                        for (SelectInteraction.EntityMatcher var17 : var13.matchers) {
                           if (!var17.test(var6, var5x, var7)) {
                              class="kw">continue label40;
                           }
                        }

                        var9 = var13.next;
                     }
                  }

                  if (var9 != null) {
                     var13.add(new SelectInteraction.EntityCandidate(var5x, var6x, var9));
                  }
               }
            }
         }, var3x -> this.ignoreOwner && var3x.equals(var6) ? false : !var3x.equals(var4.getEntity()));

         for (SelectInteraction.EntityCandidate var16 : this.maxTargets > 0 && var13.size() > this.maxTargets ? reservoirSample(var13, this.maxTargets) : var13) {
            RootInteraction var17 = RootInteraction.getRootInteractionOrUnknown(var16.hitEntity());
            InteractionContext var18 = var4.duplicate();
            DynamicMetaStore var19 = var18.getMetaStore();
            var19.putMetaObject(TARGET_ENTITY, var16.targetRef());
            var19.putMetaObject(HIT_LOCATION, var16.hit());
            var19.putMetaObject(SELECT_META_STORE, var8);
            var19.removeMetaObject(TARGET_BLOCK);
            var19.removeMetaObject(TARGET_BLOCK_RAW);
            if (var9 != null && SNAPSHOT_SOURCE == SelectInteraction.SnapshotSource.CLIENT) {
               InteractionSyncData var20 = var4.getClientState();
               var18.setSnapshotProvider((var1x, var2x, var3x) -> {
                  int var4 = var1x.getComponent(var2x, NetworkId.getComponentType()).getId();
                  if (var3x == var4) {
                     class="kw">return new EntitySnapshot(PositionUtil.toVector3d(var20.attackerPos), PositionUtil.toRotation(var20.attackerRot));
                  }

                  for (SelectedHitEntity var8 : var20.hitEntities) {
                     if (var8.networkId == var3x) {
                        class="kw">return new EntitySnapshot(PositionUtil.toVector3d(var8.position), PositionUtil.toRotation(var8.bodyRotation));
                     }
                  }

                  throw new IllegalArgumentException("No entity " + var3x + " in client state");
               });
            }

            var4.fork(new InteractionChainData(), var4.getChain().getType(), var18, var17, false);
         }

         if (var4.hasLabels()
            && var12.isEmpty()
            && var4.getState().state == InteractionState.Finished
            && (this.failOn == FailOnType.Entity || this.failOn == FailOnType.Either)) {
            var4.getState().state = InteractionState.Failed;
         }
      }

      if (this.hitBlock != null) {
         Set var22 = var8.getMetaObject(HIT_BLOCKS);
         RootInteraction var23 = RootInteraction.getRootInteractionOrUnknown(this.hitBlock);
         ArrayList var24 = new ArrayList<>();
         var21.selectTargetBlocks(var7, var4.getEntity(), (var2x, var3x, var4x, var5x, var6x, var7x) -> {
            BlockPosition var8 = new BlockPosition(var5x, var6x, var7x);
            if (var22.add(var8)) {
               var24.add(new SelectInteraction.BlockCandidate(new BlockPosition(var2x, var3x, var4x), var8));
            }
         });

         for (SelectInteraction.BlockCandidate var27 : this.maxTargets > 0 && var24.size() > this.maxTargets ? reservoirSample(var24, this.maxTargets) : var24) {
            InteractionContext var28 = var4.duplicate();
            DynamicMetaStore var29 = var28.getMetaStore();
            var29.putMetaObject(TARGET_BLOCK, var27.targetBlock());
            var29.putMetaObject(TARGET_BLOCK_RAW, var27.rawBlock());
            var29.putMetaObject(SELECT_META_STORE, var8);
            var29.removeMetaObject(TARGET_ENTITY);
            var4.fork(new InteractionChainData(), var4.getChain().getType(), var28, var23, false);
         }

         if (var4.hasLabels()
            && var22.isEmpty()
            && var4.getState().state == InteractionState.Finished
            && (this.failOn == FailOnType.Block || this.failOn == FailOnType.Either)) {
            var4.getState().state = InteractionState.Failed;
         }
      }

      if (var9 != null && SNAPSHOT_SOURCE == SelectInteraction.SnapshotSource.CLIENT && var4.getState().state != InteractionState.Failed) {
         var4.getState().state = var4.getClientState().state;
      }

      super.tick0(var1, var2, var3, var4, var5);
   }

   @Override
   class="kw">protected void simulateTick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
   }

   @Override
   class="kw">public boolean walk(@Nonnull Collector var1, @Nonnull InteractionContext var2) {
      if (this.hitEntity != null
         && InteractionManager.walkInteractions(var1, var2, TAG_HIT_ENTITY, RootInteraction.getRootInteractionOrUnknown(this.hitEntity).getInteractionIds())) {
         class="kw">return true;
      }

      if (this.hitEntityRules != null) {
         for (int var3 = 0; var3 < this.hitEntityRules.length; var3++) {
            SelectInteraction.HitEntity var4 = this.hitEntityRules[var3];
            if (var4.next != null
               && InteractionManager.walkInteractions(
                  var1, var2, SelectInteraction.HitEntityRuleTag.of(var3), RootInteraction.getRootInteractionOrUnknown(var4.next).getInteractionIds()
               )) {
               class="kw">return true;
            }
         }
      }

      class="kw">return this.hitBlock != null
            && InteractionManager.walkInteractions(var1, var2, TAG_HIT_BLOCK, RootInteraction.getRootInteractionOrUnknown(this.hitBlock).getInteractionIds())
         ? true
         : super.walk(var1, var2);
   }

   @Nullable
   @Override
   class="kw">public InteractionChain mapForkChain(@Nonnull InteractionContext var1, @Nonnull InteractionChainData var2) {
      if (var2.blockPosition != null) {
         class="kw">return null;
      }

      Long2ObjectMap var3 = var1.getChain().getForkedChains();
      ObjectIterator var4 = var3.values().iterator();

      while (var4.hasNext()) {
         InteractionChain var5 = (InteractionChain)var4.next();
         if (var5.getBaseForkedChainId().entryIndex == var1.getEntry().getIndex()) {
            InteractionChainData var6 = var5.getChainData();
            if (var6.entityId == var2.entityId) {
               class="kw">return var5;
            }
         }
      }

      class="kw">return null;
   }

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

   @Override
   class="kw">protected void configurePacket(com.hypixel.hytale.protocol.Interaction var1) {
      super.configurePacket(var1);
      com.hypixel.hytale.protocol.SelectInteraction var2 = (com.hypixel.hytale.protocol.SelectInteraction)var1;
      var2.hitEntity = RootInteraction.getRootInteractionIdOrUnknown(this.hitEntity);
      var2.failOn = this.failOn;
      var2.ignoreOwner = this.ignoreOwner;
      var2.selector = this.selector.toPacket();
      if (this.hitEntityRules != null) {
         com.hypixel.hytale.protocol.HitEntity[] var3 = new com.hypixel.hytale.protocol.HitEntity[this.hitEntityRules.length];

         for (int var4 = 0; var4 < this.hitEntityRules.length; var4++) {
            var3[var4] = this.hitEntityRules[var4].toPacket();
         }

         var2.hitEntityRules = var3;
      }
   }

   @Nonnull
   class="kw">private class="kw">static <T> List<T> reservoirSample(@Nonnull List<T> var0, int var1) {
      ArrayList var2 = new ArrayList<>(var1);
      ThreadLocalRandom var3 = ThreadLocalRandom.current();
      int var4 = 0;

      for (int var5 = var0.size(); var4 < var5; var4++) {
         if (var4 < var1) {
            var2.add(var0.get(var4));
         } else {
            int var6 = var3.nextInt(var4 + 1);
            if (var6 < var1) {
               var2.set(var6, var0.get(var4));
            }
         }
      }

      class="kw">return var2;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "SelectInteraction{selector="
         + this.selector
         + ", hitEntity='"
         + this.hitEntity
         + "', hitBlock='"
         + this.hitBlock
         + "', ignoreOwner="
         + this.ignoreOwner
         + ", maxTargets="
         + this.maxTargets
         + "} "
         + super.toString();
   }

   record BlockCandidate(BlockPosition rawBlock, BlockPosition targetBlock) {
      BlockCandidate {
      }
   }

   record EntityCandidate(Ref<EntityStore> targetRef, Vector4d hit, String hitEntity) {
      EntityCandidate {
      }
   }

   class="kw">public class="kw">abstract class="kw">static class EntityMatcher class="kw">implements NetworkSerializable<com.hypixel.hytale.protocol.EntityMatcher> {
      @Nonnull
      class="kw">public class="kw">static class="kw">final CodecMapCodec<SelectInteraction.EntityMatcher> CODEC = new CodecMapCodec<>("Type");
      @Nonnull
      class="kw">public class="kw">static class="kw">final BuilderCodec<SelectInteraction.EntityMatcher> BASE_CODEC = BuilderCodec.abstractBuilder(SelectInteraction.EntityMatcher.class)
         .appendInherited(
            new KeyedCodec<>("Invert", Codec.BOOLEAN), (var0, var1) -> var0.invert = var1, var0 -> var0.invert, (var0, var1) -> var0.invert = var1.invert
         )
         .documentation("Inverts the result of the matcher")
         .add()
         .build();
      class="kw">protected boolean invert;

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

      class="kw">public class="kw">final boolean test(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3) {
         class="kw">return this.test0(var1, var2, var3) ^ this.invert;
      }

      class="kw">public class="kw">abstract boolean test0(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3);

      @Nonnull
      class="kw">public com.hypixel.hytale.protocol.EntityMatcher toPacket() {
         com.hypixel.hytale.protocol.EntityMatcher var1 = new com.hypixel.hytale.protocol.EntityMatcher();
         var1.type = EntityMatcherType.Server;
         var1.invert = this.invert;
         class="kw">return var1;
      }
   }

   class="kw">public class="kw">static class HitEntity class="kw">implements NetworkSerializable<com.hypixel.hytale.protocol.HitEntity> {
      @Nonnull
      class="kw">public class="kw">static class="kw">final BuilderCodec<SelectInteraction.HitEntity> CODEC = BuilderCodec.builder(
            SelectInteraction.HitEntity.class, SelectInteraction.HitEntity::new
         )
         .appendInherited(
            new KeyedCodec<>("Next", RootInteraction.CHILD_ASSET_CODEC),
            (var0, var1) -> var0.next = var1,
            var0 -> var0.next,
            (var0, var1) -> var0.next = var1.next
         )
         .addValidatorLate(() -> RootInteraction.VALIDATOR_CACHE.getValidator().late())
         .addValidator(Validators.nonNull())
         .add()
         .<SelectInteraction.EntityMatcher[]>appendInherited(
            new KeyedCodec<>("Matchers", new ArrayCodec<>(SelectInteraction.EntityMatcher.CODEC, SelectInteraction.EntityMatcher[]::new)),
            (var0, var1) -> var0.matchers = var1,
            var0 -> var0.matchers,
            (var0, var1) -> var0.matchers = var1.matchers
         )
         .addValidator(Validators.nonNull())
         .add()
         .build();
      class="kw">protected String next;
      class="kw">protected SelectInteraction.EntityMatcher[] matchers;

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

      @Nonnull
      class="kw">public com.hypixel.hytale.protocol.HitEntity toPacket() {
         com.hypixel.hytale.protocol.EntityMatcher[] var1 = new com.hypixel.hytale.protocol.EntityMatcher[this.matchers.length];

         for (int var2 = 0; var2 < this.matchers.length; var2++) {
            var1[var2] = this.matchers[var2].toPacket();
         }

         class="kw">return new com.hypixel.hytale.protocol.HitEntity(RootInteraction.getRootInteractionIdOrUnknown(this.next), var1);
      }
   }

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

      class="kw">private HitEntityRuleTag(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 {
            class="kw">return var1 != null && this.getClass() == var1.getClass() ? this.index == ((SelectInteraction.HitEntityRuleTag)var1).index : false;
         }
      }

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

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

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

   class="kw">public enum SnapshotSource {
      SERVER,
      @Deprecated
      CLIENT;

      SnapshotSource() {
      }
   }
}