From 0226bfc62f8b7b2ba216030c28f13ce03e3f6a66 Mon Sep 17 00:00:00 2001 From: Motschen Date: Tue, 3 May 2022 12:22:20 +0200 Subject: [PATCH] MidnightControls 0.2.0 - Fixes, improvements, compat - Fix #4 - Fix #3 (maybe?) - No longer break OptiFabric - Better XBox controller icons (#7) by @Ivanoks - Start of reimplementing REI compat - Hide HUD when controller is missing --- README.md | 10 +- build.gradle | 40 +----- gradle.properties | 5 +- .../midnightcontrols/MidnightControls.java | 18 +-- .../MidnightControlsConstants.java | 2 +- .../client/MidnightControlsConfig.java | 3 +- .../client/MidnightInput.java | 2 +- .../client/compat/EmotecraftCompat.java | 2 - .../client/compat/MidnightControlsCompat.java | 2 +- .../compat/MidnightControlsMixinPlugin.java | 2 +- .../client/compat/ReiCompat.java | 130 +++++++++++------- .../compat/mixin/EntryListWidgetAccessor.java | 13 +- .../client/gui/MidnightControlsHud.java | 3 +- .../gui/MidnightControlsSettingsScreen.java | 42 +++++- .../textures/gui/controller_axis.png | Bin 14130 -> 13416 bytes .../textures/gui/controller_buttons.png | Bin 25958 -> 26017 bytes src/main/resources/fabric.mod.json | 11 +- .../midnightcontrols_compat.mixins.json | 2 +- 18 files changed, 168 insertions(+), 119 deletions(-) diff --git a/README.md b/README.md index 079a3f9..ea8a693 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,13 @@ ![Java 16](https://img.shields.io/badge/language-Java%2017-9B599A.svg?style=flat-square) [![GitHub license](https://img.shields.io/github/license/TeamMidnightDust/MidnightControls?style=flat-square)](https://raw.githubusercontent.com/TeamMidnightDust/MidnightControls/master/LICENSE) ![Environment: Client](https://img.shields.io/badge/environment-client-1976d2?style=flat-square) -[![Mod loader: Fabric]][fabric] +[![Mod loader: Quilt/Fabric]][quilt] ![Version](https://img.shields.io/github/v/tag/TeamMidnightDust/MidnightControls?label=version&style=flat-square) -[![CurseForge](http://cf.way2muchnoise.eu/title/354231.svg)](https://www.curseforge.com/minecraft/mc-mods/lambdacontrols) +[![CurseForge](http://cf.way2muchnoise.eu/title/354231.svg)](https://www.curseforge.com/minecraft/mc-mods/midnightcontrols) A Fabric Minecraft mod which adds better controls, reach-around and controller support. -Forked from [LambdaControls](https://github.com/LambdAurora/LambdaControls) by the amazing [LambdaAurora](https://github.com/LambdAurora), which was sadly discontinued +Forked from [LambdaControls](https://github.com/LambdAurora/LambdaControls) by the amazing [LambdAurora](https://github.com/LambdAurora), which was sadly discontinued. ## What's this mod? @@ -56,5 +56,5 @@ This mod also adds controller support. Just do `./gradlew build` and everything should build just fine! -[fabric]: https://fabricmc.net -[Mod loader: Fabric]: https://img.shields.io/badge/modloader-Fabric-1976d2?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTEyLTE2VDE2OjU0OjE3LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHN0RXZ0OndoZW49IjIwMTgtMTItMTZUMTY6NTQ6MTctMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4/HiGMAAAAtUlEQVRYw+XXrQqAMBQF4D2P2eBL+QIG8RnEJFaNBjEum+0+zMQLtwwv+wV3ZzhhMDgfJ0wUSinxZUQWgKos1JP/AbD4OneIDyQPwCFniA+EJ4CaXm4TxAXCC0BNHgLhAdAnx9hC8PwGSRtAFVMQjF7cNTWED8B1cgwW20yfJgAvrssAsZ1cB3g/xckAxr6FmCDU5N6f488BrpCQ4rQBJkiMYh4ACmLzwOQF0CExinkCsvw7vgGikl+OotaKRwAAAABJRU5ErkJggg== +[quilt]: https://quiltmc.org +[Mod loader: Quilt]: https://img.shields.io/badge/modloader-Quilt%2FFabric-blueviolet?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAADGAAAAxgGwdJvFAAAFU0lEQVR4nO1bwW7bOBCdCHtP+wUNxIvhS7yA7kkPOjf9AKPam4/OF2zzB96bblXhH0jPPkS5G1jnIvgib/IFtX/ALoYZemmKtEWRRe3aDzAsURbJGQ6HM4/02Wq1gmNGcNTSnxQA8IdakDK4AOCfJpj3SpiI98r2rAMAbxrWNWFFOMeL1nCJdXQa1gPTbpCbnm34ABIeBThv2hgAfOyVcF+2ZwkAfHGo54kVIRe6NVxiny4d6vpn2g36ugfqFLhwFB6kkUoc67k0XLv0qYKj9wEnBXiqZwEAf/ZKOOuV8BkLWBFesyI8A4C/LOt6AoC39C7HtBvg9Vt65hUnC/BUDzrOf1MGq5S9WkDZnuVle7ZqsBKgw/tO73K0hku8/u64EmhxsoA96MMvxdEroBIKO+CWoshnqqJPYTAGRJ8sql3QO3Op7D19D3z7AV8KeAGArFf+32lWhDwnKNuzuaUCclaE93KBiOU9hMQV+FLAOxz9lPHRR0VkZXs2oBDUNon5ULZnKOgcYwl4FTwna/K+CtRRwIK+dTnCCwkP9I0fkXmh4FcN+6UKqqtHblvtb+18po4TvKaPilsS8qVuYx5havsbJXS1I0ZVAXP1B5jfyzm+hAnN+We1XPluioX03kJtY9oNtG1T+b1aburDxhRAQVMGHw3z9k65F41nktmjUnjjrAj7ZXv27ECIyEKgBd7saBuka7lsPu0GA1MjR0+KVpwgMTlrMkN4YoztlZ/2camTvD0QjcWZF6KxMgcLyKbdAN+HKOb1y6PYH49gEsUwUKw1G48gi2KQZcApkYxH1eldUQBxeKbkRfXEQjDZ21+h2bMiHJDwH2wk1rSX0XWueHZd2yCZ/oVSnilTaA3VAiqjRRahQ0JBjuov3ijfPqAua0kUg67tmyjWCmvsS504wGQRnywjPJ8wtY3xw3827fjMBXziUalL3DcNrIzYRwXcTbvBZ7lgPHoNxKKYky1/+2xsHxXQbw2X/EIoggQHyjC9Yh8VcC6NshDc66jLOHpC5KSAPejDL8U+KuArboTQZgjHeARn+MFnvhvbRyfYaQ2XfNkTVFgUr/mIxlvkJuyjAjCae6BrYQUPW37vhDpT4MnAsCyIgbHBnYbcADJt7/t+deBCiSWsCG8sOv5IgU2FnJh2g+RnBDl1oCpgogqEx1TEURUFokx+tpCYnEzzjg1kh+fq/Ix9OXpG6OjjgI1VIGWcOMhlXh4PPdAz1VTe90rIU8Z/L9JUnALXSK4SjSUzOY+Y1ekyOlzjaamTvf3X8cjunBH1v6OeVtsG1QI66qYEVkoVmyA/O5fYmIHjgSsrskUavAc6q1BLeXXiANMZu0HKwGav7opGv+LticZqHOToLBeZrJRxC97qjOsowCTgZYO9OlNa25haMwgvsFMJPp3gLW1ji8b6dO89fhfYIbzAl23T4adtjyNvD6/mbbs9Xgs1hRcwWoIvCxDb47nQNm5aRDHvoPGcblNYCi+gtQSfU+AdLYfioLXYtHA9eruBhsILVJRwUIGQo/ACG0o4GAV4El5grQSffMA3SqbEnBdb1zeunfYsvAB3jL4UwE92KauA2NnNbLerNKhEqJ6Q+FIAOjpcATAVzjFHoC3qC9OurCW0W9s+6vXpAy4p0hPkSUL3ziNHiY3tqfNdQN4jORgnSEGMLyU8Udbq1QIEdEyRF3hSwlp4vKkwQimrHDuxAR6S4tleFIPzERnhSFXQEtbkD1kbwiMOlhJroISK8IiDpcQsp4NWeMRBc4I1lWAUHnHwpOgOJWwVHvFbsMIGJewUHvFb7QuQYxR/ttgIzbUAgB9KOM3uc+PN7QAAAABJRU5ErkJggg== \ No newline at end of file diff --git a/build.gradle b/build.gradle index a00dd9f..b52dc44 100644 --- a/build.gradle +++ b/build.gradle @@ -3,11 +3,9 @@ plugins { id 'java-library' id 'maven-publish' id 'com.github.johnrengelman.shadow' version '7.0.0' - id 'org.cadixdev.licenser' version '0.6.1' id 'com.modrinth.minotaur' version '1.2.+' } -import net.fabricmc.loom.task.RemapJarTask import com.google.gson.GsonBuilder import com.google.gson.JsonObject import com.modrinth.minotaur.TaskModrinthUpload @@ -41,14 +39,6 @@ String getMCVersionString() { return version[0] + '.' + version[1] } -String getTerraformersMCMaven() { - def terraformersUrl = 'https://maven.terraformersmc.com/' - if (pingUrl(terraformersUrl)) - return terraformersUrl - else - return 'https://maven.kotlindiscord.com/repository/terraformers/' -} - boolean pingUrl(String address) { try { def conn = (HttpURLConnection) new URL(address).openConnection() @@ -65,7 +55,6 @@ String parseReadme() { def readme = (String) file('README.md').text readme = readme.replaceAll(excludeRegex, '') - readme = readme.replaceAll(linkRegex, '![$1](https://raw.githubusercontent.com/LambdAurora/midnightcontrols/1.17/$2)') return readme } @@ -82,18 +71,12 @@ repositories { name 'CottonMC' url 'https://server.bbkr.space/artifactory/libs-snapshot' } - maven { - name 'TerraformersMC' - url getTerraformersMCMaven() - content { - includeGroup 'dev.emi' - includeGroup 'com.terraformersmc' - } - } + maven { url "https://maven.terraformersmc.com/releases/" } maven { url 'https://maven.kosmx.dev' } maven { url 'https://maven.shedaniel.me/' } maven { url 'https://jitpack.io' } maven { url "https://api.modrinth.com/maven" } + maven { url 'https://maven.quiltmc.org/repository/release'} } configurations { @@ -121,10 +104,10 @@ dependencies { modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}" // Compatibility mods - modImplementation("com.github.EnnuiL:okzoomer:e6a801b1a3") { - exclude group: 'com.terraformersmc' - exclude group: 'dev.lambdaurora' - } + modImplementation("maven.modrinth:ok-zoomer:${project.ok_zoomer_version}") + modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}" + modImplementation "org.quiltmc:quilt-json5:1.0.0" + modImplementation("me.shedaniel:RoughlyEnoughItems-runtime-fabric:${project.rei_version}") modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}" modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}" @@ -159,17 +142,6 @@ processResources { } } -jar { - from('LICENSE') { - rename { "${it}_${project.archivesBaseName}" } - } -} - -license { - header file('HEADER') - include '**/*.java' -} - task publishModrinth(type: TaskModrinthUpload) { dependsOn(build) onlyIf { diff --git a/gradle.properties b/gradle.properties index b1e9276..3c28ee5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.18.1+build.22 loader_version=0.13.3 # Mod Properties -mod_version = 0.1.0 +mod_version = 0.2.0 maven_group = eu.midnightdust archives_base_name = midnightcontrols modrinth_id=W1D3UXEc @@ -21,3 +21,6 @@ midnightlib_version=0.4.0 modmenu_version=2.0.2 emotecraft_version=2.1-MC1.18.1-fabric bendylib_version=2.0.+ +rei_version=7.4.456 +ok_zoomer_version=5.0.0-beta.3+1.17.1 +libzoomer_version = 0.3.0+1.17.1 diff --git a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java index 8a714ed..115bb05 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java @@ -26,10 +26,10 @@ import java.util.Objects; import java.util.Optional; /** - * Represents the midnightcontrols mod. + * Represents the MidnightControls mod. * - * @author LambdAurora - * @version 1.7.0 + * @author LambdAurora & Motschen + * @version 1.8.0 * @since 1.0.0 */ public class MidnightControls implements ModInitializer { @@ -40,12 +40,12 @@ public class MidnightControls implements ModInitializer { public static final TranslatableText NOT_BOUND_TEXT = new TranslatableText("midnightcontrols.not_bound"); - public final Logger logger = LogManager.getLogger("midnightcontrols"); + public final Logger logger = LogManager.getLogger("MidnightControls"); @Override public void onInitialize() { INSTANCE = this; - this.log("Initializing midnightcontrols..."); + this.log("Initializing MidnightControls..."); ServerPlayNetworking.registerGlobalReceiver(HELLO_CHANNEL, (server, player, handler, buf, responseSender) -> { String version = buf.readString(32); @@ -68,7 +68,7 @@ public class MidnightControls implements ModInitializer { * @param info the message to print */ public void log(String info) { - this.logger.info("[midnightcontrols] " + info); + this.logger.info("[MidnightControls] " + info); } /** @@ -77,7 +77,7 @@ public class MidnightControls implements ModInitializer { * @param warning the warning to print */ public void warn(String warning) { - this.logger.info("[midnightcontrols] " + warning); + this.logger.info("[MidnightControls] " + warning); } /** @@ -119,9 +119,9 @@ public class MidnightControls implements ModInitializer { } /** - * Gets the midnightcontrols instance. + * Gets the MidnightControls instance. * - * @return the midnightcontrols instance + * @return the MidnightControls instance */ public static MidnightControls get() { return INSTANCE; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsConstants.java b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsConstants.java index 9d70186..0593e7e 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsConstants.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsConstants.java @@ -13,7 +13,7 @@ package eu.midnightdust.midnightcontrols; import net.minecraft.util.Identifier; /** - * Represents the constants used by midnightcontrols. + * Represents the constants used by MidnightControls. * * @author LambdAurora * @version 1.1.0 diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index cb295c1..15f3827 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -46,7 +46,6 @@ public class MidnightControlsConfig extends MidnightConfig { @Entry public static int[] reacharoundOutlineColor = new int[]{255, 255, 255, 102}; // Controller @Entry public static ControllerType controllerType = ControllerType.DEFAULT; - //private static final double DEFAULT_DEAD_ZONE = 0.25; @Entry public static double rightDeadZone = 0.25; @Entry public static double leftDeadZone = 0.25; @Entry public static boolean invertRightYAxis = false; @@ -124,7 +123,7 @@ public class MidnightControlsConfig extends MidnightConfig { if (raw instanceof Number) { if (((Number) raw).intValue() == -1) return Optional.empty(); - return Optional.of(Controller.byId((Integer) raw)); + return Optional.of(Controller.byId(((Number) raw).intValue())); } else if (raw instanceof String) { return Optional.of(Controller.byGuid((String) raw).orElse(Controller.byId(GLFW.GLFW_JOYSTICK_1))); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 70d2ab4..35ada2a 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -70,7 +70,7 @@ import static org.lwjgl.glfw.GLFW.*; public class MidnightInput { private static final Map BUTTON_COOLDOWNS = new HashMap<>(); // Cooldowns - private int actionGuiCooldown = 0; + public int actionGuiCooldown = 0; private boolean ignoreNextARelease = false; private double targetYaw = 0.0; private double targetPitch = 0.0; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java index 23abf68..0c13979 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java @@ -13,9 +13,7 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen; import io.github.kosmx.emotes.main.network.ClientEmotePlay; -import net.minecraft.client.gui.screen.Screen; import org.jetbrains.annotations.NotNull; -import org.lwjgl.glfw.GLFW; /** * Represents a compatibility handler for Emotecraft. diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java index cfc067e..563dfcc 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java @@ -31,7 +31,7 @@ import java.util.stream.Stream; * @since 1.1.0 */ public class MidnightControlsCompat { - private static final List HANDLERS = new ArrayList<>(); + public static final List HANDLERS = new ArrayList<>(); /** * Initializes compatibility with other mods if needed. diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java index 7a1d915..d746747 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java @@ -36,7 +36,7 @@ public class MidnightControlsMixinPlugin implements IMixinConfigPlugin { } private void putConditionalMixin(@NotNull String path, boolean condition) { - this.conditionalMixins.put("me.lambdaurora.midnightcontrols.client.compat.mixin." + path, condition); + this.conditionalMixins.put("eu.midnightdust.midnightcontrols.client.compat.mixin." + path, condition); } @Override diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java index 31f7c74..8fa82e1 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java @@ -11,15 +11,39 @@ package eu.midnightdust.midnightcontrols.client.compat; import eu.midnightdust.midnightcontrols.client.ButtonState; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; +import eu.midnightdust.midnightcontrols.client.compat.mixin.EntryListWidgetAccessor; +import eu.midnightdust.midnightcontrols.client.compat.mixin.EntryWidgetAccessor; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.InputHandlers; import eu.midnightdust.midnightcontrols.client.controller.PressAction; +import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; +import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.impl.client.REIRuntimeImpl; +import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; +import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; +import me.shedaniel.rei.impl.client.gui.widget.EntryListEntryWidget; +import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; +import me.shedaniel.rei.impl.client.registry.screen.ScreenRegistryImpl; +import me.shedaniel.rei.impl.common.entry.AbstractEntryStack; +import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; +import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.EntryListWidget; import net.minecraft.util.Identifier; +import net.minecraft.util.Pair; +import org.aperlambda.lambdacommon.utils.LambdaReflection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; +import java.util.Optional; + +import static eu.midnightdust.midnightcontrols.client.compat.CompatHandler.SlotPos.INVALID_SLOT; import static org.lwjgl.glfw.GLFW.*; /** @@ -30,11 +54,11 @@ import static org.lwjgl.glfw.GLFW.*; * @since 1.2.0 */ public class ReiCompat implements CompatHandler { - //private static EntryListWidget ENTRY_LIST_WIDGET; + private static EntryListWidget ENTRY_LIST_WIDGET; @Override public void handle(@NotNull MidnightControlsClient mod) { - ButtonBinding.builder(new Identifier("rei", "category_back")) + /*ButtonBinding.builder(new Identifier("rei", "category_back")) .buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER) .filter((client, binding) -> isViewingScreen(client.currentScreen)) .action(handleTab(false)) @@ -87,38 +111,40 @@ public class ReiCompat implements CompatHandler { .action(handleShowRecipeUsage(false)) .cooldown(true) .register(); + */ } + /* @Override public boolean requireMouseOnScreen(Screen screen) { - return isViewingScreen(screen) /*|| screen instanceof PreRecipeViewingScreen*/; + return isViewingScreen(screen); } @Override - public @Nullable SlotPos getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) { - /*var overlay = ScreenHelper.getOptionalOverlay(); - if (overlay.isPresent() && overlay.get().isInside(mouseX, mouseY)) { - var widget = getEntryListWidget(); + public @Nullable CompatHandler.SlotPos getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) { + + ScreenOverlayImpl overlay = ScreenOverlayImpl.getInstance(); + if (overlay.isInside(mouseX, mouseY)) { + EntryListWidget widget = getEntryListWidget(); if (widget == null) return null; - var slot = this.getSlotAt(widget, mouseX, mouseY, false); - if (slot != null && slot != INVALID_SLOT) - return slot; + return this.getSlotAt(widget, mouseX, mouseY, false); } else if (isViewingScreen(screen)) { - for (var element : screen.children()) { + for (Element element : screen.children()) { var slot = this.getSlotAt(element, mouseX, mouseY, true); - if (slot != null && slot != INVALID_SLOT) + if (slot != null) return slot; } - }*/ + } return null; } - /*private @Nullable SlotPos getSlotAt(@NotNull Element element, int mouseX, int mouseY, boolean allowEmpty) { - if (element instanceof EntryWidget entry) { + private @Nullable CompatHandler.SlotPos getSlotAt(@NotNull Element element, int mouseX, int mouseY, boolean allowEmpty) { + if (element instanceof EntryWidget) { + EntryWidget entry = (EntryWidget) element; if (entry.containsMouse(mouseX, mouseY)) { - if (!allowEmpty && entry.entries().isEmpty()) + if (!allowEmpty && entry.getEntries().isEmpty()) return INVALID_SLOT; return new SlotPos(entry.getBounds().getX() + 1, entry.getBounds().getY() + 1); } @@ -137,11 +163,10 @@ public class ReiCompat implements CompatHandler { } } return null; - }*/ + } private static boolean isViewingScreen(Screen screen) { - return true; - //return screen instanceof DefaultDisplayViewingScreen || screen instanceof CompositeDisplayViewingScreen; + return screen instanceof DefaultDisplayViewingScreen || screen instanceof CompositeDisplayViewingScreen; } @Override @@ -149,12 +174,12 @@ public class ReiCompat implements CompatHandler { if (!isViewingScreen(screen)) return false; - /*MinecraftClient.getInstance().openScreen(REIRuntimeImpl.getInstance().getPreviousContainerScreen()); - ScreenHelper.getLastOverlay().init();*/ + MinecraftClient.getInstance().setScreen(REIRuntimeImpl.getInstance().getPreviousContainerScreen()); + REIRuntimeImpl.getInstance().getLastOverlay().init(); return true; } - /*private static EntryListWidget getEntryListWidget() { + private static EntryListWidget getEntryListWidget() { if (ENTRY_LIST_WIDGET == null) { ENTRY_LIST_WIDGET = LambdaReflection.getFirstFieldOfType(ContainerScreenOverlay.class, EntryListWidget.class) .map(field -> (EntryListWidget) LambdaReflection.getFieldValue(null, field)) @@ -163,55 +188,56 @@ public class ReiCompat implements CompatHandler { return ENTRY_LIST_WIDGET; } - private static @Nullable EntryStack getCurrentStack(@NotNull MinecraftClient client) { + private static @Nullable AbstractEntryStack getCurrentStack(@NotNull MinecraftClient client) { double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(); double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight(); if (isViewingScreen(client.currentScreen)) { - for (var element : client.currentScreen.children()) { - var stack = getCurrentStack(element, x, y); + for (Element element : client.currentScreen.children()) { + EntryStack stack = getCurrentStack(element, x, y); if (stack != null) return stack; } } - var overlay = ScreenHelper.getOptionalOverlay(); + Optional overlay = REIRuntimeImpl.getInstance().getOverlay(false,false); if (!overlay.isPresent()) return RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen); - var widget = getEntryListWidget(); + EntryListWidget widget = getEntryListWidget(); if (widget == null) - return RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen); + return ScreenOverlayImpl.getInstance().getInstance().getOverlayMenu()..getScreenFocusedStack(client.currentScreen); return getCurrentStack(widget, x, y); } private static @Nullable EntryStack getCurrentStack(@NotNull Element element, double mouseX, double mouseY) { - if (element instanceof EntryWidget entry) { + if (element instanceof EntryWidget) { + EntryWidget entry = (EntryWidget) element; if (entry.containsMouse(mouseX, mouseY)) - return ((EntryWidgetAccessor) entry).midnightcontrols_getCurrentEntry(); + return ((EntryWidgetAccessor) entry).lambdacontrols_getCurrentEntry(); } else if (element instanceof EntryListWidget) { - var entries = ((EntryListWidgetAccessor) element).getEntries(); + List entries = ((EntryListWidgetAccessor) element).getEntries(); for (EntryListEntryWidget entry : entries) { if (entry.containsMouse(mouseX, mouseY)) { - return ((EntryWidgetAccessor) entry).midnightcontrols_getCurrentEntry(); + return ((EntryWidgetAccessor) entry).lambdacontrols_getCurrentEntry(); } } - } else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds widgetWithBounds) { - for (var child : widgetWithBounds.children()) { - var stack = getCurrentStack(child, mouseX, mouseY); + } else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds) { + for (Element child : ((WidgetWithBounds) element).children()) { + EntryStack stack = getCurrentStack(child, mouseX, mouseY); if (stack != null) return stack; } } return null; - }*/ + } private static PressAction handleShowRecipeUsage(boolean usage) { return (client, button, value, action) -> { if (action.isUnpressed()) return false; - /*EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen); + EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen); if (stack == null) { stack = getCurrentStack(client); } @@ -223,7 +249,7 @@ public class ReiCompat implements CompatHandler { } else { return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); } - }*/ + } return false; }; @@ -234,11 +260,11 @@ public class ReiCompat implements CompatHandler { if (action == ButtonState.RELEASE) return false; - /*Optional overlay = ScreenHelper.getOptionalOverlay(); + Optional overlay = ScreenHelper.getOptionalOverlay(); if (!overlay.isPresent()) return false; - var widget = getEntryListWidget(); + EntryListWidget widget = getEntryListWidget(); if (widget == null) return false; @@ -246,7 +272,7 @@ public class ReiCompat implements CompatHandler { widget.nextPage(); else widget.previousPage(); - widget.updateEntriesPosition();*/ + widget.updateEntriesPosition(); return true; }; @@ -258,27 +284,28 @@ public class ReiCompat implements CompatHandler { * @param next True if the action is to switch to the next tab. * @return The handler. */ + /* private static PressAction handleTab(boolean next) { return (client, button, value, action) -> { if (action != ButtonState.RELEASE) return false; - /*if (client.currentScreen instanceof DefaultDisplayViewingScreen) { + if (client.currentScreen instanceof RecipeViewingScreen) { RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen; if (next) screen.getCategoryNext().onClick(); else screen.getCategoryBack().onClick(); return true; - } else if (client.currentScreen instanceof CompositeDisplayViewingScreen) { + } else if (client.currentScreen instanceof VillagerRecipeViewingScreen) { VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen; List> categories = screen.getCategories(); int currentTab = screen.getSelectedCategoryIndex(); screen.setSelectedCategoryIndex(getNextIndex(currentTab, categories.size(), next)); screen.setSelectedRecipeIndex(0); - screen.midnightcontrols_init(); + screen.lambdacontrols_init(); return true; - }*/ + } return false; }; } @@ -288,13 +315,15 @@ public class ReiCompat implements CompatHandler { if (action.isUnpressed()) return false; - /*if (client.currentScreen instanceof RecipeViewingScreenAccessor screen) { + if (client.currentScreen instanceof RecipeViewingScreen) { + RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen; if (next) screen.getRecipeNext().onClick(); else screen.getRecipeBack().onClick(); return true; - } else if (client.currentScreen instanceof VillagerRecipeViewingScreenAccessor screen) { + } else if (client.currentScreen instanceof VillagerRecipeViewingScreen) { + VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen; List> categories = screen.getCategories(); int currentTab = screen.getSelectedCategoryIndex(); List recipes = screen.getCategoryMap().get(categories.get(currentTab)); @@ -315,10 +344,10 @@ public class ReiCompat implements CompatHandler { } screen.setSelectedRecipeIndex(nextRecipe); - screen.midnightcontrols_init(); + screen.lambdacontrols_init(); return true; - }*/ + } return false; }; @@ -332,4 +361,5 @@ public class ReiCompat implements CompatHandler { nextIndex = 0; return nextIndex; } -} + */ +} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java index 4ebf374..ee027a9 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java @@ -9,6 +9,13 @@ package eu.midnightdust.midnightcontrols.client.compat.mixin; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.widget.EntryListWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + /** * Represents an accessor to REI's EntryListWidget. * @@ -16,8 +23,8 @@ package eu.midnightdust.midnightcontrols.client.compat.mixin; * @version 1.5.0 * @since 1.5.0 */ -//@Mixin(value = EntryListWidget.class, remap = false) +@Mixin(value = EntryListWidget.class, remap = false) public interface EntryListWidgetAccessor { - /*@Accessor(value = "entries") - List getEntries();*/ + @Accessor(value = "children") + List getEntries(); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java index 544176e..1153ee2 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java @@ -14,6 +14,7 @@ import eu.midnightdust.midnightcontrols.MidnightControlsConstants; import eu.midnightdust.midnightcontrols.client.HudSide; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import eu.midnightdust.midnightcontrols.client.MidnightInput; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import dev.lambdaurora.spruceui.hud.Hud; @@ -77,7 +78,7 @@ public class MidnightControlsHud extends Hud { */ @Override public void render(MatrixStack matrices, float tickDelta) { - if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null) { + if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null && MidnightControlsConfig.getController().isConnected() && MidnightControlsConfig.getController().isGamepad()) { int y = bottom(2); this.renderFirstIcons(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y); this.renderSecondIcons(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java index c545e43..4e3ab21 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -9,6 +9,10 @@ package eu.midnightdust.midnightcontrols.client.gui; +import com.mojang.blaze3d.systems.RenderSystem; +import dev.lambdaurora.spruceui.background.Background; +import dev.lambdaurora.spruceui.widget.SpruceWidget; +import eu.midnightdust.lib.util.MidnightColorUtil; import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; @@ -27,6 +31,7 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.render.*; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.LiteralText; @@ -35,8 +40,11 @@ import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import net.minecraft.util.Util; +import net.minecraft.util.math.Matrix4f; import org.lwjgl.glfw.GLFW; +import java.awt.*; + /** * Represents the midnightcontrols settings screen. */ @@ -158,7 +166,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { ClientPlayNetworking.getSender().sendPacket(MidnightControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next)); } }, option -> option.getDisplayText(new TranslatableText(MidnightControlsConfig.controlsMode.getTranslationKey())), - new TranslatableText("midnightcontrols.tooltip.controls_mode")); + new TranslatableText("midnightcontrols.tooltip.controlsMidnightColorUtil.radialRainbow(1f,1f);_mode")); this.autoSwitchModeOption = new SpruceToggleBooleanOption("midnightcontrols.menu.auto_switch_mode", () -> MidnightControlsConfig.autoSwitchMode, value -> MidnightControlsConfig.autoSwitchMode = value, new TranslatableText("midnightcontrols.tooltip.auto_switch_mode")); this.rotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.rotation_speed", 0.0, 100.0, .5f, @@ -262,6 +270,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { var tabs = new SpruceTabbedWidget(Position.of(0, 24), this.width, this.height - 32 - 24, null, Math.max(116, this.width / 8), 0); + tabs.getList().setBackground(new MidnightControlsBackground()); this.addDrawableChild(tabs); tabs.addSeparatorEntry(new TranslatableText("midnightcontrols.menu.separator.general")); @@ -368,4 +377,35 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) { drawCenteredText(matrices, this.textRenderer, I18n.translate("midnightcontrols.menu.title"), this.width / 2, 8, 16777215); } + + public static class MidnightControlsBackground implements Background { + @Override + public void render(MatrixStack matrixStack, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) { + fill(matrixStack, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000")); + } + private void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) { + matrixStack.push(); + + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); + float r = (float)(color.getRed()) / 255.0F; + float g = (float)(color.getGreen()) / 255.0F; + float b = (float)(color.getBlue()) / 255.0F; + float t = (float)(160) / 255.0F; + BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); + RenderSystem.enableBlend(); + RenderSystem.disableTexture(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + bufferBuilder.vertex(matrix, (float)x1, (float)y2, 0.0F).color(r, g, b, t).next(); + bufferBuilder.vertex(matrix, (float)x2, (float)y2, 0.0F).color(r, g, b, t).next(); + bufferBuilder.vertex(matrix, (float)x2, (float)y1, 0.0F).color(r, g, b, t).next(); + bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t).next(); + bufferBuilder.end(); + BufferRenderer.draw(bufferBuilder); + RenderSystem.enableTexture(); + RenderSystem.disableBlend(); + matrixStack.pop(); + } + } } diff --git a/src/main/resources/assets/midnightcontrols/textures/gui/controller_axis.png b/src/main/resources/assets/midnightcontrols/textures/gui/controller_axis.png index de1f6b5e2dda2ae91d0e433a01fca8243956b092..f52f81ee038bffcf77fc5d0e565a315b2a2ba34f 100644 GIT binary patch delta 9813 zcmb7qRZQIv(Cp#h?(Xh>aCdj7xRrwzcYe4QcXuuB6lk&HZY>lqP@uRw_kSO6?!%Wa zlWeltx0%W8!)}Yqp?xwfKpEk$Yv`$M=|lC&-PI22WJ~4g_sN#Z))#6A0{O0;<{7z@ zcV^1HbH|Z@L&CiU?P(nl_+E@j%k5P(Iw}mb0F4&8t1BK{zuXP7kh7Or!2I6)1-e

