ChunkLightDataBuilder class

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

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

extends: ChunkLightData

Поля (39)

МодификаторыТипИмя
static boolean DEBUG
public static final ChunkLightDataBuilder.Res INSTANCE
private final String segment
Arena var1
StringBuilder var1
short var10
int var11
int var11
int var12
ChunkLightDataBuilder.Res var12
byte[] var14
var14
int var2
int var3
MemorySegment var3
var3
int var3
int var4
int var4
short var4
long var4
int var4
byte var5
int var5
int var6
long var6
int var6
int var7
var7
byte var7
var7
var7
int var7
int var8
int var8
int var8
int var9
int var9
MemorySegment var9

Методы (41)

МодификаторыВозвратСигнатура
abstract return new ChunkLightDatareturn new ChunkLightData(null, this.changeId)
abstract return new ChunkLightDatareturn new ChunkLightData(var1, var3, this.changeId)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("ChunkLightDataBuilder light data isn't compacted so we can't read this cleanly atm")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException()
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Index " + var1 + " is outside of the bounds!")
private Resprivate Res(String var1)
abstract throw new RuntimeExceptionthrow new RuntimeException("Discovered branch at deepest point in octree! Mask " + var7 + " innerIndex " + var8 + " depth " + var4 + " setValue " + var5 + " currentValue " + var10 + " at index " + var2 + " pointer " + var3)
abstract throw new RuntimeExceptionthrow new RuntimeException("Failed at " + var1, var3)
private boolean allLeavesEqualboolean allLeavesEqual(int var1, short var2)
for for(int var6 = 0; var6 < 8; var6++)
for for(int var3 = 0; var3 < 8; var3++)
for for(int var10 = 0; var10 < 8; var10++)
for for(int var5 = 0; var5 < 8; var5++)
protected int growSegmentint growSegment(@Nonnull BitSet var1, short var2)
if if(var1 instanceof ChunkLightDataBuilder)
if if(this.lightData != null)
if if(var2 >= 0 && var2 < 4)
if if(var1 >= 0 && var1 < 32768)
if if(this.lightData == null)
if if(this.currentSegments == null)
if if(this.lightData == null)
if if(var4 == 12)
if if(var4 > 12)
if if(var4 == 12)
if if(DEBUG)
if if(var12 != null)
if if(var4 != var2)
if if(var4 < var6)
if if(var5 != 7)
static void octreeToStringvoid octreeToString(@Nonnull MemorySegment var0, int var1, @Nonnull StringBuilder var2, int var3)
abstract octreeToString octreeToString(var0, 0, var1, 0)
abstract octreeToString octreeToString(var0, var7, var2, var3 + 1)
private int serializeOctreeint serializeOctree(@Nonnull MemorySegment var1, int var2, int var3)
public void setBlockLightvoid setBlockLight(int var1, int var2, int var3, byte var4, byte var5, byte var6)
public void setBlockLightvoid setBlockLight(int var1, byte var2, byte var3, byte var4)
public void setLightvoid setLight(int var1, int var2, byte var3)
public void setLightRawvoid setLightRaw(int var1, short var2)
public void setSkyLightvoid setSkyLight(int var1, int var2, int var3, byte var4)
public void setSkyLightvoid setSkyLight(int var1, byte var2)
abstract super super(var1.lightData, var2)
public String toStringpublic String toString()

Исходный код

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

class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import java.lang.foreign.Arena;
class="kw">import java.lang.foreign.MemorySegment;
class="kw">import java.lang.foreign.ValueLayout;
class="kw">import java.util.BitSet;
class="kw">import java.util.HexFormat;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class ChunkLightDataBuilder class="kw">extends ChunkLightData {
   class="kw">static boolean DEBUG = false;
   class="kw">protected BitSet currentSegments;

   class="kw">public ChunkLightDataBuilder(short var1) {
      super(Arena.ofAuto(), null, var1);
   }

   class="kw">public ChunkLightDataBuilder(@Nonnull ChunkLightData var1, short var2) {
      super(var1.lightData, var2);
      if (var1 class="kw">instanceof ChunkLightDataBuilder) {
         throw new IllegalArgumentException("ChunkLightDataBuilder light data isn't compacted so we can't read this cleanly atm");
      }

      if (this.lightData != null) {
         int var3 = (int)(this.lightData.byteSize() / 17L);
         this.currentSegments = new BitSet(var3);
         this.currentSegments.set(0, var3);
      }
   }

   class="kw">public void setBlockLight(int var1, int var2, int var3, byte var4, byte var5, byte var6) {
      this.setBlockLight(ChunkUtil.indexBlock(var1, var2, var3), var4, var5, var6);
   }

   class="kw">public void setBlockLight(int var1, byte var2, byte var3, byte var4) {
      byte var5 = this.getLight(var1, 3);
      this.setLightRaw(var1, combineLightValues(var2, var3, var4, var5));
   }

