From e37d03fa778c6339a4f801c0016e0744dd176b0c Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 12 Oct 2021 22:04:45 +0200 Subject: [PATCH] replaced accesswidener with simple reflection (cherry picked from commit 18a64c267dad24f5afa6cea124c45fb310487ca9) --- bclib.gradle | 4 -- .../ru/bclib/mixin/client/MinecraftMixin.java | 52 ++++++++++++++++--- src/main/resources/bclib.accesswidener | 4 -- src/main/resources/fabric.mod.json | 3 +- 4 files changed, 47 insertions(+), 16 deletions(-) delete mode 100644 src/main/resources/bclib.accesswidener diff --git a/bclib.gradle b/bclib.gradle index 2f8a64ae..3ff8796e 100644 --- a/bclib.gradle +++ b/bclib.gradle @@ -23,10 +23,6 @@ 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 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" ],