t5NFa8afpZKd06d)GpLrjTK zv@c;=T|etOb^d*Radh-oaM#@51Xb3!z!nM4B?(TO%Ri($*Wf>YngfsO-yX3K9v`~C zi`hRvY#mX4IbSm;e7yXp8@oBvYtK!Adhq!3!~>@Cy{vVBF%~HE+9ayG?Cvv24T?vG zc{IxZ_U5VY*}ilGEDF48cYF&v2%gf9D{^h73^VyA{&wRLl zCAf8b*mL;rJ;0~uJjX9C1*L?e2=f-7FKFwW2&l>u};BD5V^xOA>?+LYLHqOuc zjDW%6`tKKX<`b?#^uIwSmd(R>N%0vPRwnbC@zV|`ZaG(3z>UDVVf}B0y!jQCfR=~$ z%nO&_ukPnA2_onHAFQ{nq`WSBfQ|FF{yv9Dtib0u{C{y;19rp{`EUEqHgxN=#Rr7j zt^n{-)=NS>71v^1j{ED;EjDL}Qqh8QeuR{lQeusM>D3QLdbpl99$6k?%(#h6`GRkR z1RUx_XWw)K*fXp1V7Vve$&J|PkEz9f<&)4J3UHiC$s%urwX>o5(5&q86+JaWyE53p zVQFqGQ)i}oFZaWlA0BJXp0+YO_=i?KgMkNo`-*-5`LwY^cZU84$G!xL9+=$jEVF=r zeMtjihz1ldH{0meQ-aQwIU8)PGyKnF@mEIBeLa0s!1=xT2Iy1ln;E`R)e+<*e>DDMmuSrHE<6k0P>NA2LM$*6QgS1#>6YLx#}+??2;DGz2LR zDa{24eTdc0g>Q*{@)&>Car)+V%C-N_gvShP0v+++oTW|J&@Kutv|#AhOU%#wxT@JM01A>8sIHu?)+MbHY!Bg;Gi=Yyn|YM_^PXGTpat@2T^a=a~8mzdo#-duij z3Sj<|*++(PiRX_HUSo*0UXt{g#{)J1WuZ-ON?PYTcwY)d!kKhv_bb{ z7uEO6$Ngg&=y`n?zH-u=lOajA8X)mRtxq$EDP?*0(_&YAohgef zM)HvZ4M!W4;;ozu`Jhq42i+Fr%rw55S^wC&EI}y5YbOgBv zIwUHnq{&iJhZkmU5*X#Nz?}V+a?nbgQJtST{xj#B!5YRuI&angMO zPOZz!j%DaVk`5f&X586R*OW|kjsj=-iC_>ML$^K4$XJ_f`!W`ult{@}ylt?L9^?5L zu+^)C4?lKx{<0Opaj0Ef_z}P4Vr%AG)?ZX`yWXNs9H}lGo5)ayhzL7mg^;PUwZ5qz zV)VIEDChXoRtQ-V{jxc`7+ts-#bwbSx5@l~KT(%}y3jr!6e3SL-mM)`-<3 z-IG<{h@zLpIA->g3yzZ8@rUZ_ulk7#FhuNnp!%eIfdV=EcP%ejO5Qk=x(rhz;cLjS z#_hthhF=r|aicz6AAV#t2*SRj@K~+i-_XvHY+ zcd3?(w)qt}7%pl4a*pa>{{4#W*b?Wmz>((!J0er}jVhznGiWeC+S*j8W3S>L=K`4N z;qxrKU*$H%0Oo;E@-O!aTgHl(BYy`3LN^dy&GJcBDr_E${J&J8LLE&37~>^*_$Uij z6dbP7xgtz%Dpx$;XuyKuDYMBZ6R#rEj>*rpx+&RpQ_Ppj;!9{maJ}9})Z=Wg2>+&g ze;kY*2OUyrHn=(RP031=Zm`y&7t}+Z>$ga4An(NK@9AO_Lk1xP7yb129j)E}X%_><0nNeRZm=)-Fc{`3lWc=L_8s&EwK6{n?onz*0-zfdt*0LE zZw=WuTF{UrI@~o>9DvIolITG>fR255^ZH&V-0gfP|;EcB7oO8yq2 zngKgb;EE>6P0F;wR4*j4m!g=nbENn8|E11Bri!r; z-Za{m4B&q$y{^^V=LNAN@FAqKBuHPz#OAoY78_cwJ@t1LdOn zRV{Rcx57(;@Ye#@;XH<>P(rYD+`%e(g>?gShDNpm#Tp#zOLH@FlqEl9Z$3!z#7x{m z&2i&jMYbdSy`a!-?rKmpoeqp%7>~ahJy~f^4p>F4bI|FCwNo`^S>X~Fo9grKEgK?F zag_27QwXPrff9|URrrIn-l9^dLZz-6z(dJPTK7Y*Ww%;zo^vDvm1v$KDt%bRsBES* zA$FkpF6yM;@J6i=Bz|iLyOQFHjAnKM!;WPc3zOpN6Y%f@GctRwId#h0uiV9L)IVsM zK-h(YL2`KAmAlmF_ z607gKY>xlgz+6rk{xe-DSMF#FK?8p(@KWv|hFXKYs4FmtTCDuD1Uf=LO)IVHVF@i! z2uhrKT~1;uq57i$Z&5K!rJo1K#NrQG6_^-S88BaPvrl?bxbx4ljYYRDyK#x`&k?Y^ zL|~&grL7NU@|hy*mqfoWvM%A5RGivLOCja)WQUlsm?VjHr$0zqJC!V&dw{Zk!ff;CBw2@!WA0Jqn-K#R*=L zNT!5v`|6Bknx#U#m*U562=++5kTJ>JwfoTDmKiG|bN>YRvR#yOOy0p3hJlRr z6Fjo8ko^@Qh}AFTYvf&=fI6mm7RR!$bM8AzQktoTcBmRWQVR^e-hAa{$bY9j8Hpl% zDZG@Miy3P~Br5u=Mi>>1FN{Xqukt4_zLiOzX05pE8K;oqd~WTA8Z(dr%4v(eN(^9H zk5+jms)XLYElfP97z&0A%*!8ZvgL>*>%IuzZ8$;<732y%&7eSh)V1vkL>`hAdQX0u zm}GeLee7(Q){Sngh$2Ov--z;yTf>a-B->m95 zHidS+(tnQw3Bq{0rNFeb)No6fRLj9;sv_@EBCx$&Be3OOBx_6oB2m6jWrRmJIc}BN z^jv6&q?-Don9iz31PPijkyHgHjo46P&TLERvh2x_xww5*lkD)1 z2~qIIYg)Op3)NJ>;IeOQXmMO>qkii=l59&mh9?feaI3Q7eRK)d390uftjM9?he+jk z7Xa=uXAcV@*=GPRy+l_vE8#eXMLEZ8QZmYpRsHQ>Iod(vvNx~MhX2L8fzE8q#{4j- zN1lJ#PWNMeiv^Kf9c78Cr_B*Y7225E^3J6m7MNQ4N{|Ck#pN%X6R9|Tdc-e)w|1>L zD@Deci*0jSElGXIUzx7YPKU|TOtCQAuQZWVyWOn*2oH1_*st8aXE~xy%^VMbk<&NA(?>{3L zwMg1~9LK+pIo$W*(Zv6NO{u1T7;zRlV1=tlaNzlI^t7^F8=KmX{Rg-DV;9=Hr-JF2 zHtem)gl9H~jO|D~39)p8mTTr9WcUk$|GOajn~NdvxeMq1d$o0){INk?yKEtaReAH1 zQ}tZp2QFXW^ktAQ4y_rnlB;#_(6+;^ElzPY3v-H>MM~ zOnwIdX~GqqP`Q^=sQGZe6q1`1WP_w+*tR)Eumi%U|sfz*k6@pHW`2%X}jkJ~ht6G7R`7(9hCmSFl#9_j7d z;CmQ9pTL$9I(ihn>GsDVLyPf}PYQ=D1g~Dj2lA4xqNHY*5A22@9p0O$Z9W(MdLf%SD&KDlTSM!x>S>O zH46=J7us#Jmw&LZ%Erw>CD6QR-Q|Q~O-BnV<+JP!o2QKtA|X>qwke;H`+POWU>@mh z;@XA!ZPM6LBQ?0{FvX$k=VvL{yW0lT6%OpXuiEG#tZI(Ln; zRcbMLKV%qYlHTdiSC;iP&SwNbpE?+!;QUx$rOOdaGOxZKri*{ZSlyUfE^=%iGyYMC zWLB;&ZjPWKl(j2Y`gh{u31&0aJso~OETOrmrL>FNb$?i+yydRdX`DqxB|iwz6O*Sw z@syiA+x6djjZ{+&5VAv=cH*cCAQ!jlgJLxD*e!yfUKofFgK1Q9lBYR?H-*!YWTzs^7lOI;gV8(_ zn)iNnq{$u2Bq{>&a<{eQstS2NQs#@8-hZj7LReid-1G^?k@=RE=s=HU4AbMOq}Hb` zM=SJ>((#aPWSy4&wRUu3Tfug{DkCQLoD>%XyUUE)@?Ig$D|Hd=h|s^oYYys!SKyzW z{G6z0jo?zNp*x)FwSsJ|^3pzIeAjPSB&eQR+;sVJA_~}FYIRUN73St-Y)ZlTb%@3V z>B-RVR9_mnjc#s#yZ~C!Kjf4$K&Qx#wcf8#5}6 zjSS_vZ$m*Ib8q>YZ$#d9ahjqX2ye{$DQghpoP&g+oiS)dtd(*4cy|IR_3#0%DOMLo z?zT$vPX|+8Lx4{2)Xe&~s?Iy3`r@Z>oBcJ&&bHD|{IMwlYTd3VQpX3Q2{@~iRc*;1 zKEcVZG#?K~5q=KaVcE~5q?bhdY4qdv@Y zpcYNfW9RkK9wO0O(X;>3+UKNHn{)(AJ0*IGR_j7UO91K4J3XY@De26XG_VH6fRgBvM6`E!+pGVT%mOJmeD zZ-YVXvjQN|Boyy_nxCqz;&{4pV7ViyjUo}i7g#9jB9^FppJ`cM7BdaYHf1K)ALPA$ zqBp&<+JafYE zX%*i7Q987gf`3Tg42LE66hp{!P!_W;>5-YtrwGJEp=er4)gTWU#KY3YF@%@NB_Xc3 zP`u_qD&=WlERf1z)7N+{jI7CPZ@Ghm(y~w_L+&}C9^kJ1>6gO|5`C+DaBz4!RV}Ow zv8DUGQ{TncgI(5n!oz5EYIwEx2{%Q~vvBg#X#1M%zw7<7T0f(kveuBd2*@=m4LdcbQQd4Qa z6fO#_U9pkGQ^g|q{>839piqxs;}=?=nqtGfvHWRi zh#E?fuO+dyegw}|Cs?fIc`vC`I!7(ZYgg<;cFk}?t3c1-U0o4D=}>F>tw&$}lJniWy4D=w&A6D3hM>cF`HS2gbuSyYxoMYnAo2};E3t+d^G=_AShQRF zts+DE0_B{3eX=8w7Iy$K^1+hYYXZ9JvN5|{eFw=8iV(4uR&XZz|y z`}*7NeGC;EZz`9){HWZh-3sFTJ0rf1WhqU63|n}Yag7$PO>lPc+T`mm8-Vu76Jc5H zVeuM+7AhG z3K|m)GFIIPcCft%`l|4oM2 zPtjWshqE_tr?<2kp*|GWI_k7H#yKz&#QMw?!wSmfQ5*)dKa%gJ_}+NsS21 z;?hh@OojZ@wA|4i#t)6K;yynD@5-2+>V#(#Bv?sG;4ccOyXFn(dG>#jVY)QD*qZ;vyHj9l}4D7FdD3xbnEFqTh1`}Nlu!Xx+cl!9G-TO5!$wGKKT`*G{L3?yNM z(S*Bkxv{=CJ`P%1H_W=Xg72w6N2#TF((gtB4kPikj)#Q)8iZyQpM%3xj$kdZf9wES#KH2R12Myx1BtxiemK!hCPH7S4EiYQ*NC{&Bzk zh-CxLz>>WGd7UN2>rM?U~K!9V`Yv@DlS zlMsF;9PkHKVsDcR?d!8zA7TvAg}e?qddeZ7Jcr)fZ|9eb(oq_zq9+x&Bon8Y9NKZp zgXCjP)l^1%%Q6&M6eCD!oNn)0KAzif^bpC61KG`NO2t~G%2T&X9T~WXsS7uiMZhbV zS#825t6dz^qE$!RUx2|QcOQ0*usIK@y@SV2+ValJ3x2d55x929)xLKqo5wnYuUh~v z$mK}NWF$(Zjz=3yp$`(bj%27aiz&4Ad%e~ohTRPeEKl(9urx}R^$mR_`4b4gG%2+L z#?v{uy!e_|8jbpJZ;28b(gL;Rv_(=T0{&oJtchcM*KrA%*i=vJDsLu&IJrbe3@g5 zs>4x|FXS_6X&E&!=CYK4@Tv+c6*qri$mwcs$3Fv-xxOqkR~b3UjK-vl{%UiDfr{Pd zXcqEdg*v|J+&D>vXgQK&4JKioIjtIM?ihz91l5dBLrZ@;lcR;tk1bqIRV0C``NUsj zO(Tu$?ZpN+LY_wfFtRA`9DfWiRBgt_JP-T~D+j8P9-AzF&vVO2G@82D zm{0ZS5E>r4d%=zyv_`5fP1m)=eu6{aC8^(CViO`<;W$u|ZpuDE@$%w2TZuu=}Hhq10B+~epMMWF~9#-7X4u3Q^UN*F>Wkt~U@kz&TCcn;{8;kPcml0fF?yP}it>qWGs z2kZ!Nvb#oh+5DFXmp7HppEem2TT<(Aig1&1Jf(IO8dxd5yK#JFyO^rZQJTe7i2Y%O z$Vxt?Tq!RqN2bG9a1~iM%JP?e#<*g{_fh^nAtX#&gdY7;6q;fs8d!zF-FXIN~!f_LhGFANsrHCt(){5ZbSh|9$@D zmdhx4LEN?Q`^^D1`;o41bHz$Qa*O|y+r~<|*tR<&kuQ&pj&}u>T8SoTbM`RLUGklM zuIJ!(g=uZ{2sXK-L0h1IfSSv={KTus=ic+~?mR~ykU)HK4-7S(F9w0oUt8_z z5NkU=Azn*%0SLb(J48SL!Y;^TWy22Pv*h8mg;??P@bIJ&FjZpkar5wTaS3wqa6!0* zAgvQjCNOC-%qDb}{5Cu`0z6jiR+a+X>=0WnUUoqtYddyZD_a2pYi@2{9y`mlA!bD^ z2s@9EF1MgCFGLu^#mdFgO3LDhgn10r{sRJm*fmvka}a;XW(LO6mUhp^?+&$tKOC1Tae8Bc17td|8xDrcvB|C0=#f%V?C5ebq$G6W?+X z&?BIk&$TDD{)?RfSEQG&RsgRU2+DUFcAQxz^%;}GX~9+US;d3Fk?8;YSp#-z%rLc^ z&Wh?%WD74RW4cOZ*Px$NGDRpQTujmy^OK<9-Wn_%ZuQjrAsh?u9zH_$1<>uQWk=7Y zWk5httkRE`^9j@bkFlLmy$DZdY*#RaZ#(l8sGTH4(HI=$;xYFOvt-1+m0Vo)u@fXnCY=JOyZEmoV>Z z-`TP-ufmVg9tt#n6Nw~M)2-ddwRF#d>2}ztNH22(Zb!)7(<4q~7fku(LWVIf3jQNI zkkMM{E;S}}`218R#b`C~D_t;rFAUx)uFx8+?j2~fOr}9hk}GuLB}u)QN5;%Dq|=+z z%=07tMP)~f36M%mut^Y*ul|-bkw`inm9a$d)rG}UQYoHIn9l3sj|UNt zIrjXif+0)Il;of1-^%UmSjC6ovEP&IVd0(J!^+T~P_O<^nFUDCGnJpyT9W)(fN&m2 zNeDG!dT>)$jK|lBro^jrsa|T5ok>~OkKdK-?=zYNp)@IRI0mdYAA9Y zEEgb4{b1@HEFP<`&M(FQ!ARX?x0cZp`|%UzmcF0y@@>|Jx7OU;{5TJbcv-sh>RC~U zEOD9s)^F4WTt0ecX1C&YJAEtqc=4kqliPCO|}jX>sLBF#!C5ak=v;r;)L46XG4h%hRoFsd{J k0lYK}0TiM`pBqZHZpLU68}sb{!V07$r!LzdZ4vf=0L0TtIRF3v delta 10717 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 I8T0V}1>%0`^8f$< diff --git a/src/main/resources/assets/midnightcontrols/textures/gui/controller_buttons.png b/src/main/resources/assets/midnightcontrols/textures/gui/controller_buttons.png index 45573c622c41bc1fffa47d308c67015ec29c293d..8fa618ce97039a550f8ff480a51fb1bb562dd209 100644 GIT binary patch delta 22419 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 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 7f93078..024d159 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -9,8 +9,8 @@ "Motschen" ], "contact": { - "homepage": "https://github.com/TeamMidnightDust/MidnightControls", - "sources": "https://github.com/TeamMidnightDust/MidnightControls.git", + "homepage": "https://modrinth.com/mod/midnightcontrols", + "sources": "https://github.com/TeamMidnightDust/MidnightControls", "issues": "https://github.com/TeamMidnightDust/MidnightControls/issues" }, "license": "MIT", @@ -37,17 +37,16 @@ "fabric": ">=0.36.0", "minecraft": ">=1.17", "spruceui": ">=3.2.0", - "java": ">=16" + "java": ">=17" }, "recommends": { "modmenu": ">=1.12.2" }, "suggests": { - "flamingo": "*" + "quilt_loader": "*" }, "breaks": { "lambdacontrols": "*", - "modmenu": "<1.12.2", - "optifabric": "*" + "modmenu": "<1.12.2" } } diff --git a/src/main/resources/midnightcontrols_compat.mixins.json b/src/main/resources/midnightcontrols_compat.mixins.json index a41c333..040f2dc 100644 --- a/src/main/resources/midnightcontrols_compat.mixins.json +++ b/src/main/resources/midnightcontrols_compat.mixins.json @@ -1,6 +1,6 @@ { "required": true, - "package": "dev.lambdaurora.midnightcontrols.client.compat.mixin", + "package": "eu.midnightdust.midnightcontrols.client.compat.mixin", "plugin": "eu.midnightdust.midnightcontrols.client.compat.MidnightControlsMixinPlugin", "compatibilityLevel": "JAVA_16", "client": [