Deobf datapalette block & fix a ton of issues

This commit is contained in:
cyberpwn 2021-08-25 02:41:37 -04:00
parent c1ba176e27
commit f45d643739

View File

@ -18,6 +18,8 @@
package com.volmit.iris.util.nbt.mca.palettes; package com.volmit.iris.util.nbt.mca.palettes;
import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.engine.data.cache.AtomicCache;
import com.volmit.iris.util.math.MathHelper; import com.volmit.iris.util.math.MathHelper;
import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.mca.NBTWorld;
import com.volmit.iris.util.nbt.tag.CompoundTag; import com.volmit.iris.util.nbt.tag.CompoundTag;
@ -28,36 +30,49 @@ import lombok.Getter;
import net.minecraft.network.PacketDataSerializer; import net.minecraft.network.PacketDataSerializer;
import org.bukkit.Material; import org.bukkit.Material;
import java.util.concurrent.Semaphore;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
@Getter @Getter
public class DataPaletteBlock<T> implements DataPaletteExpandable<T> { public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
private static final int d = 4096; private static final int d = 4096;
public static final int a = 9; public static final int HASH_BITS = 9;
public static final int b = 4; public static final int LINEAR_BITS = 4;
private final DataPalette<T> e; private final DataPalette<T> globalPalette;
private final DataPaletteExpandable<T> f = (var0x, var1x) -> { private final DataPaletteExpandable<T> f = (var0x, var1x) -> 0;
return 0; private final RegistryBlockID<T> stolenRegistry;
};
private final RegistryBlockID<T> g;
private final Function<CompoundTag, T> h; private final Function<CompoundTag, T> h;
private final Function<T, CompoundTag> i; private final Function<T, CompoundTag> i;
private final T j; private final T defAir;
private static final RegistryBlockID<CompoundTag> registry = new RegistryBlockID<>(); private static final AtomicCache<RegistryBlockID<CompoundTag>> reg = new AtomicCache<>();
private static final AtomicCache<DataPaletteGlobal<CompoundTag>> global = new AtomicCache<>();
private static final CompoundTag air = NBTWorld.getCompound(Material.AIR.createBlockData()); private static final CompoundTag air = NBTWorld.getCompound(Material.AIR.createBlockData());
protected DataBits c; protected DataBits dataBits;
private DataPalette<T> k; private DataPalette<T> currentPalette;
private int bits; private int bits = 0;
private final Semaphore m = new Semaphore(1);
public void b() {
this.m.release();
}
public DataPaletteBlock() { public DataPaletteBlock() {
this(null, (RegistryBlockID<T>) registry, (i) -> (T) i, (i) -> (CompoundTag) i, (T) air); this((DataPalette<T>) global.aquire(() ->
new DataPaletteGlobal<>(reg.aquire(() -> {
try {
return INMS.get().computeBlockIDRegistry();
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
return null;
}), air)
), (RegistryBlockID<T>) reg.aquire(() -> {
try {
return INMS.get().computeBlockIDRegistry();
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
return null;
}), (i) -> (T) i, (i) -> (CompoundTag) i, (T) air);
} }
public DataPaletteBlock(DataPalette<T> var0, public DataPaletteBlock(DataPalette<T> var0,
@ -65,171 +80,153 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
Function<CompoundTag, T> var2, Function<CompoundTag, T> var2,
Function<T, CompoundTag> var3, Function<T, CompoundTag> var3,
T var4) { T var4) {
this.e = var0; this.globalPalette = var0;
this.g = var1; this.stolenRegistry = var1;
this.h = var2; this.h = var2;
this.i = var3; this.i = var3;
this.j = var4; this.defAir = var4;
this.b(4); this.changeBitsTo(4);
} }
private static int b(int var0, int var1, int var2) { private static int blockIndex(int var0, int var1, int var2) {
return var1 << 8 | var2 << 4 | var0; return var1 << 8 | var2 << 4 | var0;
} }
private void b(int var0) { private void changeBitsTo(int newbits) {
if (var0 != this.bits) { if (newbits != this.bits) {
this.bits = var0; this.bits = newbits;
if (this.bits <= 4) { if (this.bits <= LINEAR_BITS) {
this.bits = 4; this.bits = LINEAR_BITS;
this.k = new DataPaletteLinear<T>(this.g, this.bits, this, this.h); this.currentPalette = new DataPaletteLinear<T>(this.stolenRegistry, this.bits, this, this.h);
} else if (this.bits < 9) { } else if (this.bits < HASH_BITS) {
this.k = new DataPaletteHash<T>(this.g, this.bits, this, this.h, this.i); this.currentPalette = new DataPaletteHash<T>(this.stolenRegistry, this.bits, this, this.h, this.i);
} else { } else {
this.k = this.e; this.currentPalette = this.globalPalette;
this.bits = MathHelper.e(this.g.a()); this.bits = MathHelper.e(this.stolenRegistry.size());
} }
this.k.a(this.j); this.currentPalette.getIndex(this.defAir);
this.c = new DataBits(this.bits, 4096); this.dataBits = new DataBits(this.bits, 4096);
} }
} }
public int onResize(int var0, T var1) { public int onResize(int var0, T var1) {
DataBits var2 = this.c; DataBits var2 = this.dataBits;
DataPalette<T> var3 = this.k; DataPalette<T> var3 = this.currentPalette;
this.b(var0); this.changeBitsTo(var0);
for (int var4 = 0; var4 < var2.b(); ++var4) { for (int var4 = 0; var4 < var2.b(); ++var4) {
T var5 = var3.a(var2.a(var4)); T var5 = var3.getByIndex(var2.getIndexFromPos(var4));
if (var5 != null) { if (var5 != null) {
this.setBlockIndex(var4, var5); this.setBlockIndex(var4, var5);
} }
} }
return this.k.a(var1); return this.currentPalette.getIndex(var1);
} }
public T setBlock(int var0, int var1, int var2, T var3) { public T setBlock(int var0, int var1, int var2, T var3) {
T var6; return this.a(blockIndex(var0, var1, var2), var3);
try {
var6 = this.a(b(var0, var1, var2), var3);
} finally {
this.b();
}
return var6;
}
public T b(int var0, int var1, int var2, T var3) {
return this.a(b(var0, var1, var2), var3);
} }
private T a(int var0, T var1) { private T a(int var0, T var1) {
int var2 = this.k.a(var1); int var2 = this.currentPalette.getIndex(var1);
int var3 = this.c.a(var0, var2); int var3 = this.dataBits.a(var0, var2);
T var4 = this.k.a(var3); T var4 = this.currentPalette.getByIndex(var3);
return var4 == null ? this.j : var4; return var4 == null ? this.defAir : var4;
} }
public void c(int var0, int var1, int var2, T var3) { public void c(int var0, int var1, int var2, T var3) {
try { this.setBlockIndex(blockIndex(var0, var1, var2), var3);
this.setBlockIndex(b(var0, var1, var2), var3);
} finally {
this.b();
}
} }
private void setBlockIndex(int var0, T var1) { private void setBlockIndex(int var0, T var1) {
int var2 = this.k.a(var1); int var2 = this.currentPalette.getIndex(var1);
this.c.b(var0, var2); this.dataBits.b(var0, var2);
} }
public T a(int var0, int var1, int var2) { public T getBlock(int var0, int var1, int var2) {
return this.a(b(var0, var1, var2)); return this.getByIndex(blockIndex(var0, var1, var2));
} }
protected T a(int var0) { protected T getByIndex(int var0) {
T var1 = this.k.a(this.c.a(var0)); if(this.currentPalette == null)
return var1 == null ? this.j : var1; {
return null;
} }
public void a(ListTag<CompoundTag> palettedata, long[] databits) { T data = this.currentPalette.getByIndex(this.dataBits.getIndexFromPos(var0));
try { return data == null ? this.defAir : data;
int var2 = Math.max(4, MathHelper.e(palettedata.size()));
if (var2 != this.bits) {
this.b(var2);
} }
this.k.a(palettedata); public void load(ListTag<CompoundTag> palettedata, long[] databits) {
int var3 = databits.length * 64 / 4096; int readBits = Math.max(4, MathHelper.e(palettedata.size()));
if (this.k == this.e) { if (readBits != this.bits) {
DataPalette<T> var4 = new DataPaletteHash<T>(this.g, var2, this.f, this.h, this.i); this.changeBitsTo(readBits);
var4.a(palettedata); }
DataBits var5 = new DataBits(var2, 4096, databits);
this.currentPalette.replace(palettedata);
int dblen = databits.length * 64 / 4096;
if (this.currentPalette == this.globalPalette) {
DataPalette<T> hashPalette = new DataPaletteHash<T>(this.stolenRegistry, readBits, this.f, this.h, this.i);
hashPalette.replace(palettedata);
DataBits var5 = new DataBits(readBits, 4096, databits);
for (int var6 = 0; var6 < 4096; ++var6) { for (int var6 = 0; var6 < 4096; ++var6) {
this.c.b(var6, this.e.a(var4.a(var5.a(var6)))); this.dataBits.b(var6, this.globalPalette.getIndex(hashPalette.getByIndex(var5.getIndexFromPos(var6))));
} }
} else if (var3 == this.bits) { } else if (dblen == this.bits) {
System.arraycopy(databits, 0, this.c.a(), 0, databits.length); System.arraycopy(databits, 0, this.dataBits.getData(), 0, databits.length);
} else { } else {
DataBits var4 = new DataBits(var3, 4096, databits); DataBits var4 = new DataBits(dblen, 4096, databits);
for (int var5 = 0; var5 < 4096; ++var5) { for (int var5 = 0; var5 < 4096; ++var5) {
this.c.b(var5, var4.a(var5)); this.dataBits.b(var5, var4.getIndexFromPos(var5));
} }
} }
} finally {
this.b();
}
} }
public void a(CompoundTag var0, String var1, String var2) { public void save(CompoundTag to, String paletteName, String blockStatesName) {
try { DataPaletteHash<T> hashpal = new DataPaletteHash<T>(this.stolenRegistry, bits, this.f, this.h, this.i);
DataPaletteHash<T> var3 = new DataPaletteHash(this.g, this.bits, this.f, this.h, this.i); T cursor = this.defAir;
T var4 = this.j; int palIndex = hashpal.getIndex(this.defAir);
int var5 = var3.a(this.j);
int[] var6 = new int[4096]; int[] var6 = new int[4096];
for (int var7 = 0; var7 < 4096; ++var7) { for (int var7 = 0; var7 < 4096; ++var7) {
T var8 = this.a(var7); T entry = this.getByIndex(var7);
if (var8 != var4) { if (!entry.equals(cursor)) {
var4 = var8; cursor = entry;
var5 = var3.a(var8); palIndex = hashpal.getIndex(entry);
} }
var6[var7] = var5; var6[var7] = palIndex;
} }
ListTag<CompoundTag> var7 = (ListTag<CompoundTag>) ListTag.createUnchecked(CompoundTag.class); ListTag<CompoundTag> npalette = (ListTag<CompoundTag>) ListTag.createUnchecked(CompoundTag.class);
var3.b(var7); hashpal.writePalette(npalette);
var0.put(var1, var7); to.put(paletteName, npalette);
int var8 = Math.max(4, MathHelper.e(var7.size())); int var8 = Math.max(4, MathHelper.e(npalette.size()));
DataBits var9 = new DataBits(var8, 4096); DataBits writeBits = new DataBits(var8, 4096);
for (int var10 = 0; var10 < var6.length; ++var10) { for (int var10 = 0; var10 < var6.length; ++var10) {
var9.b(var10, var6[var10]); writeBits.b(var10, var6[var10]);
} }
var0.putLongArray(var2, var9.a()); to.putLongArray(blockStatesName, writeBits.getData());
} finally {
this.b();
}
} }
public int c() { public int c() {
return 1 + this.k.a() + PacketDataSerializer.a(this.c.b()) + this.c.a().length * 8; return 1 + this.currentPalette.a() + PacketDataSerializer.a(this.dataBits.b()) + this.dataBits.getData().length * 8;
} }
public boolean contains(Predicate<T> var0) { public boolean contains(Predicate<T> var0) {
return this.k.a(var0); return this.currentPalette.a(var0);
} }
public void a(DataPaletteBlock.a<T> var0) { public void a(DataPaletteBlock.a<T> var0) {
Int2IntMap var1 = new Int2IntOpenHashMap(); Int2IntMap var1 = new Int2IntOpenHashMap();
this.c.a((var1x) -> var1.put(var1x, var1.get(var1x) + 1)); this.dataBits.a((var1x) -> var1.put(var1x, var1.get(var1x) + 1));
var1.int2IntEntrySet().forEach((var1x) -> var0.accept(this.k.a(var1x.getIntKey()), var1x.getIntValue())); var1.int2IntEntrySet().forEach((var1x) -> var0.accept(this.currentPalette.getByIndex(var1x.getIntKey()), var1x.getIntValue()));
} }
@FunctionalInterface @FunctionalInterface