diff --git a/bclib.gradle b/bclib.gradle index 3ff8796e..2f8a64ae 100644 --- a/bclib.gradle +++ b/bclib.gradle @@ -23,6 +23,10 @@ repositories { maven { url 'https://jitpack.io' } } +minecraft { + accessWidener = file("src/main/resources/bclib.accesswidener") +} + dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings minecraft.officialMojangMappings() diff --git a/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java b/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java index 3499016a..76d00a4d 100644 --- a/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java +++ b/src/main/java/ru/bclib/mixin/client/MinecraftMixin.java @@ -2,6 +2,7 @@ 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; @@ -25,11 +26,6 @@ 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) @@ -53,55 +49,19 @@ 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) -> { - bclib_doLoadLevel_BACKUP(levelID, RegistryAccess.builtin(), Minecraft::loadDataPacks, Minecraft::loadWorldData, false); - //this.doLoadLevel(levelID, RegistryAccess.builtin(), Minecraft::loadDataPacks, Minecraft::loadWorldData, false, Minecraft.ExperimentalDialogType.BACKUP); + 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 new file mode 100644 index 00000000..3efe4455 --- /dev/null +++ b/src/main/resources/bclib.accesswidener @@ -0,0 +1,4 @@ +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 f7563925..9ec07e33 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -28,7 +28,8 @@ ], "modmenu": [ "ru.bclib.gui.modmenu.EntryPoint::entrypointObject" ] }, - "mixins": [ + "accessWidener" : "bclib.accesswidener", + "mixins": [ "bclib.mixins.common.json", "bclib.mixins.client.json" ],