diff --git a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index 78c242df1..90ce686c0 100644 --- a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.nms; +import com.volmit.iris.util.nbt.mca.palettes.RegistryBlockID; import com.volmit.iris.util.nbt.tag.CompoundTag; import org.bukkit.Location; import org.bukkit.World; @@ -74,4 +75,6 @@ public interface INMSBinding { default boolean supportsDataPacks() { return false; } + + RegistryBlockID computeBlockIDRegistry() throws NoSuchFieldException, IllegalAccessException; } diff --git a/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java b/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java index 542297741..e98382053 100644 --- a/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java +++ b/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java @@ -22,6 +22,8 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.nbt.io.NBTUtil; +import com.volmit.iris.util.nbt.mca.NBTWorld; +import com.volmit.iris.util.nbt.mca.palettes.RegistryBlockID; import com.volmit.iris.util.nbt.tag.CompoundTag; import net.minecraft.core.BlockPosition; import net.minecraft.core.IRegistry; @@ -35,6 +37,8 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.WorldServer; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.biome.BiomeBase; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.TileEntity; import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.chunk.BiomeStorage; @@ -44,8 +48,10 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.v1_17_R1.CraftServer; import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; @@ -53,6 +59,9 @@ import org.bukkit.generator.ChunkGenerator; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.IdentityHashMap; +import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class NMSBinding17_1 implements INMSBinding { @@ -63,6 +72,28 @@ public class NMSBinding17_1 implements INMSBinding { return true; } + @Override + public RegistryBlockID computeBlockIDRegistry() throws NoSuchFieldException, IllegalAccessException { + Field cf = net.minecraft.core.RegistryBlockID.class.getDeclaredField("c"); + Field df = net.minecraft.core.RegistryBlockID.class.getDeclaredField("d"); + Field bf = net.minecraft.core.RegistryBlockID.class.getDeclaredField("b"); + cf.setAccessible(true); + df.setAccessible(true); + bf.setAccessible(true); + net.minecraft.core.RegistryBlockID blockData = Block.p; + IdentityHashMap c = (IdentityHashMap) cf.get(blockData); + List d = (List) df.get(blockData); + List realTags = new ArrayList<>(); + IdentityHashMap realMap = new IdentityHashMap<>(512); + d.forEach((i) -> realTags.add(NBTWorld.getCompound(CraftBlockData.fromData(i)))); + c.forEach((k,v) -> realMap.put(NBTWorld.getCompound(CraftBlockData.fromData(k)), v)); + RegistryBlockID registry = new RegistryBlockID(realMap, realTags, bf.getInt(blockData)); + + Iris.info("INMS: Stole Global Palette: " + realTags.size() + " Tags, " + realMap.size() + " Mapped"); + + return registry; + } + private Object getBiomeStorage(ChunkGenerator.BiomeGrid g) { try { return getFieldForBiomeStorage(g).get(g); diff --git a/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java b/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java index e0f8b0f99..ca986c8df 100644 --- a/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java +++ b/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java @@ -18,7 +18,9 @@ package com.volmit.iris.core.nms.v1X; +import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; +import com.volmit.iris.util.nbt.mca.palettes.RegistryBlockID; import com.volmit.iris.util.nbt.tag.CompoundTag; import org.bukkit.Location; import org.bukkit.World; @@ -142,4 +144,10 @@ public class NMSBinding1X implements INMSBinding { public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { } + + @Override + public RegistryBlockID computeBlockIDRegistry() throws NoSuchFieldException, IllegalAccessException { + Iris.error("Cannot use the global data palette! Iris is incapable of using MCA generation on this version of minecraft!"); + return null; + } }