SnapshotProvider interface

Пакет: com.hypixel.hytale.server.core.entity

Файл: com/hypixel/hytale/server/core/entity/InteractionContext.java

Методы (1)

МодификаторыВозвратСигнатура
abstract EntitySnapshot getSnapshotEntitySnapshot getSnapshot(CommandBuffer<EntityStore> var1, Ref<EntityStore> var2, int var3)

Исходный код

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

class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
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.InteractionSyncData;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.PrioritySlot;
class="kw">import com.hypixel.hytale.protocol.RootInteractionSettings;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemContext;
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.inventory.container.SimpleItemContainer;
class="kw">import com.hypixel.hytale.server.core.meta.DynamicMetaStore;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.SnapshotBuffer;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.Interactions;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.components.CarriedBlock;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.UnarmedInteractions;
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.operation.Label;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.Arrays;
class="kw">import java.util.Map;
class="kw">import java.util.function.Function;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3f;
class="kw">import org.joml.Vector4d;

class="kw">public class InteractionContext {
   @Nonnull
   class="kw">private class="kw">static class="kw">final Function<InteractionContext, Map<String, String>> DEFAULT_VAR_GETTER = InteractionContext::defaultGetVars;
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">final int heldItemSectionId;
   @Nullable
   class="kw">private class="kw">final ItemContainer heldItemContainer;
   class="kw">private class="kw">final byte heldItemSlot;
   @Nullable
   class="kw">private ItemStack heldItem;
   @Nullable
   class="kw">private class="kw">final Item originalItemType;
   class="kw">private Function<InteractionContext, Map<String, String>> interactionVarsGetter = DEFAULT_VAR_GETTER;
   @Nullable
   class="kw">private class="kw">final InteractionManager interactionManager;
   @Nullable
   class="kw">private class="kw">final Ref<EntityStore> owningEntity;
   @Nullable
   class="kw">private class="kw">final Ref<EntityStore> runningForEntity;
   @Nullable
   class="kw">private InteractionChain chain;
   @Nullable
   class="kw">private InteractionEntry entry;
   @Nullable
   class="kw">private Label[] labels;
   @Nullable
   class="kw">private InteractionContext.SnapshotProvider snapshotProvider;
   @Nonnull
   class="kw">private class="kw">final DynamicMetaStore<InteractionContext> metaStore;

   class="kw">private InteractionContext(
      @Nullable InteractionManager var1, @Nullable Ref<EntityStore> var2, int var3, @Nullable ItemContainer var4, byte var5, @Nullable ItemStack var6
   ) {
      this(var1, var2, var2, var3, var4, var5, var6);
   }

   class="kw">private InteractionContext(
      @Nullable InteractionManager var1,
      @Nullable Ref<EntityStore> var2,
      @Nullable Ref<EntityStore> var3,
      int var4,
      @Nullable ItemContainer var5,
      byte var6,
      @Nullable ItemStack var7
   ) {
      this.interactionManager = var1;
      this.owningEntity = var2;
      this.runningForEntity = var3;
      this.heldItemSectionId = var4;
      this.heldItemContainer = var5;
      this.heldItemSlot = var6;
      this.heldItem = var7;
      this.originalItemType = var7 != null ? var7.getItem() : null;
      this.metaStore = new DynamicMetaStore<>(this, Interaction.CONTEXT_META_REGISTRY);
   }

   @Nonnull
   class="kw">public InteractionChain fork(@Nonnull InteractionContext var1, @Nonnull RootInteraction var2, boolean var3) {
      assert this.chain != null;
      class="kw">return this.fork(this.chain.getType(), var1, var2, var3);
   }

   @Nonnull
   class="kw">public InteractionChain fork(@Nonnull InteractionType var1, @Nonnull InteractionContext var2, @Nonnull RootInteraction var3, boolean var4) {
      InteractionChainData var5 = new InteractionChainData(this.chain.getChainData());
      class="kw">return this.fork(var5, var1, var2, var3, var4);
   }