   class="kw">public void setSkyLight(int var1, int var2, int var3, byte var4) {
      this.setSkyLight(ChunkUtil.indexBlock(var1, var2, var3), var4);
   }

   class="kw">public void setSkyLight(int var1, byte var2) {
      this.setLight(var1, 3, var2);
   }

   class="kw">public void setLight(int var1, int var2, byte var3) {
      if (var2 >= 0 && var2 < 4) {
         int var4 = this.getLightRaw(var1);
         var4 &= ~(15 << var2 * 4);
         var4 |= (var3 & 15) << var2 * 4;
         this.setLightRaw(var1, (short)var4);
      } else {
         throw new IllegalArgumentException();
      }
   }

   class="kw">public void setLightRaw(int var1, short var2) {
      if (var1 >= 0 && var1 < 32768) {
         if (this.lightData == null) {
            this.lightData = this.arena.allocate(2176L);
         }

         if (this.currentSegments == null) {
            this.currentSegments = new BitSet();
            this.currentSegments.set(0);
         }

         this.setTraverse(this.currentSegments, var1, 0, 0, var2);
      } else {
         throw new IllegalArgumentException("Index " + var1 + " is outside of the bounds!");
      }
   }

   @Nonnull
   class="kw">public ChunkLightData build() {
      if (this.lightData == null) {
         class="kw">return new ChunkLightData(null, this.changeId);
      } else {
         Arena var1 = Arena.ofAuto();
         int var2 = this.currentSegments.cardinality();
         MemorySegment var3 = var1.allocate(var2 * 17L);
         if (var2 == this.currentSegments.length()) {
            MemorySegment.copy(this.lightData, 0L, var3, 0L, var3.byteSize());
            class="kw">return new ChunkLightData(var1, var3, this.changeId);
         } else {
            this.serializeOctree(var3, 0, 0);
            class="kw">return new ChunkLightData(var1, var3, this.changeId);
         }
      }
   }

   class="kw">private int serializeOctree(@Nonnull MemorySegment var1, int var2, int var3) {
      int var4 = var3;
      int var5 = this.lightData.get(VL_BYTE, var2 * 17L);
      var1.set(VL_BYTE, var4 * 17L, (byte)var5);

      for (int var6 = 0; var6 < 8; var6++) {
         int var7 = Short.toUnsignedInt(this.lightData.get(VL_SHORT, var2 * 17L + var6 * 2L + 1L));
         if ((var5 >> var6 & 1) == 1) {
            int var8 = ++var3;
            int var9 = var7;
            var7 = var8;
            var3 = this.serializeOctree(var1, var9, var8);
         }

         var1.set(VL_SHORT, var4 * 17L + var6 * 2L + 1L, (short)var7);
      }

      class="kw">return var3;
   }

   @Nullable
   class="kw">private ChunkLightDataBuilder.Res setTraverse(@Nonnull BitSet var1, int var2, int var3, int var4, short var5) {
      int var6 = var3 * 17;
      byte var7 = this.lightData.get(VL_BYTE, var6);
      int var8 = var2 >> 12 - var4 & 7;
      int var9 = var8 * 2 + var6 + 1;
      short var10 = this.lightData.get(VL_SHORT, var9);

      try {
         if ((var7 >> var8 & 1) == 1) {
            class="kw">return this.setTraverseBranch(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10);
         } else {
            class="kw">return var5 != var10 ? this.setTraverseLeaf(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10) : null;
         }
      } catch (Throwable var12) {
         throw new RuntimeException(
            "Failed to setTraverse("
               + var2
               + ", "
               + var3
               + ", "
               + var4
               + ", "
               + var5
               + ") with i "
               + var7
               + ", innerIndex "
               + var8
               + ", position "
               + var9
               + ", currentValue "
               + var10,
            var12
         );
      }
   }

   @Nullable
   class="kw">private ChunkLightDataBuilder.Res setTraverseBranch(
      @Nonnull BitSet var1, int var2, int var3, int var4, short var5, int var6, byte var7, int var8, int var9, short var10
   ) {
      int var11 = var10 & '\uffff';
      if (var4 == 12) {
         throw new RuntimeException(
            "Discovered branch at deepest point in octree! Mask "
               + var7
               + " innerIndex "
               + var8
               + " depth "
               + var4
               + " setValue "
               + var5
               + " currentValue "
               + var10
               + " at index "
               + var2
               + " pointer "
               + var3
         );
      }

      if (this.setTraverse(var1, var2, var11, var4 + 3, var5) != null) {
         var1.clear(var11);
         this.lightData.set(VL_SHORT, var9, var5);
         int var12 = ~(1 << var8);
         var7 = (byte)(var7 & var12);
         this.lightData.set(VL_BYTE, var6, var7);
         if (var7 == 0 && this.allLeavesEqual(var6, var5)) {
            class="kw">return ChunkLightDataBuilder.Res.INSTANCE;
         }
      }

      class="kw">return null;
   }

