Skip to content

Commit

Permalink
initial
Browse files Browse the repository at this point in the history
  • Loading branch information
KrLite committed Jan 1, 2024
1 parent 2058742 commit b83b356
Show file tree
Hide file tree
Showing 11 changed files with 133 additions and 24 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
### <p align=right>[`` Modrinth](https://modrinth.com/mod/fabric-api)</p>

# 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

Expand Down
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
40 changes: 40 additions & 0 deletions src/main/java/net/krlite/it_follows/ItFollows.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
25 changes: 25 additions & 0 deletions src/main/java/net/krlite/it_follows/mixin/MouseMixin.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
}
Original file line number Diff line number Diff line change
@@ -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));
}
}
14 changes: 0 additions & 14 deletions src/main/java/net/krlite/modid/ExampleMod.java

This file was deleted.

File renamed without changes
15 changes: 8 additions & 7 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
@@ -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": "*",
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/it_follows.accesswidener
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
accessWidener v1 named
accessible method net/minecraft/client/gui/widget/OptionListWidget$WidgetEntry children ()Ljava/util/List;
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit b83b356

Please sign in to comment.