From 14319319aba0eb5e21087000182a9f2b1cd81207 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Sun, 22 Jun 2025 20:48:52 -0400 Subject: [PATCH 1/4] 3.1.0: fast reset like button location --- build.gradle | 120 ++++-------------- gradle.properties | 20 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 8 +- .../me/voidxwalker/anchiale/Anchiale.java | 48 ++++++- .../anchiale/mixin/GameMenuScreenMixin.java | 54 ++++++-- .../anchiale/mixin/IntegratedServerMixin.java | 18 +-- .../mixin/SkinOptionsScreenMixin.java | 30 +++++ src/main/resources/anchiale.mixins.json | 9 +- src/main/resources/fabric.mod.json | 11 +- 10 files changed, 176 insertions(+), 144 deletions(-) create mode 100644 src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java diff --git a/build.gradle b/build.gradle index 51aea8d..e50af26 100644 --- a/build.gradle +++ b/build.gradle @@ -1,125 +1,49 @@ plugins { - id 'fabric-loom' version "0.7-SNAPSHOT" // To use chocoloom, change the version to a commit hash - id 'maven-publish' - id 'org.ajoberstar.grgit' version '4.1.0' + id "fabric-loom" version "1.10-SNAPSHOT" + id "legacy-looming" version "1.10-SNAPSHOT" + id "maven-publish" } -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +version = "$mod_version+$target_version" +group = maven_group -def getVersionMetadata() { - // CI builds version numbers - def build_id = System.getenv("RELEASE_NUMBER") - if (build_id != null) { - return build_id + ".0.0" - } - - // Development builds - if (grgit == null) { - return "dev" - } - - // Named development builds - def id = grgit.head().abbreviatedId - if (!grgit.status().clean) { - id += "-dirty" - } - - return "rev.${id}" +base { + archivesName = archives_name } -archivesBaseName = "${project.mod_id}-${project.minecraft_version}" -version = "${getVersionMetadata()}" -group = project.maven_group - -repositories { - maven { - name = "legacy-fabric" - url = "https://maven.legacyfabric.net" +loom { + decompilers { + vineflower { + options.putAll(["mark-corresponding-synthetics": "1", "indent-string": " "]) + } } -} - -// Comment out this block if you're using Chocoloom -// Comment when using loom 0.10 -minecraft { - intermediaryUrl = { - return "https://maven.legacyfabric.net/net/fabricmc/intermediary/" + it + "/intermediary-" + it + "-v2.jar"; + mixin { + useLegacyMixinAp = false } } dependencies { - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - - // Fabric API provides hooks for events, item registration, and more. As most mods will need this, it's included by default. - // If you know for a fact you don't, it's not required and can be safely removed. - //modImplementation ("net.legacyfabric.legacy-fabric-api:legacy-fabric-api:${fabric_version}") { - // exclude module: "fabric-loader-1.8.9" - //} - - // Hacks that make mac os work - if (System.getProperty("os.name").toLowerCase().contains("mac")) { - implementation 'org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209' - implementation 'org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209' - implementation 'org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209' - } -} - -// More hacks that make mac os work -if (System.getProperty("os.name").toLowerCase().contains("mac")) { - configurations.all { - resolutionStrategy { - dependencySubstitution { - substitute module('org.lwjgl.lwjgl:lwjgl_util:2.9.2-nightly-201408222') with module('org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209') - substitute module('org.lwjgl.lwjgl:lwjgl:2.9.2-nightly-201408222') with module('org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209') - } - force 'org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209' - } - } + minecraft "com.mojang:minecraft:$minecraft_version" + mappings legacy.yarn(minecraft_version, yarn_build) + modImplementation "net.fabricmc:fabric-loader:$loader_version" } processResources { - inputs.property "mod_id", project.mod_id - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "mod_id": project.mod_id, "version": project.version + filesMatching "fabric.mod.json", { + expand "version": version } } -// ensure that the encoding is set to UTF-8, no matter what the system default is -// this fixes some edge cases with special characters not displaying correctly -// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html tasks.withType(JavaCompile).configureEach { it.options.encoding = "UTF-8" - if (JavaVersion.current().isJava9Compatible()) it.options.release = 8 + it.options.release.set(8) } java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. + sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 withSourcesJar() } jar { - from("LICENSE") { - rename { "${it}_${project.archivesBaseName}"} - } + from "LICENSE" } - -// configure the maven publication -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - } - } - - // select the repositories you want to publish to - repositories { - // uncomment to publish to the local maven - // mavenLocal() - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a137b04..1fa4cb7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,13 @@ -# suppress inspection "UnusedProperty" for whole file -# Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx2G +org.gradle.jvmargs = -Xmx2G +org.gradle.parallel = true +org.gradle.caching = true -# Fabric Properties -minecraft_version = 1.8.9 -yarn_mappings = 1.8.9+build.202201091851 -loader_version = 0.12.12 +mod_version = 3.1.0 -# Mod Properties -mod_version = 1.0.2 +target_version = 1.8-1.12.2 +archives_name = anchiale maven_group = me.voidxwalker -mod_id = anchiale \ No newline at end of file + +minecraft_version = 1.8.9 +yarn_build = 571 +loader_version = 0.16.14 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102..17b9d0f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index f91a4fe..24e0754 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,9 +1,9 @@ pluginManagement { repositories { - maven { - name = 'Fabric' - url = 'https://maven.fabricmc.net/' - } + maven { url "https://maven.fabricmc.net" } + maven { url "https://maven.legacyfabric.net" } + mavenCentral() gradlePluginPortal() + mavenLocal() } } diff --git a/src/main/java/me/voidxwalker/anchiale/Anchiale.java b/src/main/java/me/voidxwalker/anchiale/Anchiale.java index 0ba1d0b..8dcbf11 100644 --- a/src/main/java/me/voidxwalker/anchiale/Anchiale.java +++ b/src/main/java/me/voidxwalker/anchiale/Anchiale.java @@ -1,9 +1,53 @@ package me.voidxwalker.anchiale; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import net.fabricmc.loader.api.FabricLoader; +import org.apache.logging.log4j.*; + +import java.io.IOException; +import java.nio.file.*; public class Anchiale { public static final Logger LOGGER = LogManager.getLogger(); public static boolean fastReset = false; + public static ButtonLocation buttonLocation = ButtonLocation.BOTTOM_RIGHT; + public static Path config = FabricLoader.getInstance().getConfigDir().resolve("anchiale.txt"); + + static { + try { + if (Files.notExists(config)) { + Files.createFile(config); + saveConfig(); + } + buttonLocation = ButtonLocation.values()[Integer.parseInt(new String(Files.readAllBytes(config)))]; + } catch (Exception e) { + LOGGER.error("Failed to create/read Anchiale config"); + e.printStackTrace(); + } + } + + public static void saveConfig() { + try { + Files.write(config, ("" + buttonLocation.ordinal()).getBytes()); + } catch (IOException e) { + LOGGER.error("Failed to write Anchiale config"); + e.printStackTrace(); + } + } + + public enum ButtonLocation { + BOTTOM_RIGHT("Bottom Right"), + CENTER("Center"), + REPLACE_SQ("Replace Save and Quit"); + + private final String name; + + ButtonLocation(String name) { + this.name = name; + } + + @Override + public String toString() { + return this.name; + } + } } diff --git a/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java b/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java index 7fab6ed..4a36bed 100644 --- a/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java +++ b/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java @@ -1,27 +1,61 @@ package me.voidxwalker.anchiale.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import me.voidxwalker.anchiale.Anchiale; -import net.minecraft.client.gui.screen.GameMenuScreen; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.*; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.resource.language.I18n; 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.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GameMenuScreen.class) public abstract class GameMenuScreenMixin extends Screen { + @ModifyArg(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/ButtonWidget;(IIILjava/lang/String;)V", ordinal = 0), index = 1) + private int titleScreenX(int x, @Share("originalX") LocalIntRef originalX) { + originalX.set(x); + return Anchiale.buttonLocation == Anchiale.ButtonLocation.REPLACE_SQ ? this.width - 153 - 4 : x; + } + + @ModifyArg(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/ButtonWidget;(IIILjava/lang/String;)V", ordinal = 0), index = 2) + private int titleScreenY(int y, @Share("originalY") LocalIntRef originalY) { + originalY.set(y); + return Anchiale.buttonLocation == Anchiale.ButtonLocation.REPLACE_SQ ? this.height - 24 : y; + } + + @ModifyExpressionValue(method = "init", at = @At(value = "NEW", target = "(IIILjava/lang/String;)Lnet/minecraft/client/gui/widget/ButtonWidget;", ordinal = 0)) + private ButtonWidget titleScreenWidth(ButtonWidget button) { + if (Anchiale.buttonLocation == Anchiale.ButtonLocation.REPLACE_SQ) { + button.setWidth(150); // from fast reset + } + return button; + } @Inject(method = "init", at = @At("TAIL")) - private void anchiale_addMenuQuitWorldButton(CallbackInfo ci) { + private void addAnchialeButton(CallbackInfo ci, @Share("originalX") LocalIntRef originalX, @Share("originalY") LocalIntRef originalY) { + int x, y, width; + switch (Anchiale.buttonLocation) { + case BOTTOM_RIGHT: + x = this.width - 104; + y = this.height - 24; + break; + case CENTER: + x = originalX.get(); + y = originalY.get() + 24; + break; + case REPLACE_SQ: + default: + x = originalX.get(); + y = originalY.get(); + } if (this.client.isInSingleplayer()) { - this.buttons.add(new ButtonWidget(1507, this.width - 106, this.height - 24, 102, 20, I18n.translate("menu.quitWorld"))); + this.buttons.add(new ButtonWidget(1507, x, y, Anchiale.buttonLocation == Anchiale.ButtonLocation.BOTTOM_RIGHT ? 100 : 200, 20, "Quit to Title")); } } @Inject(method = "buttonClicked", at = @At("HEAD")) - private void anchiale_onMenuQuitWorldClicked(ButtonWidget button, CallbackInfo ci) { + private void onMenuQuitWorldClicked(ButtonWidget button, CallbackInfo ci) { if (button.id == 1507) { Anchiale.fastReset = true; button.id = 1; @@ -29,7 +63,7 @@ private void anchiale_onMenuQuitWorldClicked(ButtonWidget button, CallbackInfo c } @Inject(method = "buttonClicked", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/TitleScreen;()V")) - private void anchiale_fastResetFalse(CallbackInfo ci) { + private void fastResetFalse(CallbackInfo ci) { Anchiale.fastReset = false; } -} \ No newline at end of file +} diff --git a/src/main/java/me/voidxwalker/anchiale/mixin/IntegratedServerMixin.java b/src/main/java/me/voidxwalker/anchiale/mixin/IntegratedServerMixin.java index 2911d33..07d0184 100644 --- a/src/main/java/me/voidxwalker/anchiale/mixin/IntegratedServerMixin.java +++ b/src/main/java/me/voidxwalker/anchiale/mixin/IntegratedServerMixin.java @@ -1,25 +1,21 @@ package me.voidxwalker.anchiale.mixin; -import com.google.common.util.concurrent.Futures; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import me.voidxwalker.anchiale.Anchiale; import net.minecraft.server.integrated.IntegratedServer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; import java.util.concurrent.Future; @Mixin(IntegratedServer.class) public abstract class IntegratedServerMixin { - - @Redirect(method = "stopRunning", at = @At(value = "INVOKE", target = "Lcom/google/common/util/concurrent/Futures;getUnchecked(Ljava/util/concurrent/Future;)Ljava/lang/Object;")) - public Object anchiale_fastReset(Future e){ + @WrapWithCondition(method = "stopRunning", at = @At(value = "INVOKE", target = "Lcom/google/common/util/concurrent/Futures;getUnchecked(Ljava/util/concurrent/Future;)Ljava/lang/Object;")) + public boolean fastReset(Future e) { if (Anchiale.fastReset) { - Anchiale.LOGGER.info("Exiting world without waiting for server tasks to finish."); - return null; - } else { - Anchiale.LOGGER.info("Exiting world normally."); - return Futures.getUnchecked(e); + Anchiale.LOGGER.info("Exiting world without waiting for server tasks to finish"); + return false; } + return true; } -} \ No newline at end of file +} diff --git a/src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java b/src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java new file mode 100644 index 0000000..8bffbf8 --- /dev/null +++ b/src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java @@ -0,0 +1,30 @@ +package me.voidxwalker.anchiale.mixin; + +import me.voidxwalker.anchiale.Anchiale; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.options.SkinOptionsScreen; +import net.minecraft.client.gui.widget.ButtonWidget; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SkinOptionsScreen.class) +public abstract class SkinOptionsScreenMixin extends Screen { + @Unique + private ButtonWidget locationButton; + + @Inject(method = "init", at = @At("TAIL")) + private void addLocationButton(CallbackInfo ci) { + this.buttons.add(this.locationButton = new ButtonWidget(1541, this.width / 2 - 155, this.height / 6 + 120, 150, 20, Anchiale.buttonLocation.toString())); + } + + @Inject(method = "buttonClicked", at = @At("TAIL")) + private void locationButtonClicked(ButtonWidget button, CallbackInfo ci) { + if (button.active && button.id == 1541) { + Anchiale.ButtonLocation[] locations = Anchiale.ButtonLocation.values(); + Anchiale.buttonLocation = locations[(Anchiale.buttonLocation.ordinal() + 1) % locations.length]; + locationButton.message = Anchiale.buttonLocation.toString(); + Anchiale.saveConfig(); + } + } +} diff --git a/src/main/resources/anchiale.mixins.json b/src/main/resources/anchiale.mixins.json index dc1b1ee..11f31cb 100644 --- a/src/main/resources/anchiale.mixins.json +++ b/src/main/resources/anchiale.mixins.json @@ -4,10 +4,13 @@ "package": "me.voidxwalker.anchiale.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ - "IntegratedServerMixin", - "GameMenuScreenMixin" + "GameMenuScreenMixin", + "IntegratedServerMixin" + ], + "client": [ + "SkinOptionsScreenMixin" ], "injectors": { "defaultRequire": 1 } -} \ No newline at end of file +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 165f1eb..9eb4e28 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,15 +1,16 @@ { "schemaVersion": 1, - "id": "${mod_id}", + "id": "anchiale", "version": "${version}", "name": "Anchiale", "description": "", "authors": [ - "RedLime?", + "RedLime", "voidxwalker", "Gregor", "pixfumy", - "KingContaria" + "KingContaria", + "tildejustin" ], "license": "MIT", "environment": "*", @@ -17,7 +18,7 @@ "anchiale.mixins.json" ], "depends": { - "fabricloader": ">=0.12.12", + "fabricloader": ">=0.15", "minecraft": ">=1.8 <=1.12.2" } -} \ No newline at end of file +} From 5820783dec28aafb37d3de42cbe25d45b107b350 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Sun, 22 Jun 2025 20:51:19 -0400 Subject: [PATCH 2/4] fix target still compatible, but it's already in atum 1.9-1.12 b/c it fixes a crash --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 1fa4cb7..f4fe148 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.caching = true mod_version = 3.1.0 -target_version = 1.8-1.12.2 +target_version = 1.8.x archives_name = anchiale maven_group = me.voidxwalker From dd6bcd64295f4b0fa95edb68b1695f2574d74df1 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Jun 2025 17:55:38 -0400 Subject: [PATCH 3/4] make config button replace broadcast, add description --- .../anchiale/mixin/GameMenuScreenMixin.java | 2 +- .../anchiale/mixin/SettingsScreenMixin.java | 35 +++++++++++++++++++ .../mixin/SkinOptionsScreenMixin.java | 30 ---------------- src/main/resources/anchiale.mixins.json | 2 +- src/main/resources/fabric.mod.json | 2 +- 5 files changed, 38 insertions(+), 33 deletions(-) create mode 100644 src/main/java/me/voidxwalker/anchiale/mixin/SettingsScreenMixin.java delete mode 100644 src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java diff --git a/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java b/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java index 4a36bed..b3002e0 100644 --- a/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java +++ b/src/main/java/me/voidxwalker/anchiale/mixin/GameMenuScreenMixin.java @@ -34,7 +34,7 @@ private ButtonWidget titleScreenWidth(ButtonWidget button) { @Inject(method = "init", at = @At("TAIL")) private void addAnchialeButton(CallbackInfo ci, @Share("originalX") LocalIntRef originalX, @Share("originalY") LocalIntRef originalY) { - int x, y, width; + int x, y; switch (Anchiale.buttonLocation) { case BOTTOM_RIGHT: x = this.width - 104; diff --git a/src/main/java/me/voidxwalker/anchiale/mixin/SettingsScreenMixin.java b/src/main/java/me/voidxwalker/anchiale/mixin/SettingsScreenMixin.java new file mode 100644 index 0000000..286c1e1 --- /dev/null +++ b/src/main/java/me/voidxwalker/anchiale/mixin/SettingsScreenMixin.java @@ -0,0 +1,35 @@ +package me.voidxwalker.anchiale.mixin; + +import me.voidxwalker.anchiale.Anchiale; +import net.minecraft.client.gui.screen.*; +import net.minecraft.client.gui.widget.ButtonWidget; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SettingsScreen.class) +public abstract class SettingsScreenMixin extends Screen { + @Unique + private ButtonWidget locationButton; + + @ModifyArg(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/ButtonWidget;(IIIIILjava/lang/String;)V", ordinal = 0), slice = @Slice(from = @At(value = "CONSTANT", args = "stringValue=options.stream"))) + private String renameBroadcastButton(String string) { + return Anchiale.buttonLocation.toString(); + } + + // modifyexpressionvalue on invoke doesn't work and on new is before the string ldc for some reason + @ModifyArg(method = "init", at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", ordinal = 0), slice = @Slice(from = @At(value = "CONSTANT", args = "stringValue=options.stream"))) + private Object captureLocationButton(Object button) { + locationButton = (ButtonWidget) button; + return button; + } + + @Inject(method = "buttonClicked", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;getTwitchStreamProvider()Lnet/minecraft/client/util/TwitchStreamProvider;"), cancellable = true) + private void locationButtonClicked(ButtonWidget button, CallbackInfo ci) { + Anchiale.ButtonLocation[] locations = Anchiale.ButtonLocation.values(); + Anchiale.buttonLocation = locations[(Anchiale.buttonLocation.ordinal() + 1) % locations.length]; + locationButton.message = Anchiale.buttonLocation.toString(); + Anchiale.saveConfig(); + ci.cancel(); + } +} diff --git a/src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java b/src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java deleted file mode 100644 index 8bffbf8..0000000 --- a/src/main/java/me/voidxwalker/anchiale/mixin/SkinOptionsScreenMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package me.voidxwalker.anchiale.mixin; - -import me.voidxwalker.anchiale.Anchiale; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.options.SkinOptionsScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(SkinOptionsScreen.class) -public abstract class SkinOptionsScreenMixin extends Screen { - @Unique - private ButtonWidget locationButton; - - @Inject(method = "init", at = @At("TAIL")) - private void addLocationButton(CallbackInfo ci) { - this.buttons.add(this.locationButton = new ButtonWidget(1541, this.width / 2 - 155, this.height / 6 + 120, 150, 20, Anchiale.buttonLocation.toString())); - } - - @Inject(method = "buttonClicked", at = @At("TAIL")) - private void locationButtonClicked(ButtonWidget button, CallbackInfo ci) { - if (button.active && button.id == 1541) { - Anchiale.ButtonLocation[] locations = Anchiale.ButtonLocation.values(); - Anchiale.buttonLocation = locations[(Anchiale.buttonLocation.ordinal() + 1) % locations.length]; - locationButton.message = Anchiale.buttonLocation.toString(); - Anchiale.saveConfig(); - } - } -} diff --git a/src/main/resources/anchiale.mixins.json b/src/main/resources/anchiale.mixins.json index 11f31cb..d397892 100644 --- a/src/main/resources/anchiale.mixins.json +++ b/src/main/resources/anchiale.mixins.json @@ -8,7 +8,7 @@ "IntegratedServerMixin" ], "client": [ - "SkinOptionsScreenMixin" + "SettingsScreenMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 9eb4e28..ccb6fd5 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,7 +3,7 @@ "id": "anchiale", "version": "${version}", "name": "Anchiale", - "description": "", + "description": "Adds a faster way to exit worlds in 1.8. Use the Quit to Title button to exit the current world without waiting for the server tasks queue to complete.", "authors": [ "RedLime", "voidxwalker", From ced4771c1f8be51e39ccaccdcbd4c28c63811c1b Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Jun 2025 18:38:39 -0400 Subject: [PATCH 4/4] restrict supported versions --- src/main/resources/fabric.mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ccb6fd5..d562a07 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,6 +19,6 @@ ], "depends": { "fabricloader": ">=0.15", - "minecraft": ">=1.8 <=1.12.2" + "minecraft": "1.8.x" } }