diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener index bccdbe43..babf2c36 100644 --- a/common/src/main/resources/modernfix.accesswidener +++ b/common/src/main/resources/modernfix.accesswidener @@ -30,4 +30,5 @@ accessible field net/minecraft/server/MinecraftServer resources Lnet/minecraft/s accessible class net/minecraft/server/MinecraftServer$ReloadableResources accessible method net/minecraft/client/gui/screens/Screen addRenderableWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener; accessible field net/minecraft/client/KeyMapping ALL Ljava/util/Map; -accessible field net/minecraft/server/packs/resources/MultiPackResourceManager namespacedManagers Ljava/util/Map; \ No newline at end of file +accessible field net/minecraft/server/packs/resources/MultiPackResourceManager namespacedManagers Ljava/util/Map; +accessible field net/minecraft/resources/RegistryOps registryAccess Lnet/minecraft/core/RegistryAccess; \ No newline at end of file diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/removed_dimensions/LevelStorageSourceMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/removed_dimensions/LevelStorageSourceMixin.java new file mode 100644 index 00000000..42514369 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/removed_dimensions/LevelStorageSourceMixin.java @@ -0,0 +1,27 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.removed_dimensions; + +import com.mojang.datafixers.DataFixer; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.Lifecycle; +import net.minecraft.resources.RegistryOps; +import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraft.world.level.storage.LevelStorageSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(LevelStorageSource.class) +public class LevelStorageSourceMixin { + @Inject(method = "readWorldGenSettings", at = @At(value = "INVOKE", target = "Lcom/mojang/serialization/Codec;parse(Lcom/mojang/serialization/Dynamic;)Lcom/mojang/serialization/DataResult;")) + private static void freezeRegistriesBeforeParsing(Dynamic nbt, DataFixer fixer, int version, CallbackInfoReturnable> cir) { + DynamicOps var10 = nbt.getOps(); + if (var10 instanceof RegistryOps ops) { + ops.registryAccess.ownedRegistries().forEach((e) -> { + e.value().freeze(); + }); + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/removed_dimensions/RegistryLoaderMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/removed_dimensions/RegistryLoaderMixin.java new file mode 100644 index 00000000..dfa7d4a5 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/removed_dimensions/RegistryLoaderMixin.java @@ -0,0 +1,27 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.removed_dimensions; + +import com.google.gson.JsonElement; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.resources.RegistryLoader; +import net.minecraft.resources.ResourceKey; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(RegistryLoader.class) +public class RegistryLoaderMixin { + @Inject(method = "overrideElementFromResources", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/WritableRegistry;getOrCreateHolder(Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/core/Holder;", ordinal = 0), cancellable = true) + private void handleErroringHolder(WritableRegistry arg, ResourceKey> arg2, Codec codec, ResourceKey arg3, DynamicOps dynamicOps, CallbackInfoReturnable>> cir) { + try { + arg.getOrCreateHolder(arg3); + } catch(RuntimeException e) { + cir.setReturnValue(DataResult.error("Missing holder for " + arg3)); + } + } +}