TickingSystem class

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

Файл: com/hypixel/hytale/server/core/modules/entity/system/UpdateLocationSystems.java

extends: EntityTickingSystem<EntityStore>

Поля (4)

МодификаторыТипИмя
World var6
Ref var7
TransformComponent var8
Dirty var9

Методы (2)

МодификаторыВозвратСигнатура
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
public void tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5)

Исходный код

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

class="kw">import com.hypixel.hytale.common.util.CompletableFutureUtil;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
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.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.RefSystem;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.entity.Dirty;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
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.chunk.section.ChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.EntitySection;
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 com.hypixel.hytale.server.core.universe.world.storage.IChunkSaver;
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 UpdateLocationSystems {
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_GENERAL_PLAYER_IN_INVALID_CHUNK = Message.translation("server.general.playerInInvalidChunk");
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();

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

   class="kw">private class="kw">static void updateLocation(
      @Nonnull Ref<EntityStore> var0, @Nonnull TransformComponent var1, @Nullable Dirty var2, @Nullable World var3, @Nonnull CommandBuffer<EntityStore> var4
   ) {
      if (var3 != null) {
         Vector3d var5 = var1.getPosition();
         if (var5.y() < -32.0 && !var4.getArchetype(var0).contains(Player.getComponentType())) {
            LOGGER.at(Level.WARNING).log("Unable to move entity below the world! %d < %s", -32, var5);
            var4.removeEntity(var0, RemoveReason.REMOVE);
         } else {
            if (var2 != null && var1.pollMovedEnoughToSave()) {
               var2.markDirty();
            }

            ChunkStore var6 = var3.getChunkStore();
            Store var7 = var6.getStore();
            int var8 = ChunkUtil.chunkCoordinate(var5.x());
            int var9 = ChunkUtil.chunkCoordinate(var5.y());
            int var10 = ChunkUtil.chunkCoordinate(var5.z());
            Ref var11 = var1.getSectionRef();
            boolean var12 = false;
            int var13 = 0;
            int var14 = 0;
            int var15 = 0;
            if (var11 != null && var11.isValid()) {
               ChunkSection var16 = var7.getComponent(var11, ChunkSection.getComponentType());
               if (var16 != null) {
                  var12 = true;
                  var13 = var16.getX();
                  var14 = var16.getY();
                  var15 = var16.getZ();
               }
            }

            if (!var12 || var13 != var8 || var15 != var10 || var14 != var9) {
               Ref var19 = var6.getChunkSectionReference(var8, var9, var10);
               if (var19 != null && var19.isValid()) {
                  updateSection(var0, var1, var2, var11, var19, null, var7, var4);
               } else {
                  boolean var17 = var4.getArchetype(var0).contains(Player.getComponentType());
                  if (var17) {
                     Ref var18 = var6.getChunkReference(ChunkUtil.indexChunkFromBlock(var1.getPosition().x, var1.getPosition().z));
                     if (var18 != null) {
                        updateSection(var0, var1, var2, var11, var19, var18, var7, var4);
                        class="kw">return;
                     }
                  }

                  LOGGER.at(Level.WARNING).log("Entity has moved into a chunk that isn't currently loaded! %d, %d, %d, %s", var8, var9, var10, var1);
                  CompletableFutureUtil._catch(var6.getChunkSectionReferenceAsync(var8, var9, var10).thenAcceptAsync(var2x -> {
                     if (var2x != null && var2x.isValid()) {
                        updateSectionAsync(var0, (Ref<ChunkStore>)var2x, var7);
                     } else {
                        updateSectionAsync(var0, null, var7);
                     }
                  }, var3));
               }
            }
         }
      }
   }

   class="kw">private class="kw">static void updateSectionAsync(@Nonnull Ref<EntityStore> var0, @Nullable Ref<ChunkStore> var1, @Nonnull Store<ChunkStore> var2) {
      if (var0.isValid()) {
         Store var3 = var0.getStore();
         TransformComponent var4 = var3.getComponent(var0, TransformComponent.getComponentType());
         assert var4 != null;
         Dirty var5 = var3.getComponent(var0, Dirty.getComponentType());
         Ref var6 = var4.getSectionRef();
         updateSection(var0, var4, var5, var6, var1, null, var2, var3);
      }
   }

   class="kw">private class="kw">static void updateSection(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull TransformComponent var1,
      @Nullable Dirty var2,
      @Nullable Ref<ChunkStore> var3,
      @Nullable Ref<ChunkStore> var4,
      @Nullable Ref<ChunkStore> var5,
      @Nonnull ComponentAccessor<ChunkStore> var6,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      boolean var8 = var7.getArchetype(var0).contains(Player.getComponentType());
      if (var4 == null) {
         handleInvalidChunk(var0, var1, var8, var5, var7);
      } else {
         if (!var8) {
            updateEntityInChunk(var0, var2, var3, var4, var6, var7);
         }

         var1.setSectionLocation(var4);
      }
   }

   class="kw">private class="kw">static void handleInvalidChunk(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull TransformComponent var1,
      boolean var2,
      @Nullable Ref<ChunkStore> var3,
      @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (!var2) {
         LOGGER.at(Level.SEVERE).log("Entity is in a chunk that can't be loaded! Removing! %s", var1);
         var4.removeEntity(var0, EntityStore.REGISTRY.newHolder(), RemoveReason.REMOVE);
      } else {
         var1.setSectionLocation(null);
         Ref var5 = var3 != null
            ? var3
            : var4.getExternalData().getWorld().getChunkStore().getChunkReference(ChunkUtil.indexChunkFromBlock(var1.getPosition().x, var1.getPosition().z));
         if (var5 != null) {
            class="kw">return;
         }

         LOGGER.at(Level.SEVERE).log("Player is in a chunk that can't be loaded! Moving (-%d,0,0)! %s", 32, var1);
         Vector3d var6 = var1.getPosition();
         Vector3d var7 = new Vector3d(var6).sub(32.0, 0.0, 0.0);
         Rotation3f var8 = var1.getRotation();
         Teleport var9 = Teleport.createForPlayer(var7, var8);
         var4.addComponent(var0, Teleport.getComponentType(), var9);
         PlayerRef var10 = var4.getComponent(var0, PlayerRef.getComponentType());
         if (var10 != null) {
            var10.sendMessage(MESSAGE_GENERAL_PLAYER_IN_INVALID_CHUNK);
         }
      }
   }

   class="kw">private class="kw">static void updateEntityInChunk(
      @Nonnull Ref<EntityStore> var0,
      @Nullable Dirty var1,
      @Nullable Ref<ChunkStore> var2,
      @Nonnull Ref<ChunkStore> var3,
      @Nonnull ComponentAccessor<ChunkStore> var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      if (var2 != null && var2.isValid()) {
         EntitySection var6 = var4.getComponent(var2, EntitySection.getComponentType());
         assert var6 != null;
         var6.removeEntityReference(var0);
      }

      EntitySection var8 = var4.getComponent(var3, EntitySection.getComponentType());
      assert var8 != null;
      if (var1 != null) {
         if (!(var4.getExternalData().getSaver() class="kw">instanceof IChunkSaver.Cubic)) {
            var1.setSection(var8);
         } else {
            var1.setSection(null);
         }

         var1.forceMarkDirty();
      }

      if (var4.getArchetype(var3).contains(ChunkStore.REGISTRY.getNonTickingComponentType())) {
         Holder var7 = EntityStore.REGISTRY.newHolder();
         var5.removeEntity(var0, var7, RemoveReason.UNLOAD);
         var8.addEntityHolder(var7);
      } else {
         var8.addEntityReference(var0);
      }
   }

   class="kw">public class="kw">static class SpawnSystem class="kw">extends RefSystem<EntityStore> {
      class="kw">public SpawnSystem() {
      }

      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return TransformComponent.getComponentType();
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         TransformComponent var5 = var4.getComponent(var1, TransformComponent.getComponentType());
         assert var5 != null;
         Dirty var6 = var4.getComponent(var1, Dirty.getComponentType());
         Ref var7 = var5.getSectionRef();
         if (var7 == null || !var7.isValid()) {
            UpdateLocationSystems.updateLocation(var1, var5, var6, var3.getExternalData().getWorld(), var4);
         }
      }

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

   class="kw">public class="kw">static class TickingSystem class="kw">extends EntityTickingSystem<EntityStore> {
      class="kw">public TickingSystem() {
      }

      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return TransformComponent.getComponentType();
      }

      @Override
      class="kw">public void tick(
         float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
      ) {
         World var6 = var5.getExternalData().getWorld();
         Ref var7 = var3.getReferenceTo(var2);
         TransformComponent var8 = var3.getComponent(var2, TransformComponent.getComponentType());
         assert var8 != null;
         Dirty var9 = var3.getComponent(var2, Dirty.getComponentType());
         UpdateLocationSystems.updateLocation(var7, var8, var9, var6, var5);
      }
   }
}