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 + "'}";
}
}
}