SelectInteraction class

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

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

extends: SimpleInteraction

Поля (49)

МодификаторыТипИмя
public static final BuilderCodec<SelectInteraction.EntityMatcher> BASE_CODEC
CLIENT
public static final CodecMapCodec<SelectInteraction.EntityMatcher> CODEC
public static final BuilderCodec<SelectInteraction.HitEntity> CODEC
static boolean SHOW_VISUAL_DEBUG
private final int index
protected boolean invert
protected SelectInteraction.EntityMatcher[] matchers
protected String next
return
com.hypixel.hytale.protocol.EntityMatcher var1
com.hypixel.hytale.protocol.EntityMatcher[] var1
Selector var10
var10
boolean var11
IntSet var12
ArrayList var13
RootInteraction var17
InteractionContext var18
DynamicMetaStore var19
com.hypixel.hytale.protocol.SelectInteraction var2
ArrayList var2
InteractionSyncData var20
Selector var21
Set var22
RootInteraction var23
ArrayList var24
InteractionContext var28
DynamicMetaStore var29
Long2ObjectMap var3
com.hypixel.hytale.protocol.HitEntity[] var3
ThreadLocalRandom var3
int var4
SelectInteraction.HitEntity var4
ObjectIterator var4
int var4
InteractionChain var5
Ref var6
InteractionChainData var6
int var6
CommandBuffer var7
NetworkId var7
DynamicMetaStore var8
int var8
BlockPosition var8
Player var9
String var9
var9
var9

Методы (40)

МодификаторыВозвратСигнатура
record BlockCandidaterecord BlockCandidate(BlockPosition rawBlock, BlockPosition targetBlock)
record EntityCandidaterecord EntityCandidate(Ref<EntityStore> targetRef, Vector4d hit, String hitEntity)
public EntityMatcherpublic EntityMatcher()
public HitEntitypublic HitEntity()
private HitEntityRuleTagprivate HitEntityRuleTag(int var1)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("No entity " + var3x + " in client state")
SnapshotSource SnapshotSource()
public boolean equalspublic boolean equals(@Nullable Object var1)
for for(SelectInteraction.HitEntity var13 : this.hitEntityRules)
for for(SelectInteraction.EntityMatcher var17 : var13.matchers)
for for(SelectedHitEntity var8 : var20.hitEntities)
for for(int var3 = 0; var3 < this.hitEntityRules.length; var3++)
for for(int var4 = 0; var4 < this.hitEntityRules.length; var4++)
for for(int var2 = 0; var2 < this.matchers.length; var2++)
abstract for for(int var5 = var0.size()
public int getIndexpublic int getIndex()
public int hashCodepublic int hashCode()
if if(var1)
if if(var9 != null && SNAPSHOT_SOURCE == SelectInteraction.SnapshotSource.CLIENT)
if if(var11)
if if(var7 != null)
if if(this.hitEntityRules != null)
if if(var9 != null)
if if(var9 != null && SNAPSHOT_SOURCE == SelectInteraction.SnapshotSource.CLIENT)
if if(var3x == var4)
if if(var8.networkId == var3x)
if if(this.hitBlock != null)
if if(this.hitEntityRules != null)
if if(var2.blockPosition != null)
if if(var6.entityId == var2.entityId)
if if(this.hitEntityRules != null)
if if(var4 < var1)
if if(var6 < var1)
if if(this == var1)
public static SelectInteraction.HitEntityRuleTag ofpublic static SelectInteraction.HitEntityRuleTag of(int var0)
public final boolean testpublic final boolean test(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3)
abstract public abstract boolean test0public abstract boolean test0(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3)
public com.hypixel.hytale.protocol.EntityMatcher toPacketpublic com.hypixel.hytale.protocol.EntityMatcher toPacket()
public com.hypixel.hytale.protocol.HitEntity toPacketpublic com.hypixel.hytale.protocol.HitEntity toPacket()
public String toStringpublic String toString()

Исходный код

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