From 43026a9f60330acb7d2719de1e7b47e6c1d043a6 Mon Sep 17 00:00:00 2001 From: Wynd Date: Wed, 11 Sep 2024 00:53:22 +0300 Subject: [PATCH] Minecraft static accessor doesn't really want to work so back to reflection we are --- .../xyz/pixelatedw/finalbeta/WyHelper.java | 56 +++++++++++++++++-- .../finalbeta/mixin/ClientPlayerMixin.java | 2 +- .../mixin/MinecraftAccessorMixin.java | 14 ----- .../finalbeta/mixin/MinecraftMixin.java | 2 +- .../mixin/RecipeRegistryAccessor.java | 16 ++++++ .../mixin/RecipeRegistryAccessorMixin.java | 16 ------ src/main/resources/finalbeta.mixins.json | 3 +- 7 files changed, 70 insertions(+), 39 deletions(-) delete mode 100644 src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftAccessorMixin.java create mode 100644 src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessor.java delete mode 100644 src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessorMixin.java diff --git a/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java b/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java index 469570e..0b3679b 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/WyHelper.java @@ -1,18 +1,21 @@ package xyz.pixelatedw.finalbeta; import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.time.Duration; import java.util.HashMap; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.Player; import net.minecraft.item.ItemInstance; import net.minecraft.item.ItemType; import net.minecraft.recipe.RecipeRegistry; -import xyz.pixelatedw.finalbeta.mixin.MinecraftAccessorMixin; -import xyz.pixelatedw.finalbeta.mixin.RecipeRegistryAccessorMixin; +import xyz.pixelatedw.finalbeta.mixin.RecipeRegistryAccessor; public class WyHelper { + private static final Minecraft INSTANCE; public static final String SPAWN_TIME_TAG = "SpawnTime"; public static final String PLAY_TIME_TAG = "PlayTime"; public static long playTime; @@ -23,12 +26,55 @@ public class WyHelper { public static final HashMap DOOR_UPDATES = new HashMap<>(); public static final HashMap DOOR_STATES = new HashMap<>(); + static { + INSTANCE = getInstance(); + } + + public static Minecraft getInstance() { + if (INSTANCE != null) { + return INSTANCE; + } else { + try { + return (Minecraft) getField(Minecraft.class, "instance", "field_2791").get(null); + } catch (IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + return null; + } + } + } + + public static Field getField(Class clz, String... names) { + for (String name : names) { + try { + Field field = clz.getDeclaredField(name); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException ex) { + continue; + } + } + return null; + } + + public static Method getMethod(Class clz, String[] names, Class... params) { + for (String name : names) { + try { + Method method = clz.getDeclaredMethod(name, params); + method.setAccessible(true); + return method; + } catch (NoSuchMethodException ex) { + continue; + } + } + return null; + } + public static void addShapedRecipe(ItemInstance result, Object... recipe) { - ((RecipeRegistryAccessorMixin) RecipeRegistry.getInstance()).invokeAddShapedRecipe(result, recipe); + ((RecipeRegistryAccessor) RecipeRegistry.getInstance()).invokeAddShapedRecipe(result, recipe); } public static void addShapelessRecipe(ItemInstance result, Object... ingredients) { - ((RecipeRegistryAccessorMixin) RecipeRegistry.getInstance()).invokeAddShapelessRecipe(result, ingredients); + ((RecipeRegistryAccessor) RecipeRegistry.getInstance()).invokeAddShapelessRecipe(result, ingredients); } public static long getRealDaysPlayed() { @@ -37,7 +83,7 @@ public class WyHelper { } public static long getGameDaysPlayed() { - long seconds = MinecraftAccessorMixin.getMinecraft().level.getLevelTime() / 20; + long seconds = WyHelper.getInstance().level.getLevelTime() / 20; return Duration.ofSeconds(seconds).toMinutes() / 20; } diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/ClientPlayerMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/ClientPlayerMixin.java index 3716937..6567681 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/mixin/ClientPlayerMixin.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/mixin/ClientPlayerMixin.java @@ -24,7 +24,7 @@ public class ClientPlayerMixin { @Inject(method = "method_136", at = @At("TAIL")) public void onKeyPressed(int key, boolean state, CallbackInfo ci) { - Minecraft mc = MinecraftAccessorMixin.getMinecraft(); + Minecraft mc = WyHelper.getInstance(); Player player = (Player) (Object) this; if (player.vehicle != null && key == Keyboard.KEY_LSHIFT && state) { diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftAccessorMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftAccessorMixin.java deleted file mode 100644 index 4038ec9..0000000 --- a/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftAccessorMixin.java +++ /dev/null @@ -1,14 +0,0 @@ -package xyz.pixelatedw.finalbeta.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.Minecraft; - -@Mixin(Minecraft.class) -public interface MinecraftAccessorMixin { - @Accessor("instance") - public static Minecraft getMinecraft() { - throw new AssertionError(); - } -} diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftMixin.java index eed17c9..c3099b8 100644 --- a/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftMixin.java +++ b/src/main/java/xyz/pixelatedw/finalbeta/mixin/MinecraftMixin.java @@ -16,7 +16,7 @@ import xyz.pixelatedw.finalbeta.MainMod; import xyz.pixelatedw.finalbeta.ModConfig; @Mixin(Minecraft.class) -public class MinecraftMixin { +public class MinecraftMixin { @Redirect(method = "init()V", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/Display;create()V"), remap = false) public void createDisplay() throws LWJGLException { // Why the fuck is this even a thing ? What was its intended purpose ? I NEED TO KNOW diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessor.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessor.java new file mode 100644 index 0000000..4945283 --- /dev/null +++ b/src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessor.java @@ -0,0 +1,16 @@ +package xyz.pixelatedw.finalbeta.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.item.ItemInstance; +import net.minecraft.recipe.RecipeRegistry; + +@Mixin(RecipeRegistry.class) +public interface RecipeRegistryAccessor { + @Invoker("addShapedRecipe") + void invokeAddShapedRecipe(ItemInstance result, Object... shape); + + @Invoker("addShapelessRecipe") + void invokeAddShapelessRecipe(ItemInstance result, Object... materials); +} diff --git a/src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessorMixin.java b/src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessorMixin.java deleted file mode 100644 index 91f40b8..0000000 --- a/src/main/java/xyz/pixelatedw/finalbeta/mixin/RecipeRegistryAccessorMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.pixelatedw.finalbeta.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import net.minecraft.item.ItemInstance; -import net.minecraft.recipe.RecipeRegistry; - -@Mixin(RecipeRegistry.class) -public interface RecipeRegistryAccessorMixin { - @Invoker("addShapedRecipe") - void invokeAddShapedRecipe(ItemInstance result, Object... shape); - - @Invoker("addShapelessRecipe") - void invokeAddShapelessRecipe(ItemInstance result, Object... materials); -} diff --git a/src/main/resources/finalbeta.mixins.json b/src/main/resources/finalbeta.mixins.json index 379bf18..20afb91 100644 --- a/src/main/resources/finalbeta.mixins.json +++ b/src/main/resources/finalbeta.mixins.json @@ -44,8 +44,7 @@ "SlimeMixin", "DimensionMixin", "TranslationStorageMixin", - "RecipeRegistryAccessorMixin", - "MinecraftAccessorMixin" + "RecipeRegistryAccessor" ], "injectors": { "defaultRequire": -1