EntityMatcher class
Пакет: com.hypixel.hytale.server.core.modules.interaction.interaction.config.none
Файл: com/hypixel/hytale/server/core/modules/interaction/interaction/config/none/SelectInteraction.java
implements: NetworkSerializable<com.hypixel.hytale.protocol.EntityMatcher>
Поля (4)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final BuilderCodec<SelectInteraction.EntityMatcher> |
BASE_CODEC |
|
public static final CodecMapCodec<SelectInteraction.EntityMatcher> |
CODEC |
|
protected boolean |
invert |
|
com.hypixel.hytale.protocol.EntityMatcher |
var1 |
Методы (3)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
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() |
Исходный код
Показать/скрыть
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() {
}
}
}