   @Nonnull
   class="kw">public InteractionChain fork(
      @Nonnull InteractionChainData var1, @Nonnull InteractionType var2, @Nonnull InteractionContext var3, @Nonnull RootInteraction var4, boolean var5
   ) {
      if (var3 == this) {
         throw new IllegalArgumentException("Cannot use current context");
      }

      Integer var6 = var3.metaStore.getMetaObject(Interaction.TARGET_SLOT);
      if (var6 == null) {
         var6 = this.metaStore.getMetaObject(Interaction.TARGET_SLOT);
         var3.metaStore.putMetaObject(Interaction.TARGET_SLOT, var6);
      }

      if (var6 != null) {
         var1.targetSlot = var6;
      }

      Ref var7 = var3.metaStore.getIfPresentMetaObject(Interaction.TARGET_ENTITY);
      if (var7 != null && var7.isValid()) {
         CommandBuffer var8 = this.getCommandBuffer();
         assert var8 != null;
         NetworkId var9 = var8.getComponent(var7, NetworkId.getComponentType());
         if (var9 != null) {
            var1.entityId = var9.getId();
         }
      }

      Vector4d var16 = var3.metaStore.getIfPresentMetaObject(Interaction.HIT_LOCATION);
      if (var16 != null) {
         var1.hitLocation = new Vector3f((float)var16.x, (float)var16.y, (float)var16.z);
      }

      String var17 = var3.metaStore.getIfPresentMetaObject(Interaction.HIT_DETAIL);
      if (var17 != null) {
         var1.hitDetail = var17;
      }

      BlockPosition var10 = var3.metaStore.getIfPresentMetaObject(Interaction.TARGET_BLOCK_RAW);
      if (var10 != null) {
         var1.blockPosition = var10;
      }

      int var11 = this.chain.getChainId();
      ForkedChainId var12 = this.chain.getForkedChainId();
      ForkedChainId var13 = new ForkedChainId(this.entry.getIndex(), this.entry.nextForkId(), null);
      if (var12 != null) {
         ForkedChainId var14 = var12 = var12.clone();

         while (var14.forkedId != null) {
            var14 = var14.forkedId;
         }

         var14.forkedId = var13;
      } else {
         var12 = var13;
      }

      InteractionChain var19 = new InteractionChain(var12, var13, var2, var3, var1, var4, null, true);
      var19.setChainId(var11);
      var19.setBaseType(this.chain.getBaseType());
      var19.setPredicted(var5);
      var19.skipChainOnClick = this.allowSkipChainOnClick();
      var19.setTimeShift(this.chain.getTimeShift());
      this.chain.putForkedChain(var13, var19);
      InteractionChain.TempChain var15 = this.chain.removeTempForkedChain(var13, var19);
      if (var15 != null) {
         LOGGER.at(Level.FINEST).log("Loading temp chain data for fork %s", var13);
         var19.copyTempFrom(var15);
      }

      class="kw">return var19;
   }

   @Nonnull
   class="kw">public InteractionContext duplicate() {
      InteractionContext var1 = new InteractionContext(
         this.interactionManager, this.owningEntity, this.runningForEntity, this.heldItemSectionId, this.heldItemContainer, this.heldItemSlot, this.heldItem
      );
      var1.interactionVarsGetter = this.interactionVarsGetter;
      var1.metaStore.copyFrom(this.metaStore);
      class="kw">return var1;
   }

   @Nonnull
   class="kw">public Ref<EntityStore> getEntity() {
      class="kw">return this.runningForEntity;
   }

   @Nullable
   class="kw">public Ref<EntityStore> getOwningEntity() {
      class="kw">return this.owningEntity;
   }

   class="kw">public void execute(@Nonnull RootInteraction var1) {
      this.chain.getContext().getState().enteredRootInteraction = RootInteraction.getAssetMap().getIndex(var1.getId());
      this.chain.pushRoot(var1, this.entry.isUseSimulationState());
   }

   @Nullable
   class="kw">public InteractionChain getChain() {
      class="kw">return this.chain;
   }

   @Nullable
   class="kw">public InteractionEntry getEntry() {
      class="kw">return this.entry;
   }

   class="kw">public int getOperationCounter() {
      class="kw">return this.entry.isUseSimulationState() ? this.chain.getSimulatedOperationCounter() : this.chain.getOperationCounter();
   }

   class="kw">public void setOperationCounter(int var1) {
      if (this.entry.isUseSimulationState()) {
         this.chain.setSimulatedOperationCounter(var1);
      } else {
         this.chain.setOperationCounter(var1);
      }
   }

   class="kw">public void jump(@Nonnull Label var1) {
      this.setOperationCounter(var1.getIndex());
   }

