diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java index 3561eb997..8d01af591 100644 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java +++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java @@ -6,6 +6,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -599,8 +600,25 @@ public class NMSBinding implements INMSBinding { var biomeFiles = biome.listFiles(jsonFilter); if (biomeFiles == null) continue; for (File biomeFile : biomeFiles) { + String json = null; + int tries = 10; + while (json == null && tries-- > 0) { + try { + json = IO.readAll(biomeFile); + } catch (IOException e) { + Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries); + if (tries == 0) { + e.printStackTrace(); + } + try { + Thread.sleep(100); + } catch (InterruptedException ignored) {} + } + } + if (json == null) continue; + try { - var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null); + var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null); register(Registry.BIOME_REGISTRY, from(file.getName(), biomeFile), value, replace); } catch (Throwable e) { Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName()); @@ -639,28 +657,15 @@ public class NMSBinding implements INMSBinding { field.setAccessible(true); boolean frozen = field.getBoolean(registry); field.setBoolean(registry, false); - Field holdersField = null; - boolean holders = false; - for (Field f : MappedRegistry.class.getDeclaredFields()) { - if (!f.getGenericType().getTypeName().startsWith("java.util.Map()); - } + Field valueField = getField(Holder.Reference.class, "T"); + valueField.setAccessible(true); try { - registry.createIntrusiveHolder(value); - registry.register(key, value, Lifecycle.stable()); + var holder = registry.register(key, value, Lifecycle.stable()); + if (frozen) valueField.set(holder, value); return true; } finally { field.setBoolean(registry, frozen); - if (holders) { - holdersField.set(registry, null); - } } } catch (Throwable e) { throw new IllegalStateException(e); @@ -777,20 +782,14 @@ public class NMSBinding implements INMSBinding { @Advice.OnMethodEnter static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) { File iris = new File(access.levelDirectory.path().toFile(), "iris"); - if (!iris.exists()) return; + if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return; var logger = MinecraftServer.LOGGER; ResourceKey typeKey = ResourceKey.create(Registry.DIMENSION_TYPE_REGISTRY, new ResourceLocation("iris", key.location().getPath())); RegistryAccess registryAccess = server.registryAccess(); Registry registry = registryAccess.registry(Registry.DIMENSION_TYPE_REGISTRY).orElse(null); - if (registry == null) { - logger.warn("Unable to find registry for dimension type {}", typeKey); - return; - } + if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey); Holder holder = registry.getHolder(typeKey).orElse(null); - if (holder == null) { - logger.warn("Unable to find dimension type {}", typeKey); - return; - } + if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey); levelStem = new LevelStem(holder, levelStem.generator()); } } diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java index 03105825c..59c54c2ad 100644 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java @@ -6,6 +6,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -601,8 +602,25 @@ public class NMSBinding implements INMSBinding { var biomeFiles = biome.listFiles(jsonFilter); if (biomeFiles == null) continue; for (File biomeFile : biomeFiles) { + String json = null; + int tries = 10; + while (json == null && tries-- > 0) { + try { + json = IO.readAll(biomeFile); + } catch (IOException e) { + Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries); + if (tries == 0) { + e.printStackTrace(); + } + try { + Thread.sleep(100); + } catch (InterruptedException ignored) {} + } + } + if (json == null) continue; + try { - var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null); + var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null); register(Registries.BIOME, from(file.getName(), biomeFile), value, replace); } catch (Throwable e) { Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName()); @@ -641,28 +659,15 @@ public class NMSBinding implements INMSBinding { field.setAccessible(true); boolean frozen = field.getBoolean(registry); field.setBoolean(registry, false); - Field holdersField = null; - boolean holders = false; - for (Field f : MappedRegistry.class.getDeclaredFields()) { - if (!f.getGenericType().getTypeName().startsWith("java.util.Map()); - } + Field valueField = getField(Holder.Reference.class, "T"); + valueField.setAccessible(true); try { - registry.createIntrusiveHolder(value); - registry.register(key, value, Lifecycle.stable()); + var holder = registry.register(key, value, Lifecycle.stable()); + if (frozen) valueField.set(holder, value); return true; } finally { field.setBoolean(registry, frozen); - if (holders) { - holdersField.set(registry, null); - } } } catch (Throwable e) { throw new IllegalStateException(e); @@ -778,20 +783,13 @@ public class NMSBinding implements INMSBinding { @Advice.OnMethodEnter static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) { File iris = new File(access.levelDirectory.path().toFile(), "iris"); - if (!iris.exists()) return; - var logger = MinecraftServer.LOGGER; + if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return; ResourceKey typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath())); RegistryAccess registryAccess = server.registryAccess(); Registry registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null); - if (registry == null) { - logger.warn("Unable to find registry for dimension type {}", typeKey); - return; - } + if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey); Holder holder = registry.getHolder(typeKey).orElse(null); - if (holder == null) { - logger.warn("Unable to find dimension type {}", typeKey); - return; - } + if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey); levelStem = new LevelStem(holder, levelStem.generator()); } } diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java index 8eef4e427..a1396ba1c 100644 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java @@ -6,6 +6,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -605,8 +606,25 @@ public class NMSBinding implements INMSBinding { var biomeFiles = biome.listFiles(jsonFilter); if (biomeFiles == null) continue; for (File biomeFile : biomeFiles) { + String json = null; + int tries = 10; + while (json == null && tries-- > 0) { + try { + json = IO.readAll(biomeFile); + } catch (IOException e) { + Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries); + if (tries == 0) { + e.printStackTrace(); + } + try { + Thread.sleep(100); + } catch (InterruptedException ignored) {} + } + } + if (json == null) continue; + try { - var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null); + var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null); register(Registries.BIOME, from(file.getName(), biomeFile), value, replace); } catch (Throwable e) { Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName()); @@ -645,28 +663,15 @@ public class NMSBinding implements INMSBinding { field.setAccessible(true); boolean frozen = field.getBoolean(registry); field.setBoolean(registry, false); - Field holdersField = null; - boolean holders = false; - for (Field f : MappedRegistry.class.getDeclaredFields()) { - if (!f.getGenericType().getTypeName().startsWith("java.util.Map()); - } + Field valueField = getField(Holder.Reference.class, "T"); + valueField.setAccessible(true); try { - registry.createIntrusiveHolder(value); - registry.register(key, value, Lifecycle.stable()); + var holder = registry.register(key, value, Lifecycle.stable()); + if (frozen) valueField.set(holder, value); return true; } finally { field.setBoolean(registry, frozen); - if (holders) { - holdersField.set(registry, null); - } } } catch (Throwable e) { throw new IllegalStateException(e); @@ -782,20 +787,13 @@ public class NMSBinding implements INMSBinding { @Advice.OnMethodEnter static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) { File iris = new File(access.levelDirectory.path().toFile(), "iris"); - if (!iris.exists()) return; - var logger = MinecraftServer.LOGGER; + if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return; ResourceKey typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath())); RegistryAccess registryAccess = server.registryAccess(); Registry registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null); - if (registry == null) { - logger.warn("Unable to find registry for dimension type {}", typeKey); - return; - } + if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey); Holder holder = registry.getHolder(typeKey).orElse(null); - if (holder == null) { - logger.warn("Unable to find dimension type {}", typeKey); - return; - } + if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey); levelStem = new LevelStem(holder, levelStem.generator()); } } diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java index 7e6e8c963..ab01736a8 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java @@ -88,6 +88,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -592,8 +593,25 @@ public class NMSBinding implements INMSBinding { var biomeFiles = biome.listFiles(jsonFilter); if (biomeFiles == null) continue; for (File biomeFile : biomeFiles) { + String json = null; + int tries = 10; + while (json == null && tries-- > 0) { + try { + json = IO.readAll(biomeFile); + } catch (IOException e) { + Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries); + if (tries == 0) { + e.printStackTrace(); + } + try { + Thread.sleep(100); + } catch (InterruptedException ignored) {} + } + } + if (json == null) continue; + try { - var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null); + var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null); register(Registries.BIOME, from(file.getName(), biomeFile), value, replace); } catch (Throwable e) { Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName()); @@ -632,28 +650,15 @@ public class NMSBinding implements INMSBinding { field.setAccessible(true); boolean frozen = field.getBoolean(registry); field.setBoolean(registry, false); - Field holdersField = null; - boolean holders = false; - for (Field f : MappedRegistry.class.getDeclaredFields()) { - if (!f.getGenericType().getTypeName().startsWith("java.util.Map()); - } + Field valueField = getField(Holder.Reference.class, "T"); + valueField.setAccessible(true); try { - registry.createIntrusiveHolder(value); - registry.register(key, value, Lifecycle.stable()); + var holder = registry.register(key, value, Lifecycle.stable()); + if (frozen) valueField.set(holder, value); return true; } finally { field.setBoolean(registry, frozen); - if (holders) { - holdersField.set(registry, null); - } } } catch (Throwable e) { throw new IllegalStateException(e); @@ -782,20 +787,13 @@ public class NMSBinding implements INMSBinding { @Advice.OnMethodEnter static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) { File iris = new File(access.levelDirectory.path().toFile(), "iris"); - if (!iris.exists()) return; - var logger = MinecraftServer.LOGGER; + if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return; ResourceKey typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath())); RegistryAccess registryAccess = server.registryAccess(); Registry registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null); - if (registry == null) { - logger.warn("Unable to find registry for dimension type {}", typeKey); - return; - } + if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey); Holder holder = registry.getHolder(typeKey).orElse(null); - if (holder == null) { - logger.warn("Unable to find dimension type {}", typeKey); - return; - } + if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey); levelStem = new LevelStem(holder, levelStem.generator()); } } diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java index 724b52dc1..e4af087ec 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java @@ -6,6 +6,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -602,8 +603,25 @@ public class NMSBinding implements INMSBinding { var biomeFiles = biome.listFiles(jsonFilter); if (biomeFiles == null) continue; for (File biomeFile : biomeFiles) { + String json = null; + int tries = 10; + while (json == null && tries-- > 0) { + try { + json = IO.readAll(biomeFile); + } catch (IOException e) { + Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries); + if (tries == 0) { + e.printStackTrace(); + } + try { + Thread.sleep(100); + } catch (InterruptedException ignored) {} + } + } + if (json == null) continue; + try { - var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null); + var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null); register(Registries.BIOME, from(file.getName(), biomeFile), value, replace); } catch (Throwable e) { Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName()); @@ -642,28 +660,15 @@ public class NMSBinding implements INMSBinding { field.setAccessible(true); boolean frozen = field.getBoolean(registry); field.setBoolean(registry, false); - Field holdersField = null; - boolean holders = false; - for (Field f : MappedRegistry.class.getDeclaredFields()) { - if (!f.getGenericType().getTypeName().startsWith("java.util.Map()); - } + Field valueField = getField(Holder.Reference.class, "T"); + valueField.setAccessible(true); try { - registry.createIntrusiveHolder(value); - registry.register(key, value, Lifecycle.stable()); + var holder = registry.register(key, value, Lifecycle.stable()); + if (frozen) valueField.set(holder, value); return true; } finally { field.setBoolean(registry, frozen); - if (holders) { - holdersField.set(registry, null); - } } } catch (Throwable e) { throw new IllegalStateException(e); @@ -784,20 +789,13 @@ public class NMSBinding implements INMSBinding { @Advice.OnMethodEnter static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) { File iris = new File(access.levelDirectory.path().toFile(), "iris"); - if (!iris.exists()) return; - var logger = MinecraftServer.LOGGER; + if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return; ResourceKey typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath())); RegistryAccess registryAccess = server.registryAccess(); Registry registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null); - if (registry == null) { - logger.warn("Unable to find registry for dimension type {}", typeKey); - return; - } + if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey); Holder holder = registry.getHolder(typeKey).orElse(null); - if (holder == null) { - logger.warn("Unable to find dimension type {}", typeKey); - return; - } + if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey); levelStem = new LevelStem(holder, levelStem.generator()); } } diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index cb67298e0..5f56f1299 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -7,21 +7,15 @@ import java.io.DataOutputStream; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; -import java.lang.instrument.ClassFileTransformer; -import java.lang.instrument.Instrumentation; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.nio.file.Files; import java.util.*; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Logger; import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; import com.google.gson.JsonElement; -import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; @@ -29,27 +23,19 @@ import com.mojang.serialization.JsonOps; import com.mojang.serialization.Lifecycle; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.util.format.C; -import com.volmit.iris.util.function.NastySupplier; import com.volmit.iris.util.io.IO; import it.unimi.dsi.fastutil.objects.Reference2IntMap; import net.bytebuddy.ByteBuddy; -import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; import net.bytebuddy.matcher.ElementMatchers; -import net.bytebuddy.utility.JavaModule; import net.minecraft.core.IdMapper; import net.minecraft.core.MappedRegistry; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.progress.ChunkProgressListener; import net.minecraft.util.GsonHelper; -import net.minecraft.util.worldupdate.WorldUpgrader; import net.minecraft.world.RandomSequences; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.storage.LevelStorageSource; @@ -615,8 +601,25 @@ public class NMSBinding implements INMSBinding { var biomeFiles = biome.listFiles(jsonFilter); if (biomeFiles == null) continue; for (File biomeFile : biomeFiles) { + String json = null; + int tries = 10; + while (json == null && tries-- > 0) { + try { + json = IO.readAll(biomeFile); + } catch (IOException e) { + Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries); + if (tries == 0) { + e.printStackTrace(); + } + try { + Thread.sleep(100); + } catch (InterruptedException ignored) {} + } + } + if (json == null) continue; + try { - var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null); + var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null); register(Registries.BIOME, from(file.getName(), biomeFile), value, replace); } catch (Throwable e) { Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName()); @@ -655,28 +658,15 @@ public class NMSBinding implements INMSBinding { field.setAccessible(true); boolean frozen = field.getBoolean(registry); field.setBoolean(registry, false); - Field holdersField = null; - boolean holders = false; - for (Field f : MappedRegistry.class.getDeclaredFields()) { - if (!f.getGenericType().getTypeName().startsWith("java.util.Map()); - } + Field valueField = getField(Holder.Reference.class, "T"); + valueField.setAccessible(true); try { - registry.createIntrusiveHolder(value); - registry.register(key, value, Lifecycle.stable()); + var holder = registry.register(key, value, Lifecycle.stable()); + if (frozen) valueField.set(holder, value); return true; } finally { field.setBoolean(registry, frozen); - if (holders) { - holdersField.set(registry, null); - } } } catch (Throwable e) { throw new IllegalStateException(e); @@ -796,20 +786,13 @@ public class NMSBinding implements INMSBinding { @Advice.OnMethodEnter static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) { File iris = new File(access.levelDirectory.path().toFile(), "iris"); - if (!iris.exists()) return; - var logger = MinecraftServer.LOGGER; + if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return; ResourceKey typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath())); RegistryAccess registryAccess = server.registryAccess(); Registry registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null); - if (registry == null) { - logger.warn("Unable to find registry for dimension type {}", typeKey); - return; - } + if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey); Holder holder = registry.getHolder(typeKey).orElse(null); - if (holder == null) { - logger.warn("Unable to find dimension type {}", typeKey); - return; - } + if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey); levelStem = new LevelStem(holder, levelStem.generator()); } }