diff --git a/bclib.gradle b/bclib.gradle index 1beb0887..0ba6ce46 100644 --- a/bclib.gradle +++ b/bclib.gradle @@ -23,10 +23,6 @@ repositories { maven { url 'https://jitpack.io' } } -loom { - accessWidenerPath = file("src/main/resources/bclib.accesswidener") -} - dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings minecraft.officialMojangMappings() diff --git a/gradle.properties b/gradle.properties index c3f11f2c..c65e4e44 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx2G #Loom -loom_version=0.9-SNAPSHOT +loom_version=0.10-SNAPSHOT # Fabric Properties # check these on https://fabricmc.net/versions.html diff --git a/src/main/java/ru/bclib/BCLib.java b/src/main/java/ru/bclib/BCLib.java index f5f6eb3c..73dce098 100644 --- a/src/main/java/ru/bclib/BCLib.java +++ b/src/main/java/ru/bclib/BCLib.java @@ -3,6 +3,7 @@ package ru.bclib; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import ru.bclib.api.TagAPI; import ru.bclib.api.WorldDataAPI; @@ -23,6 +24,8 @@ import ru.bclib.world.generator.BCLibNetherBiomeSource; import ru.bclib.world.generator.GeneratorOptions; import ru.bclib.world.surface.BCLSurfaceBuilders; +import java.lang.reflect.Array; +import java.lang.reflect.Field; import java.util.List; public class BCLib implements ModInitializer { diff --git a/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java b/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java index 76d00a4d..3499016a 100644 --- a/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java +++ b/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java @@ -2,7 +2,6 @@ package ru.bclib.mixin.client; import com.mojang.datafixers.util.Function4; import net.minecraft.client.Minecraft; -import net.minecraft.client.Minecraft.ExperimentalDialogType; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.main.GameConfig; @@ -26,6 +25,11 @@ import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.datafixer.DataFixerAPI; import ru.bclib.interfaces.CustomColorProvider; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; import java.util.function.Function; @Mixin(Minecraft.class) @@ -49,19 +53,55 @@ public abstract class MinecraftMixin { }); } - @Shadow - protected abstract void doLoadLevel(String string, RegistryHolder registryHolder, Function function, Function4 function4, boolean bl, ExperimentalDialogType experimentalDialogType); - +// @Shadow +// protected abstract void doLoadLevel(String string, RegistryHolder registryHolder, Function function, Function4 function4, boolean bl, ExperimentalDialogType experimentalDialogType); +// @Shadow @Final private LevelStorageSource levelSource; - + Method doLoadLevel = null; + Object experimentalDialogType_BACKUP = null; + + private void bclib_doLoadLevel_BACKUP(String levelID, RegistryHolder registryHolder, Function function, Function4 function4, boolean bl){ + if (experimentalDialogType_BACKUP==null) { + try { + Class experimentalDialogType = Class.forName("net.minecraft.client.Minecraft$ExperimentalDialogType"); + Field f = experimentalDialogType.getDeclaredField("$VALUES"); + f.setAccessible(true); + experimentalDialogType_BACKUP = Array.get(f.get(null), 2); + } catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException e) { + e.printStackTrace(); + } + } + + if (doLoadLevel==null) { + for (Method m : Minecraft.class.getDeclaredMethods()) { + if (m.getName().equals("doLoadLevel")) { + doLoadLevel = m; + break; + } + } + } + + if (doLoadLevel!=null && experimentalDialogType_BACKUP!=null){ + doLoadLevel.setAccessible(true); + try { + doLoadLevel.invoke(this, new Object[]{levelID, registryHolder, function, function4, bl, experimentalDialogType_BACKUP}); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + @Inject(method = "loadLevel", cancellable = true, at = @At("HEAD")) private void bclib_callFixerOnLoad(String levelID, CallbackInfo ci) { DataExchangeAPI.prepareServerside(); if (DataFixerAPI.fixData(this.levelSource, levelID, true, (appliedFixes) -> { - this.doLoadLevel(levelID, RegistryAccess.builtin(), Minecraft::loadDataPacks, Minecraft::loadWorldData, false, Minecraft.ExperimentalDialogType.BACKUP); + bclib_doLoadLevel_BACKUP(levelID, RegistryAccess.builtin(), Minecraft::loadDataPacks, Minecraft::loadWorldData, false); + //this.doLoadLevel(levelID, RegistryAccess.builtin(), Minecraft::loadDataPacks, Minecraft::loadWorldData, false, Minecraft.ExperimentalDialogType.BACKUP); })) { ci.cancel(); } diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener deleted file mode 100644 index 3efe4455..00000000 --- a/src/main/resources/bclib.accesswidener +++ /dev/null @@ -1,4 +0,0 @@ -accessWidener v1 named - -# Classes -accessible class net/minecraft/client/Minecraft$ExperimentalDialogType \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 9ec07e33..f7563925 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -28,8 +28,7 @@ ], "modmenu": [ "ru.bclib.gui.modmenu.EntryPoint::entrypointObject" ] }, - "accessWidener" : "bclib.accesswidener", - "mixins": [ + "mixins": [ "bclib.mixins.common.json", "bclib.mixins.client.json" ],