   @Nullable
   class="kw">public Item getOriginalItemType() {
      class="kw">return this.originalItemType;
   }

   class="kw">public int getHeldItemSectionId() {
      class="kw">return this.heldItemSectionId;
   }

   @Nullable
   class="kw">public ItemContainer getHeldItemContainer() {
      class="kw">return this.heldItemContainer;
   }

   class="kw">public byte getHeldItemSlot() {
      class="kw">return this.heldItemSlot;
   }

   @Nullable
   class="kw">public ItemStack getHeldItem() {
      class="kw">return this.heldItem;
   }

   class="kw">public void setHeldItem(@Nullable ItemStack var1) {
      this.heldItem = var1;
   }

   @Nullable
   class="kw">public ItemContext createHeldItemContext() {
      class="kw">return this.heldItemContainer != null && this.heldItem != null ? new ItemContext(this.heldItemContainer, this.heldItemSlot, this.heldItem) : null;
   }

   class="kw">public Function<InteractionContext, Map<String, String>> getInteractionVarsGetter() {
      class="kw">return this.interactionVarsGetter;
   }

   class="kw">public Map<String, String> getInteractionVars() {
      class="kw">return this.interactionVarsGetter.apply(this);
   }

   class="kw">public void setInteractionVarsGetter(Function<InteractionContext, Map<String, String>> var1) {
      this.interactionVarsGetter = var1;
   }

   class="kw">public InteractionManager getInteractionManager() {
      class="kw">return this.interactionManager;
   }

   @Nullable
   class="kw">public Ref<EntityStore> getTargetEntity() {
      class="kw">return this.metaStore.getIfPresentMetaObject(Interaction.TARGET_ENTITY);
   }

   @Nullable
   class="kw">public BlockPosition getTargetBlock() {
      class="kw">return this.metaStore.getIfPresentMetaObject(Interaction.TARGET_BLOCK);
   }

   @Nullable
   class="kw">public BlockPosition getTargetBlockRaw() {
      class="kw">return this.metaStore.getIfPresentMetaObject(Interaction.TARGET_BLOCK_RAW);
   }

   @Nonnull
   class="kw">public DynamicMetaStore<InteractionContext> getMetaStore() {
      class="kw">return this.metaStore;
   }

   @Nonnull
   class="kw">public InteractionSyncData getState() {
      class="kw">return this.entry.getState();
   }

   @Nullable
   class="kw">public InteractionSyncData getClientState() {
      class="kw">return this.entry.getClientState();
   }

   @Nonnull
   class="kw">public InteractionSyncData getServerState() {
      class="kw">return this.entry.getServerState();
   }

   @Nonnull
   class="kw">public DynamicMetaStore<Interaction> getInstanceStore() {
      class="kw">return this.entry.getMetaStore();
   }

   class="kw">public boolean allowSkipChainOnClick() {
      class="kw">return this.chain.skipChainOnClick;
   }

   class="kw">public void setLabels(Label[] var1) {
      this.labels = var1;
   }

   class="kw">public boolean hasLabels() {
      class="kw">return this.labels != null;
   }

   class="kw">public Label getLabel(int var1) {
      class="kw">return this.labels[var1];
   }

   class="kw">public EntitySnapshot getSnapshot(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      NetworkId var3 = var2.getComponent(var1, NetworkId.getComponentType());
      assert var3 != null;
      int var4 = var3.getId();
      if (this.snapshotProvider != null) {
         class="kw">return this.snapshotProvider.getSnapshot(this.getCommandBuffer(), this.runningForEntity, var4);
      }

      SnapshotBuffer var5 = var2.getComponent(var1, SnapshotBuffer.getComponentType());
      if (var5 != null) {
         EntitySnapshot var6 = var5.getSnapshot(var5.getCurrentTickIndex());
         if (var6 != null) {
            class="kw">return var6;
         }
      }

      TransformComponent var7 = var2.getComponent(var1, TransformComponent.getComponentType());
      assert var7 != null;
      class="kw">return new EntitySnapshot(var7.getPosition(), var7.getRotation());
   }

   class="kw">public void setSnapshotProvider(@Nullable InteractionContext.SnapshotProvider var1) {
      this.snapshotProvider = var1;
   }

   class="kw">public void setTimeShift(float var1) {
      if (!this.entry.isUseSimulationState()) {
         this.chain.setTimeShift(var1);
         if (this.chain.getForkedChainId() == null) {
            this.interactionManager.setGlobalTimeShift(this.chain.getType(), var1);
         }
      }
   }

