TeleportInstanceInteraction class

Пакет: com.hypixel.hytale.builtin.instances.interactions

Файл: com/hypixel/hytale/builtin/instances/interactions/TeleportInstanceInteraction.java

extends: SimpleInstantInteraction

Поля (65)

МодификаторыТипИмя
break
return
return
return
InstancesPlugin var10
WorldChunk var10
Universe var11
BlockType var11
World var12
var12
var12
BlockChunk var12
CompletableFuture var13
var13
var13
var13
int var13
Transform var14
var14
var14
RotationTuple var14
BlockPosition var15
IndexedLookupTableAssetMap var15
ChunkStore var16
Box var16
Ref var17
Vector3d var17
int var18
Rotation3f var18
var18
var18
Ref var19
var19
TransformComponent var19
InstanceBlock var20
var20
var20
var20
Holder var21
BlockModule.BlockStateInfo var22
Ref var23
InstanceBlock var24
Transform var25
Transform var26
BlockPosition var27
ChunkStore var28
int var29
ChunkStore var3
Ref var30
UUID var31
CommandBuffer var4
Ref var4
Transform var4
var4
var4
Ref var5
BlockPosition var5
DeathComponent var6
World var6
Player var7
ChunkStore var7
Archetype var8
Store var8
World var9
Ref var9

Методы (20)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Can't use OriginSource.BLOCK without a target block")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Missing chunk")
if if(var0.rotation != null)
if if(var6 == null)
if if(this.instanceKey != null)
if if(var12 == null)
if if(var15 == null)
if if(var19 == null)
if if(var19 == null)
if if(var20 == null)
if if(var12 == null && var13 == null)
if if(var13 != null)
if if(this.removeBlockAfter >= 0.0)
if if(var27 != null)
if if(this.removeBlockAfter == 0.0)
if if(!this.personalReturnPoint)
if if(var5 == null)
if if(var10 == null)
if if(this.rotation != null)
switch switch(this.originSource)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.instances.interactions;

