BlockSection class

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

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

implements: Component<ChunkStore>

Поля (134)

МодификаторыТипИмя
return this.tickingBlocksCount > 0
final int VERSION
break
private final ComponentType<ChunkStore, BlockSection> componentType
private final Query<ChunkStore> query
return
long var1
long var1
var1
long var1
var1
long var1
var1
long var1
var1
long var1
double var1
long var1
int var10
int var10
PaletteType var10
MemorySegment var10
PaletteType var10
SetChunk var10
BlockTickStrategy var11
int var11
byte var11
int var11
int var11
MemorySegment var11
long var12
BlockType var12
final Function var12
BlockBoundingBoxes var13
long[] var13
boolean var14
var14
double var14
AbstractSectionPalette.SetResult var17
AbstractSectionPalette.SetResult var18
long var2
var2
long var2
var2
long var2
var2
long var2
var2
long var2
var2
long var2
var2
long var2
long var2
BlockSection.TickRequest var2
long var2
int var20
PaletteTypeEnum var21
PaletteTypeEnum var22
IntOpenHashSet var3
int var3
IntSet var3
Int2ShortMap var3
boolean var3
long var3
long var3
long var3
long var3
long var3
double var3
var3
byte[] var3
MemorySegment var3
String var3
int var4
int var4
int var4
boolean var4
boolean var4
int var4
long var4
MemorySegment var4
PaletteType var4
int var4
SoftReference var4
var4
var4
long var5
int var5
int var5
long var5
PaletteType var5
BitSet var5
var5
var5
int var5
CompletableFuture var5
var5
byte[] var5
var5
var5
long var6
int var6
byte var6
long[] var6
var6
var6
Function var6
var6
var6
byte[] var6
var6
int var7
IndexedLookupTableAssetMap var7
int var7
ChunkLightData var7
Map var7
ChunkLightData var7
BlockSection var7
AbstractSectionPalette.SetResult var8
var8
var8
int var8
BlockTypeAssetMap var8
PaletteType var8
ChunkLightData var8
MemorySegment var8
ChunkSection var8
AbstractSectionPalette.SetResult var9
int var9
byte var9
byte[] var9
PaletteTypeEnum var9
ChunkLightData var9