   @Nullable
   class="kw">public CommandBuffer<EntityStore> getCommandBuffer() {
      class="kw">return this.interactionManager.commandBuffer;
   }

   @Nullable
   class="kw">public String getRootInteractionId(@Nonnull InteractionType var1) {
      if (this.runningForEntity != null && this.runningForEntity.isValid()) {
         Interactions var2 = this.runningForEntity.getStore().getComponent(this.runningForEntity, Interactions.getComponentType());
         if (var2 != null) {
            String var3 = var2.getInteractionId(var1);
            if (var3 != null) {
               class="kw">return var3;
            }

            if (var2.isOverrideAll()) {
               class="kw">return null;
            }
         }
      }

      Item var5 = this.originalItemType;
      if (var5 == null) {
         UnarmedInteractions var7 = UnarmedInteractions.getAssetMap().getAsset("Empty");
         class="kw">return var7 != null ? var7.getInteractions().get(var1) : null;
      }

      if (this.runningForEntity != null && this.runningForEntity.isValid()) {
         CarriedBlock var6 = this.runningForEntity.getStore().getComponent(this.runningForEntity, CarriedBlock.getComponentType());
         if (var6 != null) {
            if (var6.getCarriedItemId() != null) {
               class="kw">return Item.getAssetMap().getAsset(var6.getCarriedItemId()).getCarryInteractions().get(var1);
            }

            UnarmedInteractions var4 = UnarmedInteractions.getAssetMap().getAsset("Empty");
            class="kw">return var4 != null ? var4.getInteractions().get(var1) : null;
         }
      }

      class="kw">return var5.getInteractions().get(var1);
   }

   void initEntry(@Nonnull InteractionChain var1, @Nonnull InteractionEntry var2, @Nullable Ref<EntityStore> var3) {
      CommandBuffer var4 = this.getCommandBuffer();
      assert var4 != null;
      this.chain = var1;
      this.entry = var2;
      this.labels = null;
      Player var5 = null;
      if (var3 != null) {
         var5 = var4.getComponent(var3, Player.getComponentType());
      }

      GameMode var6 = var5 != null ? var5.getGameMode() : GameMode.Adventure;
      RootInteractionSettings var7 = var1.getRootInteraction().getSettings().get(var6);
      var1.skipChainOnClick = var1.skipChainOnClick | (var7 != null && var7.allowSkipChainOnClick);
   }

   void deinitEntry(InteractionChain var1, InteractionEntry var2, Ref<EntityStore> var3) {
      this.chain = null;
      this.entry = null;
      this.labels = null;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "InteractionContext{heldItemSectionId="
         + this.heldItemSectionId
         + ", heldItemContainer="
         + this.heldItemContainer
         + ", heldItemSlot="
         + this.heldItemSlot
         + ", heldItem="
         + this.heldItem
         + ", originalItemType="
         + this.originalItemType
         + ", interactionVarsGetter="
         + this.interactionVarsGetter
         + ", labels="
         + Arrays.toString(this.labels)
         + ", snapshotProvider="
         + this.snapshotProvider
         + ", metaStore="
         + this.metaStore
         + "}";
   }

   @Nonnull
   class="kw">public class="kw">static InteractionContext forProxyEntity(
      @Nonnull InteractionManager var0, @Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      InventoryComponent.Hotbar var4 = var3.getComponent(var1, InventoryComponent.Hotbar.getComponentType());
      class="kw">return new InteractionContext(
         var0, var1, var2, -1, var4 != null ? var4.getInventory() : null, var4 != null ? var4.getActiveSlot() : -1, var4 != null ? var4.getActiveItem() : null
      );
   }

   @Nonnull
   class="kw">public class="kw">static InteractionContext forInteraction(
      @Nonnull InteractionManager var0, @Nonnull Ref<EntityStore> var1, @Nonnull InteractionType var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      if (var2 == InteractionType.Equipped) {
         throw new IllegalArgumentException("Equipped interaction type requires a slot set");
      } else {
         class="kw">return forInteraction(var0, var1, var2, 0, var3);
      }
   }

