Interaction class

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

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

implements: Operation, JsonAssetWithMap<String, IndexedLookupTableAssetMap<String, Interaction>>, NetworkSerializable<com.hypixel.hytale.protocol.Interaction>

Поля (68)

МодификаторыТипИмя
ASSET_STORE
return
com.hypixel.hytale.protocol.Interaction var1
IndexedLookupTableAssetMap var1
Interaction var1
InteractionSyncData var10
InteractionSyncData var10
InteractionSyncData var10
ForkedChainId var10
Float var11
Float var11
int var11
Item var12
NetworkId var12
float var13
int var13
double var14
var14
PlayInteractionFor var14
InteractionSyncData var15
TransformComponent var15
Vector3d var16
SpatialResource var17
List var18
Ref var19
com.hypixel.hytale.protocol.Interaction var2
String var2
var2
var2
var2
int var2
var2
ComponentType var20
PlayerRef var23
ItemPlayerAnimations var3
Archetype var3
int var3
ItemAnimation var4
boolean var4
CommandBuffer var5
CommandBuffer var5
BlockyAnimationCache.BlockyAnimation var5
boolean var5
var5
byte var6
Player var6
Ref var6
String var6
Player var6
int var7
int var7
byte var7
GameMode var7
InteractionSyncData var7
InteractionType var7
PlayerSettings var7
int var8
int var8
ItemStack var8
InteractionSettings var8
InteractionChain var8
int var8
boolean var8
CommandBuffer var9
CommandBuffer var9
ItemContainer var9
InteractionChain var9
int var9

Методы (46)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown key! " + var0)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown interaction: " + var0)
public void compilevoid compile(@Nonnull OperationsBuilder var1)
protected void configurePacketvoid configurePacket(com.hypixel.hytale.protocol.Interaction var1)
static boolean failedboolean failed(@Nonnull InteractionState var0)
for for(Ref var22 : var18)
protected double getAnimationDurationdouble getAnimationDuration(@Nullable Item var1)
static IndexedLookupTableAssetMap<String, Interaction> getAssetMapIndexedLookupTableAssetMap<String, Interaction> getAssetMap()
public float getHorizontalSpeedMultiplierfloat getHorizontalSpeedMultiplier()
public String getIdString getId()
public InteractionItemChangeBehavior getOnItemChangeBehaviorInteractionItemChangeBehavior getOnItemChangeBehavior()
public float getRunTimefloat getRunTime()
public double getViewDistancedouble getViewDistance()
if if(ASSET_STORE == null)
if if(var11 != null)
if if(var11 != null)
if if(var2 < var13)
if if(var13 > 0.0F)
if if(var7.state != InteractionState.NotFinished)
if if(var2 && var7.state == InteractionState.Finished)
if if(var2)
if if(var1 != null)
if if(this.data != null)
if if(this.camera != null)
if if(this.effects.itemPlayerAnimationsId != null)
if if(var3 == null)
if if(var4 == null)
if if(var5)
if if(var0 == null)
if if(var2 == Integer.MIN_VALUE)
if if(var3 == Integer.MIN_VALUE)
if if(var0 == null)
if if(var1 == null)
static boolean isTargetInvulnerableboolean isTargetInvulnerable(CommandBuffer<EntityStore> var0, Ref<EntityStore> var1, Ref<EntityStore> var2)
public boolean isUnknownboolean isUnknown()
static boolean needsRemoteSyncboolean needsRemoteSync(@Nullable String var0)
abstract abstract boolean needsRemoteSyncboolean needsRemoteSync()
private void sendPlayInteractvoid sendPlayInteract(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionContext var2, @Nonnull InteractionChain var3, boolean var4)
abstract abstract void simulateTick0void simulateTick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5)
switch switch(var10.state)
switch switch(var10.state)
return switchreturn switch(var0)
abstract abstract void tick0void tick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5)
private boolean tickInternalboolean tickInternal(@Nonnull Ref<EntityStore> var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull ComponentAccessor<EntityStore> var5)
private void trySkipChainvoid trySkipChain(@Nonnull Ref<EntityStore> var1, float var2, @Nonnull InteractionContext var3, @Nonnull InteractionSyncData var4)
abstract abstract boolean walkboolean walk(@Nonnull Collector var1, @Nonnull InteractionContext var2)

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetExtraInfo;
class="kw">import com.hypixel.hytale.assetstore.AssetKeyValidator;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.AssetStore;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetCodecMapCodec;
class="kw">import com.hypixel.hytale.assetstore.codec.ContainedAssetCodec;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
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.codecs.map.EnumMapCodec;
class="kw">import com.hypixel.hytale.codec.schema.metadata.ui.UIEditor;
class="kw">import com.hypixel.hytale.codec.validation.ValidatorCache;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.BlockPosition;
class="kw">import com.hypixel.hytale.protocol.ForkedChainId;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.protocol.InteractionChainData;
class="kw">import com.hypixel.hytale.protocol.InteractionItemChangeBehavior;
class="kw">import com.hypixel.hytale.protocol.InteractionSettings;
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.ItemAnimation;
class="kw">import com.hypixel.hytale.protocol.packets.interaction.PlayInteractionFor;
class="kw">import com.hypixel.hytale.server.core.asset.common.BlockyAnimationCache;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.itemanimation.config.ItemPlayerAnimations;
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.inventory.InventoryUtils;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.io.NetworkSerializable;
class="kw">import com.hypixel.hytale.server.core.meta.MetaKey;
class="kw">import com.hypixel.hytale.server.core.meta.MetaRegistry;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.Invulnerable;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.RespondToHit;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.Damage;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.player.PlayerSettings;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.modules.entitystats.EntityStatMap;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
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.none.simple.SendMessageInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.Operation;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.OperationsBuilder;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.UUIDUtil;
class="kw">import java.lang.ref.SoftReference;
class="kw">import java.util.Collections;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector4d;

