Res class

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

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

Поля (2)

МодификаторыТипИмя
public static final ChunkLightDataBuilder.Res INSTANCE
private final String segment

Методы (1)

МодификаторыВозвратСигнатура
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 + "'}";
      }
   }
}