   @Nonnull
   class="kw">public class="kw">static InteractionContext forInteraction(
      @Nonnull InteractionManager var0, @Nonnull Ref<EntityStore> var1, @Nonnull InteractionType var2, int var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      InventoryComponent.Hotbar var5 = var4.getComponent(var1, InventoryComponent.Hotbar.getComponentType());
      CarriedBlock var6 = var4.getComponent(var1, CarriedBlock.getComponentType());
      if (var6 != null && var6.getCarriedItemId() != null) {
         SimpleItemContainer var15 = var6.getItemContainer();
         class="kw">return new InteractionContext(var0, var1, -10, var15, (byte)0, var15.getItemStack((short)0));
      }

      InventoryComponent.Utility var7 = var4.getComponent(var1, InventoryComponent.Utility.getComponentType());
      InventoryComponent.Armor var8 = var4.getComponent(var1, InventoryComponent.Armor.getComponentType());
      InventoryComponent.Tool var9 = var4.getComponent(var1, InventoryComponent.Tool.getComponentType());
      class="kw">switch (var2) {
         case Equipped:
            class="kw">return new InteractionContext(
               var0, var1, -3, var8 != null ? var8.getInventory() : null, (byte)var3, var8 != null ? var8.getInventory().getItemStack((short)var3) : null
            );
         case HeldOffhand:
            class="kw">return new InteractionContext(
               var0, var1, -5, var7 != null ? var7.getInventory() : null, var7 != null ? var7.getActiveSlot() : -1, var7 != null ? var7.getActiveItem() : null
            );
         case Ability1:
         case Ability2:
         case Ability3:
         case Pick:
         case Primary:
         case Secondary:
            if (var9 != null && var9.isUsingToolsItem()) {
               class="kw">return new InteractionContext(var0, var1, -8, var9.getInventory(), var9.getActiveSlot(), var9.getActiveItem());
            } else {
               ItemStack var10 = var5 != null ? var5.getActiveItem() : null;
               ItemStack var11 = var7 != null ? var7.getActiveItem() : null;
               int var12 = -1;
               if (var10 == null && var11 != null) {
                  var12 = -5;
               } else if (var10 != null && var11 != null) {
                  int var13 = var10.getItem().getInteractionConfig().getPriorityFor(var2, PrioritySlot.MainHand);
                  int var14 = var11.getItem().getInteractionConfig().getPriorityFor(var2, PrioritySlot.OffHand);
                  if (var13 == var14) {
                     if (var2 == InteractionType.Secondary && var10.getItem().getUtility().isCompatible()) {
                        var12 = -5;
                     }
                  } else if (var13 < var14) {
                     var12 = -5;
                  } else {
                     if (var2 == InteractionType.Primary && !var10.getItem().getInteractions().containsKey(InteractionType.Primary)) {
                        var12 = -5;
                     }

                     if (var2 == InteractionType.Secondary && !var10.getItem().getInteractions().containsKey(InteractionType.Secondary)) {
                        var12 = -5;
                     }
                  }
               }

               class="kw">return var12 == -5
                  ? new InteractionContext(
                     var0,
                     var1,
                     -5,
                     var7 != null ? var7.getInventory() : null,
                     var7 != null ? var7.getActiveSlot() : -1,
                     var7 != null ? var7.getActiveItem() : null
                  )
                  : new InteractionContext(
                     var0,
                     var1,
                     -1,
                     var5 != null ? var5.getInventory() : null,
                     var5 != null ? var5.getActiveSlot() : -1,
                     var5 != null ? var5.getActiveItem() : null
                  );
            }
         case Held:
         class="kw">default:
            class="kw">return new InteractionContext(
               var0, var1, -1, var5 != null ? var5.getInventory() : null, var5 != null ? var5.getActiveSlot() : -1, var5 != null ? var5.getActiveItem() : null
            );
      }
   }

   @Nonnull
   class="kw">public class="kw">static InteractionContext withoutEntity() {
      class="kw">return new InteractionContext(null, null, -1, null, (byte)-1, null);
   }

   @Nullable
   class="kw">private class="kw">static Map<String, String> defaultGetVars(@Nonnull InteractionContext var0) {
      Item var1 = var0.originalItemType;
      class="kw">return var1 != null ? var1.getInteractionVars() : null;
   }

   @Deprecated
   @FunctionalInterface
   class="kw">public class="kw">interface SnapshotProvider {
      EntitySnapshot getSnapshot(CommandBuffer<EntityStore> var1, Ref<EntityStore> var2, int var3);
   }
}