class="kw">public class="kw">abstract class Interaction
   class="kw">implements Operation,
   JsonAssetWithMap<String, IndexedLookupTableAssetMap<String, Interaction>>,
   NetworkSerializable<com.hypixel.hytale.protocol.Interaction> {
   @Nonnull
   class="kw">public class="kw">static class="kw">final AssetCodecMapCodec<String, Interaction> CODEC = new AssetCodecMapCodec<>(
      Codec.STRING, (var0, var1) -> var0.id = var1, var0 -> var0.id, (var0, var1) -> var0.data = var1, var0 -> var0.data
   );
   @Nonnull
   class="kw">public class="kw">static class="kw">final Codec<String> CHILD_ASSET_CODEC = new ContainedAssetCodec<>(Interaction.class, CODEC);
   @Nonnull
   class="kw">public class="kw">static class="kw">final Codec<String[]> CHILD_ASSET_CODEC_ARRAY = new ArrayCodec<>(CHILD_ASSET_CODEC, String[]::new);
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<Interaction> ABSTRACT_CODEC = BuilderCodec.abstractBuilder(Interaction.class)
      .appendInherited(
         new KeyedCodec<>("ViewDistance", Codec.DOUBLE),
         (var0, var1) -> var0.viewDistance = var1,
         var0 -> var0.viewDistance,
         (var0, var1) -> var0.viewDistance = var1.viewDistance
      )
      .documentation("Configures the distance in which other players will be able to see the effects of this interaction.")
      .add()
      .<InteractionEffects>appendInherited(
         new KeyedCodec<>("Effects", InteractionEffects.CODEC),
         (var0, var1) -> var0.effects = var1,
         var0 -> var0.effects,
         (var0, var1) -> var0.effects = var1.effects
      )
      .documentation("Sets effects that will be applied whilst the interaction is running.")
      .add()
      .<Float>appendInherited(
         new KeyedCodec<>("HorizontalSpeedMultiplier", Codec.FLOAT),
         (var0, var1) -> var0.horizontalSpeedMultiplier = var1,
         var0 -> var0.horizontalSpeedMultiplier,
         (var0, var1) -> var0.horizontalSpeedMultiplier = var1.horizontalSpeedMultiplier
      )
      .documentation("The multiplier to apply to the horizontal speed of the entity whilst this interaction is running.")
      .metadata(new UIEditor(new UIEditor.FormattedNumber(0.1, null, null)))
      .add()
      .<Float>appendInherited(
         new KeyedCodec<>("RunTime", Codec.FLOAT), (var0, var1) -> var0.runTime = var1, var0 -> var0.runTime, (var0, var1) -> var0.runTime = var1.runTime
      )
      .documentation(
         "The time in seconds this interaction should run for. \n\nIf *Effects.WaitForAnimationToFinish* is set and the length of the animation is longer than the runtime then the interaction will run for longer than the set time."
      )
      .metadata(new UIEditor(new UIEditor.FormattedNumber(0.01, "s", null)))
      .add()
      .<InteractionItemChangeBehavior>appendInherited(
         new KeyedCodec<>("OnItemChangeBehavior", new EnumCodec<>(InteractionItemChangeBehavior.class)),
         (var0, var1) -> var0.onItemChangeBehavior = var1,
         var0 -> var0.onItemChangeBehavior,
         (var0, var1) -> var0.onItemChangeBehavior = var1.onItemChangeBehavior
      )
      .documentation("What should happen to the interaction when the entity's held item changes.")
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("CancelOnItemChange", Codec.BOOLEAN),
         (var0, var1) -> var0.onItemChangeBehavior = var1 ? InteractionItemChangeBehavior.Cancel : InteractionItemChangeBehavior.Ignore,
         var0 -> null,
         (var0, var1) -> var0.onItemChangeBehavior = var1.onItemChangeBehavior
      )
      .addValidator(Validators.deprecated())
      .documentation("Deprecated field for whether the interaction will be cancelled when the entity's held item changes.")
      .add()
      .<InteractionRules>appendInherited(
         new KeyedCodec<>("Rules", InteractionRules.CODEC), (var0, var1) -> var0.rules = var1, var0 -> var0.rules, (var0, var1) -> var0.rules = var1.rules
      )
      .documentation("A set of rules that control when this interaction can run.")
      .addValidator(Validators.nonNull())
      .add()
      .<Map<GameMode, InteractionSettings>>appendInherited(
         new KeyedCodec<>(
            "Settings",
            new EnumMapCodec<>(
               GameMode.class,
               BuilderCodec.builder(InteractionSettings.class, InteractionSettings::new)
                  .appendInherited(
                     new KeyedCodec<>("AllowSkipOnClick", Codec.BOOLEAN),
                     (var0, var1) -> var0.allowSkipOnClick = var1,
                     var0 -> var0.allowSkipOnClick,
                     (var0, var1) -> var0.allowSkipOnClick = var1.allowSkipOnClick
                  )
                  .documentation("Whether to skip this interaction when another click is sent.")
                  .add()
                  .build()
            )
         ),
         (var0, var1) -> var0.settings = var1,
         var0 -> var0.settings,
         (var0, var1) -> var0.settings = var1.settings
      )
      .documentation("Per a gamemode settings.")
      .add()
      .<InteractionCameraSettings>appendInherited(
         new KeyedCodec<>("Camera", InteractionCameraSettings.CODEC),
         (var0, var1) -> var0.camera = var1,
         var0 -> var0.camera,
         (var0, var1) -> var0.camera = var1.camera
      )
      .documentation("Configures the camera behaviour for this interaction.")
      .add()
      .build();
   @Nonnull
   class="kw">public class="kw">static class="kw">final ValidatorCache<String> VALIDATOR_CACHE = new ValidatorCache<>(new AssetKeyValidator<>(Interaction::getAssetStore));
   class="kw">private class="kw">static AssetStore<String, Interaction, IndexedLookupTableAssetMap<String, Interaction>> ASSET_STORE;
   class="kw">public class="kw">static class="kw">final MetaRegistry<InteractionContext> CONTEXT_META_REGISTRY = new MetaRegistry<>();
   class="kw">public class="kw">static class="kw">final MetaRegistry<Interaction> META_REGISTRY = new MetaRegistry<>();
   class="kw">public class="kw">static class="kw">final MetaKey<Ref<EntityStore>> TARGET_ENTITY = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<Vector4d> HIT_LOCATION = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<String> HIT_DETAIL = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<BlockPosition> TARGET_BLOCK = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<BlockPosition> TARGET_BLOCK_RAW = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<BlockType> TARGET_BLOCK_TYPE = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<Integer> TARGET_BLOCK_ROTATION_INDEX = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> 0);
   class="kw">public class="kw">static class="kw">final MetaKey<Integer> TARGET_SLOT = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> 0);
   class="kw">public class="kw">static class="kw">final MetaKey<Float> TIME_SHIFT = META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<Damage> DAMAGE = CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">protected String id;
   class="kw">protected AssetExtraInfo.Data data;
   class="kw">protected boolean unknown;
   class="kw">protected double viewDistance = 96.0;
   @Nonnull
   class="kw">protected InteractionEffects effects = new InteractionEffects();
   class="kw">protected float horizontalSpeedMultiplier = 1.0F;
   class="kw">protected float runTime;
   class="kw">protected InteractionItemChangeBehavior onItemChangeBehavior = InteractionItemChangeBehavior.Cancel;
   @Nonnull
   class="kw">protected Map<GameMode, InteractionSettings> settings = Collections.emptyMap();
   @Nonnull
   class="kw">protected InteractionRules rules = InteractionRules.DEFAULT_RULES;
   @Nullable
   class="kw">protected InteractionCameraSettings camera;
   @Nullable
   class="kw">private class="kw">transient SoftReference<com.hypixel.hytale.protocol.Interaction> cachedPacket;

   @Nonnull
   class="kw">public class="kw">static AssetStore<String, Interaction, IndexedLookupTableAssetMap<String, Interaction>> getAssetStore() {
      if (ASSET_STORE == null) {
         ASSET_STORE = AssetRegistry.getAssetStore(Interaction.class);
      }

      class="kw">return ASSET_STORE;
   }

   class="kw">public class="kw">static IndexedLookupTableAssetMap<String, Interaction> getAssetMap() {
      class="kw">return (IndexedLookupTableAssetMap<String, Interaction>)getAssetStore().getAssetMap();
   }

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

   class="kw">public Interaction(@Nonnull String var1) {
      this.id = var1;
   }

   class="kw">public String getId() {
      class="kw">return this.id;
   }

   class="kw">public boolean isUnknown() {
      class="kw">return this.unknown;
   }

   @Nonnull
   class="kw">public InteractionEffects getEffects() {
      class="kw">return this.effects;
   }

   class="kw">public float getHorizontalSpeedMultiplier() {
      class="kw">return this.horizontalSpeedMultiplier;
   }

   class="kw">public double getViewDistance() {
      class="kw">return this.viewDistance;
   }

   class="kw">public float getRunTime() {
      class="kw">return this.runTime;
   }

   class="kw">public InteractionItemChangeBehavior getOnItemChangeBehavior() {
      class="kw">return this.onItemChangeBehavior;
   }

   @Nonnull
   @Override
   class="kw">public InteractionRules getRules() {
      class="kw">return this.rules;
   }

   @Nonnull
   class="kw">public Map<GameMode, InteractionSettings> getSettings() {
      class="kw">return this.settings;
   }

   @Override
   class="kw">public class="kw">final void tick(
      @Nonnull Ref<EntityStore> var1, boolean var2, float var3, @Nonnull InteractionType var4, @Nonnull InteractionContext var5, @Nonnull CooldownHandler var6
   ) {
      int var7 = var5.getOperationCounter();
      int var8 = var5.getChain().getCallDepth();
      CommandBuffer var9 = var5.getCommandBuffer();
      assert var9 != null;
      if (!this.tickInternal(var1, var3, var4, var5, var9)) {
         this.tick0(var2, var3, var4, var5, var6);
      }

      InteractionSyncData var10 = var5.getState();
      this.trySkipChain(var1, var3, var5, var10);
      class="kw">switch (var10.state) {
         case Failed:
         case Finished:
         case Skip:
            Float var11 = var5.getInstanceStore().getMetaObject(TIME_SHIFT);
            if (var11 != null) {
               var5.setTimeShift(var11);
            }

            if (var5.getOperationCounter() == var7 && var8 == var5.getChain().getCallDepth()) {
               var5.setOperationCounter(var5.getOperationCounter() + 1);
            }
         case NotFinished:
         class="kw">default:
            class="kw">return;
         case ItemChanged:
            throw new InteractionManager.ChainCancelledException(var10.state);
      }
   }

   @Override
   class="kw">public class="kw">final void simulateTick(
      @Nonnull Ref<EntityStore> var1, boolean var2, float var3, @Nonnull InteractionType var4, @Nonnull InteractionContext var5, @Nonnull CooldownHandler var6
   ) {
      int var7 = var5.getOperationCounter();
      int var8 = var5.getChain().getSimulatedCallDepth();
      CommandBuffer var9 = var5.getCommandBuffer();
      assert var9 != null;
      if (!this.tickInternal(var1, var3, var4, var5, var9)) {
         this.simulateTick0(var2, var3, var4, var5, var6);
      }

      InteractionSyncData var10 = var5.getState();
      this.trySkipChain(var1, var3, var5, var10);
      class="kw">switch (var10.state) {
         case Failed:
         case Finished:
         case Skip:
            Float var11 = var5.getInstanceStore().getMetaObject(TIME_SHIFT);
            if (var11 != null) {
               var5.setTimeShift(var11);
            }

            if (var5.getOperationCounter() == var7 && var8 == var5.getChain().getSimulatedCallDepth()) {
               var5.setOperationCounter(var5.getOperationCounter() + 1);
            }
         case ItemChanged:
         case NotFinished:
      }
   }

   class="kw">private boolean tickInternal(
      @Nonnull Ref<EntityStore> var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      byte var6 = var3 == InteractionType.Equipped ? var4.getHeldItemSlot() : InventoryUtils.getActiveSlot(var1, var4.getHeldItemSectionId(), var5);
      byte var7 = var4.getHeldItemSlot();
      ItemStack var8 = var4.getHeldItem();
      ItemContainer var9 = var4.getHeldItemContainer();
      if (!UUIDUtil.isEmptyOrNull(var4.getChain().getChainData().proxyId)
         || this.onItemChangeBehavior == InteractionItemChangeBehavior.Ignore
         || (var3 == InteractionType.Equipped || var6 == var7) && (var7 == -1 || ItemStack.isEquivalentType(var9.getItemStack(var7), var8))) {
         if (!failed(var4.getState().state)) {
            double var14 = 0.0;
            if (this.effects.isWaitForAnimationToFinish()) {
               Item var12 = var8 != null ? var8.getItem() : null;
               var14 = this.getAnimationDuration(var12);
            }

            InteractionSyncData var15 = var4.getState();
            float var13 = Math.max(this.runTime, (float)var14);
            if (var2 < var13) {
               var15.state = InteractionState.NotFinished;
            } else {
               if (var13 > 0.0F) {
                  var4.getInstanceStore().putMetaObject(TIME_SHIFT, var2 - var13);
               }

               var15.state = InteractionState.Finished;
            }

            var15.progress = var2;
         }

         class="kw">return false;
      } else {
         InteractionSyncData var10 = var4.getState();

         var10.state = class="kw">switch (this.onItemChangeBehavior) {
            case Fail -> InteractionState.Failed;
            case Finish -> InteractionState.Finished;
            class="kw">default -> InteractionState.ItemChanged;
         };
         var10.progress = var2;
         class="kw">return var10.state == InteractionState.ItemChanged;
      }
   }

   class="kw">private void trySkipChain(@Nonnull Ref<EntityStore> var1, float var2, @Nonnull InteractionContext var3, @Nonnull InteractionSyncData var4) {
      CommandBuffer var5 = var3.getCommandBuffer();
      assert var5 != null;
      Player var6 = var5.getComponent(var1, Player.getComponentType());
      GameMode var7 = var6 != null ? var6.getGameMode() : GameMode.Adventure;
      InteractionSettings var8 = this.settings.get(var7);
      InteractionChain var9 = var3.getChain();
      assert var9 != null;
      if (!var9.isFirstRun()
         && var4.state == InteractionState.NotFinished
         && (var3.allowSkipChainOnClick() || var8 != null && var8.allowSkipOnClick)
         && var3.getClientState() != null
         && var3.getClientState().state == InteractionState.Skip) {
         var4.state = InteractionState.Skip;
         var4.progress = var2;
      }
   }

   class="kw">public void compile(@Nonnull OperationsBuilder var1) {
      var1.addOperation(this);
   }

   class="kw">protected class="kw">abstract void tick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5);

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

   class="kw">public class="kw">abstract boolean walk(@Nonnull Collector var1, @Nonnull InteractionContext var2);

   @Override
   class="kw">public void handle(@Nonnull Ref<EntityStore> var1, boolean var2, float var3, @Nonnull InteractionType var4, @Nonnull InteractionContext var5) {
      Ref var6 = var5.getEntity();
      if (var6.isValid()) {
         if (var1.isValid()) {
            InteractionSyncData var7 = var5.getState();
            InteractionChain var8 = var5.getChain();
            assert var8 != null;
            if (var7.state != InteractionState.NotFinished) {
               if (var2 && var7.state == InteractionState.Finished) {
                  this.sendPlayInteract(var6, var5, var8, false);
               }

               this.sendPlayInteract(var6, var5, var8, true);
            } else {
               if (var2) {
                  this.sendPlayInteract(var6, var5, var8, false);
               }
            }
         }
      }
   }

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

   class="kw">private void sendPlayInteract(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionContext var2, @Nonnull InteractionChain var3, boolean var4) {
      CommandBuffer var5 = var2.getCommandBuffer();
      assert var5 != null;
      String var6 = null;
      InteractionType var7 = var3.getBaseType();
      int var8 = getInteractionIdOrUnknown(this.id);
      int var9 = var3.getChainId();
      ForkedChainId var10 = var3.getForkedChainId();
      int var11 = var3.getOperationIndex();
      NetworkId var12 = var5.getComponent(var1, NetworkId.getComponentType());
      assert var12 != null;
      int var13 = var12.getId();
      PlayInteractionFor var14 = new PlayInteractionFor(var13, var9, var10, var11, var8, var6, var7, var4);
      TransformComponent var15 = var5.getComponent(var1, TransformComponent.getComponentType());
      assert var15 != null;
      Vector3d var16 = var15.getPosition();
      SpatialResource var17 = var5.getResource(EntityModule.get().getPlayerSpatialResourceType());
      List var18 = SpatialResource.getThreadLocalReferenceList();
      var17.getSpatialStructure().collect(var16, this.viewDistance, var18);
      Ref var19 = var2.getOwningEntity();
      ComponentType var20 = PlayerRef.getComponentType();

      for (Ref var22 : var18) {
         if (var22.isValid() && (!var3.requiresClient() || !var22.equals(var19))) {
            PlayerRef var23 = var5.getComponent(var22, var20);
            assert var23 != null;
            var23.getPacketHandler().writeNoCache(var14);
         }
      }
   }

   @Nonnull
   class="kw">public class="kw">final com.hypixel.hytale.protocol.Interaction toPacket() {
      com.hypixel.hytale.protocol.Interaction var1 = this.cachedPacket == null ? null : this.cachedPacket.get();
      if (var1 != null) {
         class="kw">return var1;
      }

      com.hypixel.hytale.protocol.Interaction var2 = this.generatePacket();
      this.configurePacket(var2);
      this.cachedPacket = new SoftReference<>(var2);
      class="kw">return var2;
   }

   @Nonnull
   class="kw">protected class="kw">abstract com.hypixel.hytale.protocol.Interaction generatePacket();

   class="kw">protected void configurePacket(com.hypixel.hytale.protocol.Interaction var1) {
      var1.waitForDataFrom = this.getWaitForDataFrom();
      var1.effects = this.effects.toPacket();
      var1.horizontalSpeedMultiplier = this.horizontalSpeedMultiplier;
      var1.runTime = this.runTime;
      var1.onItemChangeBehavior = this.onItemChangeBehavior;
      var1.settings = this.settings;
      var1.rules = this.rules.toPacket();
      if (this.data != null) {
         var1.tags = this.data.getTags().keySet().toIntArray();
      }

      if (this.camera != null) {
         var1.camera = this.camera.toPacket();
      }
   }

   class="kw">protected double getAnimationDuration(@Nullable Item var1) {
      String var2;
      if (this.effects.itemPlayerAnimationsId != null) {
         var2 = this.effects.itemPlayerAnimationsId;
      } else if (var1 != null) {
         var2 = var1.getPlayerAnimationsId();
      } else {
         var2 = "Default";
      }

      ItemPlayerAnimations var3 = ItemPlayerAnimations.getAssetMap().getAsset(var2);
      if (var3 == null) {
         class="kw">return 0.0;
      }

      ItemAnimation var4 = this.effects.getItemAnimationId() != null ? var3.getAnimations().get(this.effects.getItemAnimationId()) : null;
      if (var4 == null) {
         class="kw">return 0.0;
      }

      BlockyAnimationCache.BlockyAnimation var5 = BlockyAnimationCache.getNow(var4.firstPerson);
      class="kw">return var5 == null ? 0.0 : var5.getDurationSeconds() * var4.speed;
   }

   class="kw">protected class="kw">static boolean isTargetInvulnerable(CommandBuffer<EntityStore> var0, Ref<EntityStore> var1, Ref<EntityStore> var2) {
      Archetype var3 = var0.getArchetype(var2);
      boolean var4 = var3.contains(DeathComponent.getComponentType());
      boolean var5 = var3.contains(Invulnerable.getComponentType());
      if (var5) {
         Player var6 = var0.getComponent(var2, Player.getComponentType());
         if (var6 != null && var6.getGameMode() == GameMode.Creative) {
            PlayerSettings var7 = var0.getComponent(var2, PlayerSettings.getComponentType());
            if (var7 != null && var7.creativeSettings().respondToHit()) {
               var5 = false;
            }
         }
      }

      boolean var8 = var3.contains(EntityStatMap.getComponentType()) || var3.contains(RespondToHit.getComponentType());
      class="kw">return var4 || var5 || var2.equals(var1) || !var8;
   }

   class="kw">public class="kw">abstract boolean needsRemoteSync();

   @Override
   class="kw">public String toString() {
      class="kw">return "Interaction{id='"
         + this.id
         + "', viewDistance="
         + this.viewDistance
         + ", effects="
         + this.effects
         + ", horizontalSpeedMultiplier="
         + this.horizontalSpeedMultiplier
         + ", runTime="
         + this.runTime
         + ", onItemChangeBehavior="
         + this.onItemChangeBehavior
         + ", settings="
         + this.settings
         + ", rules="
         + this.rules
         + ", camera="
         + this.camera
         + "}";
   }

   class="kw">public class="kw">static boolean failed(@Nonnull InteractionState var0) {
      class="kw">return class="kw">switch (var0) {
         case Failed, Skip, ItemChanged -> true;
         case Finished, NotFinished -> false;
      };
   }

   @Nullable
   @Deprecated
   class="kw">public class="kw">static Interaction getInteractionOrUnknown(@Nonnull String var0) {
      class="kw">return getAssetMap().getAsset(getInteractionIdOrUnknown(var0));
   }

   @Deprecated
   class="kw">public class="kw">static int getInteractionIdOrUnknown(@Nullable String var0) {
      if (var0 == null) {
         class="kw">return Integer.MIN_VALUE;
      }

      IndexedLookupTableAssetMap var1 = getAssetMap();
      int var2 = var1.getIndex(var0);
      if (var2 == Integer.MIN_VALUE) {
         HytaleLogger.getLogger().at(Level.WARNING).log("Missing interaction %s", var0);
         getAssetStore().loadAssets("Hytale:Hytale", List.of(new SendMessageInteraction(var0, "Missing interaction: " + var0)));
         int var3 = var1.getIndex(var0);
         if (var3 == Integer.MIN_VALUE) {
            throw new IllegalArgumentException("Unknown key! " + var0);
         }

         var2 = var3;
      }

      class="kw">return var2;
   }

   class="kw">protected class="kw">static boolean needsRemoteSync(@Nullable String var0) {
      if (var0 == null) {
         class="kw">return false;
      } else {
         Interaction var1 = getInteractionOrUnknown(var0);
         if (var1 == null) {
            throw new IllegalArgumentException("Unknown interaction: " + var0);
         } else {
            class="kw">return var1.needsRemoteSync();
         }
      }
   }
}