   @Nullable
   class="kw">private ChunkLightDataBuilder.Res setTraverseLeaf(
      @Nonnull BitSet var1, int var2, int var3, int var4, short var5, int var6, byte var7, int var8, int var9, short var10
   ) {
      if (var4 > 12) {
         throw new IllegalStateException(
            "Somehow have invalid octree state: "
               + octreeToString(this.lightData)
               + " when setTraverse("
               + var2
               + ", "
               + var3
               + ", "
               + var4
               + ", "
               + var5
               + ");"
         );
      }

      if (var4 == 12) {
         byte[] var14 = null;
         if (DEBUG) {
            var14 = this.lightData.asSlice(var6, 17L).toArray(ValueLayout.JAVA_BYTE);
         }

         this.lightData.set(VL_SHORT, var9, var5);
         if (!this.allLeavesEqual(var6, var5)) {
            class="kw">return null;
         } else {
            class="kw">return DEBUG ? new ChunkLightDataBuilder.Res(HexFormat.of().formatHex(var14)) : ChunkLightDataBuilder.Res.INSTANCE;
         }
      } else {
         var7 = (byte)(var7 | 1 << var8);
         this.lightData.set(VL_BYTE, var6, var7);
         int var11 = this.growSegment(var1, var10);
         this.lightData.set(VL_SHORT, var9, (short)var11);
         ChunkLightDataBuilder.Res var12 = this.setTraverse(var1, var2, var11, var4 + 3, var5);
         if (var12 != null) {
            throw new RuntimeException(
               "Created new segment that instantly collapsed with ("
                  + var2
                  + ", "
                  + var3
                  + ", "
                  + var4
                  + ", "
                  + var5
                  + "): with currentValue mismatch "
                  + var10
                  + " res "
                  + var12
            );
         } else {
            class="kw">return null;
         }
      }
   }

   class="kw">private boolean allLeavesEqual(int var1, short var2) {
      for (int var3 = 0; var3 < 8; var3++) {
         short var4 = this.lightData.get(VL_SHORT, var3 * 2L + var1 + 1L);
         if (var4 != var2) {
            class="kw">return false;
         }
      }

      class="kw">return true;
   }

   class="kw">protected int growSegment(@Nonnull BitSet var1, short var2) {
      int var3 = var1.nextClearBit(0);
      var1.set(var3);
      long var4 = this.lightData.byteSize();
      long var6 = (var3 + 1) * 17L;
      if (var4 < var6) {
         int var8 = Math.max(ArrayUtil.grow((int)var4), (int)var6);
         MemorySegment var9 = this.lightData;
         this.lightData = this.arena.allocate(var8);
         this.lightData.copyFrom(var9);
      }

      this.lightData.set(VL_BYTE, var3 * 17L, (byte)0);

      for (int var10 = 0; var10 < 8; var10++) {
         this.lightData.set(VL_SHORT, var3 * 17L + var10 * 2L + 1L, var2);
      }

      class="kw">return var3;
   }

   @Nonnull
   class="kw">public String toStringOctree() {
      class="kw">return this.lightData == null ? "NULL" : octreeToString(this.lightData);
   }

   @Nonnull
   class="kw">public class="kw">static String octreeToString(@Nonnull MemorySegment var0) {
      StringBuilder var1 = new StringBuilder();

      try {
         octreeToString(var0, 0, var1, 0);
      } catch (Throwable var3) {
         throw new RuntimeException("Failed at " + var1, var3);
      }

      class="kw">return var1.toString();
   }

   class="kw">public class="kw">static void octreeToString(@Nonnull MemorySegment var0, int var1, @Nonnull StringBuilder var2, int var3) {
      int var4 = var0.get(VL_BYTE, var1 * 17L);

      for (int var5 = 0; var5 < 8; var5++) {
         int var6 = var1 * 17 + var5 * 2 + 1;
         int var7 = Short.toUnsignedInt(var0.get(VL_SHORT, var6));
         var2.append("\t".repeat(Math.max(0, var3)));
         if ((var4 & 1 << var5) != 0) {
            var2.append("SUBTREE AT ").append(var5).append('\n');
            octreeToString(var0, var7, var2, var3 + 1);
         } else {
            var2.append("INDEX ").append(var5).append(" VALUE: ").append(var7);
         }

         if (var5 != 7) {
            var2.append('\n');
         }
      }
   }

   class="kw">private class="kw">static class Res {
      class="kw">public class="kw">static class="kw">final ChunkLightDataBuilder.Res INSTANCE = new ChunkLightDataBuilder.Res(null);
      class="kw">private class="kw">final String segment;

      class="kw">private Res(String var1) {
         this.segment = var1;
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return "Res{segment='" + this.segment + "'}";
      }
   }
}