Методы (101)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Version not supported: " + var4)
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Promoted chunk section failed to correctly add the new block!")
public LoadBlockSectionPacketSystempublic LoadBlockSectionPacketSystem(ComponentType<ChunkStore, BlockSection> var1)
private record TickRequestrecord TickRequest(int index, @Nonnull Instant requestedGameTime)
abstract throw new UnsupportedOperationExceptionthrow new UnsupportedOperationException("Not implemented!")
public boolean containsboolean contains(int var1)
public boolean containsAnyboolean containsAny(IntList var1)
public int countint count()
public int countint count(int var1)
public int deserializepublic int deserialize(MemorySegment var1, int var2)
public int deserializepublic int deserialize(MemorySegment var1, int var2)
public void deserializevoid deserialize(@Nonnull byte[] var1, @Nonnull ExtraInfo var2)
public int deserializepublic int deserialize(MemorySegment var1, int var2x)
public void fetchpublic void fetch(int var1, @Nonnull ArchetypeChunk<ChunkStore> var2, Store<ChunkStore> var3, CommandBuffer<ChunkStore> var4, PlayerRef var5, @Nonnull List<CompletableFuture<ToClientPacket>> var6)
public void findvoid find(IntList var1, IntConsumer var2)
public void findvoid find(IntList var1, BiIntConsumer var2)
for for(int var9 = 0; var9 < 32768; var9++)
abstract for for(int var6 = 0; var6 < var1.size()
abstract for for(int var7 = this.tickingBlocksCopy.nextSetBit(0)
abstract for for(BlockMigration var8 = var7.get(var5)
public <T, V> int forEachTicking<T, V> int forEachTicking(T var1, V var2, int var3, @Nonnull ObjectPositionBlockFunction<T, V, BlockTickStrategy> var4)
public void forEachValuevoid forEachValue(IntConsumer var1)
public int getint get(int var1)
public int getint get(int var1, int var2, int var3)
public AbstractSectionPalette getChunkSectionAbstractSectionPalette getChunkSection()
static ComponentType<ChunkStore, BlockSection> getComponentTypeComponentType<ChunkStore, BlockSection> getComponentType()
public int getFillerint getFiller(int var1)
public int getFillerint getFiller(int var1, int var2, int var3)
public short getGlobalChangeCountershort getGlobalChangeCounter()
public ChunkLightData getGlobalLightChunkLightData getGlobalLight()
public short getLocalChangeCountershort getLocalChangeCounter()
public ChunkLightData getLocalLightChunkLightData getLocalLight()
public double getMaximumHitboxExtentdouble getMaximumHitboxExtent()
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
public RotationTuple getRotationRotationTuple getRotation(int var1)
public RotationTuple getRotationRotationTuple getRotation(int var1, int var2, int var3)
public int getRotationIndexint getRotationIndex(int var1)
public int getRotationIndexint getRotationIndex(int var1, int var2, int var3)
public int getTickingBlocksCountint getTickingBlocksCount()
public int getTickingBlocksCountCopyint getTickingBlocksCountCopy()
public boolean hasGlobalLightboolean hasGlobalLight()
public boolean hasLocalLightboolean hasLocalLight()
public boolean hasTickingboolean hasTicking()
if if(var3 >= 0 && var3 < RotationTuple.VALUES.length)
if if(var8 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE)
if if(var9 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED)
if if(var8 == AbstractSectionPalette.SetResult.ADDED_OR_REMOVED)
if if(var8 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE)
if if(var17 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED)
if if(var8 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE)
if if(var18 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED)
if if(var14 && this.loaded)
if if(var14)
if if(var2)
if if(var2)
if if(this.tickingBlocksCount > 0)
if if(var2 != null)
if if(this.tickingBlocksCount != 0)
if if(this.tickingBlocksCountCopy == 0)
if if(var1 != -1.0)
if if(var10 != 0)
if if(var13 != BlockBoundingBoxes.UNIT_BOX)
if if(var14 > var3)
if if(var4 != PaletteType.Empty)
if if(var4 != PaletteType.Empty)
if if(var4 < 6)
if if(var6 == null)
if if(var6 != null)
if if(var10 != PaletteType.Empty)
if if(var5 != null)
if if(var1x != null)
public void invalidatevoid invalidate()
public void invalidateGlobalLightvoid invalidateGlobalLight()
public void invalidateLocalLightvoid invalidateLocalLight()
public boolean isSolidAirboolean isSolidAir()
public boolean isTickingboolean isTicking(int var1)
public boolean isTickingboolean isTicking(int var1, int var2, int var3)
public int keySizepublic int keySize(int var1)
public int keySizepublic int keySize(int var1)
public int keySizepublic int keySize(MemorySegment var1, int var2)
public int keySizepublic int keySize(MemorySegment var1, int var2)
public int keySizepublic int keySize(MemorySegment var1, int var2x)
public void mergeTickingBlocksvoid mergeTickingBlocks()
public void preTickvoid preTick(Instant var1)
public void scheduleTickvoid scheduleTick(int var1, @Nullable Instant var2)
public int serializepublic int serialize(MemorySegment var1, int var2, int var3)
public int serializepublic int serialize(MemorySegment var1, int var2, int var3)
public byte[] serializebyte[] serialize(ExtraInfo var1)
public byte[] serializeForPacketbyte[] serializeForPacket()
public boolean setboolean set(int var1, int var2, int var3, int var4)
public boolean setboolean set(int var1, int var2, int var3, int var4, int var5, int var6)
public void setChunkSectionvoid setChunkSection(AbstractSectionPalette var1)
public void setGlobalLightvoid setGlobalLight(@Nonnull ChunkLightDataBuilder var1)
public void setLocalLightvoid setLocalLight(@Nonnull ChunkLightDataBuilder var1)
public boolean setTickingboolean setTicking(int var1, boolean var2)
public int setTickingint setTicking(@Nonnull IntList var1, boolean var2)
public boolean setTickingboolean setTicking(int var1, int var2, int var3, boolean var4)
switch switch(var11)
abstract this this(EmptySectionPalette.INSTANCE, EmptySectionPalette.INSTANCE, EmptySectionPalette.INSTANCE)
public Int2ShortMap valueCountsInt2ShortMap valueCounts()
public IntSet valuesIntSet values()

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.common.util.BitSetUtil;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.function.consumer.BiIntConsumer;
class="kw">import com.hypixel.hytale.function.predicate.ObjectPositionBlockFunction;
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.ToClientPacket;
class="kw">import com.hypixel.hytale.protocol.packets.world.PaletteType;
class="kw">import com.hypixel.hytale.protocol.packets.world.SetChunk;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.BlockTickStrategy;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockMigration;
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.modules.LegacyModule;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.palette.AbstractSectionPalette;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.palette.EmptySectionPalette;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.palette.PaletteTypeEnum;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.util.io.MemorySegmentUtil;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ShortMap;
class="kw">import it.unimi.dsi.fastutil.ints.IntList;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue;
class="kw">import java.lang.foreign.MemorySegment;
class="kw">import java.lang.foreign.ValueLayout;
class="kw">import java.lang.ref.SoftReference;
class="kw">import java.time.Instant;
class="kw">import java.util.BitSet;
class="kw">import java.util.Comparator;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.locks.StampedLock;
class="kw">import java.util.function.Function;
class="kw">import java.util.function.IntConsumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class BlockSection class="kw">implements Component<ChunkStore> {
   class="kw">public class="kw">static class="kw">final int VERSION = 6;
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static class="kw">final BuilderCodec<BlockSection> CODEC = BuilderCodec.<BlockSection>builder(BlockSection.class, BlockSection::new)
      .versioned()
      .codecVersion(6)
      .append(new KeyedCodec<>("Data", Codec.BYTE_ARRAY), BlockSection::deserialize, BlockSection::serialize)
      .add()
      .build();
   class="kw">private class="kw">final StampedLock chunkSectionLock = new StampedLock();
   class="kw">public boolean loaded = false;
   @Nonnull
   class="kw">private IntOpenHashSet changedPositions = new IntOpenHashSet(0);
   @Nonnull
   class="kw">private IntOpenHashSet swapChangedPositions = new IntOpenHashSet(0);
   class="kw">private AbstractSectionPalette chunkSection;
   class="kw">private AbstractSectionPalette fillerSection;
   class="kw">private AbstractSectionPalette rotationSection;
   class="kw">private ChunkLightData localLight;
   class="kw">private short localChangeCounter;
   class="kw">private ChunkLightData globalLight;
   class="kw">private short globalChangeCounter;
   class="kw">private BitSet tickingBlocks;
   class="kw">private class="kw">final BitSet tickingBlocksCopy;
   @Nonnull
   class="kw">private class="kw">final BitSet tickingWaitAdjacentBlocks;
   class="kw">private int tickingBlocksCount;
   class="kw">private int tickingBlocksCountCopy;
   class="kw">private int tickingWaitAdjacentBlockCount;
   class="kw">private class="kw">final ObjectHeapPriorityQueue<BlockSection.TickRequest> tickRequests;
   class="kw">private double maximumHitboxExtent;
   @Nullable
   class="kw">private class="kw">transient SoftReference<CompletableFuture<CachedPacket<SetChunk>>> cachedChunkPacket;
   class="kw">private class="kw">static class="kw">final AbstractSectionPalette.KeyMemorySerializer FILLER_SERIALIZER = new AbstractSectionPalette.KeyMemorySerializer() {
      @Override
      class="kw">public int serialize(MemorySegment var1, int var2, int var3) {
         var1.set(MemorySegmentUtil.SHORT_BE, var2, (short)var3);
         class="kw">return 2;
      }

      @Override
      class="kw">public int keySize(int var1) {
         class="kw">return 2;
      }
   };
   class="kw">private class="kw">static class="kw">final AbstractSectionPalette.KeyMemorySerializer ROTATION_SERIALIZER = new AbstractSectionPalette.KeyMemorySerializer() {
      @Override
      class="kw">public int serialize(MemorySegment var1, int var2, int var3) {
         var1.set(ValueLayout.JAVA_BYTE, var2, (byte)var3);
         class="kw">return 1;
      }

      @Override
      class="kw">public int keySize(int var1) {
         class="kw">return 1;
      }
   };
   class="kw">private class="kw">static class="kw">final AbstractSectionPalette.KeyMemoryDeserializer FILLER_DESERIALIZER = new AbstractSectionPalette.KeyMemoryDeserializer() {
      @Override
      class="kw">public int deserialize(MemorySegment var1, int var2) {
         class="kw">return Short.toUnsignedInt(var1.get(MemorySegmentUtil.SHORT_BE, var2));
      }

      @Override
      class="kw">public int keySize(MemorySegment var1, int var2) {
         class="kw">return 2;
      }
   };
   class="kw">private class="kw">static class="kw">final AbstractSectionPalette.KeyMemoryDeserializer ROTATION_DESERIALIZER = new AbstractSectionPalette.KeyMemoryDeserializer() {
      @Override
      class="kw">public int deserialize(MemorySegment var1, int var2) {
         class="kw">return Byte.toUnsignedInt(var1.get(ValueLayout.JAVA_BYTE, var2));
      }

      @Override
      class="kw">public int keySize(MemorySegment var1, int var2) {
         class="kw">return 1;
      }
   };
   class="kw">private class="kw">static class="kw">final Comparator<BlockSection.TickRequest> TICK_REQUEST_COMPARATOR = Comparator.comparing(var0 -> var0.requestedGameTime);

   class="kw">public class="kw">static ComponentType<ChunkStore, BlockSection> getComponentType() {
      class="kw">return LegacyModule.get().getBlockSectionComponentType();
   }

   class="kw">public BlockSection() {
      this(EmptySectionPalette.INSTANCE, EmptySectionPalette.INSTANCE, EmptySectionPalette.INSTANCE);
   }

   class="kw">public BlockSection(AbstractSectionPalette var1, AbstractSectionPalette var2, AbstractSectionPalette var3) {
      this.tickRequests = new ObjectHeapPriorityQueue(TICK_REQUEST_COMPARATOR);
      this.maximumHitboxExtent = -1.0;
      this.chunkSection = var1;
      this.fillerSection = var2;
      this.rotationSection = var3;
      this.tickingBlocks = new BitSet();
      this.tickingBlocksCopy = new BitSet();
      this.tickingWaitAdjacentBlocks = new BitSet();
      this.tickingBlocksCount = 0;
      this.tickingBlocksCountCopy = 0;
      this.localLight = ChunkLightData.EMPTY;
      this.localChangeCounter = 0;
      this.globalLight = ChunkLightData.EMPTY;
      this.globalChangeCounter = 0;
   }

   class="kw">public AbstractSectionPalette getChunkSection() {
      class="kw">return this.chunkSection;
   }

   class="kw">public void setChunkSection(AbstractSectionPalette var1) {
      this.chunkSection = var1;
   }

   class="kw">public void setLocalLight(@Nonnull ChunkLightDataBuilder var1) {
      Objects.requireNonNull(var1);
      this.localLight = var1.build();
   }

   class="kw">public void setGlobalLight(@Nonnull ChunkLightDataBuilder var1) {
      Objects.requireNonNull(var1);
      this.globalLight = var1.build();
   }

   class="kw">public ChunkLightData getLocalLight() {
      class="kw">return this.localLight;
   }

   class="kw">public ChunkLightData getGlobalLight() {
      class="kw">return this.globalLight;
   }

   class="kw">public boolean hasLocalLight() {
      class="kw">return this.localLight.getChangeId() == this.localChangeCounter;
   }

   class="kw">public boolean hasGlobalLight() {
      class="kw">return this.globalLight.getChangeId() == this.globalChangeCounter;
   }

   class="kw">public void invalidateLocalLight() {
      this.localChangeCounter++;
      this.invalidateGlobalLight();
   }

   class="kw">public void invalidateGlobalLight() {
      this.globalChangeCounter++;
   }

   class="kw">public short getLocalChangeCounter() {
      class="kw">return this.localChangeCounter;
   }

   class="kw">public short getGlobalChangeCounter() {
      class="kw">return this.globalChangeCounter;
   }

   class="kw">public void invalidate() {
      this.cachedChunkPacket = null;
   }

   class="kw">public int get(int var1) {
      long var2 = this.chunkSectionLock.tryOptimisticRead();
      int var4 = this.chunkSection.get(var1);
      if (!this.chunkSectionLock.validate(var2)) {
         var2 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.get(var1);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var2);
         }
      } else {
         class="kw">return var4;
      }
   }

   class="kw">public int getFiller(int var1) {
      long var2 = this.chunkSectionLock.tryOptimisticRead();
      int var4 = this.fillerSection.get(var1);
      if (!this.chunkSectionLock.validate(var2)) {
         var2 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.fillerSection.get(var1);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var2);
         }
      } else {
         class="kw">return var4;
      }
   }

   class="kw">public int getFiller(int var1, int var2, int var3) {
      class="kw">return this.getFiller(ChunkUtil.indexBlock(var1, var2, var3));
   }

   class="kw">public int getRotationIndex(int var1) {
      long var2 = this.chunkSectionLock.tryOptimisticRead();
      int var4 = this.rotationSection.get(var1);
      if (!this.chunkSectionLock.validate(var2)) {
         var2 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.rotationSection.get(var1);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var2);
         }
      } else {
         class="kw">return var4;
      }
   }

   class="kw">public int getRotationIndex(int var1, int var2, int var3) {
      class="kw">return this.getRotationIndex(ChunkUtil.indexBlock(var1, var2, var3));
   }

   class="kw">public RotationTuple getRotation(int var1) {
      class="kw">return RotationTuple.get(this.getRotationIndex(var1));
   }

   class="kw">public RotationTuple getRotation(int var1, int var2, int var3) {
      class="kw">return this.getRotation(ChunkUtil.indexBlock(var1, var2, var3));
   }

   class="kw">public boolean set(int var1, int var2, int var3, int var4) {
      if (var3 >= 0 && var3 < RotationTuple.VALUES.length) {
         long var6 = this.chunkSectionLock.writeLock();

         boolean var14;
         try {
            AbstractSectionPalette.SetResult var8 = this.chunkSection.set(var1, var2);
            if (var8 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE) {
               this.chunkSection = this.chunkSection.promote();
               AbstractSectionPalette.SetResult var9 = this.chunkSection.set(var1, var2);
               if (var9 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED) {
                  throw new IllegalStateException("Promoted chunk section failed to correctly add the new block!");
               }
            } else {
               if (var8 == AbstractSectionPalette.SetResult.ADDED_OR_REMOVED) {
                  this.maximumHitboxExtent = -1.0;
               }

               if (this.chunkSection.shouldDemote()) {
                  this.chunkSection = this.chunkSection.demote();
               }
            }

            var14 = var8 != AbstractSectionPalette.SetResult.UNCHANGED;
            var8 = this.fillerSection.set(var1, var4);
            if (var8 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE) {
               this.fillerSection = this.fillerSection.promote();
               AbstractSectionPalette.SetResult var17 = this.fillerSection.set(var1, var4);
               if (var17 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED) {
                  throw new IllegalStateException("Promoted chunk section failed to correctly add the new block!");
               }
            } else if (this.fillerSection.shouldDemote()) {
               this.fillerSection = this.fillerSection.demote();
            }

            var14 |= var8 != AbstractSectionPalette.SetResult.UNCHANGED;
            var8 = this.rotationSection.set(var1, var3);
            if (var8 == AbstractSectionPalette.SetResult.REQUIRES_PROMOTE) {
               this.rotationSection = this.rotationSection.promote();
               AbstractSectionPalette.SetResult var18 = this.rotationSection.set(var1, var3);
               if (var18 != AbstractSectionPalette.SetResult.ADDED_OR_REMOVED) {
                  throw new IllegalStateException("Promoted chunk section failed to correctly add the new block!");
               }
            } else if (this.rotationSection.shouldDemote()) {
               this.rotationSection = this.rotationSection.demote();
            }

            var14 |= var8 != AbstractSectionPalette.SetResult.UNCHANGED;
            if (var14 && this.loaded) {
               this.changedPositions.add(var1);
            }
         } class="kw">finally {
            this.chunkSectionLock.unlockWrite(var6);
         }

         if (var14) {
            this.invalidateLocalLight();
         }

         class="kw">return var14;
      } else {
         throw new IllegalArgumentException("Rotation index out of bounds. Got " + var3 + " but expected 0-" + (RotationTuple.VALUES.length - 1));
      }
   }

   @Nonnull
   class="kw">public IntOpenHashSet getAndClearChangedPositions() {
      long var1 = this.chunkSectionLock.writeLock();

      try {
         this.swapChangedPositions.clear();
         IntOpenHashSet var3 = this.changedPositions;
         this.changedPositions = this.swapChangedPositions;
         this.swapChangedPositions = var3;
         class="kw">return var3;
      } class="kw">finally {
         this.chunkSectionLock.unlockWrite(var1);
      }
   }

   class="kw">public boolean contains(int var1) {
      long var2 = this.chunkSectionLock.tryOptimisticRead();
      boolean var4 = this.chunkSection.contains(var1);
      if (!this.chunkSectionLock.validate(var2)) {
         var2 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.contains(var1);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var2);
         }
      } else {
         class="kw">return var4;
      }
   }

   class="kw">public boolean containsAny(IntList var1) {
      long var2 = this.chunkSectionLock.tryOptimisticRead();
      boolean var4 = this.chunkSection.containsAny(var1);
      if (!this.chunkSectionLock.validate(var2)) {
         var2 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.containsAny(var1);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var2);
         }
      } else {
         class="kw">return var4;
      }
   }

   class="kw">public int count() {
      long var1 = this.chunkSectionLock.tryOptimisticRead();
      int var3 = this.chunkSection.count();
      if (!this.chunkSectionLock.validate(var1)) {
         var1 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.count();
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var1);
         }
      } else {
         class="kw">return var3;
      }
   }

   class="kw">public int count(int var1) {
      long var2 = this.chunkSectionLock.tryOptimisticRead();
      int var4 = this.chunkSection.count(var1);
      if (!this.chunkSectionLock.validate(var2)) {
         var2 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.count(var1);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var2);
         }
      } else {
         class="kw">return var4;
      }
   }

   class="kw">public IntSet values() {
      long var1 = this.chunkSectionLock.tryOptimisticRead();
      IntSet var3 = this.chunkSection.values();
      if (!this.chunkSectionLock.validate(var1)) {
         var1 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.values();
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var1);
         }
      } else {
         class="kw">return var3;
      }
   }

   class="kw">public void forEachValue(IntConsumer var1) {
      long var2 = this.chunkSectionLock.readLock();

      try {
         this.chunkSection.forEachValue(var1);
      } class="kw">finally {
         this.chunkSectionLock.unlockRead(var2);
      }
   }

   class="kw">public Int2ShortMap valueCounts() {
      long var1 = this.chunkSectionLock.tryOptimisticRead();
      Int2ShortMap var3 = this.chunkSection.valueCounts();
      if (!this.chunkSectionLock.validate(var1)) {
         var1 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.valueCounts();
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var1);
         }
      } else {
         class="kw">return var3;
      }
   }

   class="kw">public boolean isSolidAir() {
      long var1 = this.chunkSectionLock.tryOptimisticRead();
      boolean var3 = this.chunkSection.isSolid(0);
      if (!this.chunkSectionLock.validate(var1)) {
         var1 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.chunkSection.isSolid(0);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var1);
         }
      } else {
         class="kw">return var3;
      }
   }

   @Deprecated(since = "2026-02-26", forRemoval = true)
   class="kw">public void find(IntList var1, IntSet var2, IntConsumer var3) {
      this.find(var1, var3);
   }

   class="kw">public void find(IntList var1, IntConsumer var2) {
      long var3 = this.chunkSectionLock.readLock();

      try {
         this.chunkSection.find(var1, var2);
      } class="kw">finally {
         this.chunkSectionLock.unlockRead(var3);
      }
   }

   class="kw">public void find(IntList var1, BiIntConsumer var2) {
      long var3 = this.chunkSectionLock.readLock();

      try {
         this.chunkSection.find(var1, var2);
      } class="kw">finally {
         this.chunkSectionLock.unlockRead(var3);
      }
   }

   class="kw">public boolean setTicking(int var1, boolean var2) {
      long var3 = this.chunkSectionLock.readLock();

      try {
         if (this.tickingBlocks.get(var1) == var2) {
            class="kw">return false;
         }
      } class="kw">finally {
         this.chunkSectionLock.unlockRead(var3);
      }

      long var5 = this.chunkSectionLock.writeLock();

      try {
         if (this.tickingBlocks.get(var1) != var2) {
            if (var2) {
               this.tickingBlocksCount++;
            } else {
               this.tickingBlocksCount--;
            }

            this.tickingBlocks.set(var1, var2);
            class="kw">return true;
         } else {
            class="kw">return false;
         }
      } class="kw">finally {
         this.chunkSectionLock.unlockWrite(var5);
      }
   }

   class="kw">public int setTicking(@Nonnull IntList var1, boolean var2) {
      long var3 = this.chunkSectionLock.writeLock();

      try {
         int var5 = 0;

         for (int var6 = 0; var6 < var1.size(); var6++) {
            int var7 = var1.getInt(var6);
            if (this.tickingBlocks.get(var7) != var2) {
               if (var2) {
                  this.tickingBlocksCount++;
               } else {
                  this.tickingBlocksCount--;
               }

               this.tickingBlocks.set(var7, var2);
               var5++;
            }
         }

         class="kw">return var5;
      } class="kw">finally {
         this.chunkSectionLock.unlockWrite(var3);
      }
   }

   class="kw">public int getTickingBlocksCount() {
      class="kw">return this.tickingBlocksCount > 0 ? this.tickingBlocksCount : 0;
   }

   class="kw">public int getTickingBlocksCountCopy() {
      class="kw">return this.tickingBlocksCountCopy;
   }

   class="kw">public boolean hasTicking() {
      class="kw">return this.tickingBlocksCount > 0;
   }

   class="kw">public boolean isTicking(int var1) {
      if (this.tickingBlocksCount > 0) {
         long var2 = this.chunkSectionLock.readLock();

         try {
            class="kw">return this.tickingBlocks.get(var1);
         } class="kw">finally {
            this.chunkSectionLock.unlockRead(var2);
         }
      } else {
         class="kw">return false;
      }
   }

   class="kw">public void scheduleTick(int var1, @Nullable Instant var2) {
      if (var2 != null) {
         this.tickRequests.enqueue(new BlockSection.TickRequest(var1, var2));
      }
   }

   class="kw">public void preTick(Instant var1) {
      BlockSection.TickRequest var2;
      while (!this.tickRequests.isEmpty() && (var2 = (BlockSection.TickRequest)this.tickRequests.first()).requestedGameTime.isBefore(var1)) {
         this.tickRequests.dequeue();
         this.setTicking(var2.index, true);
      }

      long var3 = this.chunkSectionLock.writeLock();

      try {
         if (this.tickingBlocksCount != 0) {
            BitSetUtil.copyValues(this.tickingBlocks, this.tickingBlocksCopy);
            this.tickingBlocksCountCopy = this.tickingBlocksCount;
            this.tickingBlocks.clear();
            this.tickingBlocksCount = 0;
            class="kw">return;
         }

         this.tickingBlocksCountCopy = 0;
      } class="kw">finally {
         this.chunkSectionLock.unlockWrite(var3);
      }
   }

   class="kw">public <T, V> int forEachTicking(T var1, V var2, int var3, @Nonnull ObjectPositionBlockFunction<T, V, BlockTickStrategy> var4) {
      if (this.tickingBlocksCountCopy == 0) {
         class="kw">return 0;
      }

      int var5 = var3 << 5;
      int var6 = 0;

      for (int var7 = this.tickingBlocksCopy.nextSetBit(0); var7 >= 0; var7 = this.tickingBlocksCopy.nextSetBit(var7 + 1)) {
         int var8 = ChunkUtil.xFromIndex(var7);
         int var9 = ChunkUtil.yFromIndex(var7);
         int var10 = ChunkUtil.zFromIndex(var7);
         BlockTickStrategy var11 = var4.accept(var1, var2, var8, var9 | var5, var10, this.get(var7));
         long var12 = this.chunkSectionLock.writeLock();

         try {
            class="kw">switch (var11) {
               case WAIT_FOR_ADJACENT_CHUNK_LOAD:
                  if (!this.tickingWaitAdjacentBlocks.get(var7)) {
                     this.tickingWaitAdjacentBlockCount++;
                     this.tickingWaitAdjacentBlocks.set(var7, true);
                  }
                  break;
               case CONTINUE:
                  if (!this.tickingBlocks.get(var7)) {
                     this.tickingBlocksCount++;
                     this.tickingBlocks.set(var7, true);
                  }
               case SLEEP:
               case IGNORED:
            }
         } class="kw">finally {
            this.chunkSectionLock.unlockWrite(var12);
         }

         var6++;
      }

      class="kw">return var6;
   }

   class="kw">public void mergeTickingBlocks() {
      long var1 = this.chunkSectionLock.writeLock();

      try {
         this.tickingBlocks.or(this.tickingWaitAdjacentBlocks);
         this.tickingBlocksCount = this.tickingBlocks.cardinality();
         this.tickingWaitAdjacentBlocks.clear();
         this.tickingWaitAdjacentBlockCount = 0;
      } class="kw">finally {
         this.chunkSectionLock.unlockWrite(var1);
      }
   }

   class="kw">public double getMaximumHitboxExtent() {
      double var1 = this.maximumHitboxExtent;
      if (var1 != -1.0) {
         class="kw">return var1;
      }

      double var3 = BlockBoundingBoxes.UNIT_BOX_MAXIMUM_EXTENT;
      long var5 = this.chunkSectionLock.readLock();

      try {
         IndexedLookupTableAssetMap var7 = BlockBoundingBoxes.getAssetMap();
         BlockTypeAssetMap var8 = BlockType.getAssetMap();

         for (int var9 = 0; var9 < 32768; var9++) {
            int var10 = this.chunkSection.get(var9);
            if (var10 != 0) {
               int var11 = this.rotationSection.get(var9);
               BlockType var12 = var8.getAsset(var10);
               if (var12 != null && !var12.isUnknown()) {
                  BlockBoundingBoxes var13 = var7.getAsset(var12.getHitboxTypeIndex());
                  if (var13 != BlockBoundingBoxes.UNIT_BOX) {
                     double var14 = var13.get(var11).getBoundingBox().getMaximumExtent();
                     if (var14 > var3) {
                        var3 = var14;
                     }
                  }
               }
            }
         }
      } class="kw">finally {
         this.chunkSectionLock.unlockRead(var5);
      }

      class="kw">return this.maximumHitboxExtent = var3;
   }

   @Deprecated
   class="kw">public void invalidateBlock(int var1, int var2, int var3) {
      long var4 = this.chunkSectionLock.writeLock();

      try {
         this.changedPositions.add(ChunkUtil.indexBlock(var1, var2, var3));
      } class="kw">finally {
         this.chunkSectionLock.unlockWrite(var4);
      }
   }

   class="kw">public byte[] serializeForPacket() {
      long var1 = this.chunkSectionLock.readLock();

      try {
         byte[] var3 = new byte[1
            + this.chunkSection.serializedPacketByteSize()
            + 1
            + this.fillerSection.serializedPacketByteSize()
            + 1
            + this.rotationSection.serializedPacketByteSize()];
         MemorySegment var4 = MemorySegment.ofArray(var3);
         PaletteType var5 = this.chunkSection.getPaletteType();
         byte var6 = (byte)var5.ordinal();
         var4.set(ValueLayout.JAVA_BYTE, 0L, var6);
         int var7 = 1 + this.chunkSection.serializeForPacket(var4, 1);
         PaletteType var8 = this.fillerSection.getPaletteType();
         byte var9 = (byte)var8.ordinal();
         var4.set(ValueLayout.JAVA_BYTE, var7, var9);
         var7 += 1 + this.fillerSection.serializeForPacket(var4, var7 + 1);
         PaletteType var10 = this.rotationSection.getPaletteType();
         byte var11 = (byte)var10.ordinal();
         var4.set(ValueLayout.JAVA_BYTE, var7, var11);
         this.rotationSection.serializeForPacket(var4, var7 + 1);
         class="kw">return var3;
      } class="kw">finally {
         this.chunkSectionLock.unlockRead(var1);
      }
   }

   class="kw">public byte[] serialize(ExtraInfo var1) {
      long var2 = this.chunkSectionLock.readLock();

      try {
         PaletteType var4 = this.chunkSection.getPaletteType();
         BitSet var5;
         long[] var6;
         if (var4 != PaletteType.Empty) {
            var5 = (BitSet)this.tickingBlocks.clone();
            var5.or(this.tickingWaitAdjacentBlocks);
            var6 = var5.toLongArray();
         } else {
            var5 = null;
            var6 = null;
         }

         ChunkLightData var7 = this.localLight;
         ChunkLightData var8 = this.globalLight;
         byte[] var9 = new byte[5
            + this.chunkSection.serializedByteSize(BlockType.KEY_MEMORY_SERIALIZER)
            + (var4 != PaletteType.Empty ? 4 + var6.length * 8 : 0)
            + 1
            + this.fillerSection.serializedByteSize(FILLER_SERIALIZER)
            + 1
            + this.rotationSection.serializedByteSize(ROTATION_SERIALIZER)
            + var7.serializedByteSize()
            + var8.serializedByteSize()
            + 2
            + 2];
         MemorySegment var10 = MemorySegment.ofArray(var9);
         var10.set(MemorySegmentUtil.INT_BE, 0L, BlockMigration.getAssetMap().getAssetCount());
         var10.set(ValueLayout.JAVA_BYTE, 4L, (byte)var4.ordinal());
         int var11 = 5 + this.chunkSection.serialize(BlockType.KEY_MEMORY_SERIALIZER, var10, 5);
         if (var4 != PaletteType.Empty) {
            var10.set(MemorySegmentUtil.SHORT_BE, var11, (short)var5.cardinality());
            var10.set(MemorySegmentUtil.SHORT_BE, var11 + 2, (short)var6.length);
            MemorySegment.copy(var6, 0, var10, MemorySegmentUtil.LONG_BE, var11 + 4, var6.length);
            var11 += 4 + var6.length * 8;
         }

         var10.set(ValueLayout.JAVA_BYTE, var11, (byte)this.fillerSection.getPaletteType().ordinal());
         var11 += 1 + this.fillerSection.serialize(FILLER_SERIALIZER, var10, var11 + 1);
         var10.set(ValueLayout.JAVA_BYTE, var11, (byte)this.rotationSection.getPaletteType().ordinal());
         var11 += 1 + this.rotationSection.serialize(ROTATION_SERIALIZER, var10, var11 + 1);
         var11 += var7.serialize(var10, var11);
         var11 += var8.serialize(var10, var11);
         var10.set(MemorySegmentUtil.SHORT_BE, var11, this.localChangeCounter);
         var10.set(MemorySegmentUtil.SHORT_BE, var11 + 2, this.globalChangeCounter);
         class="kw">return var9;
      } class="kw">finally {
         this.chunkSectionLock.unlockRead(var2);
      }
   }

   class="kw">public void deserialize(@Nonnull byte[] var1, @Nonnull ExtraInfo var2) {
      MemorySegment var3 = MemorySegment.ofArray(var1);
      int var4 = var2.getVersion();
      if (var4 < 6) {
         throw new IllegalArgumentException("Version not supported: " + var4);
      }

      int var5 = var3.get(MemorySegmentUtil.INT_BE, 0L);
      Function var6 = null;
      Map var7 = BlockMigration.getAssetMap().getAssetMap();

      for (BlockMigration var8 = var7.get(var5); var8 != null; var8 = var7.get(++var5)) {
         if (var6 == null) {
            var6 = var8::getMigration;
         } else {
            var6 = var6.andThen(var8::getMigration);
         }
      }

      PaletteTypeEnum var9 = PaletteTypeEnum.get(var3.get(ValueLayout.JAVA_BYTE, 4L));
      PaletteType var10 = var9.getPaletteType();
      this.chunkSection = var9.getConstructor().get();
      int var11 = 5;
      if (var6 != null) {
         class="kw">final Function var12 = var6;
         var11 += this.chunkSection.deserialize(new AbstractSectionPalette.KeyMemoryDeserializer() {
            @Override
            class="kw">public int deserialize(MemorySegment var1, int var2x) {
               String var3 = var12.apply(MemorySegmentUtil.readUTF(var1, var2x));
               class="kw">return BlockType.getBlockIdOrUnknown(var3, "Unknown BlockType %s", var3);
            }

            @Override
            class="kw">public int keySize(MemorySegment var1, int var2x) {
               class="kw">return MemorySegmentUtil.utf8Size(var1, var2x);
            }
         }, var3, var11);
      } else {
         var11 += this.chunkSection.deserialize(BlockType.KEY_MEMORY_DESERIALIZER, var3, var11);
      }

      if (var10 != PaletteType.Empty) {
         this.tickingBlocksCount = Short.toUnsignedInt(var3.get(MemorySegmentUtil.SHORT_BE, var11));
         int var20 = Short.toUnsignedInt(var3.get(MemorySegmentUtil.SHORT_BE, var11 + 2));
         var11 += 4;
         long[] var13 = var3.asSlice(var11, var20 * 8L).toArray(MemorySegmentUtil.LONG_BE);
         var11 += var20 * 8;
         this.tickingBlocks = BitSet.valueOf(var13);
         this.tickingBlocksCount = this.tickingBlocks.cardinality();
      }

      PaletteTypeEnum var21 = PaletteTypeEnum.get(var3.get(ValueLayout.JAVA_BYTE, var11));
      this.fillerSection = var21.getConstructor().get();
      var11 += 1 + this.fillerSection.deserialize(FILLER_DESERIALIZER, var3, var11 + 1);
      PaletteTypeEnum var22 = PaletteTypeEnum.get(var3.get(ValueLayout.JAVA_BYTE, var11));
      this.rotationSection = var22.getConstructor().get();
      var11 += 1 + this.rotationSection.deserialize(ROTATION_DESERIALIZER, var3, var11 + 1);
      this.localLight = ChunkLightData.deserialize(var3, var11);
      var11 += this.localLight.serializedByteSize();
      this.globalLight = ChunkLightData.deserialize(var3, var11);
      var11 += this.globalLight.serializedByteSize();
      this.localChangeCounter = var3.get(MemorySegmentUtil.SHORT_BE, var11);
      this.globalChangeCounter = var3.get(MemorySegmentUtil.SHORT_BE, var11 + 2);
   }

   @Override
   class="kw">public Component<ChunkStore> clone() {
      throw new UnsupportedOperationException("Not implemented!");
   }

   @Nonnull
   @Override
   class="kw">public Component<ChunkStore> cloneSerializable() {
      class="kw">return this;
   }

   @Nonnull
   class="kw">public CompletableFuture<CachedPacket<SetChunk>> getCachedChunkPacket(int var1, int var2, int var3) {
      SoftReference var4 = this.cachedChunkPacket;
      CompletableFuture var5 = var4 != null ? var4.get() : null;
      if (var5 != null) {
         class="kw">return var5;
      }

      var5 = CompletableFuture.supplyAsync(() -> {
         byte[] var4 = null;
         byte[] var5 = null;
         byte[] var6 = null;
         if (BlockChunk.SEND_LOCAL_LIGHTING_DATA && this.hasLocalLight()) {
            ChunkLightData var7 = this.getLocalLight();
            var4 = new byte[var7.serializedForPacketByteSize()];
            MemorySegment var8 = MemorySegment.ofArray(var4);
            var7.serializeForPacket(var8, 0);
            if (this.getLocalChangeCounter() != var7.getChangeId()) {
               var4 = null;
            }
         }

         if (BlockChunk.SEND_GLOBAL_LIGHTING_DATA && this.hasGlobalLight()) {
            ChunkLightData var9 = this.getGlobalLight();
            var5 = new byte[var9.serializedForPacketByteSize()];
            MemorySegment var11 = MemorySegment.ofArray(var5);
            var9.serializeForPacket(var11, 0);
            if (this.getGlobalChangeCounter() != var9.getChangeId()) {
               var5 = null;
            }
         }

         if (!this.isSolidAir()) {
            var6 = this.serializeForPacket();
         }

         SetChunk var10 = new SetChunk(var1, var2, var3, var4, var5, var6);
         class="kw">return CachedPacket.cache(var10);
      });
      this.cachedChunkPacket = new SoftReference<>(var5);
      class="kw">return var5;
   }

   class="kw">public int get(int var1, int var2, int var3) {
      class="kw">return this.get(ChunkUtil.indexBlock(var1, var2, var3));
   }

   class="kw">public boolean set(int var1, int var2, int var3, int var4, int var5, int var6) {
      class="kw">return this.set(ChunkUtil.indexBlock(var1, var2, var3), var4, var5, var6);
   }

   class="kw">public boolean setTicking(int var1, int var2, int var3, boolean var4) {
      class="kw">return this.setTicking(ChunkUtil.indexBlock(var1, var2, var3), var4);
   }

   class="kw">public boolean isTicking(int var1, int var2, int var3) {
      class="kw">return this.isTicking(ChunkUtil.indexBlock(var1, var2, var3));
   }

   class="kw">public class="kw">static class LoadBlockSectionPacketSystem class="kw">extends ChunkStore.LoadFuturePacketDataQuerySystem {
      class="kw">private class="kw">final ComponentType<ChunkStore, BlockSection> componentType;
      class="kw">private class="kw">final Query<ChunkStore> query;

      class="kw">public LoadBlockSectionPacketSystem(ComponentType<ChunkStore, BlockSection> var1) {
         this.componentType = var1;
         this.query = Query.and(var1, ChunkSection.getComponentType());
      }

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

      class="kw">public void fetch(
         int var1,
         @Nonnull ArchetypeChunk<ChunkStore> var2,
         Store<ChunkStore> var3,
         CommandBuffer<ChunkStore> var4,
         PlayerRef var5,
         @Nonnull List<CompletableFuture<ToClientPacket>> var6
      ) {
         BlockSection var7 = var2.getComponent(var1, this.componentType);
         assert var7 != null;
         ChunkSection var8 = var2.getComponent(var1, ChunkSection.getComponentType());
         assert var8 != null;
         var6.add(
            var7.getCachedChunkPacket(var8.getX(), var8.getY(), var8.getZ())
               .exceptionally(
                  var1x -> {
                     if (var1x != null) {
                        ((HytaleLogger.Api)BlockSection.LOGGER.at(Level.SEVERE).withCause(var1x))
                           .log("Exception while compressing set chunk (%d, %d, %d):", var8.getX(), var8.getY(), var8.getZ());
                     }

                     class="kw">return null;
                  }
               )
               .thenApply(Function.identity())
         );
      }
   }

   class="kw">private record TickRequest(int index, @Nonnull Instant requestedGameTime) {
      class="kw">private TickRequest {
      }
   }
}