MoveSystem class

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

Файл: com/hypixel/hytale/server/core/modules/entity/teleport/TeleportSystems.java

extends: RefChangeSystem<EntityStore, Teleport>

Поля (9)

МодификаторыТипИмя
private final ComponentType<EntityStore, HeadRotation> headRotationComponentType
private final Query<EntityStore> query
private final ComponentType<EntityStore, Teleport> teleportComponentType
private final ComponentType<EntityStore, TransformComponent> transformComponentType
Holder var4
TransformComponent var5
HeadRotation var6
CompletableFuture var7
World var8

Методы (7)

МодификаторыВозвратСигнатура
public ComponentType<EntityStore, Teleport> componentTypepublic ComponentType<EntityStore, Teleport> componentType()
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
if if(var6 != null)
if if(var7 != null)
public void onComponentAddedpublic void onComponentAdded(@Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4)
public void onComponentRemovedpublic void onComponentRemoved(@Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4)
public void onComponentSetpublic void onComponentSet(@Nonnull Ref<EntityStore> var1, Teleport var2, @Nonnull Teleport var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5)

Исходный код

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

class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.RefChangeSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Location;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.protocol.ModelTransform;
class="kw">import com.hypixel.hytale.protocol.packets.player.ClientTeleport;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.CollisionResultComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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 java.util.concurrent.CompletableFuture;
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">public class TeleportSystems {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();

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

   class="kw">public class="kw">static void queueAndSendClientTeleport(
      @Nonnull PlayerRef var0, @Nonnull Vector3d var1, @Nonnull Rotation3f var2, @Nonnull Rotation3f var3, boolean var4
   ) {
      TeleportAckTracker var5 = var0.getTeleportAckTracker();
      int var6 = var5.queueTeleport(var1);
      ClientTeleport var7 = new ClientTeleport(
         (byte)var6,
         getIgnoredTransformFieldsFlags(var1, var2, var3),
         (short)0,
         new ModelTransform(PositionUtil.toPositionPacket(var1), PositionUtil.toDirectionPacket(var2), PositionUtil.toDirectionPacket(var3)),
         var4
      );
      if (!var0.getPacketHandler().writePacket(var7, true)) {
         var5.rollback(var6);
         LOGGER.at(Level.WARNING)
            .log("ClientTeleport id %d to %s was swallowed by a packet filter, rolled back its pending ack", var6 & 0xFF, var0.getUsername());
      }
   }

   class="kw">public class="kw">static void completeTeleport(@Nonnull Ref<EntityStore> var0, @Nonnull Store<EntityStore> var1, @Nonnull Player var2, @Nullable Vector3d var3) {
      if (var1.getComponent(var0, PendingTeleport.getComponentType()) != null) {
         var1.removeComponent(var0, PendingTeleport.getComponentType());
         TransformComponent var4 = var1.getComponent(var0, TransformComponent.getComponentType());
         assert var4 != null;
         CollisionResultComponent var5 = var1.getComponent(var0, CollisionResultComponent.getComponentType());
         if (var5 != null) {
            var5.getCollisionStartPosition().set(var4.getPosition());
         }

         Vector3d var6 = var3 != null ? var3 : var4.getPosition();
         var2.moveTo(var0, var6.x(), var6.y(), var6.z(), var1);
      }
   }

   class="kw">static short getIgnoredTransformFieldsFlags(@Nullable Vector3d var0, @Nullable Rotation3f var1, @Nullable Rotation3f var2) {
      short var3 = 0;
      if (var0 == null || !Double.isFinite(var0.x)) {
         var3 = (short)(var3 | 1);
      }

      if (var0 == null || !Double.isFinite(var0.y)) {
         var3 = (short)(var3 | 2);
      }

      if (var0 == null || !Double.isFinite(var0.z)) {
         var3 = (short)(var3 | 4);
      }

      if (var1 == null || !Float.isFinite(var1.yaw())) {
         var3 = (short)(var3 | 8);
      }

      if (var1 == null || !Float.isFinite(var1.pitch())) {
         var3 = (short)(var3 | 16);
      }

      if (var1 == null || !Float.isFinite(var1.roll())) {
         var3 = (short)(var3 | 32);
      }

      if (var2 == null || !Float.isFinite(var2.yaw())) {
         var3 = (short)(var3 | 64);
      }

      if (var2 == null || !Float.isFinite(var2.pitch())) {
         var3 = (short)(var3 | 128);
      }

      if (var2 == null || !Float.isFinite(var2.roll())) {
         var3 = (short)(var3 | 256);
      }

      class="kw">return var3;
   }

   class="kw">public class="kw">static class MoveSystem class="kw">extends RefChangeSystem<EntityStore, Teleport> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, Teleport> teleportComponentType = Teleport.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType = TransformComponent.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, HeadRotation> headRotationComponentType = HeadRotation.getComponentType();
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query = Query.and(this.teleportComponentType, this.transformComponentType, Query.not(PlayerRef.getComponentType()));

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

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }

      @Nonnull
      @Override
      class="kw">public ComponentType<EntityStore, Teleport> componentType() {
         class="kw">return this.teleportComponentType;
      }

      class="kw">public void onComponentAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         TransformComponent var5 = var4.getComponent(var1, this.transformComponentType);
         assert var5 != null;
         var5.teleportPosition(var2.getPosition());
         var5.teleportRotation(var2.getRotation());
         HeadRotation var6 = var4.getComponent(var1, this.headRotationComponentType);
         if (var6 != null) {
            var6.teleportRotation(var2.getRotation());
         }

         CompletableFuture var7 = var2.getOnComplete();
         var4.removeComponent(var1, this.teleportComponentType);
         World var8 = var2.getWorld();
         if (var8 != null && !var8.equals(var3.getExternalData().getWorld())) {
            var4.run(var3x -> {
               Holder var4 = var3x.removeEntity(var1, RemoveReason.UNLOAD);
               var8.execute(() -> {
                  var8.getEntityStore().getStore().addEntity(var4, AddReason.LOAD);
                  if (var7 != null) {
                     var7.complete(null);
                  }
               });
            });
         } else if (var7 != null) {
            var7.complete(null);
         }
      }

      class="kw">public void onComponentRemoved(
         @Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
      }

      class="kw">public void onComponentSet(
         @Nonnull Ref<EntityStore> var1, Teleport var2, @Nonnull Teleport var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
      ) {
      }
   }

   class="kw">public class="kw">static class PlayerMoveSystem class="kw">extends RefChangeSystem<EntityStore, Teleport> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, Teleport> teleportComponentType = Teleport.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType = TransformComponent.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, HeadRotation> headRotationComponentType = HeadRotation.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, PlayerRef> playerRefComponentType = PlayerRef.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, Player> playerComponentType = Player.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, PendingTeleport> pendingTeleportComponentType = PendingTeleport.getComponentType();
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query = Query.and(
         this.teleportComponentType, this.playerRefComponentType, this.transformComponentType, this.playerComponentType
      );

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

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }

      @Nonnull
      @Override
      class="kw">public ComponentType<EntityStore, Teleport> componentType() {
         class="kw">return this.teleportComponentType;
      }

      class="kw">public void onComponentAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         World var5 = var2.getWorld();
         if (var5 != null && !var5.equals(var3.getExternalData().getWorld())) {
            this.teleportToWorld(var1, var2, var4, var5);
         } else {
            this.teleportToPosition(var1, var2, var4);
         }
      }

      class="kw">public void onComponentRemoved(
         @Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
      }

      class="kw">public void onComponentSet(
         @Nonnull Ref<EntityStore> var1, Teleport var2, @Nonnull Teleport var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
      ) {
      }

      class="kw">private void teleportToWorld(@Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull CommandBuffer<EntityStore> var3, @Nonnull World var4) {
         PlayerRef var5 = var3.getComponent(var1, this.playerRefComponentType);
         assert var5 != null;
         var3.removeComponent(var1, this.teleportComponentType);
         TransformComponent var6 = var3.getComponent(var1, this.transformComponentType);
         String var7 = var3.getExternalData().getWorld().getName();
         Location var8 = new Location(var7, new Transform(var6.getTransform()));
         Location var9 = new Location(var4.getName(), new Vector3d(var2.getPosition()), new Rotation3f(var2.getRotation()));
         var3.run(var6x -> {
            TeleportRecord var7 = var6x.ensureAndGetComponent(var1, TeleportRecord.getComponentType());
            var7.setLastTeleport(new TeleportRecord.Entry(var8, var9, System.nanoTime()));
            var5.removeFromStore();
            CompletableFuture var8 = var4.addPlayer(var5, new Transform(var2.getPosition(), var2.getRotation()));
            CompletableFuture var9 = var2.getOnComplete();
            if (var9 != null) {
               if (var8 != null) {
                  var8.whenComplete((var1x, var2x) -> {
                     if (var2x != null) {
                        var9.completeExceptionally(var2x);
                     } else {
                        var9.complete(null);
                     }
                  });
               } else {
                  var9.completeExceptionally(new RuntimeException("Failed to teleport player to world " + var4.getName()));
               }
            }
         });
      }

      class="kw">private void teleportToPosition(@Nonnull Ref<EntityStore> var1, @Nonnull Teleport var2, @Nonnull CommandBuffer<EntityStore> var3) {
         TransformComponent var4 = var3.getComponent(var1, this.transformComponentType);
         assert var4 != null;
         PlayerRef var5 = var3.getComponent(var1, this.playerRefComponentType);
         assert var5 != null;
         Player var6 = var3.getComponent(var1, this.playerComponentType);
         assert var6 != null;
         var3.ensureAndGetComponent(var1, this.pendingTeleportComponentType);
         Vector3d var7 = var2.getPosition();
         Rotation3f var8 = var2.getRotation();
         var4.teleportPosition(var7);
         var4.teleportRotation(var8);
         HeadRotation var9 = var3.getComponent(var1, this.headRotationComponentType);
         if (var9 != null) {
            Rotation3f var10 = var2.getHeadRotation();
            var9.teleportRotation(var10 != null ? var10 : var8);
         }

         TeleportRecord var16 = var3.ensureAndGetComponent(var1, TeleportRecord.getComponentType());
         World var11 = var3.getExternalData().getWorld();
         Location var12 = new Location(var11.getName(), new Vector3d(var7), new Rotation3f(var8));
         Location var13 = new Location(var11.getName(), new Vector3d(var7), new Rotation3f(var8));
         var16.setLastTeleport(new TeleportRecord.Entry(var12, var13, System.nanoTime()));
         var6.getWindowManager().validateWindows(var1, var3);
         Rotation3f var14 = var9 != null ? var9.getRotation() : var4.getRotation();
         if (!var6.isWaitingForClientReady()) {
            TeleportSystems.queueAndSendClientTeleport(var5, var4.getPosition(), var4.getRotation(), var14, var2.isResetVelocity());
         }

         CompletableFuture var15 = var2.getOnComplete();
         if (var15 != null) {
            var15.complete(null);
         }

         var3.removeComponent(var1, this.teleportComponentType);
      }
   }
}