This commit is contained in:
cyberpwn 2021-08-25 08:42:46 -04:00
parent d52d70a014
commit 3f730ead84
35 changed files with 1452 additions and 1506 deletions

View File

@ -32,7 +32,7 @@ plugins {
} }
group 'com.volmit.iris' group 'com.volmit.iris'
version '1.7.8-Dumpy' version '1.7.9'
def apiVersion = '1.17' def apiVersion = '1.17'
def name = getRootProject().getName() // See settings.gradle def name = getRootProject().getName() // See settings.gradle
def main = 'com.volmit.iris.Iris' def main = 'com.volmit.iris.Iris'

View File

@ -48,40 +48,30 @@ import com.volmit.iris.util.io.InstanceState;
import com.volmit.iris.util.io.JarScanner; import com.volmit.iris.util.io.JarScanner;
import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.M;
import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.nbt.mca.*;
import com.volmit.iris.util.nbt.mca.palette.BiomeContainer;
import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.parallel.MultiBurst;
import com.volmit.iris.util.plugin.*; import com.volmit.iris.util.plugin.*;
import com.volmit.iris.util.reflect.ShadeFix; import com.volmit.iris.util.reflect.ShadeFix;
import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.Looper;
import com.volmit.iris.util.scheduling.Queue; import com.volmit.iris.util.scheduling.Queue;
import com.volmit.iris.util.scheduling.ShurikenQueue; import com.volmit.iris.util.scheduling.ShurikenQueue;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.serializer.ComponentSerializer; import net.kyori.adventure.text.serializer.ComponentSerializer;
import net.minecraft.world.level.chunk.storage.RegionFile;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.checkerframework.checker.units.qual.K;
import java.io.*; import java.io.*;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.net.URL; import java.net.URL;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.Set;
@SuppressWarnings("CanBeFinal") @SuppressWarnings("CanBeFinal")
public class Iris extends VolmitPlugin implements Listener { public class Iris extends VolmitPlugin implements Listener {
@ -118,14 +108,6 @@ public class Iris extends VolmitPlugin implements Listener {
IO.delete(new File("iris")); IO.delete(new File("iris"));
installDataPacks(); installDataPacks();
fixShading(); fixShading();
(new Looper() {
protected long loop() {
File ff = Iris.instance.getDataFolderNoCreate("dump");
if (ff.exists() && ff.isDirectory() && ff.listFiles().length == 0)
Iris.dump();
return 10000L;
}
}).start();
} }
private void enable() { private void enable() {

View File

@ -118,7 +118,6 @@ public class DecIris implements DecreeExecutor {
case ">>" -> v = value1 >> value2; case ">>" -> v = value1 >> value2;
case "<<" -> v = value1 << value2; case "<<" -> v = value1 << value2;
} }
;
if (v == null) { if (v == null) {
sender().sendMessage(C.RED + "The operator you entered: (" + operator + ") is invalid!"); sender().sendMessage(C.RED + "The operator you entered: (" + operator + ") is invalid!");
return; return;

View File

@ -66,7 +66,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public class NMSBinding17_1 implements INMSBinding{ public class NMSBinding17_1 implements INMSBinding {
private final BlockData AIR = Material.AIR.createBlockData(); private final BlockData AIR = Material.AIR.createBlockData();
private final KMap<Biome, Object> baseBiomeCache = new KMap<>(); private final KMap<Biome, Object> baseBiomeCache = new KMap<>();
private final AtomicCache<IdMapper<IBlockData>> registryCache = new AtomicCache<>(); private final AtomicCache<IdMapper<IBlockData>> registryCache = new AtomicCache<>();
@ -93,14 +93,14 @@ public class NMSBinding17_1 implements INMSBinding{
List<IBlockData> d = (List<IBlockData>) df.get(blockData); List<IBlockData> d = (List<IBlockData>) df.get(blockData);
return new IdMapper<>(c, d, b); return new IdMapper<>(c, d, b);
}); });
Palette<IBlockData> global = globalCache.aquireNasty(() -> new GlobalPalette<>(registry, ((CraftBlockData)AIR).getState())); Palette<IBlockData> global = globalCache.aquireNasty(() -> new GlobalPalette<>(registry, ((CraftBlockData) AIR).getState()));
PalettedContainer<IBlockData> container = new PalettedContainer<>(global, registry, PalettedContainer<IBlockData> container = new PalettedContainer<>(global, registry,
i -> ((CraftBlockData)NBTWorld.getBlockData(i)).getState(), i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(),
i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), i -> NBTWorld.getCompound(CraftBlockData.fromData(i)),
((CraftBlockData) AIR).getState()); ((CraftBlockData) AIR).getState());
return new WrappedPalettedContainer<>(container, return new WrappedPalettedContainer<>(container,
i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), i -> NBTWorld.getCompound(CraftBlockData.fromData(i)),
i -> ((CraftBlockData)NBTWorld.getBlockData(i)).getState()); i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState());
} }
private Object getBiomeStorage(ChunkGenerator.BiomeGrid g) { private Object getBiomeStorage(ChunkGenerator.BiomeGrid g) {
@ -386,8 +386,7 @@ public class NMSBinding17_1 implements INMSBinding{
return biome.ordinal(); return biome.ordinal();
} }
private IdMap<BiomeBase> getBiomeMapping() private IdMap<BiomeBase> getBiomeMapping() {
{
return biomeMapCache.aquire(() -> new IdMap<>() { return biomeMapCache.aquire(() -> new IdMap<>() {
@NotNull @NotNull
@Override @Override
@ -434,7 +433,7 @@ public class NMSBinding17_1 implements INMSBinding{
@Override @Override
public int getBiome(int x, int y, int z) { public int getBiome(int x, int y, int z) {
return biomeMapping.getId(base.getBiome(x,y,z)); return biomeMapping.getId(base.getBiome(x, y, z));
} }
}; };
} }

View File

@ -113,7 +113,7 @@ public class AsyncPregenMethod implements PregeneratorMethod {
@Override @Override
public void generateChunk(int x, int z, PregenListener listener) { public void generateChunk(int x, int z, PregenListener listener) {
if (future.size() > IrisSettings.getThreadCount((int) IrisSettings.get().getConcurrency().getParallelism())) { // TODO: FIX if (future.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())) { // TODO: FIX
waitForChunks(); waitForChunks();
} }

View File

@ -95,7 +95,7 @@ public class MedievalPregenMethod implements PregeneratorMethod {
@Override @Override
public void generateChunk(int x, int z, PregenListener listener) { public void generateChunk(int x, int z, PregenListener listener) {
if (futures.size() > IrisSettings.getThreadCount((int) IrisSettings.get().getConcurrency().getParallelism())) { if (futures.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())) {
waitForChunks(); waitForChunks();
} }

View File

@ -337,7 +337,7 @@ public class IrisData {
} }
} }
String ff = g.toString().substring(1).split("\\Q.\\E")[0]; String ff = g.substring(1).split("\\Q.\\E")[0];
return ff; return ff;
} else { } else {
Iris.error("Forign file from loader " + f.getPath() + " (loader realm: " + getDataFolder().getPath() + ")"); Iris.error("Forign file from loader " + f.getPath() + " (loader realm: " + getDataFolder().getPath() + ")");

View File

@ -29,8 +29,8 @@ import com.volmit.iris.util.scheduling.Looper;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
public class PreservationSVC implements IrisService { public class PreservationSVC implements IrisService {
private KList<Thread> threads = new KList<>(); private final KList<Thread> threads = new KList<>();
private KList<ExecutorService> services = new KList<>(); private final KList<ExecutorService> services = new KList<>();
private Looper dereferencer; private Looper dereferencer;
public void register(Thread t) { public void register(Thread t) {

View File

@ -129,7 +129,7 @@ public class IrisToolbelt {
} }
return pregenerate(task, new HybridPregenMethod(gen.getEngine().getWorld().realWorld(), return pregenerate(task, new HybridPregenMethod(gen.getEngine().getWorld().realWorld(),
IrisSettings.getThreadCount((int) IrisSettings.get().getConcurrency().getParallelism()))); IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())));
} }
/** /**
@ -145,7 +145,7 @@ public class IrisToolbelt {
return pregenerate(task, access(world)); return pregenerate(task, access(world));
} }
return pregenerate(task, new HybridPregenMethod(world, IrisSettings.getThreadCount((int) IrisSettings.get().getConcurrency().getParallelism()))); return pregenerate(task, new HybridPregenMethod(world, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism())));
} }
/** /**

View File

@ -400,17 +400,13 @@ public class IrisEngine implements Engine {
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
Hunk<BlockData> blocks = vblocks.listen((xx, y, zz, t) -> catchBlockUpdates(x + xx, y + getMinHeight(), z + zz, t)); Hunk<BlockData> blocks = vblocks.listen((xx, y, zz, t) -> catchBlockUpdates(x + xx, y + getMinHeight(), z + zz, t));
if(getDimension().isDebugChunkCrossSections() && ((x >> 4) % getDimension().getDebugCrossSectionsMod() == 0 || (z >> 4) % getDimension().getDebugCrossSectionsMod() == 0)) if (getDimension().isDebugChunkCrossSections() && ((x >> 4) % getDimension().getDebugCrossSectionsMod() == 0 || (z >> 4) % getDimension().getDebugCrossSectionsMod() == 0)) {
{
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) { for (int j = 0; j < 16; j++) {
blocks.set(i, 0, j, Material.CRYING_OBSIDIAN.createBlockData()); blocks.set(i, 0, j, Material.CRYING_OBSIDIAN.createBlockData());
} }
} }
} } else {
else
{
getMantle().generateMatter(x >> 4, z >> 4, true); getMantle().generateMatter(x >> 4, z >> 4, true);
burst().burst(multicore, burst().burst(multicore,
() -> getTerrainActuator().actuate(x, z, vblocks, multicore), () -> getTerrainActuator().actuate(x, z, vblocks, multicore),

View File

@ -51,16 +51,11 @@ public class AtomicCache<T> {
} }
} }
public T aquireNasty(NastySupplier<T> t) public T aquireNasty(NastySupplier<T> t) {
{
return aquire(() -> { return aquire(() -> {
try try {
{
return t.get(); return t.get();
} } catch (Throwable e) {
catch(Throwable e)
{
return null; return null;
} }
}); });

View File

@ -44,7 +44,6 @@ import com.volmit.iris.engine.object.spawners.IrisSpawner;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.collection.KSet;
import com.volmit.iris.util.context.IrisContext;
import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.B;
import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.data.DataProvider;
import com.volmit.iris.util.data.VanillaBiomeMap; import com.volmit.iris.util.data.VanillaBiomeMap;
@ -372,10 +371,8 @@ public class IrisBiome extends IrisRegistrant implements IRare {
break; break;
} }
if(dim.isExplodeBiomePalettes()) if (dim.isExplodeBiomePalettes()) {
{ for (int j = 0; j < dim.getExplodeBiomePaletteSize(); j++) {
for(int j = 0; j < dim.getExplodeBiomePaletteSize(); j++)
{
data.add(BARRIER); data.add(BARRIER);
if (data.size() >= maxDepth) { if (data.size() >= maxDepth) {

View File

@ -26,7 +26,6 @@ import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.math.NumberUtils;
import java.util.Random; import java.util.Random;
import java.util.UUID; import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.IntPredicate; import java.util.function.IntPredicate;
public class MathHelper { public class MathHelper {
@ -44,7 +43,7 @@ public class MathHelper {
public static final float f = 1.0E-5F; public static final float f = 1.0E-5F;
public static final float g = c(2.0F); public static final float g = c(2.0F);
private static final float n = 10430.378F; private static final float n = 10430.378F;
private static final float[] o = (float[]) SystemUtils.a(new float[65536], (var0x) -> { private static final float[] o = SystemUtils.a(new float[65536], (var0x) -> {
for (int var1 = 0; var1 < var0x.length; ++var1) { for (int var1 = 0; var1 < var0x.length; ++var1) {
var0x[var1] = (float) Math.sin((double) var1 * 3.141592653589793D * 2.0D / 65536.0D); var0x[var1] = (float) Math.sin((double) var1 * 3.141592653589793D * 2.0D / 65536.0D);
} }
@ -71,7 +70,7 @@ public class MathHelper {
} }
public static float c(float var0) { public static float c(float var0) {
return (float) Math.sqrt((double) var0); return (float) Math.sqrt(var0);
} }
public static int d(float var0) { public static int d(float var0) {
@ -607,7 +606,7 @@ public class MathHelper {
int var2; int var2;
for (var2 = 0; var2 < var0.length; ++var2) { for (var2 = 0; var2 < var0.length; ++var2) {
var0[var2] /= (double) var1; var0[var2] /= var1;
} }
for (var2 = 0; var2 < var0.length; ++var2) { for (var2 = 0; var2 < var0.length; ++var2) {
@ -658,7 +657,7 @@ public class MathHelper {
int var7 = 0; int var7 = 0;
for (int var8 = var4; var8 <= var5; ++var8) { for (int var8 = var4; var8 <= var5; ++var8) {
var6[var7] = Math.max(var0 * StrictMath.log((double) var8) + var2, 0.0D); var6[var7] = Math.max(var0 * StrictMath.log(var8) + var2, 0.0D);
++var7; ++var7;
} }
@ -773,7 +772,7 @@ public class MathHelper {
} }
public static double n(double var0) { public static double n(double var0) {
return var0 + (2.0D * (new Random((long) floor(var0 * 3000.0D))).nextDouble() - 1.0D) * 1.0E-7D / 2.0D; return var0 + (2.0D * (new Random(floor(var0 * 3000.0D))).nextDouble() - 1.0D) * 1.0E-7D / 2.0D;
} }
public static int d(int var0, int var1) { public static int d(int var0, int var1) {

View File

@ -20,17 +20,14 @@ package com.volmit.iris.util.nbt.mca;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.util.io.IO;
import com.volmit.iris.util.nbt.io.NBTDeserializer; import com.volmit.iris.util.nbt.io.NBTDeserializer;
import com.volmit.iris.util.nbt.io.NBTSerializer; import com.volmit.iris.util.nbt.io.NBTSerializer;
import com.volmit.iris.util.nbt.io.NamedTag; import com.volmit.iris.util.nbt.io.NamedTag;
import com.volmit.iris.util.nbt.mca.palette.BiomeContainer; import com.volmit.iris.util.nbt.mca.palette.BiomeContainer;
import com.volmit.iris.util.nbt.tag.CompoundTag; import com.volmit.iris.util.nbt.tag.CompoundTag;
import com.volmit.iris.util.nbt.tag.ListTag; import com.volmit.iris.util.nbt.tag.ListTag;
import com.volmit.iris.util.nbt.tag.Tag;
import java.io.*; import java.io.*;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.concurrent.atomic.AtomicReferenceArray;
import static com.volmit.iris.util.nbt.mca.LoadFlags.*; import static com.volmit.iris.util.nbt.mca.LoadFlags.*;

View File

@ -18,7 +18,6 @@
package com.volmit.iris.util.nbt.mca; package com.volmit.iris.util.nbt.mca;
import com.volmit.iris.Iris;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.Position2;
import com.volmit.iris.util.nbt.tag.CompoundTag; import com.volmit.iris.util.nbt.tag.CompoundTag;

View File

@ -73,24 +73,22 @@ public class Section {
* @return The block state data of this block. * @return The block state data of this block.
*/ */
public synchronized CompoundTag getBlockStateAt(int blockX, int blockY, int blockZ) { public synchronized CompoundTag getBlockStateAt(int blockX, int blockY, int blockZ) {
synchronized (palette) synchronized (palette) {
{ return palette.getBlock(blockX & 15, blockY & 15, blockZ & 15);
return palette.getBlock(blockX&15, blockY&15, blockZ&15);
} }
} }
/** /**
* Attempts to add a block state for a specific block location in this Section. * Attempts to add a block state for a specific block location in this Section.
* *
* @param blockX The x-coordinate of the block in this Section * @param blockX The x-coordinate of the block in this Section
* @param blockY The y-coordinate of the block in this Section * @param blockY The y-coordinate of the block in this Section
* @param blockZ The z-coordinate of the block in this Section * @param blockZ The z-coordinate of the block in this Section
* @param state The block state to be set * @param state The block state to be set
*/ */
public synchronized void setBlockStateAt(int blockX, int blockY, int blockZ, CompoundTag state, boolean cleanup) { public synchronized void setBlockStateAt(int blockX, int blockY, int blockZ, CompoundTag state, boolean cleanup) {
synchronized (palette) synchronized (palette) {
{ palette.setBlock(blockX & 15, blockY & 15, blockZ & 15, state);
palette.setBlock(blockX&15, blockY&15, blockZ&15, state);
} }
} }
@ -167,8 +165,7 @@ public class Section {
data.putByte("Y", (byte) y); data.putByte("Y", (byte) y);
if (palette != null) { if (palette != null) {
synchronized (palette) synchronized (palette) {
{
palette.writeToSection(data); palette.writeToSection(data);
} }
} }

View File

@ -18,8 +18,7 @@
package com.volmit.iris.util.nbt.mca.palette; package com.volmit.iris.util.nbt.mca.palette;
public interface BiomeContainer public interface BiomeContainer {
{
int[] getData(); int[] getData();
void setBiome(int x, int y, int z, int id); void setBiome(int x, int y, int z, int id);

View File

@ -23,123 +23,123 @@ import org.apache.commons.lang3.Validate;
import java.util.function.IntConsumer; import java.util.function.IntConsumer;
public class BitStorage { public class BitStorage {
private static final int[] MAGIC = new int[] { private static final int[] MAGIC = new int[]{
-1, -1, 0, Integer.MIN_VALUE, 0, 0, 1431655765, 1431655765, 0, Integer.MIN_VALUE, -1, -1, 0, Integer.MIN_VALUE, 0, 0, 1431655765, 1431655765, 0, Integer.MIN_VALUE,
0, 1, 858993459, 858993459, 0, 715827882, 715827882, 0, 613566756, 613566756, 0, 1, 858993459, 858993459, 0, 715827882, 715827882, 0, 613566756, 613566756,
0, Integer.MIN_VALUE, 0, 2, 477218588, 477218588, 0, 429496729, 429496729, 0, 0, Integer.MIN_VALUE, 0, 2, 477218588, 477218588, 0, 429496729, 429496729, 0,
390451572, 390451572, 0, 357913941, 357913941, 0, 330382099, 330382099, 0, 306783378, 390451572, 390451572, 0, 357913941, 357913941, 0, 330382099, 330382099, 0, 306783378,
306783378, 0, 286331153, 286331153, 0, Integer.MIN_VALUE, 0, 3, 252645135, 252645135, 306783378, 0, 286331153, 286331153, 0, Integer.MIN_VALUE, 0, 3, 252645135, 252645135,
0, 238609294, 238609294, 0, 226050910, 226050910, 0, 214748364, 214748364, 0, 0, 238609294, 238609294, 0, 226050910, 226050910, 0, 214748364, 214748364, 0,
204522252, 204522252, 0, 195225786, 195225786, 0, 186737708, 186737708, 0, 178956970, 204522252, 204522252, 0, 195225786, 195225786, 0, 186737708, 186737708, 0, 178956970,
178956970, 0, 171798691, 171798691, 0, 165191049, 165191049, 0, 159072862, 159072862, 178956970, 0, 171798691, 171798691, 0, 165191049, 165191049, 0, 159072862, 159072862,
0, 153391689, 153391689, 0, 148102320, 148102320, 0, 143165576, 143165576, 0, 0, 153391689, 153391689, 0, 148102320, 148102320, 0, 143165576, 143165576, 0,
138547332, 138547332, 0, Integer.MIN_VALUE, 0, 4, 130150524, 130150524, 0, 126322567, 138547332, 138547332, 0, Integer.MIN_VALUE, 0, 4, 130150524, 130150524, 0, 126322567,
126322567, 0, 122713351, 122713351, 0, 119304647, 119304647, 0, 116080197, 116080197, 126322567, 0, 122713351, 122713351, 0, 119304647, 119304647, 0, 116080197, 116080197,
0, 113025455, 113025455, 0, 110127366, 110127366, 0, 107374182, 107374182, 0, 0, 113025455, 113025455, 0, 110127366, 110127366, 0, 107374182, 107374182, 0,
104755299, 104755299, 0, 102261126, 102261126, 0, 99882960, 99882960, 0, 97612893, 104755299, 104755299, 0, 102261126, 102261126, 0, 99882960, 99882960, 0, 97612893,
97612893, 0, 95443717, 95443717, 0, 93368854, 93368854, 0, 91382282, 91382282, 97612893, 0, 95443717, 95443717, 0, 93368854, 93368854, 0, 91382282, 91382282,
0, 89478485, 89478485, 0, 87652393, 87652393, 0, 85899345, 85899345, 0, 0, 89478485, 89478485, 0, 87652393, 87652393, 0, 85899345, 85899345, 0,
84215045, 84215045, 0, 82595524, 82595524, 0, 81037118, 81037118, 0, 79536431, 84215045, 84215045, 0, 82595524, 82595524, 0, 81037118, 81037118, 0, 79536431,
79536431, 0, 78090314, 78090314, 0, 76695844, 76695844, 0, 75350303, 75350303, 79536431, 0, 78090314, 78090314, 0, 76695844, 76695844, 0, 75350303, 75350303,
0, 74051160, 74051160, 0, 72796055, 72796055, 0, 71582788, 71582788, 0, 0, 74051160, 74051160, 0, 72796055, 72796055, 0, 71582788, 71582788, 0,
70409299, 70409299, 0, 69273666, 69273666, 0, 68174084, 68174084, 0, Integer.MIN_VALUE, 70409299, 70409299, 0, 69273666, 69273666, 0, 68174084, 68174084, 0, Integer.MIN_VALUE,
0, 5 }; 0, 5};
private final long[] data; private final long[] data;
private final int bits; private final int bits;
private final long mask; private final long mask;
private final int size; private final int size;
private final int valuesPerLong; private final int valuesPerLong;
private final int divideMul; private final int divideMul;
private final int divideAdd; private final int divideAdd;
private final int divideShift; private final int divideShift;
public BitStorage(int var0, int var1) { public BitStorage(int var0, int var1) {
this(var0, var1, null); this(var0, var1, null);
} }
public BitStorage(int var0, int var1, long[] var2) { public BitStorage(int var0, int var1, long[] var2) {
Validate.inclusiveBetween(1L, 32L, var0); Validate.inclusiveBetween(1L, 32L, var0);
this.size = var1; this.size = var1;
this.bits = var0; this.bits = var0;
this.mask = (1L << var0) - 1L; this.mask = (1L << var0) - 1L;
this.valuesPerLong = (char)(64 / var0); this.valuesPerLong = (char) (64 / var0);
int var3 = 3 * (this.valuesPerLong - 1); int var3 = 3 * (this.valuesPerLong - 1);
this.divideMul = MAGIC[var3 + 0]; this.divideMul = MAGIC[var3 + 0];
this.divideAdd = MAGIC[var3 + 1]; this.divideAdd = MAGIC[var3 + 1];
this.divideShift = MAGIC[var3 + 2]; this.divideShift = MAGIC[var3 + 2];
int var4 = (var1 + this.valuesPerLong - 1) / this.valuesPerLong; int var4 = (var1 + this.valuesPerLong - 1) / this.valuesPerLong;
if (var2 != null) { if (var2 != null) {
if (var2.length != var4) if (var2.length != var4)
throw new RuntimeException("NO!"); throw new RuntimeException("NO!");
this.data = var2; this.data = var2;
} else { } else {
this.data = new long[var4]; this.data = new long[var4];
} }
} }
private int cellIndex(int var0) { private int cellIndex(int var0) {
long var1 = Integer.toUnsignedLong(this.divideMul); long var1 = Integer.toUnsignedLong(this.divideMul);
long var3 = Integer.toUnsignedLong(this.divideAdd); long var3 = Integer.toUnsignedLong(this.divideAdd);
return (int)(var0 * var1 + var3 >> 32L >> this.divideShift); return (int) (var0 * var1 + var3 >> 32L >> this.divideShift);
} }
public int getAndSet(int var0, int var1) { public int getAndSet(int var0, int var1) {
Validate.inclusiveBetween(0L, (this.size - 1), var0); Validate.inclusiveBetween(0L, (this.size - 1), var0);
Validate.inclusiveBetween(0L, this.mask, var1); Validate.inclusiveBetween(0L, this.mask, var1);
int var2 = cellIndex(var0); int var2 = cellIndex(var0);
long var3 = this.data[var2]; long var3 = this.data[var2];
int var5 = (var0 - var2 * this.valuesPerLong) * this.bits; int var5 = (var0 - var2 * this.valuesPerLong) * this.bits;
int var6 = (int)(var3 >> var5 & this.mask); int var6 = (int) (var3 >> var5 & this.mask);
this.data[var2] = var3 & (this.mask << var5 ^ 0xFFFFFFFFFFFFFFFFL) | (var1 & this.mask) << var5; this.data[var2] = var3 & (this.mask << var5 ^ 0xFFFFFFFFFFFFFFFFL) | (var1 & this.mask) << var5;
return var6; return var6;
} }
public void set(int var0, int var1) { public void set(int var0, int var1) {
Validate.inclusiveBetween(0L, (this.size - 1), var0); Validate.inclusiveBetween(0L, (this.size - 1), var0);
Validate.inclusiveBetween(0L, this.mask, var1); Validate.inclusiveBetween(0L, this.mask, var1);
int var2 = cellIndex(var0); int var2 = cellIndex(var0);
long var3 = this.data[var2]; long var3 = this.data[var2];
int var5 = (var0 - var2 * this.valuesPerLong) * this.bits; int var5 = (var0 - var2 * this.valuesPerLong) * this.bits;
this.data[var2] = var3 & (this.mask << var5 ^ 0xFFFFFFFFFFFFFFFFL) | (var1 & this.mask) << var5; this.data[var2] = var3 & (this.mask << var5 ^ 0xFFFFFFFFFFFFFFFFL) | (var1 & this.mask) << var5;
} }
public int get(int var0) { public int get(int var0) {
Validate.inclusiveBetween(0L, (this.size - 1), var0); Validate.inclusiveBetween(0L, (this.size - 1), var0);
int var1 = cellIndex(var0); int var1 = cellIndex(var0);
long var2 = this.data[var1]; long var2 = this.data[var1];
int var4 = (var0 - var1 * this.valuesPerLong) * this.bits; int var4 = (var0 - var1 * this.valuesPerLong) * this.bits;
return (int)(var2 >> var4 & this.mask); return (int) (var2 >> var4 & this.mask);
} }
public long[] getRaw() { public long[] getRaw() {
return this.data; return this.data;
} }
public int getSize() { public int getSize() {
return this.size; return this.size;
} }
public int getBits() { public int getBits() {
return this.bits; return this.bits;
} }
public void getAll(IntConsumer var0) { public void getAll(IntConsumer var0) {
int var1 = 0; int var1 = 0;
for (long var5 : this.data) { for (long var5 : this.data) {
for (int var7 = 0; var7 < this.valuesPerLong; var7++) { for (int var7 = 0; var7 < this.valuesPerLong; var7++) {
var0.accept((int)(var5 & this.mask)); var0.accept((int) (var5 & this.mask));
var5 >>= this.bits; var5 >>= this.bits;
if (++var1 >= this.size) if (++var1 >= this.size)
return; return;
} }
} }
} }
} }

View File

@ -18,84 +18,79 @@
package com.volmit.iris.util.nbt.mca.palette; package com.volmit.iris.util.nbt.mca.palette;
import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.biome.BiomeBase;
import net.minecraft.world.level.biome.BiomeManager;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bukkit.block.Biome;
import java.util.Arrays; import java.util.Arrays;
public class ChunkBiomeContainer<T> { public class ChunkBiomeContainer<T> {
private static final Logger LOGGER = LogManager.getLogger(); private static final Logger LOGGER = LogManager.getLogger();
private static final int WIDTH_BITS = Mth.ceillog2(16) - 2; private static final int WIDTH_BITS = Mth.ceillog2(16) - 2;
private static final int HORIZONTAL_MASK = (1 << WIDTH_BITS) - 1; private static final int HORIZONTAL_MASK = (1 << WIDTH_BITS) - 1;
private static final int PACKED_X_LENGTH = 1 + Mth.log2(Mth.smallestEncompassingPowerOfTwo(30000000)); private static final int PACKED_X_LENGTH = 1 + Mth.log2(Mth.smallestEncompassingPowerOfTwo(30000000));
private static final int PACKED_Z_LENGTH = PACKED_X_LENGTH; private static final int PACKED_Z_LENGTH = PACKED_X_LENGTH;
public static final int PACKED_Y_LENGTH = 64 - PACKED_X_LENGTH - PACKED_Z_LENGTH; public static final int PACKED_Y_LENGTH = 64 - PACKED_X_LENGTH - PACKED_Z_LENGTH;
public static final int MAX_SIZE = 1 << WIDTH_BITS + WIDTH_BITS + PACKED_Y_LENGTH - 2; public static final int MAX_SIZE = 1 << WIDTH_BITS + WIDTH_BITS + PACKED_Y_LENGTH - 2;
public final IdMap<T> biomeRegistry;
private final T[] biomes;
private final int quartMinY;
private final int quartHeight;
protected ChunkBiomeContainer(IdMap<T> registry, int minHeight, int maxHeight, T[] abiomebase) { public final IdMap<T> biomeRegistry;
this.biomeRegistry = registry;
this.biomes = abiomebase;
this.quartMinY = QuartPos.fromBlock(minHeight);
this.quartHeight = QuartPos.fromBlock(maxHeight) - 1;
}
public ChunkBiomeContainer(IdMap<T> registry, int min, int max) private final T[] biomes;
{
this(registry, min, max, new int[(1 << WIDTH_BITS + WIDTH_BITS) * ceilDiv(max - min, 4)]);
}
public ChunkBiomeContainer(IdMap<T> registry, int minHeight, int maxHeight, int[] aint) { private final int quartMinY;
this(registry, minHeight, maxHeight, (T[])new Object[aint.length]);
int i = -1;
for (int j = 0; j < this.biomes.length; j++) {
int k = aint[j];
T biomebase = registry.byId(k);
if (biomebase == null) {
if (i == -1)
i = j;
this.biomes[j] = (T)registry.byId(0);
} else {
this.biomes[j] = biomebase;
}
}
if (i != -1)
LOGGER.warn("Invalid biome data received, starting from {}: {}", Integer.valueOf(i), Arrays.toString(aint));
}
private static int ceilDiv(int i, int j) { private final int quartHeight;
return (i + j - 1) / j;
}
public int[] writeBiomes() { protected ChunkBiomeContainer(IdMap<T> registry, int minHeight, int maxHeight, T[] abiomebase) {
int[] aint = new int[this.biomes.length]; this.biomeRegistry = registry;
for (int i = 0; i < this.biomes.length; i++) this.biomes = abiomebase;
aint[i] = this.biomeRegistry.getId(this.biomes[i]); this.quartMinY = QuartPos.fromBlock(minHeight);
return aint; this.quartHeight = QuartPos.fromBlock(maxHeight) - 1;
} }
public T getBiome(int i, int j, int k) { public ChunkBiomeContainer(IdMap<T> registry, int min, int max) {
int l = i & HORIZONTAL_MASK; this(registry, min, max, new int[(1 << WIDTH_BITS + WIDTH_BITS) * ceilDiv(max - min, 4)]);
int i1 = Mth.clamp(j - this.quartMinY, 0, this.quartHeight); }
int j1 = k & HORIZONTAL_MASK;
return this.biomes[i1 << WIDTH_BITS + WIDTH_BITS | j1 << WIDTH_BITS | l]; public ChunkBiomeContainer(IdMap<T> registry, int minHeight, int maxHeight, int[] aint) {
} this(registry, minHeight, maxHeight, (T[]) new Object[aint.length]);
int i = -1;
public void setBiome(int i, int j, int k, T biome) { for (int j = 0; j < this.biomes.length; j++) {
int l = i & HORIZONTAL_MASK; int k = aint[j];
int i1 = Mth.clamp(j - this.quartMinY, 0, this.quartHeight); T biomebase = registry.byId(k);
int j1 = k & HORIZONTAL_MASK; if (biomebase == null) {
this.biomes[i1 << WIDTH_BITS + WIDTH_BITS | j1 << WIDTH_BITS | l] = biome; if (i == -1)
} i = j;
this.biomes[j] = registry.byId(0);
} else {
this.biomes[j] = biomebase;
}
}
if (i != -1)
LOGGER.warn("Invalid biome data received, starting from {}: {}", Integer.valueOf(i), Arrays.toString(aint));
}
private static int ceilDiv(int i, int j) {
return (i + j - 1) / j;
}
public int[] writeBiomes() {
int[] aint = new int[this.biomes.length];
for (int i = 0; i < this.biomes.length; i++)
aint[i] = this.biomeRegistry.getId(this.biomes[i]);
return aint;
}
public T getBiome(int i, int j, int k) {
int l = i & HORIZONTAL_MASK;
int i1 = Mth.clamp(j - this.quartMinY, 0, this.quartHeight);
int j1 = k & HORIZONTAL_MASK;
return this.biomes[i1 << WIDTH_BITS + WIDTH_BITS | j1 << WIDTH_BITS | l];
}
public void setBiome(int i, int j, int k, T biome) {
int l = i & HORIZONTAL_MASK;
int i1 = Mth.clamp(j - this.quartMinY, 0, this.quartHeight);
int j1 = k & HORIZONTAL_MASK;
this.biomes[i1 << WIDTH_BITS + WIDTH_BITS | j1 << WIDTH_BITS | l] = biome;
}
} }

View File

@ -20,5 +20,5 @@ package com.volmit.iris.util.nbt.mca.palette;
@FunctionalInterface @FunctionalInterface
public interface CountConsumer<T> { public interface CountConsumer<T> {
void accept(T paramT, int paramInt); void accept(T paramT, int paramInt);
} }

View File

@ -25,143 +25,143 @@ import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> { public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
public static final int NOT_FOUND = -1; public static final int NOT_FOUND = -1;
private static final Object EMPTY_SLOT = null;
private static final float LOADFACTOR = 0.8F;
private K[] keys;
private int[] values;
private K[] byId;
private int nextId;
private int size;
public CrudeIncrementalIntIdentityHashBiMap(int var0) {
var0 = (int)(var0 / 0.8F);
this.keys = (K[])new Object[var0];
this.values = new int[var0];
this.byId = (K[])new Object[var0];
}
public int getId(K var0) {
return getValue(indexOf(var0, hash(var0)));
}
public K byId(int var0) { private static final Object EMPTY_SLOT = null;
if (var0 < 0 || var0 >= this.byId.length)
return null; private static final float LOADFACTOR = 0.8F;
return this.byId[var0];
} private K[] keys;
private int getValue(int var0) { private int[] values;
if (var0 == -1)
return -1; private K[] byId;
return this.values[var0];
} private int nextId;
public boolean contains(K var0) { private int size;
return (getId(var0) != -1);
} public CrudeIncrementalIntIdentityHashBiMap(int var0) {
var0 = (int) (var0 / 0.8F);
public boolean contains(int var0) { this.keys = (K[]) new Object[var0];
return (byId(var0) != null); this.values = new int[var0];
} this.byId = (K[]) new Object[var0];
}
public int add(K var0) {
int var1 = nextId(); public int getId(K var0) {
addMapping(var0, var1); return getValue(indexOf(var0, hash(var0)));
return var1; }
}
private int nextId() { public K byId(int var0) {
while (this.nextId < this.byId.length && this.byId[this.nextId] != null) if (var0 < 0 || var0 >= this.byId.length)
this.nextId++; return null;
return this.nextId; return this.byId[var0];
} }
private void grow(int var0) { private int getValue(int var0) {
K[] var1 = this.keys; if (var0 == -1)
int[] var2 = this.values; return -1;
this.keys = (K[])new Object[var0]; return this.values[var0];
this.values = new int[var0]; }
this.byId = (K[])new Object[var0];
this.nextId = 0; public boolean contains(K var0) {
this.size = 0; return (getId(var0) != -1);
for (int var3 = 0; var3 < var1.length; var3++) { }
if (var1[var3] != null)
addMapping(var1[var3], var2[var3]); public boolean contains(int var0) {
} return (byId(var0) != null);
} }
public void addMapping(K var0, int var1) { public int add(K var0) {
int var2 = Math.max(var1, this.size + 1); int var1 = nextId();
if (var2 >= this.keys.length * 0.8F) { addMapping(var0, var1);
int i = this.keys.length << 1; return var1;
while (i < var1) }
i <<= 1;
grow(i); private int nextId() {
} while (this.nextId < this.byId.length && this.byId[this.nextId] != null)
int var3 = findEmpty(hash(var0)); this.nextId++;
this.keys[var3] = var0; return this.nextId;
this.values[var3] = var1; }
this.byId[var1] = var0;
this.size++; private void grow(int var0) {
if (var1 == this.nextId) K[] var1 = this.keys;
this.nextId++; int[] var2 = this.values;
} this.keys = (K[]) new Object[var0];
this.values = new int[var0];
private int hash( K var0) { this.byId = (K[]) new Object[var0];
return (Mth.murmurHash3Mixer(System.identityHashCode(var0)) & Integer.MAX_VALUE) % this.keys.length; this.nextId = 0;
} this.size = 0;
for (int var3 = 0; var3 < var1.length; var3++) {
private int indexOf( K var0, int var1) { if (var1[var3] != null)
int var2; addMapping(var1[var3], var2[var3]);
for (var2 = var1; var2 < this.keys.length; var2++) { }
if (this.keys[var2] == var0) }
return var2;
if (this.keys[var2] == EMPTY_SLOT) public void addMapping(K var0, int var1) {
return -1; int var2 = Math.max(var1, this.size + 1);
} if (var2 >= this.keys.length * 0.8F) {
for (var2 = 0; var2 < var1; var2++) { int i = this.keys.length << 1;
if (this.keys[var2] == var0) while (i < var1)
return var2; i <<= 1;
if (this.keys[var2] == EMPTY_SLOT) grow(i);
return -1; }
} int var3 = findEmpty(hash(var0));
return -1; this.keys[var3] = var0;
} this.values[var3] = var1;
this.byId[var1] = var0;
private int findEmpty(int var0) { this.size++;
int var1; if (var1 == this.nextId)
for (var1 = var0; var1 < this.keys.length; var1++) { this.nextId++;
if (this.keys[var1] == EMPTY_SLOT) }
return var1;
} private int hash(K var0) {
for (var1 = 0; var1 < var0; var1++) { return (Mth.murmurHash3Mixer(System.identityHashCode(var0)) & Integer.MAX_VALUE) % this.keys.length;
if (this.keys[var1] == EMPTY_SLOT) }
return var1;
} private int indexOf(K var0, int var1) {
throw new RuntimeException("Overflowed :("); int var2;
} for (var2 = var1; var2 < this.keys.length; var2++) {
if (this.keys[var2] == var0)
public Iterator<K> iterator() { return var2;
return (Iterator<K>) Iterators.filter((Iterator)Iterators.forArray((Object[])this.byId), Predicates.notNull()); if (this.keys[var2] == EMPTY_SLOT)
} return -1;
}
public void clear() { for (var2 = 0; var2 < var1; var2++) {
Arrays.fill((Object[])this.keys, (Object)null); if (this.keys[var2] == var0)
Arrays.fill((Object[])this.byId, (Object)null); return var2;
this.nextId = 0; if (this.keys[var2] == EMPTY_SLOT)
this.size = 0; return -1;
} }
return -1;
public int size() { }
return this.size;
} private int findEmpty(int var0) {
int var1;
for (var1 = var0; var1 < this.keys.length; var1++) {
if (this.keys[var1] == EMPTY_SLOT)
return var1;
}
for (var1 = 0; var1 < var0; var1++) {
if (this.keys[var1] == EMPTY_SLOT)
return var1;
}
throw new RuntimeException("Overflowed :(");
}
public Iterator<K> iterator() {
return (Iterator<K>) Iterators.filter(Iterators.forArray((Object[]) this.byId), Predicates.notNull());
}
public void clear() {
Arrays.fill(this.keys, null);
Arrays.fill(this.byId, null);
this.nextId = 0;
this.size = 0;
}
public int size() {
return this.size;
}
} }

View File

@ -23,32 +23,33 @@ import com.volmit.iris.util.nbt.tag.ListTag;
import java.util.function.Predicate; import java.util.function.Predicate;
public class GlobalPalette<T> implements Palette<T> { public class GlobalPalette<T> implements Palette<T> {
private final IdMapper<T> registry; private final IdMapper<T> registry;
private final T defaultValue; private final T defaultValue;
public GlobalPalette(IdMapper<T> var0, T var1) { public GlobalPalette(IdMapper<T> var0, T var1) {
this.registry = var0; this.registry = var0;
this.defaultValue = var1; this.defaultValue = var1;
} }
public int idFor(T var0) { public int idFor(T var0) {
int var1 = this.registry.getId(var0); int var1 = this.registry.getId(var0);
return (var1 == -1) ? 0 : var1; return (var1 == -1) ? 0 : var1;
} }
public boolean maybeHas(Predicate<T> var0) { public boolean maybeHas(Predicate<T> var0) {
return true; return true;
} }
public T valueFor(int var0) { public T valueFor(int var0) {
T var1 = (T)this.registry.byId(var0); T var1 = this.registry.byId(var0);
return (var1 == null) ? this.defaultValue : var1; return (var1 == null) ? this.defaultValue : var1;
} }
public int getSize() { public int getSize() {
return this.registry.size(); return this.registry.size();
} }
public void read(ListTag var0) {} public void read(ListTag var0) {
}
} }

View File

@ -25,61 +25,61 @@ import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
public class HashMapPalette<T> implements Palette<T> { public class HashMapPalette<T> implements Palette<T> {
private final IdMapper<T> registry; private final IdMapper<T> registry;
private final CrudeIncrementalIntIdentityHashBiMap<T> values;
private final PaletteResize<T> resizeHandler;
private final Function<CompoundTag, T> reader;
private final Function<T, CompoundTag> writer;
private final int bits;
public HashMapPalette(IdMapper<T> var0, int var1, PaletteResize<T> var2, Function<CompoundTag, T> var3, Function<T, CompoundTag> var4) {
this.registry = var0;
this.bits = var1;
this.resizeHandler = var2;
this.reader = var3;
this.writer = var4;
this.values = new CrudeIncrementalIntIdentityHashBiMap(1 << var1);
}
public int idFor(T var0) {
int var1 = this.values.getId(var0);
if (var1 == -1) {
var1 = this.values.add(var0);
if (var1 >= 1 << this.bits)
var1 = this.resizeHandler.onResize(this.bits + 1, var0);
}
return var1;
}
public boolean maybeHas(Predicate<T> var0) {
for (int var1 = 0; var1 < getSize(); var1++) {
if (var0.test((T)this.values.byId(var1)))
return true;
}
return false;
}
public T valueFor(int var0) { private final CrudeIncrementalIntIdentityHashBiMap<T> values;
return (T)this.values.byId(var0);
}
public int getSize() { private final PaletteResize<T> resizeHandler;
return this.values.size();
} private final Function<CompoundTag, T> reader;
public void read(ListTag var0) { private final Function<T, CompoundTag> writer;
this.values.clear();
for (int var1 = 0; var1 < var0.size(); var1++) private final int bits;
this.values.add(this.reader.apply((CompoundTag) var0.get(var1)));
} public HashMapPalette(IdMapper<T> var0, int var1, PaletteResize<T> var2, Function<CompoundTag, T> var3, Function<T, CompoundTag> var4) {
this.registry = var0;
public void write(ListTag var0) { this.bits = var1;
for (int var1 = 0; var1 < getSize(); var1++) this.resizeHandler = var2;
var0.add(this.writer.apply((T)this.values.byId(var1))); this.reader = var3;
} this.writer = var4;
this.values = new CrudeIncrementalIntIdentityHashBiMap(1 << var1);
}
public int idFor(T var0) {
int var1 = this.values.getId(var0);
if (var1 == -1) {
var1 = this.values.add(var0);
if (var1 >= 1 << this.bits)
var1 = this.resizeHandler.onResize(this.bits + 1, var0);
}
return var1;
}
public boolean maybeHas(Predicate<T> var0) {
for (int var1 = 0; var1 < getSize(); var1++) {
if (var0.test(this.values.byId(var1)))
return true;
}
return false;
}
public T valueFor(int var0) {
return this.values.byId(var0);
}
public int getSize() {
return this.values.size();
}
public void read(ListTag var0) {
this.values.clear();
for (int var1 = 0; var1 < var0.size(); var1++)
this.values.add(this.reader.apply((CompoundTag) var0.get(var1)));
}
public void write(ListTag var0) {
for (int var1 = 0; var1 < getSize(); var1++)
var0.add(this.writer.apply(this.values.byId(var1)));
}
} }

View File

@ -19,7 +19,7 @@
package com.volmit.iris.util.nbt.mca.palette; package com.volmit.iris.util.nbt.mca.palette;
public interface IdMap<T> extends Iterable<T> { public interface IdMap<T> extends Iterable<T> {
int getId(T paramT); int getId(T paramT);
T byId(int paramInt); T byId(int paramInt);
} }

View File

@ -27,62 +27,62 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
public class IdMapper<T> implements IdMap<T> { public class IdMapper<T> implements IdMap<T> {
public static final int DEFAULT = -1; public static final int DEFAULT = -1;
private int nextId;
private final IdentityHashMap<T, Integer> tToId;
private final List<T> idToT;
public IdMapper(IdentityHashMap<T, Integer> tToId, List<T> idToT, int nextId) { private int nextId;
this.tToId = tToId;
this.idToT = idToT;
this.nextId = nextId;
}
public IdMapper() { private final IdentityHashMap<T, Integer> tToId;
this(512);
}
public IdMapper(int var0) {
this.idToT = Lists.newArrayListWithExpectedSize(var0);
this.tToId = new IdentityHashMap<>(var0);
}
public void addMapping(T var0, int var1) {
this.tToId.put(var0, Integer.valueOf(var1));
while (this.idToT.size() <= var1)
this.idToT.add(null);
this.idToT.set(var1, var0);
if (this.nextId <= var1)
this.nextId = var1 + 1;
}
public void add(T var0) {
addMapping(var0, this.nextId);
}
public int getId(T var0) {
Integer var1 = this.tToId.get(var0);
return (var1 == null) ? -1 : var1.intValue();
}
public final T byId(int var0) { private final List<T> idToT;
if (var0 >= 0 && var0 < this.idToT.size())
return this.idToT.get(var0); public IdMapper(IdentityHashMap<T, Integer> tToId, List<T> idToT, int nextId) {
return null; this.tToId = tToId;
} this.idToT = idToT;
this.nextId = nextId;
public Iterator<T> iterator() { }
return (Iterator<T>) Iterators.filter(this.idToT.iterator(), Predicates.notNull());
} public IdMapper() {
this(512);
public boolean contains(int var0) { }
return (byId(var0) != null);
} public IdMapper(int var0) {
this.idToT = Lists.newArrayListWithExpectedSize(var0);
public int size() { this.tToId = new IdentityHashMap<>(var0);
return this.tToId.size(); }
}
public void addMapping(T var0, int var1) {
this.tToId.put(var0, Integer.valueOf(var1));
while (this.idToT.size() <= var1)
this.idToT.add(null);
this.idToT.set(var1, var0);
if (this.nextId <= var1)
this.nextId = var1 + 1;
}
public void add(T var0) {
addMapping(var0, this.nextId);
}
public int getId(T var0) {
Integer var1 = this.tToId.get(var0);
return (var1 == null) ? -1 : var1.intValue();
}
public final T byId(int var0) {
if (var0 >= 0 && var0 < this.idToT.size())
return this.idToT.get(var0);
return null;
}
public Iterator<T> iterator() {
return Iterators.filter(this.idToT.iterator(), Predicates.notNull());
}
public boolean contains(int var0) {
return (byId(var0) != null);
}
public int size() {
return this.tToId.size();
}
} }

View File

@ -25,62 +25,62 @@ import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
public class LinearPalette<T> implements Palette<T> { public class LinearPalette<T> implements Palette<T> {
private final IdMapper<T> registry; private final IdMapper<T> registry;
private final T[] values;
private final PaletteResize<T> resizeHandler;
private final Function<CompoundTag, T> reader;
private final int bits;
private int size;
public LinearPalette(IdMapper<T> var0, int var1, PaletteResize<T> var2, Function<CompoundTag, T> var3) {
this.registry = var0;
this.values = (T[])new Object[1 << var1];
this.bits = var1;
this.resizeHandler = var2;
this.reader = var3;
}
public int idFor(T var0) {
int var1;
for (var1 = 0; var1 < this.size; var1++) {
if (this.values[var1] == var0)
return var1;
}
var1 = this.size;
if (var1 < this.values.length) {
this.values[var1] = var0;
this.size++;
return var1;
}
return this.resizeHandler.onResize(this.bits + 1, var0);
}
public boolean maybeHas(Predicate<T> var0) {
for (int var1 = 0; var1 < this.size; var1++) {
if (var0.test(this.values[var1]))
return true;
}
return false;
}
public T valueFor(int var0) { private final T[] values;
if (var0 >= 0 && var0 < this.size)
return this.values[var0]; private final PaletteResize<T> resizeHandler;
return null;
} private final Function<CompoundTag, T> reader;
public int getSize() { private final int bits;
return this.size;
} private int size;
public void read(ListTag var0) { public LinearPalette(IdMapper<T> var0, int var1, PaletteResize<T> var2, Function<CompoundTag, T> var3) {
for (int var1 = 0; var1 < var0.size(); var1++) this.registry = var0;
this.values[var1] = this.reader.apply((CompoundTag) var0.get(var1)); this.values = (T[]) new Object[1 << var1];
this.size = var0.size(); this.bits = var1;
} this.resizeHandler = var2;
this.reader = var3;
}
public int idFor(T var0) {
int var1;
for (var1 = 0; var1 < this.size; var1++) {
if (this.values[var1] == var0)
return var1;
}
var1 = this.size;
if (var1 < this.values.length) {
this.values[var1] = var0;
this.size++;
return var1;
}
return this.resizeHandler.onResize(this.bits + 1, var0);
}
public boolean maybeHas(Predicate<T> var0) {
for (int var1 = 0; var1 < this.size; var1++) {
if (var0.test(this.values[var1]))
return true;
}
return false;
}
public T valueFor(int var0) {
if (var0 >= 0 && var0 < this.size)
return this.values[var0];
return null;
}
public int getSize() {
return this.size;
}
public void read(ListTag var0) {
for (int var1 = 0; var1 < var0.size(); var1++)
this.values[var1] = this.reader.apply((CompoundTag) var0.get(var1));
this.size = var0.size();
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -23,13 +23,13 @@ import com.volmit.iris.util.nbt.tag.ListTag;
import java.util.function.Predicate; import java.util.function.Predicate;
public interface Palette<T> { public interface Palette<T> {
int idFor(T paramT); int idFor(T paramT);
boolean maybeHas(Predicate<T> paramPredicate);
T valueFor(int paramInt); boolean maybeHas(Predicate<T> paramPredicate);
int getSize(); T valueFor(int paramInt);
void read(ListTag paramListTag); int getSize();
void read(ListTag paramListTag);
} }

View File

@ -21,11 +21,11 @@ package com.volmit.iris.util.nbt.mca.palette;
import com.volmit.iris.util.nbt.tag.CompoundTag; import com.volmit.iris.util.nbt.tag.CompoundTag;
public interface PaletteAccess { public interface PaletteAccess {
public void setBlock(int x, int y, int z, CompoundTag data); void setBlock(int x, int y, int z, CompoundTag data);
public CompoundTag getBlock(int x, int y, int z); CompoundTag getBlock(int x, int y, int z);
public void writeToSection(CompoundTag tag); void writeToSection(CompoundTag tag);
public void readFromSection(CompoundTag tag); void readFromSection(CompoundTag tag);
} }

View File

@ -19,5 +19,5 @@
package com.volmit.iris.util.nbt.mca.palette; package com.volmit.iris.util.nbt.mca.palette;
interface PaletteResize<T> { interface PaletteResize<T> {
int onResize(int paramInt, T paramT); int onResize(int paramInt, T paramT);
} }

View File

@ -26,158 +26,157 @@ import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
public class PalettedContainer<T> implements PaletteResize<T> { public class PalettedContainer<T> implements PaletteResize<T> {
private static final int SIZE = 4096; private static final int SIZE = 4096;
public static final int GLOBAL_PALETTE_BITS = 9;
public static final int MIN_PALETTE_SIZE = 4;
private final Palette<T> globalPalette;
private final PaletteResize<T> dummyPaletteResize = (var0, var1) -> 0;
private final IdMapper<T> registry;
private final Function<CompoundTag, T> reader;
private final Function<T, CompoundTag> writer;
private final T defaultValue;
protected BitStorage storage;
private Palette<T> palette;
private int bits;
public PalettedContainer(Palette<T> var0, IdMapper<T> var1, Function<CompoundTag, T> var2, Function<T, CompoundTag> var3, T var4) {
this.globalPalette = var0;
this.registry = var1;
this.reader = var2;
this.writer = var3;
this.defaultValue = var4;
setBits(4);
}
private static int getIndex(int var0, int var1, int var2) {
return var1 << 8 | var2 << 4 | var0;
}
private void setBits(int var0) {
if (var0 == this.bits)
return;
this.bits = var0;
if (this.bits <= 4) {
this.bits = 4;
this.palette = new LinearPalette<>(this.registry, this.bits, this, this.reader);
} else if (this.bits < 9) {
this.palette = new HashMapPalette<>(this.registry, this.bits, this, this.reader, this.writer);
} else {
this.palette = this.globalPalette;
this.bits = Mth.ceillog2(this.registry.size());
}
this.palette.idFor(this.defaultValue);
this.storage = new BitStorage(this.bits, 4096);
}
public int onResize(int var0, T var1) {
BitStorage var2 = this.storage;
Palette<T> var3 = this.palette;
setBits(var0);
for (int var4 = 0; var4 < var2.getSize(); var4++) {
T var5 = var3.valueFor(var2.get(var4));
if (var5 != null)
set(var4, var5);
}
return this.palette.idFor(var1);
}
public T getAndSet(int var0, int var1, int var2, T var3) {
return getAndSet(getIndex(var0, var1, var2), var3);
}
public T getAndSetUnchecked(int var0, int var1, int var2, T var3) {
return getAndSet(getIndex(var0, var1, var2), var3);
}
private T getAndSet(int var0, T var1) {
int var2 = this.palette.idFor(var1);
int var3 = this.storage.getAndSet(var0, var2);
T var4 = this.palette.valueFor(var3);
return (var4 == null) ? this.defaultValue : var4;
}
public void set(int var0, int var1, int var2, T var3) {
set(getIndex(var0, var1, var2), var3);
}
private void set(int var0, T var1) {
int var2 = this.palette.idFor(var1);
this.storage.set(var0, var2);
}
public T get(int var0, int var1, int var2) {
return get(getIndex(var0, var1, var2));
}
protected T get(int var0) {
T var1 = this.palette.valueFor(this.storage.get(var0));
return (var1 == null) ? this.defaultValue : var1;
}
public void read(ListTag var0, long[] var1) {
int var2 = Math.max(4, Mth.ceillog2(var0.size()));
if (var2 != this.bits)
setBits(var2);
this.palette.read(var0);
int var3 = var1.length * 64 / 4096;
if (this.palette == this.globalPalette) {
Palette<T> var4 = new HashMapPalette<>(this.registry, var2, this.dummyPaletteResize, this.reader, this.writer);
var4.read(var0);
BitStorage var5 = new BitStorage(var2, 4096, var1);
for (int var6 = 0; var6 < 4096; var6++)
this.storage.set(var6, this.globalPalette.idFor(var4.valueFor(var5.get(var6))));
} else if (var3 == this.bits) {
System.arraycopy(var1, 0, this.storage.getRaw(), 0, var1.length);
} else {
BitStorage var4 = new BitStorage(var3, 4096, var1);
for (int var5 = 0; var5 < 4096; var5++)
this.storage.set(var5, var4.get(var5));
}
}
public void write(CompoundTag var0, String var1, String var2) {
HashMapPalette<T> var3 = new HashMapPalette<>(this.registry, this.bits, this.dummyPaletteResize, this.reader, this.writer);
T var4 = this.defaultValue;
int var5 = var3.idFor(this.defaultValue);
int[] var6 = new int[4096];
for (int i = 0; i < 4096; i++) {
T t = get(i);
if (t != var4) {
var4 = t;
var5 = var3.idFor(t);
}
var6[i] = var5;
}
ListTag<CompoundTag> paletteList = (ListTag<CompoundTag>) ListTag.createUnchecked(CompoundTag.class);
var3.write(paletteList);
var0.put(var1, paletteList);
int var8 = Math.max(4, Mth.ceillog2(paletteList.size()));
BitStorage var9 = new BitStorage(var8, 4096);
for (int var10 = 0; var10 < var6.length; var10++)
{
var9.set(var10, var6[var10]);
}
var0.putLongArray(var2, var9.getRaw());
}
public boolean maybeHas(Predicate<T> var0) { public static final int GLOBAL_PALETTE_BITS = 9;
return this.palette.maybeHas(var0);
} public static final int MIN_PALETTE_SIZE = 4;
public void count(CountConsumer<T> var0) { private final Palette<T> globalPalette;
Int2IntOpenHashMap int2IntOpenHashMap = new Int2IntOpenHashMap();
this.storage.getAll(var1 -> int2IntOpenHashMap.put(var1, int2IntOpenHashMap.get(var1) + 1)); private final PaletteResize<T> dummyPaletteResize = (var0, var1) -> 0;
int2IntOpenHashMap.int2IntEntrySet().forEach(var1 -> var0.accept(this.palette.valueFor(var1.getIntKey()), var1.getIntValue()));
} private final IdMapper<T> registry;
private final Function<CompoundTag, T> reader;
private final Function<T, CompoundTag> writer;
private final T defaultValue;
protected BitStorage storage;
private Palette<T> palette;
private int bits;
public PalettedContainer(Palette<T> var0, IdMapper<T> var1, Function<CompoundTag, T> var2, Function<T, CompoundTag> var3, T var4) {
this.globalPalette = var0;
this.registry = var1;
this.reader = var2;
this.writer = var3;
this.defaultValue = var4;
setBits(4);
}
private static int getIndex(int var0, int var1, int var2) {
return var1 << 8 | var2 << 4 | var0;
}
private void setBits(int var0) {
if (var0 == this.bits)
return;
this.bits = var0;
if (this.bits <= 4) {
this.bits = 4;
this.palette = new LinearPalette<>(this.registry, this.bits, this, this.reader);
} else if (this.bits < 9) {
this.palette = new HashMapPalette<>(this.registry, this.bits, this, this.reader, this.writer);
} else {
this.palette = this.globalPalette;
this.bits = Mth.ceillog2(this.registry.size());
}
this.palette.idFor(this.defaultValue);
this.storage = new BitStorage(this.bits, 4096);
}
public int onResize(int var0, T var1) {
BitStorage var2 = this.storage;
Palette<T> var3 = this.palette;
setBits(var0);
for (int var4 = 0; var4 < var2.getSize(); var4++) {
T var5 = var3.valueFor(var2.get(var4));
if (var5 != null)
set(var4, var5);
}
return this.palette.idFor(var1);
}
public T getAndSet(int var0, int var1, int var2, T var3) {
return getAndSet(getIndex(var0, var1, var2), var3);
}
public T getAndSetUnchecked(int var0, int var1, int var2, T var3) {
return getAndSet(getIndex(var0, var1, var2), var3);
}
private T getAndSet(int var0, T var1) {
int var2 = this.palette.idFor(var1);
int var3 = this.storage.getAndSet(var0, var2);
T var4 = this.palette.valueFor(var3);
return (var4 == null) ? this.defaultValue : var4;
}
public void set(int var0, int var1, int var2, T var3) {
set(getIndex(var0, var1, var2), var3);
}
private void set(int var0, T var1) {
int var2 = this.palette.idFor(var1);
this.storage.set(var0, var2);
}
public T get(int var0, int var1, int var2) {
return get(getIndex(var0, var1, var2));
}
protected T get(int var0) {
T var1 = this.palette.valueFor(this.storage.get(var0));
return (var1 == null) ? this.defaultValue : var1;
}
public void read(ListTag var0, long[] var1) {
int var2 = Math.max(4, Mth.ceillog2(var0.size()));
if (var2 != this.bits)
setBits(var2);
this.palette.read(var0);
int var3 = var1.length * 64 / 4096;
if (this.palette == this.globalPalette) {
Palette<T> var4 = new HashMapPalette<>(this.registry, var2, this.dummyPaletteResize, this.reader, this.writer);
var4.read(var0);
BitStorage var5 = new BitStorage(var2, 4096, var1);
for (int var6 = 0; var6 < 4096; var6++)
this.storage.set(var6, this.globalPalette.idFor(var4.valueFor(var5.get(var6))));
} else if (var3 == this.bits) {
System.arraycopy(var1, 0, this.storage.getRaw(), 0, var1.length);
} else {
BitStorage var4 = new BitStorage(var3, 4096, var1);
for (int var5 = 0; var5 < 4096; var5++)
this.storage.set(var5, var4.get(var5));
}
}
public void write(CompoundTag var0, String var1, String var2) {
HashMapPalette<T> var3 = new HashMapPalette<>(this.registry, this.bits, this.dummyPaletteResize, this.reader, this.writer);
T var4 = this.defaultValue;
int var5 = var3.idFor(this.defaultValue);
int[] var6 = new int[4096];
for (int i = 0; i < 4096; i++) {
T t = get(i);
if (t != var4) {
var4 = t;
var5 = var3.idFor(t);
}
var6[i] = var5;
}
ListTag<CompoundTag> paletteList = (ListTag<CompoundTag>) ListTag.createUnchecked(CompoundTag.class);
var3.write(paletteList);
var0.put(var1, paletteList);
int var8 = Math.max(4, Mth.ceillog2(paletteList.size()));
BitStorage var9 = new BitStorage(var8, 4096);
for (int var10 = 0; var10 < var6.length; var10++) {
var9.set(var10, var6[var10]);
}
var0.putLongArray(var2, var9.getRaw());
}
public boolean maybeHas(Predicate<T> var0) {
return this.palette.maybeHas(var0);
}
public void count(CountConsumer<T> var0) {
Int2IntOpenHashMap int2IntOpenHashMap = new Int2IntOpenHashMap();
this.storage.getAll(var1 -> int2IntOpenHashMap.put(var1, int2IntOpenHashMap.get(var1) + 1));
int2IntOpenHashMap.int2IntEntrySet().forEach(var1 -> var0.accept(this.palette.valueFor(var1.getIntKey()), var1.getIntValue()));
}
} }

View File

@ -19,25 +19,25 @@
package com.volmit.iris.util.nbt.mca.palette; package com.volmit.iris.util.nbt.mca.palette;
public final class QuartPos { public final class QuartPos {
public static final int BITS = 2; public static final int BITS = 2;
public static final int SIZE = 4; public static final int SIZE = 4;
private static final int SECTION_TO_QUARTS_BITS = 2; private static final int SECTION_TO_QUARTS_BITS = 2;
public static int fromBlock(int var0) { public static int fromBlock(int var0) {
return var0 >> 2; return var0 >> 2;
} }
public static int toBlock(int var0) { public static int toBlock(int var0) {
return var0 << 2; return var0 << 2;
} }
public static int fromSection(int var0) { public static int fromSection(int var0) {
return var0 << 2; return var0 << 2;
} }
public static int toSection(int var0) { public static int toSection(int var0) {
return var0 >> 2; return var0 >> 2;
} }
} }

View File

@ -29,23 +29,19 @@ public class WrappedPalettedContainer<T> implements PaletteAccess {
private final Function<T, CompoundTag> reader; private final Function<T, CompoundTag> reader;
private final Function<CompoundTag, T> writer; private final Function<CompoundTag, T> writer;
public void setBlock(int x, int y, int z, CompoundTag data) public void setBlock(int x, int y, int z, CompoundTag data) {
{ container.set(x, y, z, writer.apply(data));
container.set(x,y,z,writer.apply(data));
} }
public CompoundTag getBlock(int x, int y, int z) public CompoundTag getBlock(int x, int y, int z) {
{ return reader.apply(container.get(x, y, z));
return reader.apply(container.get(x,y,z));
} }
public void writeToSection(CompoundTag tag) public void writeToSection(CompoundTag tag) {
{
container.write(tag, "Palette", "BlockStates"); container.write(tag, "Palette", "BlockStates");
} }
public void readFromSection(CompoundTag tag) public void readFromSection(CompoundTag tag) {
{
container.read(tag.getListTag("Palette"), tag.getLongArrayTag("BlockStates").getValue()); container.read(tag.getListTag("Palette"), tag.getLongArrayTag("BlockStates").getValue());
} }
} }

View File

@ -127,13 +127,9 @@ public class J {
} }
public static <T> T attemptResult(NastySupplier<T> r) { public static <T> T attemptResult(NastySupplier<T> r) {
try try {
{
return r.get(); return r.get();
} } catch (Throwable e) {
catch(Throwable e)
{
return null; return null;
} }
} }

View File

@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicInteger;
public abstract class QueueJob<T> implements Job { public abstract class QueueJob<T> implements Job {
final KList<T> queue; final KList<T> queue;
protected int totalWork; protected int totalWork;
private AtomicInteger completed; private final AtomicInteger completed;
public QueueJob() { public QueueJob() {
totalWork = 0; totalWork = 0;