From 32dac5fbe29118a8c55d57e2d169c807b6c4c89d Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Mon, 10 Jan 2022 21:38:00 -0500 Subject: [PATCH] Fix registry access --- .../iris/core/nms/v18_1/NMSBinding18_1.java | 65 ++++++++++++++++++- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/nms/v18_1/NMSBinding18_1.java b/src/main/java/com/volmit/iris/core/nms/v18_1/NMSBinding18_1.java index d15fb0878..00b56bd01 100644 --- a/src/main/java/com/volmit/iris/core/nms/v18_1/NMSBinding18_1.java +++ b/src/main/java/com/volmit/iris/core/nms/v18_1/NMSBinding18_1.java @@ -38,8 +38,10 @@ import com.volmit.iris.util.nbt.tag.CompoundTag; import com.volmit.iris.util.scheduling.Queue; import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; import net.minecraft.nbt.NbtIo; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.core.BlockPos; @@ -65,6 +67,7 @@ import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; @@ -77,6 +80,7 @@ public class NMSBinding18_1 implements INMSBinding { private final AtomicCache> biomeMapCache = new AtomicCache<>(); private final AtomicCache> registryCache = new AtomicCache<>(); private final AtomicCache> globalCache = new AtomicCache<>(); + private final AtomicCache registryAccess = new AtomicCache<>(); private Field biomeStorageCache = null; @Override @@ -145,12 +149,18 @@ public class NMSBinding18_1 implements INMSBinding { return true; } + private RegistryAccess registry() + { + return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); + } + private Registry getCustomBiomeRegistry() { - return ((CraftServer) Bukkit.getServer()).getHandle().getServer().registryHolder.registry(Registry.BIOME_REGISTRY).orElse(null); + + return registry().registry(Registry.BIOME_REGISTRY).orElse(null); } private Registry getBlockRegistry() { - return ((CraftServer) Bukkit.getServer()).getHandle().getServer().registryHolder.registry(Registry.BLOCK_REGISTRY).orElse(null); + return registry().registry(Registry.BLOCK_REGISTRY).orElse(null); } @Override @@ -185,7 +195,7 @@ public class NMSBinding18_1 implements INMSBinding { @Override public Object getCustomBiomeBaseFor(String mckey) { - return null; + return getCustomBiomeRegistry().get(new ResourceLocation(mckey)); } @Override @@ -363,4 +373,53 @@ public class NMSBinding18_1 implements INMSBinding { i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); } + + private static Object getFor(Class type, Object source) { + Object o = fieldFor(type, source); + + if(o != null) + { + return o; + } + + return invokeFor(type, source); + } + + private static Object invokeFor(Class returns, Object in) + { + for(Method i : in.getClass().getMethods()) + { + if(i.getReturnType().equals(returns)) + { + i.setAccessible(true); + try { + Iris.info("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() +"."+ i.getName() + "()"); + return i.invoke(in); + } catch(Throwable e) { + e.printStackTrace(); + } + } + } + + return null; + } + + private static Object fieldFor(Class returns, Object in) + { + for(Field i : in.getClass().getFields()) + { + if(i.getType().equals(returns)) + { + i.setAccessible(true); + try { + Iris.info("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() +"."+ i.getName()); + return i.get(in); + } catch(IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + return null; + } }