From b83b356d22e220a7f7cb83de989325be1287b302 Mon Sep 17 00:00:00 2001 From: KrLite <68179735+KrLite@users.noreply.github.com> Date: Mon, 1 Jan 2024 21:40:06 +0800 Subject: [PATCH] initial --- README.md | 4 +- build.gradle | 4 ++ .../java/net/krlite/it_follows/ItFollows.java | 40 ++++++++++++++++++ .../mixin/CyclingButtonWidgetMixin.java | 22 ++++++++++ .../krlite/it_follows/mixin/MouseMixin.java | 25 +++++++++++ .../mixin/VideoOptionsScreenMixin.java | 26 ++++++++++++ .../java/net/krlite/modid/ExampleMod.java | 14 ------ .../assets/{modid => it_follows}/icon.png | Bin src/main/resources/fabric.mod.json | 15 ++++--- src/main/resources/it_follows.accesswidener | 2 + ...did.mixins.json => it_follows.mixins.json} | 5 ++- 11 files changed, 133 insertions(+), 24 deletions(-) create mode 100644 src/main/java/net/krlite/it_follows/ItFollows.java create mode 100644 src/main/java/net/krlite/it_follows/mixin/CyclingButtonWidgetMixin.java create mode 100644 src/main/java/net/krlite/it_follows/mixin/MouseMixin.java create mode 100644 src/main/java/net/krlite/it_follows/mixin/VideoOptionsScreenMixin.java delete mode 100644 src/main/java/net/krlite/modid/ExampleMod.java rename src/main/resources/assets/{modid => it_follows}/icon.png (100%) create mode 100644 src/main/resources/it_follows.accesswidener rename src/main/resources/{modid.mixins.json => it_follows.mixins.json} (57%) diff --git a/README.md b/README.md index 1e57974..8d3740c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ###
[`→` Modrinth](https://modrinth.com/mod/fabric-api)
-# Example Mod +# It Follows! -This is an example mod. +This useful mod sticks your cursor to the `GUI Scale` button when adjusting the GUI scaling. ## License diff --git a/build.gradle b/build.gradle index 360d70a..cfd1647 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,10 @@ dependencies { modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" } +loom { + accessWidenerPath = file("src/main/resources/it_follows.accesswidener") +} + processResources { inputs.property "version", project.version diff --git a/src/main/java/net/krlite/it_follows/ItFollows.java b/src/main/java/net/krlite/it_follows/ItFollows.java new file mode 100644 index 0000000..a014398 --- /dev/null +++ b/src/main/java/net/krlite/it_follows/ItFollows.java @@ -0,0 +1,40 @@ +package net.krlite.it_follows; + +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.client.gui.widget.CyclingButtonWidget; +import net.minecraft.client.gui.widget.PressableWidget; +import net.minecraft.util.ActionResult; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector2i; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ItFollows implements ModInitializer { + public static final String NAME = "It Follows!", ID = "it-follows"; + public static final Logger LOGGER = LoggerFactory.getLogger(ID); + + @Nullable + private static PressableWidget GUI_SCALE_WIDGET = null; + @Nullable + private static Vector2i BUTTON_POS = null; + + @Override + public void onInitialize() { + } + + public static void guiScaleWidget(PressableWidget widget) { + GUI_SCALE_WIDGET = widget; + } + + public static @Nullable Vector2i buttonPos() { + return BUTTON_POS; + } + + public static void buttonPos(PressableWidget widget, int x, int y) { + if (widget.equals(GUI_SCALE_WIDGET)) { + BUTTON_POS = new Vector2i(x, y); + } + } +} diff --git a/src/main/java/net/krlite/it_follows/mixin/CyclingButtonWidgetMixin.java b/src/main/java/net/krlite/it_follows/mixin/CyclingButtonWidgetMixin.java new file mode 100644 index 0000000..d200e22 --- /dev/null +++ b/src/main/java/net/krlite/it_follows/mixin/CyclingButtonWidgetMixin.java @@ -0,0 +1,22 @@ +package net.krlite.it_follows.mixin; + +import net.krlite.it_follows.ItFollows; +import net.minecraft.client.gui.widget.CyclingButtonWidget; +import net.minecraft.client.gui.widget.PressableWidget; +import net.minecraft.text.Text; +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.CallbackInfo; + +@Mixin(CyclingButtonWidget.class) +public abstract class CyclingButtonWidgetMixin extends PressableWidget { + public CyclingButtonWidgetMixin(int i, int j, int k, int l, Text text) { + super(i, j, k, l, text); + } + + @Inject(method = "cycle", at = @At("HEAD")) + private void cycleHead(int amount, CallbackInfo ci) { + ItFollows.buttonPos(this, getX(), getY()); + } +} diff --git a/src/main/java/net/krlite/it_follows/mixin/MouseMixin.java b/src/main/java/net/krlite/it_follows/mixin/MouseMixin.java new file mode 100644 index 0000000..b9dc523 --- /dev/null +++ b/src/main/java/net/krlite/it_follows/mixin/MouseMixin.java @@ -0,0 +1,25 @@ +package net.krlite.it_follows.mixin; + +import net.krlite.it_follows.ItFollows; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Mouse; +import org.joml.Vector2i; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Mouse.class) +public abstract class MouseMixin { + @Shadow protected abstract void onCursorPos(long window, double x, double y); + + @Inject(method = "onResolutionChanged", at = @At("RETURN")) + private void onResolutionChanged(CallbackInfo ci) { + Vector2i pos = ItFollows.buttonPos(); + if (pos != null) { + onCursorPos(MinecraftClient.getInstance().getWindow().getHandle(), pos.x(), pos.y()); + System.out.println(pos.x() + ", " + pos.y()); + } + } +} diff --git a/src/main/java/net/krlite/it_follows/mixin/VideoOptionsScreenMixin.java b/src/main/java/net/krlite/it_follows/mixin/VideoOptionsScreenMixin.java new file mode 100644 index 0000000..850d409 --- /dev/null +++ b/src/main/java/net/krlite/it_follows/mixin/VideoOptionsScreenMixin.java @@ -0,0 +1,26 @@ +package net.krlite.it_follows.mixin; + +import net.krlite.it_follows.ItFollows; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.option.GameOptionsScreen; +import net.minecraft.client.gui.screen.option.VideoOptionsScreen; +import net.minecraft.client.gui.widget.CyclingButtonWidget; +import net.minecraft.client.gui.widget.OptionListWidget; +import net.minecraft.client.option.GameOptions; +import net.minecraft.text.Text; +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.CallbackInfo; + +@Mixin(VideoOptionsScreen.class) +public class VideoOptionsScreenMixin extends GameOptionsScreen { + public VideoOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text title) { + super(parent, gameOptions, title); + } + + @Inject(method = "init", at = @At("TAIL")) + private void init(CallbackInfo ci) { + ItFollows.guiScaleWidget((CyclingButtonWidget>) (((OptionListWidget) children().get(0)).children().get(6)).children().get(0)); + } +} diff --git a/src/main/java/net/krlite/modid/ExampleMod.java b/src/main/java/net/krlite/modid/ExampleMod.java deleted file mode 100644 index 7f628b8..0000000 --- a/src/main/java/net/krlite/modid/ExampleMod.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.krlite.modid; - -import net.fabricmc.api.ModInitializer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ExampleMod implements ModInitializer { - public static final String NAME = "Mod Name", ID = "modid"; - public static final Logger LOGGER = LoggerFactory.getLogger(ID); - - @Override - public void onInitialize() { - } -} diff --git a/src/main/resources/assets/modid/icon.png b/src/main/resources/assets/it_follows/icon.png similarity index 100% rename from src/main/resources/assets/modid/icon.png rename to src/main/resources/assets/it_follows/icon.png diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 6dc5d57..3190cb2 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,30 +1,31 @@ { "schemaVersion": 1, - "id": "modid", + "id": "it-follows", "version": "${version}", - "name": "Example Mod", - "description": "", + "name": "It Follows!", + "description": "Let the Cursor Follow the 'GUI Scale' Button So They Won't Separate!", "authors": [ "KrLite" ], "contact": { "homepage": "https://github.com/KrLite", - "sources": "https://github.com/KrLite/Example-Mod" + "sources": "https://github.com/KrLite/It-Follows-Exclamation" }, "license": "GPL-3.0", - "icon": "assets/modid/icon.png", + "icon": "assets/it_follows/icon.png", "environment": "*", "entrypoints": { "main": [ - "net.krlite.modid.ExampleMod" + "net.krlite.it_follows.ItFollows" ] }, "mixins": [ - "modid.mixins.json" + "it_follows.mixins.json" ], + "accessWidener": "it_follows.accesswidener", "depends": { "fabricloader": "*", diff --git a/src/main/resources/it_follows.accesswidener b/src/main/resources/it_follows.accesswidener new file mode 100644 index 0000000..3462c52 --- /dev/null +++ b/src/main/resources/it_follows.accesswidener @@ -0,0 +1,2 @@ +accessWidener v1 named +accessible method net/minecraft/client/gui/widget/OptionListWidget$WidgetEntry children ()Ljava/util/List; \ No newline at end of file diff --git a/src/main/resources/modid.mixins.json b/src/main/resources/it_follows.mixins.json similarity index 57% rename from src/main/resources/modid.mixins.json rename to src/main/resources/it_follows.mixins.json index 22d4730..e2b1c6c 100644 --- a/src/main/resources/modid.mixins.json +++ b/src/main/resources/it_follows.mixins.json @@ -1,11 +1,14 @@ { "required": true, "minVersion": "0.8", - "package": "net.krlite.modid.mixin", + "package": "net.krlite.it_follows.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ ], "client": [ + "CyclingButtonWidgetMixin", + "MouseMixin", + "VideoOptionsScreenMixin" ], "injectors": { "defaultRequire": 0