class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.builtin.instances.InstanceValidator;
class="kw">import com.hypixel.hytale.builtin.instances.InstancesPlugin;
class="kw">import com.hypixel.hytale.builtin.instances.blocks.InstanceBlock;
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.validation.Validators;
class="kw">import com.hypixel.hytale.common.util.CompletableFutureUtil;
class="kw">import com.hypixel.hytale.component.AddReason;
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.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.Axis;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.BlockPosition;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.WaitForDataFrom;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionContext;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.PendingTeleport;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.OriginSource;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.SimpleInstantInteraction;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class TeleportInstanceInteraction class="kw">extends SimpleInstantInteraction {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<TeleportInstanceInteraction> CODEC = BuilderCodec.builder(
         TeleportInstanceInteraction.class, TeleportInstanceInteraction::new, SimpleInstantInteraction.CODEC
      )
      .documentation("Teleports the **Player** to the named instance, creating it if required.")
      .<String>appendInherited(
         new KeyedCodec<>("InstanceName", Codec.STRING),
         (var0, var1) -> var0.instanceName = var1,
         var0 -> var0.instanceName,
         (var0, var1) -> var0.instanceName = var1.instanceName
      )
      .documentation("The name of the **instance** to teleport to.")
      .addValidator(Validators.nonNull())
      .addValidator(InstanceValidator.INSTANCE)
      .add()
      .<String>appendInherited(
         new KeyedCodec<>("InstanceKey", Codec.STRING),
         (var0, var1) -> var0.instanceKey = var1,
         var0 -> var0.instanceKey,
         (var0, var1) -> var0.instanceKey = var1.instanceKey
      )
      .documentation("The key to name the world. Random if not provided")
      .add()
      .<Vector3d>appendInherited(
         new KeyedCodec<>("PositionOffset", Vector3dUtil.CODEC),
         (var0, var1) -> var0.positionOffset = var1,
         var0 -> var0.positionOffset,
         (var0, var1) -> var0.positionOffset = var1.positionOffset
      )
      .documentation("The offset to apply to the class="kw">return point.\n\nUsed to prevent repeated interactions when returning from the instance.")
      .add()
      .<Rotation3f>appendInherited(
         new KeyedCodec<>("Rotation", Rotation3f.PARTIAL_TELEPORT_CODEC),
         (var0, var1) -> var0.rotation = var1,
         var0 -> var0.rotation,
         (var0, var1) -> var0.rotation = var1.rotation
      )
      .documentation("The rotation to set the player to when returning from an instance.")
      .add()
      .<OriginSource>appendInherited(
         new KeyedCodec<>("OriginSource", OriginSource.CODEC),
         (var0, var1) -> var0.originSource = var1,
         var0 -> var0.originSource,
         (var0, var1) -> var0.originSource = var1.originSource
      )
      .documentation("The source to use for the class="kw">return position.\n\nDefaults to the player's position.")
      .addValidator(Validators.nonNull())
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("PersonalReturnPoint", Codec.BOOLEAN),
         (var0, var1) -> var0.personalReturnPoint = var1,
         var0 -> var0.personalReturnPoint,
         (var0, var1) -> var0.personalReturnPoint = var1.personalReturnPoint
      )
      .documentation(
         "Whether the player entering the instance will have their own class="kw">return point\nset to the current location. Overriding the world's class="kw">return point."
      )
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("CloseOnBlockRemove", Codec.BOOLEAN),
         (var0, var1) -> var0.closeOnBlockRemove = var1,
         var0 -> var0.closeOnBlockRemove,
         (var0, var1) -> var0.closeOnBlockRemove = var1.closeOnBlockRemove
      )
      .documentation("Whether to delete the instance when the portal block is removed.")
      .add()
      .<Double>appendInherited(
         new KeyedCodec<>("RemoveBlockAfter", Codec.DOUBLE),
         (var0, var1) -> var0.removeBlockAfter = var1,
         var0 -> var0.removeBlockAfter,
         (var0, var1) -> var0.removeBlockAfter = var1.removeBlockAfter
      )
      .documentation(
         "The number of seconds to wait before removing the block that triggered\nthe interaction. A negative value disables this.\n\nThis is needed instead of using another interaction due to all interactions\nbeing stopped once teleporting to another world."
      )
      .add()
      .afterDecode(var0 -> {
         if (var0.rotation != null) {
            var0.rotation.mul((float) (Math.PI / 180.0));
         }
      })
      .build();
   class="kw">private class="kw">static class="kw">final int SET_BLOCK_SETTINGS = 256;
   class="kw">private String instanceName;
   class="kw">private String instanceKey;
   class="kw">private Vector3d positionOffset;
   class="kw">private Rotation3f rotation;
   @Nonnull
   class="kw">private OriginSource originSource = OriginSource.ENTITY;
   class="kw">private boolean personalReturnPoint;
   class="kw">private boolean closeOnBlockRemove = true;
   class="kw">private double removeBlockAfter = -1.0;

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

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

   @Override
   class="kw">protected void firstRun(@Nonnull InteractionType var1, @Nonnull InteractionContext var2, @Nonnull CooldownHandler var3) {
      CommandBuffer var4 = var2.getCommandBuffer();
      assert var4 != null;
      Ref var5 = var2.getEntity();
      DeathComponent var6 = var4.getComponent(var5, DeathComponent.getComponentType());
      if (var6 == null) {
         Player var7 = var4.getComponent(var5, Player.getComponentType());
         if (var7 != null && !var7.isWaitingForClientReady()) {
            Archetype var8 = var4.getArchetype(var5);
            if (!var8.contains(Teleport.getComponentType()) && !var8.contains(PendingTeleport.getComponentType())) {
               World var9 = var4.getExternalData().getWorld();
               InstancesPlugin var10 = InstancesPlugin.get();
               Universe var11 = Universe.get();
               CompletableFuture var13 = null;
               Transform var14 = null;
               World var12;
               if (this.instanceKey != null) {
                  var12 = var11.getWorld(this.instanceKey);
                  if (var12 == null) {
                     var14 = this.makeReturnPoint(var5, var2, var4);
                     var13 = var10.spawnInstance(this.instanceName, this.instanceKey, var9, var14);
                  }
               } else {
                  BlockPosition var15 = var2.getTargetBlock();
                  if (var15 == null) {
                     class="kw">return;
                  }

                  ChunkStore var16 = var9.getChunkStore();
                  Ref var17 = var16.getChunkSectionReferenceAtBlock(var15.x, var15.y, var15.z);
                  if (var17 == null || !var17.isValid()) {
                     class="kw">return;
                  }

                  int var18 = ChunkUtil.indexBlock(var15.x, var15.y, var15.z);
                  Ref var19 = BlockModule.getBlockEntity(var16.getStore(), var17, var15.x, var15.y, var15.z);
                  InstanceBlock var20;
                  if (var19 == null) {
                     Holder var21 = ChunkStore.REGISTRY.newHolder();
                     var20 = var21.ensureAndGetComponent(InstanceBlock.getComponentType());
                     var21.addComponent(BlockModule.BlockStateInfo.getComponentType(), new BlockModule.BlockStateInfo(var18, var17));
                     var19 = var16.getStore().addEntity(var21, AddReason.SPAWN);
                     var20.setCloseOnRemove(this.closeOnBlockRemove);
                  } else {
                     var20 = var16.getStore().getComponent(var19, InstanceBlock.getComponentType());
                  }

                  if (var19 == null) {
                     class="kw">return;
                  }

                  if (var20 == null) {
                     var20 = var16.getStore().ensureAndGetComponent(var19, InstanceBlock.getComponentType());
                     var20.setCloseOnRemove(this.closeOnBlockRemove);
                  }

                  UUID var31 = var20.getWorldUUID();
                  var13 = var20.getWorldFuture();
                  var12 = var31 != null ? var11.getWorld(var31) : null;
                  if (var12 == null && var13 == null) {
                     BlockModule.BlockStateInfo var22 = var16.getStore().getComponent(var19, BlockModule.BlockStateInfo.getComponentType());
                     var14 = this.makeReturnPoint(var5, var2, var4);
                     var13 = var10.spawnInstance(this.instanceName, var9, var14);
                     var20.setWorldFuture(var13);
                     Ref var23 = var19;
                     InstanceBlock var24 = var20;
                     CompletableFutureUtil._catch(var13.thenAcceptAsync(var3x -> {
                        if (var23.isValid()) {
                           var24.setWorldFuture(null);
                           var24.setWorldUUID(var3x.getWorldConfig().getUuid());
                           var22.markNeedsSaving();
                        }
                     }, var9));
                  }
               }

               if (var13 != null) {
                  Transform var25 = this.getPersonalReturnPoint(var5, var2, var14, var4);
                  InstancesPlugin.teleportPlayerToLoadingInstance(var5, var4, var13, var25);
               } else if (var12 != null) {
                  Transform var26 = this.getPersonalReturnPoint(var5, var2, var14, var4);
                  InstancesPlugin.teleportPlayerToInstance(var5, var4, var12, var26);
               }

               if (this.removeBlockAfter >= 0.0) {
                  BlockPosition var27 = var2.getTargetBlock();
                  if (var27 != null) {
                     if (this.removeBlockAfter == 0.0) {
                        ChunkStore var28 = var9.getChunkStore();
                        Ref var30 = var28.getChunkSectionReferenceAtBlock(var27.x, var27.y, var27.z);
                        if (var30 != null && var30.isValid()) {
                           BlockOperations.setBlock(var28, var30, var27.x, var27.y, var27.z, 0, BlockType.EMPTY, 0, 0, 256);
                        }
                     } else {
                        int var29 = var9.getBlock(var27.x, var27.y, var27.z);
                        new CompletableFuture().completeOnTimeout(null, (long)(this.removeBlockAfter * 1.0E9), TimeUnit.NANOSECONDS).thenRunAsync(() -> {
                           if (var9.getBlock(var27.x, var27.y, var27.z) == var29) {
                              ChunkStore var3 = var9.getChunkStore();
                              Ref var4 = var3.getChunkSectionReferenceAtBlock(var27.x, var27.y, var27.z);
                              if (var4 != null && var4.isValid()) {
                                 BlockOperations.setBlock(var3, var4, var27.x, var27.y, var27.z, 0, BlockType.EMPTY, 0, 0, 256);
                              }
                           }
                        }, var9);
                     }
                  }
               }
            }
         }
      }
   }

   @Nullable
   class="kw">private Transform getPersonalReturnPoint(
      @Nonnull Ref<EntityStore> var1, @Nonnull InteractionContext var2, @Nullable Transform var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (!this.personalReturnPoint) {
         class="kw">return null;
      } else {
         class="kw">return var3 == null ? this.makeReturnPoint(var1, var2, var4) : var3;
      }
   }

   @Nonnull
   class="kw">private Transform makeReturnPoint(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionContext var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      Transform var4 = null;
      class="kw">switch (this.originSource) {
         case ENTITY:
            TransformComponent var19 = var3.getComponent(var1, TransformComponent.getComponentType());
            assert var19 != null;
            var4 = new Transform(var19.getTransform());
            var4.getPosition().add(this.positionOffset);
            var4.setRotation(this.rotation != null ? this.rotation : Rotation3f.NaN);
            break;
         case BLOCK:
            BlockPosition var5 = var2.getTargetBlock();
            if (var5 == null) {
               throw new IllegalArgumentException("Can't use OriginSource.BLOCK without a target block");
            }

            World var6 = var3.getExternalData().getWorld();
            ChunkStore var7 = var6.getChunkStore();
            Store var8 = var7.getStore();
            Ref var9 = var7.getChunkReference(ChunkUtil.indexChunkFromBlock(var5.x, var5.z));
            if (var9 == null || !var9.isValid()) {
               throw new IllegalArgumentException("Missing chunk");
            }

            WorldChunk var10 = var8.getComponent(var9, WorldChunk.getComponentType());
            if (var10 == null) {
               throw new IllegalArgumentException("Missing chunk");
            }

            BlockType var11 = var10.getBlockType(var5.x, var5.y, var5.z);
            BlockChunk var12 = var8.getComponent(var9, BlockChunk.getComponentType());
            assert var12 != null;
            int var13 = var12.getSectionAtBlockY(var5.y).getRotationIndex(var5.x, var5.y, var5.z);
            RotationTuple var14 = RotationTuple.get(var13);
            IndexedLookupTableAssetMap var15 = BlockBoundingBoxes.getAssetMap();
            Box var16 = var15.getAsset(var11.getHitboxTypeIndex()).get(var13).getBoundingBox();
            Vector3d var17 = this.positionOffset != null ? var14.rotatedVector(this.positionOffset) : new Vector3d();
            var17.x = var17.x + (var16.middleX() + var5.x);
            var17.y = var17.y + (var16.middleY() + var5.y);
            var17.z = var17.z + (var16.middleZ() + var5.z);
            Rotation3f var18;
            if (this.rotation != null) {
               var18 = new Rotation3f(this.rotation);
               var18.addRotationOnAxis(Axis.Y, var14.yaw().getDegrees());
               var18.addRotationOnAxis(Axis.X, var14.pitch().getDegrees());
            } else {
               var18 = new Rotation3f(Rotation3f.NaN);
            }

            var4 = new Transform(var17, var18);
      }

      class="kw">return var4;
   }
}