LoadBlockSection class

Пакет: com.hypixel.hytale.server.core.universe.world.chunk.systems

Файл: com/hypixel/hytale/server/core/universe/world/chunk/systems/ChunkSystems.java

extends: HolderSystem<ChunkStore>

Поля (1)

МодификаторыТипИмя
BlockSection var4

Методы (3)

МодификаторыВозвратСигнатура
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
public void onEntityAddpublic void onEntityAdd(@Nonnull Holder<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3)
public void onEntityRemovedpublic void onEntityRemoved(@Nonnull Holder<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3)

Исходный код

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

class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
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.NonTicking;
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.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.RootDependency;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.HolderSystem;
class="kw">import com.hypixel.hytale.component.system.RefChangeSystem;
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.component.system.tick.RunWhenPausedSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.protocol.CachedPacket;
class="kw">import com.hypixel.hytale.protocol.packets.world.ServerSetBlock;
class="kw">import com.hypixel.hytale.protocol.packets.world.ServerSetBlocks;
class="kw">import com.hypixel.hytale.protocol.packets.world.SetBlockCmd;
class="kw">import com.hypixel.hytale.protocol.packets.world.SetChunk;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.player.ChunkTracker;
class="kw">import com.hypixel.hytale.server.core.modules.migrations.ChunkColumnMigrationSystem;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockComponentChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.EntityChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockComponentSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
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 it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.IntIterator;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectListIterator;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collection;
class="kw">import java.util.Iterator;
class="kw">import java.util.Set;
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">public class ChunkSystems {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final int MAX_CHANGES_PER_PACKET = 1024;

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

   class="kw">public class="kw">static class EnsureSection class="kw">extends HolderSystem<ChunkStore> {
      class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(
         ChunkSection.getComponentType(),
         Query.or(Query.not(BlockSection.getComponentType()), Query.not(EntitySection.getComponentType()), Query.not(BlockComponentSection.getComponentType()))
      );

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

      @Override
      class="kw">public void onEntityAdd(@Nonnull Holder<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3) {
         var1.ensureComponent(BlockSection.getComponentType());
         var1.ensureComponent(EntitySection.getComponentType());
         var1.ensureComponent(BlockComponentSection.getComponentType());
      }

      @Override
      class="kw">public void onEntityRemoved(@Nonnull Holder<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3) {
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return QUERY;
      }

      @Nonnull
      @Override
      class="kw">public Set<Dependency<ChunkStore>> getDependencies() {
         class="kw">return RootDependency.firstSet();
      }
   }

   class="kw">public class="kw">static class LoadBlockSection class="kw">extends HolderSystem<ChunkStore> {
      class="kw">public LoadBlockSection() {
      }

      @Override
      class="kw">public void onEntityAdd(@Nonnull Holder<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3) {
         BlockSection var4 = var1.getComponent(BlockSection.getComponentType());
         assert var4 != null;
         var4.loaded = true;
      }

      @Override
      class="kw">public void onEntityRemoved(@Nonnull Holder<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3) {
      }

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

   class="kw">public class="kw">static class MigrateBlockComponentChunk class="kw">extends ChunkColumnMigrationSystem {
      class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(ChunkColumn.getComponentType(), BlockComponentChunk.getComponentType());

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

      @Override
      class="kw">public void onEntityAdd(@Nonnull Holder<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3) {
         ChunkColumn var4 = var1.getComponent(ChunkColumn.getComponentType());
         assert var4 != null;
         BlockComponentChunk var5 = var1.getComponent(BlockComponentChunk.getComponentType());
         assert var5 != null;
         Holder[] var6 = var4.getSectionHolders();
         if (var6 != null) {
            var1.removeComponent(BlockComponentChunk.getComponentType());
            Int2ObjectMap var7 = var5.takeEntityHolders();
            if (var7 != null) {
               ObjectIterator var8 = var7.int2ObjectEntrySet().iterator();

               while (var8.hasNext()) {
                  Entry var9 = (Entry<Holder<ChunkStore>>)var8.next();
                  int var10 = var9.getIntKey();
                  int var11 = xFromBlockInColumn(var10);
                  int var12 = yFromBlockInColumn(var10);
                  int var13 = zFromBlockInColumn(var10);
                  int var14 = ChunkUtil.chunkCoordinate(var12);
                  if (var14 < var6.length && var6[var14] != null) {
                     BlockComponentSection var15 = var6[var14].ensureAndGetComponent(BlockComponentSection.getComponentType());
                     short var16 = (short)ChunkUtil.indexBlock(var11, var12, var13);
                     if (var15.hasBlockComponents(var16)) {
                        ChunkSystems.LOGGER
                           .at(Level.WARNING)
                           .log("Dropping block components at (%d, %d, %d): the section already has block components", var11, var12, var13);
                     } else {
                        var15.addBlockHolder(var16, (Holder<ChunkStore>)var9.getValue());
                     }
                  } else {
                     ChunkSystems.LOGGER
                        .at(Level.WARNING)
                        .log("Dropping block components at (%d, %d, %d): the column has no section %d", var11, var12, var13, var14);
                  }
               }
            }
         }
      }

      @Override
      class="kw">public void onEntityRemoved(@Nonnull Holder<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3) {
      }

      @Nullable
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return QUERY;
      }

      class="kw">private class="kw">static int xFromBlockInColumn(int var0) {
         class="kw">return var0 & 31;
      }

      class="kw">private class="kw">static int yFromBlockInColumn(int var0) {
         class="kw">return var0 >> 10 & ChunkUtil.HEIGHT_MASK;
      }

      class="kw">private class="kw">static int zFromBlockInColumn(int var0) {
         class="kw">return var0 >> 5 & 31;
      }
   }

   class="kw">public class="kw">static class MigrateEntityChunk class="kw">extends ChunkColumnMigrationSystem {
      class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(ChunkColumn.getComponentType(), EntityChunk.getComponentType());

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

      @Override
      class="kw">public void onEntityAdd(@Nonnull Holder<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3) {
         ChunkColumn var4 = var1.getComponent(ChunkColumn.getComponentType());
         assert var4 != null;
         EntityChunk var5 = var1.getComponent(EntityChunk.getComponentType());
         assert var5 != null;
         Holder[] var6 = var4.getSectionHolders();
         if (var6 != null) {
            var1.removeComponent(EntityChunk.getComponentType());
            Holder[] var7 = var5.takeEntityHolders();
            if (var7 != null && var7.length != 0) {
               ObjectArrayList var8 = new ObjectArrayList(var7);

               for (int var9 = 0; var9 < var6.length; var9++) {
                  Holder var10 = var6[var9];
                  if (var10 != null) {
                     EntitySection var11 = var10.ensureAndGetComponent(EntitySection.getComponentType());
                     if (var8.isEmpty()) {
                        break;
                     }

                     ObjectListIterator var12 = var8.iterator();

                     while (var12.hasNext()) {
                        Holder var13 = (Holder<EntityStore>)var12.next();
                        TransformComponent var14 = var13.getComponent(TransformComponent.getComponentType());
                        if (var14 == null) {
                           var11.addEntityHolder(var13);
                           var12.remove();
                        } else if (ChunkUtil.chunkCoordinate(var14.getPosition().y) == var9) {
                           var11.addEntityHolder(var13);
                           var12.remove();
                        }
                     }
                  }
               }
            }
         }
      }

      @Override
      class="kw">public void onEntityRemoved(@Nonnull Holder<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3) {
      }

      @Nullable
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return QUERY;
      }
   }

   class="kw">public class="kw">static class OnChunkLoad class="kw">extends RefSystem<ChunkStore> {
      class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(ChunkColumn.getComponentType(), WorldChunk.getComponentType());

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

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         ChunkColumn var5 = var4.getComponent(var1, ChunkColumn.getComponentType());
         assert var5 != null;
         Ref[] var6 = var5.getSections();
         Holder[] var7 = new Holder[var6.length];

         for (int var8 = 0; var8 < var6.length; var8++) {
            Ref var9 = var6[var8];
            var7[var8] = ChunkStore.REGISTRY.newHolder();
            var4.removeEntity(var9, var7[var8], var2);
         }

         var5.putSectionHolders(var7);
         Arrays.fill(var6, null);
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return QUERY;
      }
   }

   class="kw">public class="kw">static class OnNonTicking class="kw">extends RefChangeSystem<ChunkStore, NonTicking<ChunkStore>> {
      class="kw">private class="kw">final Archetype<ChunkStore> archetype = Archetype.of(WorldChunk.getComponentType(), ChunkColumn.getComponentType());

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

      @Nonnull
      @Override
      class="kw">public ComponentType<ChunkStore, NonTicking<ChunkStore>> componentType() {
         class="kw">return ChunkStore.REGISTRY.getNonTickingComponentType();
      }

      class="kw">public void onComponentAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         ChunkColumn var5 = var4.getComponent(var1, ChunkColumn.getComponentType());
         assert var5 != null;
         Ref[] var6 = var5.getSections();

         for (int var7 = 0; var7 < var6.length; var7++) {
            Ref var8 = var6[var7];
            var4.ensureComponent(var8, ChunkStore.REGISTRY.getNonTickingComponentType());
         }
      }

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

      class="kw">public void onComponentRemoved(
         @Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         ChunkColumn var5 = var4.getComponent(var1, ChunkColumn.getComponentType());
         assert var5 != null;
         Ref[] var6 = var5.getSections();

         for (int var7 = 0; var7 < var6.length; var7++) {
            Ref var8 = var6[var7];
            var4.tryRemoveComponent(var8, ChunkStore.REGISTRY.getNonTickingComponentType());
         }
      }

      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return this.archetype;
      }
   }

   class="kw">public class="kw">static class ReplicateChanges class="kw">extends EntityTickingSystem<ChunkStore> class="kw">implements RunWhenPausedSystem<ChunkStore> {
      class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(ChunkSection.getComponentType(), BlockSection.getComponentType());

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

      @Override
      class="kw">public boolean isParallel(int var1, int var2) {
         class="kw">return EntityTickingSystem.maybeUseParallel(var1, var2);
      }

      @Override
      class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5) {
         BlockSection var6 = var3.getComponent(var2, BlockSection.getComponentType());
         assert var6 != null;
         IntOpenHashSet var7 = var6.getAndClearChangedPositions();
         if (!var7.isEmpty()) {
            ChunkSection var8 = var3.getComponent(var2, ChunkSection.getComponentType());
            assert var8 != null;
            Collection var9 = var4.getExternalData().getWorld().getPlayerRefs();
            if (var9.isEmpty()) {
               var7.clear();
            } else if (var7.size() >= 1024) {
               ObjectArrayList var23 = new ObjectArrayList(var9);
               CompletableFuture var25 = var6.getCachedChunkPacket(var8.getX(), var8.getY(), var8.getZ());
               var25.thenAccept(var2x -> {
                  Iterator var3 = var23.iterator();

                  while (var3.hasNext()) {
                     PlayerRef var4 = (PlayerRef)var3.next();
                     Ref var5 = var4.getReference();
                     if (var5 != null) {
                        ChunkTracker var6 = var4.getChunkTracker();
                        if (var6.isLoaded(var8.getX(), var8.getY(), var8.getZ())) {
                           var4.getPacketHandler().writeNoCache(var2x);
                        }
                     }
                  }
               }).exceptionally(var0 -> {
                  if (var0 != null) {
                     ((HytaleLogger.Api)ChunkSystems.LOGGER.at(Level.SEVERE).withCause(var0)).log("Exception when compressing chunk fluids:");
                  }

                  class="kw">return null;
               });
               var7.clear();
            } else {
               if (var7.size() == 1) {
                  int var10 = var7.iterator().nextInt();
                  int var11 = ChunkUtil.minBlock(var8.getX()) + ChunkUtil.xFromIndex(var10);
                  int var12 = ChunkUtil.minBlock(var8.getY()) + ChunkUtil.yFromIndex(var10);
                  int var13 = ChunkUtil.minBlock(var8.getZ()) + ChunkUtil.zFromIndex(var10);
                  int var14 = var6.get(var10);
                  int var15 = var6.getFiller(var10);
                  int var16 = var6.getRotationIndex(var10);
                  ServerSetBlock var17 = new ServerSetBlock(var11, var12, var13, var14, (short)var15, (byte)var16);

                  for (PlayerRef var19 : var9) {
                     Ref var20 = var19.getReference();
                     if (var20 != null) {
                        ChunkTracker var21 = var19.getChunkTracker();
                        if (var21.isLoaded(var8.getX(), var8.getY(), var8.getZ())) {
                           var19.getPacketHandler().writeNoCache(var17);
                        }
                     }
                  }
               } else {
                  SetBlockCmd[] var22 = new SetBlockCmd[var7.size()];
                  IntIterator var24 = var7.intIterator();
                  int var26 = 0;

                  while (var24.hasNext()) {
                     int var27 = var24.nextInt();
                     int var29 = var6.get(var27);
                     int var31 = var6.getFiller(var27);
                     int var33 = var6.getRotationIndex(var27);
                     var22[var26++] = new SetBlockCmd((short)var27, var29, (short)var31, (byte)var33);
                  }

                  ServerSetBlocks var28 = new ServerSetBlocks(var8.getX(), var8.getY(), var8.getZ(), var22);

                  for (PlayerRef var32 : var9) {
                     Ref var34 = var32.getReference();
                     if (var34 != null) {
                        ChunkTracker var35 = var32.getChunkTracker();
                        if (var35.isLoaded(var8.getX(), var8.getY(), var8.getZ())) {
                           var32.getPacketHandler().writeNoCache(var28);
                        }
                     }
                  }
               }

               var7.clear();
            }
         }
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return QUERY;
      }

      @Nonnull
      @Override
      class="kw">public Set<Dependency<ChunkStore>> getDependencies() {
         class="kw">return RootDependency.lastSet();
      }
   }
}