diff --git a/CHANGES.md b/CHANGES.md index c5359db..02cf311 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,3 @@ changes: -- fix icon not properly refreshing on kde plasma and gnome -- fix GNOME not having an app icon ([#3](https://github.com/not-coded/WayFix/issues/3)) \ No newline at end of file +- fix auto gui scaling looking broken with weird window sizes +- **add support for forge & neoforge!!!!** \ No newline at end of file diff --git a/README.md b/README.md index 907437d..c3a7afb 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ # WayFix -[![Supports minecraft versions from 1.16](https://notcoded.needs.rest/r/badge_minecraft_1.16plus.svg)](https://minecraft.net) [![Cloth Config API](https://raw.githubusercontent.com/intergrav/devins-badges/v3/assets/cozy/requires/cloth-config-api_vector.svg)](https://www.modrinth.com/mod/cloth-config) ![Won't support forge](https://raw.githubusercontent.com/intergrav/devins-badges/v3/assets/cozy/unsupported/forge_vector.svg) +[![Supports minecraft versions from 1.16](https://notcoded.needs.rest/r/badge_minecraft_1.16plus.svg)](https://minecraft.net) [![Cloth Config API](https://raw.githubusercontent.com/intergrav/devins-badges/v3/assets/cozy/requires/cloth-config-api_vector.svg)](https://www.modrinth.com/mod/cloth-config) Fixes multiple issues regarding Wayland compatibility for Minecraft. @@ -17,7 +17,7 @@ Fixes multiple issues regarding Wayland compatibility for Minecraft. ## Features - Auto Scale GUI - - Auto-scales the GUI scale depending on your display's scaling. ***[may look weird when windowed]*** (e.g. 2 GUI Scale on 1920x1080 at 100% -> 4 GUI Scale on 3840x2160 at 200%) + - Auto-scales the GUI scale depending on your display's scaling. (e.g. 2 GUI Scale on 1920x1080 at 100% → 4 GUI Scale on 3840x2160 at 200%) - Inject Minecraft Icon at Startup - Injects the Minecraft Icon at Startup instead of defaulting to the normal Wayland icon. @@ -26,10 +26,13 @@ Fixes multiple issues regarding Wayland compatibility for Minecraft. - Fixes issues where keyboard combinations like 'CTRL + A' or 'CTRL + C' are sent as characters in chat instead of being recognized as key combinations. - **Fullscreen** - - Specify Monitor *(looks different in-game)* ***(by default Minecraft sometimes full-screens on the wrong monitor due to Wayland window limitations)*** - - Specify which monitor you want to fullscreen Minecraft to. (primary monitor by default) (must turn on in seperate config option) + - Select Monitor + - Select which monitor you want to fullscreen Minecraft to. (primary monitor by default) (must turn on in seperate config option) + +> [!NOTE] +> By default Minecraft sometimes full-screens on the wrong monitor due to Wayland window limitations (unable to get X and Y position). ## Building - Clone the repository - `git clone https://github.com/not-coded/WayFix` -- Run `./gradlew chiseledBuild` +- Run `./gradlew chiseledBuild` \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 7b52281..d596e47 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,29 +1,33 @@ plugins { - id("fabric-loom") version "1.8-SNAPSHOT" + id("dev.architectury.loom") + id("architectury-plugin") id("com.modrinth.minotaur") version "2.+" } -val modName = property("mod.name").toString() -version = "${property("mod.version")}" + "+" + "${property("mod.version_name")}" -group = property("mod.maven_group").toString() - +val minecraft = stonecutter.current.version +version = "${mod.version}+${mod.version_name}-common" base { - archivesName.set(modName) + archivesName.set(mod.name) } +architectury.common(stonecutter.tree.branches.mapNotNull { + if (stonecutter.current.project !in it) null + else it.prop("loom.platform") +}) + repositories { maven("https://maven.shedaniel.me/") maven("https://maven.terraformersmc.com/releases/") } dependencies { - minecraft("com.mojang:minecraft:${property("deps.minecraft")}") - mappings("net.fabricmc:yarn:${property("deps.yarn_mappings")}:v2") - modImplementation("net.fabricmc:fabric-loader:${property("deps.fabric_loader")}") + minecraft("com.mojang:minecraft:$minecraft") + mappings("net.fabricmc:yarn:${mod.dep("yarn_mappings")}:v2") + modImplementation("net.fabricmc:fabric-loader:${mod.dep("fabric_loader")}") - modImplementation("me.shedaniel.cloth:cloth-config-fabric:${property("deps.cloth_config_version")}") - modImplementation("com.terraformersmc:modmenu:${property("deps.mod_menu_version")}") + modImplementation("me.shedaniel.cloth:cloth-config-fabric:${mod.dep("cloth_config_version")}") + modImplementation("com.terraformersmc:modmenu:${mod.dep("mod_menu_version")}") implementation("org.lwjgl:lwjgl-glfw:3.3.2") } @@ -34,44 +38,20 @@ loom { options.put("mark-corresponding-synthetics", "1") } } - - runConfigs.all { - ideConfigGenerated(true) - vmArgs("-Dmixin.debug.export=true") - runDir = "../../run" - } -} - -val target = ">=${property("mod.min_target")}- <=${property("mod.max_target")}" - -tasks.processResources { - val expandProps = mapOf( - "version" to project.version, - "minecraftVersion" to target, - "javaVersion" to project.property("deps.java") - ) - - filesMatching("fabric.mod.json") { - expand(expandProps) - } - - inputs.properties(expandProps) } java { withSourcesJar() - val javaVersion = if (project.property("deps.java") == "9") JavaVersion.VERSION_1_9 else JavaVersion.VERSION_17 + val javaVersion = if (mod.dep("java") == "9") JavaVersion.VERSION_1_9 else JavaVersion.VERSION_17 sourceCompatibility = javaVersion targetCompatibility = javaVersion } -tasks.register("buildAndCollect") { - group = "build" - from(tasks.remapJar.get().archiveFile) - into(rootProject.layout.buildDirectory.file("libs")) - dependsOn("build") +tasks.build { + group = "versioned" + description = "Must run through 'chiseledBuild'" } @@ -92,5 +72,5 @@ modrinth { } val changes = rootProject.file("CHANGES.md").readText() - changelog = if (project.property("deps.java") == "9") "# Requires Java 9+\n\n$changes" else changes + changelog = if (mod.dep("java") == "9") "# Requires Java 9+\n\n$changes" else changes } \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..2eb9130 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + `kotlin-dsl` + kotlin("jvm") version "1.9.24" +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/build-extensions.kt b/buildSrc/src/main/kotlin/build-extensions.kt new file mode 100644 index 0000000..a4e29c9 --- /dev/null +++ b/buildSrc/src/main/kotlin/build-extensions.kt @@ -0,0 +1,32 @@ +import org.gradle.api.Project +import org.gradle.api.artifacts.dsl.RepositoryHandler +import org.gradle.kotlin.dsl.maven +import org.gradle.language.jvm.tasks.ProcessResources + +val Project.mod: ModData get() = ModData(this) +fun Project.prop(key: String): String? = findProperty(key)?.toString() +fun String.upperCaseFirst() = replaceFirstChar { if (it.isLowerCase()) it.uppercaseChar() else it } + +fun RepositoryHandler.strictMaven(url: String, alias: String, vararg groups: String) = exclusiveContent { + forRepository { maven(url) { name = alias } } + filter { groups.forEach(::includeGroup) } +} + +fun ProcessResources.properties(files: Iterable, vararg properties: Pair) { + for ((name, value) in properties) inputs.property(name, value) + filesMatching(files) { + expand(properties.toMap()) + } +} + +@JvmInline +value class ModData(private val project: Project) { + val id: String get() = requireNotNull(project.prop("mod.id")) { "Missing 'mod.id'" } + val name: String get() = requireNotNull(project.prop("mod.name")) { "Missing 'mod.name'" } + val version: String get() = requireNotNull(project.prop("mod.version")) { "Missing 'mod.version'" } + val version_name: String get() = requireNotNull(project.prop("mod.version_name")) { "Missing 'mod.version_name'" } + val maven_group: String get() = requireNotNull(project.prop("mod.maven_group")) { "Missing 'mod.maven_group'" } + + fun prop(key: String) = requireNotNull(project.prop("mod.$key")) { "Missing 'mod.$key'" } + fun dep(key: String) = requireNotNull(project.prop("deps.$key")) { "Missing 'deps.$key'" } +} \ No newline at end of file diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 0000000..5c24fd4 --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,127 @@ +@file:Suppress("UnstableApiUsage") + +plugins { + id("dev.architectury.loom") + id("architectury-plugin") + id("com.github.johnrengelman.shadow") +} + +val loader = prop("loom.platform")!! +val minecraft = stonecutter.current.version +val common: Project = requireNotNull(stonecutter.node.sibling("")) { + "No common project for $project" +} + +version = "${common.mod.version}+${common.mod.version_name}-${loader}" + +base { + archivesName.set(common.mod.name) +} + +repositories { + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/releases/") +} + +architectury { + platformSetupLoomIde() + fabric() +} + +val commonBundle: Configuration by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + +val shadowBundle: Configuration by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + +configurations { + compileClasspath.get().extendsFrom(commonBundle) + runtimeClasspath.get().extendsFrom(commonBundle) + get("developmentFabric").extendsFrom(commonBundle) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraft") + mappings("net.fabricmc:yarn:${common.mod.dep("yarn_mappings")}:v2") + modImplementation("net.fabricmc:fabric-loader:${common.mod.dep("fabric_loader")}") + + modImplementation("me.shedaniel.cloth:cloth-config-fabric:${common.mod.dep("cloth_config_version")}") + modImplementation("com.terraformersmc:modmenu:${common.mod.dep("mod_menu_version")}") + + implementation("org.lwjgl:lwjgl-glfw:3.3.2") + + commonBundle(project(common.path, "namedElements")) { isTransitive = false } + shadowBundle(project(common.path, "transformProductionFabric")) { isTransitive = false } +} + +loom { + decompilers { + get("vineflower").apply { // Adds names to lambdas - useful for mixins + options.put("mark-corresponding-synthetics", "1") + } + } + + runConfigs.all { + isIdeConfigGenerated = true + runDir = "../../../run" + vmArgs("-Dmixin.debug.export=true") + } +} + +val target = ">=${common.property("mod.min_target")}- <=${common.property("mod.max_target")}" + +tasks.processResources { + val expandProps = mapOf( + "version" to version, + "minecraftVersion" to target, + "javaVersion" to common.mod.dep("java") + ) + + filesMatching("fabric.mod.json") { + expand(expandProps) + } + + inputs.properties(expandProps) +} + +tasks.shadowJar { + configurations = listOf(shadowBundle) + archiveClassifier = "dev-shadow" +} + +tasks.remapJar { + injectAccessWidener = true + input = tasks.shadowJar.get().archiveFile + archiveClassifier = null + dependsOn(tasks.shadowJar) +} + +tasks.jar { + archiveClassifier = "dev" +} + +java { + withSourcesJar() + + val javaVersion = if (common.property("deps.java") == "9") JavaVersion.VERSION_1_9 else JavaVersion.VERSION_17 + + sourceCompatibility = javaVersion + targetCompatibility = javaVersion +} + +tasks.build { + group = "versioned" + description = "Must run through 'chiseledBuild'" +} + +tasks.register("buildAndCollect") { + group = "versioned" + description = "Must run through 'chiseledBuild'" + from(tasks.remapJar.get().archiveFile, tasks.remapSourcesJar.get().archiveFile) + into(rootProject.layout.buildDirectory.file("libs/${mod.version}/$loader")) + dependsOn("build") +} \ No newline at end of file diff --git a/fabric/gradle.properties b/fabric/gradle.properties new file mode 100644 index 0000000..90ee7a2 --- /dev/null +++ b/fabric/gradle.properties @@ -0,0 +1 @@ +loom.platform=fabric \ No newline at end of file diff --git a/fabric/src/main/java/net/notcoded/wayfix/fabric/WayFixFabric.java b/fabric/src/main/java/net/notcoded/wayfix/fabric/WayFixFabric.java new file mode 100644 index 0000000..e85c356 --- /dev/null +++ b/fabric/src/main/java/net/notcoded/wayfix/fabric/WayFixFabric.java @@ -0,0 +1,11 @@ +package net.notcoded.wayfix.fabric; + +import net.fabricmc.api.ClientModInitializer; +import net.notcoded.wayfix.common.WayFix; + +public class WayFixFabric implements ClientModInitializer { + @Override + public void onInitializeClient() { + WayFix.init(); + } +} diff --git a/fabric/src/main/java/net/notcoded/wayfix/fabric/config/ModMenuIntegration.java b/fabric/src/main/java/net/notcoded/wayfix/fabric/config/ModMenuIntegration.java new file mode 100644 index 0000000..32daa1a --- /dev/null +++ b/fabric/src/main/java/net/notcoded/wayfix/fabric/config/ModMenuIntegration.java @@ -0,0 +1,13 @@ +package net.notcoded.wayfix.fabric.config; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; +import net.notcoded.wayfix.common.config.ModConfig; +import me.shedaniel.autoconfig.AutoConfig; + +public class ModMenuIntegration implements ModMenuApi { + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return parent -> AutoConfig.getConfigScreen(ModConfig.class, parent).get(); + } +} diff --git a/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json similarity index 84% rename from src/main/resources/fabric.mod.json rename to fabric/src/main/resources/fabric.mod.json index 6599de5..7de1f90 100644 --- a/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,14 +20,14 @@ "environment": "client", "entrypoints": { "client": [ - "net.notcoded.wayfix.WayFix" + "net.notcoded.wayfix.fabric.WayFixFabric" ], "modmenu": [ - "net.notcoded.wayfix.config.ModMenuIntegration" + "net.notcoded.wayfix.fabric.config.ModMenuIntegration" ] }, "mixins": [ - "wayfix.mixins.json" + "wayfix-common.mixins.json" ], "depends": { diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts new file mode 100644 index 0000000..f761411 --- /dev/null +++ b/forge/build.gradle.kts @@ -0,0 +1,131 @@ +@file:Suppress("UnstableApiUsage") + +plugins { + id("dev.architectury.loom") + id("architectury-plugin") + id("com.github.johnrengelman.shadow") +} + +val loader = prop("loom.platform")!! +val minecraft = stonecutter.current.version +val common: Project = requireNotNull(stonecutter.node.sibling("")) { + "No common project for $project" +} + +version = "${common.mod.version}+${common.mod.version_name}-${loader}" + +base { + archivesName.set(common.mod.name) +} + +repositories { + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/releases/") +} + +architectury { + platformSetupLoomIde() + forge() +} + +val commonBundle: Configuration by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + +val shadowBundle: Configuration by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + +configurations { + compileClasspath.get().extendsFrom(commonBundle) + runtimeClasspath.get().extendsFrom(commonBundle) + get("developmentForge").extendsFrom(commonBundle) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraft") + mappings("net.fabricmc:yarn:${common.mod.dep("yarn_mappings")}:v2") + "forge"("net.minecraftforge:forge:$minecraft-${common.mod.dep("forge_loader")}") + modImplementation("me.shedaniel.cloth:cloth-config-forge:${common.mod.dep("cloth_config_version")}") + + implementation("org.lwjgl:lwjgl-glfw:3.3.2") + + commonBundle(project(common.path, "namedElements")) { isTransitive = false } + shadowBundle(project(common.path, "transformProductionForge")) { isTransitive = false } +} + +loom { + decompilers { + get("vineflower").apply { // Adds names to lambdas - useful for mixins + options.put("mark-corresponding-synthetics", "1") + } + } + + forge.mixinConfigs( + "wayfix-forge.mixins.json", + "wayfix-common.mixins.json" + ) + + runConfigs.all { + isIdeConfigGenerated = true + runDir = "../../../run" + vmArgs("-Dmixin.debug.export=true") + } +} + +val target = ">=${common.property("mod.min_target")}- <=${common.property("mod.max_target")}" + +tasks.processResources { + val expandProps = mapOf( + "version" to version, + "minecraftVersion" to target, + "javaVersion" to common.mod.dep("java") + ) + + filesMatching("META-INF/mods.toml") { + expand(expandProps) + } + + inputs.properties(expandProps) +} + +tasks.shadowJar { + configurations = listOf(shadowBundle) + archiveClassifier = "dev-shadow" + exclude("fabric.mod.json", "assets/wayfix/icon.png") +} + +tasks.remapJar { + injectAccessWidener = true + input = tasks.shadowJar.get().archiveFile + archiveClassifier = null + dependsOn(tasks.shadowJar) +} + +tasks.jar { + archiveClassifier = "dev" +} + +java { + withSourcesJar() + + val javaVersion = if (common.property("deps.java") == "9") JavaVersion.VERSION_1_9 else JavaVersion.VERSION_17 + + sourceCompatibility = javaVersion + targetCompatibility = javaVersion +} + +tasks.build { + group = "versioned" + description = "Must run through 'chiseledBuild'" +} + +tasks.register("buildAndCollect") { + group = "versioned" + description = "Must run through 'chiseledBuild'" + from(tasks.remapJar.get().archiveFile, tasks.remapSourcesJar.get().archiveFile) + into(rootProject.layout.buildDirectory.file("libs/${mod.version}/$loader")) + dependsOn("build") +} \ No newline at end of file diff --git a/forge/gradle.properties b/forge/gradle.properties new file mode 100644 index 0000000..32f842a --- /dev/null +++ b/forge/gradle.properties @@ -0,0 +1 @@ +loom.platform=forge \ No newline at end of file diff --git a/forge/src/main/java/net/notcoded/wayfix/forge/WayFixForge.java b/forge/src/main/java/net/notcoded/wayfix/forge/WayFixForge.java new file mode 100644 index 0000000..3da3c8c --- /dev/null +++ b/forge/src/main/java/net/notcoded/wayfix/forge/WayFixForge.java @@ -0,0 +1,35 @@ +package net.notcoded.wayfix.forge; + +import me.shedaniel.autoconfig.AutoConfig; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +//? if >=1.19 { +import net.minecraftforge.client.ConfigScreenHandler; +//?} elif <1.19 { +/*import net.minecraftforge.fml.ExtensionPoint; + *///?} +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.common.Mod; +import net.notcoded.wayfix.common.config.ModConfig; + +@Mod(value = "wayfix") +@OnlyIn(Dist.CLIENT) +public class WayFixForge { + public WayFixForge() { + DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> WayFixForge::setupConfigScreen); + } + + private static void setupConfigScreen() { + //? if >=1.19 { + ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> + new ConfigScreenHandler.ConfigScreenFactory( + (client, parent) -> AutoConfig.getConfigScreen(ModConfig.class, parent).get() + ) + ); + //?} elif <1.19 { + /*ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> + (client, parent) -> AutoConfig.getConfigScreen(ModConfig.class, parent).get() + );*///?} + } +} diff --git a/forge/src/main/java/net/notcoded/wayfix/forge/mixin/MinecraftClientMixin.java b/forge/src/main/java/net/notcoded/wayfix/forge/mixin/MinecraftClientMixin.java new file mode 100644 index 0000000..0872704 --- /dev/null +++ b/forge/src/main/java/net/notcoded/wayfix/forge/mixin/MinecraftClientMixin.java @@ -0,0 +1,17 @@ +package net.notcoded.wayfix.forge.mixin; + +import net.minecraft.client.MinecraftClient; +import net.notcoded.wayfix.common.WayFix; +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(MinecraftClient.class) +public abstract class MinecraftClientMixin { + // there's probably a better way to do this, but atm I don't care + @Inject(method = "", at = @At("HEAD")) + private static void initConfig(CallbackInfo ci) { + WayFix.init(); + } +} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..1ddc532 --- /dev/null +++ b/forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,40 @@ +modLoader = "javafml" +loaderVersion = "*" +issueTrackerURL = "https://github.com/not-coded/WayFix/issues" +license = "LGPL-2.1" + +[[mods]] +modId = "wayfix" +version = "${version}" +displayName = "WayFix" +authors = "NotCoded" +description = "Fixes multiple issues regarding Wayland compatibility for Minecraft." +logoFile = "icon.png" +logoBlur = false + +[["dependencies.wayfix"]] +modId = "minecraft" +type = "required" +versionRange = "${minecraftVersion}" +ordering = "NONE" +side = "CLIENT" + +[["dependencies.wayfix"]] +modId = "java" +type = "required" +versionRange = "${javaVersion}" +ordering = "NONE" +side = "CLIENT" + +[["dependencies.wayfix"]] +modId = "cloth-config" +type = "required" +versionRange = ">=4.9.0" +ordering = "NONE" +side = "CLIENT" + +[[mixins]] +config = "wayfix-common.mixins.json" + +[[mixins]] +config = "wayfix-forge.mixins.json" \ No newline at end of file diff --git a/forge/src/main/resources/icon.png b/forge/src/main/resources/icon.png new file mode 100644 index 0000000..83f7a39 Binary files /dev/null and b/forge/src/main/resources/icon.png differ diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..29358bb --- /dev/null +++ b/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "WayFix: Fixes multiple issues regarding Wayland compatibility for Minecraft.", + "forge:server_data_pack_format": 15, + "pack_format": 15 + } +} \ No newline at end of file diff --git a/forge/src/main/resources/wayfix-forge.mixins.json b/forge/src/main/resources/wayfix-forge.mixins.json new file mode 100644 index 0000000..7bca50f --- /dev/null +++ b/forge/src/main/resources/wayfix-forge.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.notcoded.wayfix.forge.mixin", + "compatibilityLevel": "JAVA_8", + "client": [ + "MinecraftClientMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ecb9228..cdc7f28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,11 @@ # Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx1G -org.gradle.parallel=true +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +#org.gradle.parallel=true +org.gradle.caching=true +org.gradle.caching.debug=false # Mod Information -mod.version=1.0.2 +mod.version=1.0.3 mod.name=wayfix mod.maven_group=net.notcoded @@ -19,6 +21,9 @@ publishing.supported_versions=[VERSIONED] deps.yarn=[VERSIONED] deps.fabric_loader=0.14.20 deps.cloth_config_version=[VERSIONED] +deps.neoforge_loader=[VERSIONED] +deps.neoforge_patch=[VERSIONED] +deps.forge_loader=[VERSIONED] deps.mod_menu_version=[VERSIONED] deps.fabric_api=[VERSIONED] deps.java=[VERSIONED] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar old mode 100755 new mode 100644 index 7454180..a4b76b9 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5e7606e..ccc1a9b 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Tue May 07 15:32:39 CEST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/gradlew b/gradlew index c53aefa..f5feea6 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -32,10 +34,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +82,12 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +134,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +217,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat old mode 100755 new mode 100644 index 107acd3..9b42019 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,94 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 0000000..7094a7e --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,128 @@ +@file:Suppress("UnstableApiUsage") + +plugins { + id("dev.architectury.loom") + id("architectury-plugin") + id("com.github.johnrengelman.shadow") +} + +val loader = prop("loom.platform")!! +val minecraft = stonecutter.current.version +val common: Project = requireNotNull(stonecutter.node.sibling("")) { + "No common project for $project" +} + +version = "${common.mod.version}+${common.mod.version_name}-${loader}" + +base { + archivesName.set(common.mod.name) +} + +repositories { + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/releases/") + maven("https://maven.neoforged.net/releases/") +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +val commonBundle: Configuration by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + +val shadowBundle: Configuration by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + +configurations { + compileClasspath.get().extendsFrom(commonBundle) + runtimeClasspath.get().extendsFrom(commonBundle) + get("developmentNeoForge").extendsFrom(commonBundle) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraft") + //mappings("dev.architectury:yarn-mappings-patch-neoforge:${common.mod.dep("neoforge_patch")}") + mappings("net.fabricmc:yarn:${common.mod.dep("yarn_mappings")}:v2") + "neoForge"("net.neoforged:neoforge:${common.mod.dep("neoforge_loader")}") + modImplementation("me.shedaniel.cloth:cloth-config-neoforge:${common.mod.dep("cloth_config_version")}") + + implementation("org.lwjgl:lwjgl-glfw:3.3.2") + + commonBundle(project(common.path, "namedElements")) { isTransitive = false } + shadowBundle(project(common.path, "transformProductionNeoForge")) { isTransitive = false } +} + +loom { + decompilers { + get("vineflower").apply { // Adds names to lambdas - useful for mixins + options.put("mark-corresponding-synthetics", "1") + } + } + + runConfigs.all { + isIdeConfigGenerated = true + runDir = "../../../run" + vmArgs("-Dmixin.debug.export=true") + } +} + +val target = ">=${common.property("mod.min_target")}- <=${common.property("mod.max_target")}" + +tasks.processResources { + val expandProps = mapOf( + "version" to version, + "minecraftVersion" to target, + "javaVersion" to common.mod.dep("java") + ) + + filesMatching("META-INF/neoforge.mods.toml") { + expand(expandProps) + } + + inputs.properties(expandProps) +} + +tasks.shadowJar { + configurations = listOf(shadowBundle) + archiveClassifier = "dev-shadow" + exclude("fabric.mod.json") +} + +tasks.remapJar { + injectAccessWidener = true + input = tasks.shadowJar.get().archiveFile + archiveClassifier = null + dependsOn(tasks.shadowJar) +} + +tasks.jar { + archiveClassifier = "dev" +} + +java { + withSourcesJar() + + val javaVersion = if (common.property("deps.java") == "9") JavaVersion.VERSION_1_9 else JavaVersion.VERSION_17 + + sourceCompatibility = javaVersion + targetCompatibility = javaVersion +} + +tasks.build { + group = "versioned" + description = "Must run through 'chiseledBuild'" +} + +tasks.register("buildAndCollect") { + group = "versioned" + description = "Must run through 'chiseledBuild'" + from(tasks.remapJar.get().archiveFile, tasks.remapSourcesJar.get().archiveFile) + into(rootProject.layout.buildDirectory.file("libs/${mod.version}/$loader")) + dependsOn("build") +} \ No newline at end of file diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 0000000..2914393 --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge \ No newline at end of file diff --git a/neoforge/src/main/java/net/notcoded/wayfix/forge/WayFixNeoForge.java b/neoforge/src/main/java/net/notcoded/wayfix/forge/WayFixNeoForge.java new file mode 100644 index 0000000..10bdcf8 --- /dev/null +++ b/neoforge/src/main/java/net/notcoded/wayfix/forge/WayFixNeoForge.java @@ -0,0 +1,32 @@ +package net.notcoded.wayfix.forge; + +import me.shedaniel.autoconfig.AutoConfig; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext; +import net.neoforged.neoforge.client.ConfigScreenHandler; +import net.notcoded.wayfix.common.config.ModConfig; + +@Mod(value = "wayfix") +@OnlyIn(Dist.CLIENT) +public class WayFixNeoForge { + public WayFixNeoForge() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addListener(WayFixNeoForge::onClientSetup); + } + + private static void onClientSetup(final FMLClientSetupEvent event) { + // TODO: add config support for >1.20.6 (IConfigScreenFactory) + event.enqueueWork(() -> { + ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> + new ConfigScreenHandler.ConfigScreenFactory( + (client, parent) -> AutoConfig.getConfigScreen(ModConfig.class, parent).get() + ) + ); + }); + } +} diff --git a/neoforge/src/main/java/net/notcoded/wayfix/forge/mixin/MinecraftClientMixin.java b/neoforge/src/main/java/net/notcoded/wayfix/forge/mixin/MinecraftClientMixin.java new file mode 100644 index 0000000..0872704 --- /dev/null +++ b/neoforge/src/main/java/net/notcoded/wayfix/forge/mixin/MinecraftClientMixin.java @@ -0,0 +1,17 @@ +package net.notcoded.wayfix.forge.mixin; + +import net.minecraft.client.MinecraftClient; +import net.notcoded.wayfix.common.WayFix; +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(MinecraftClient.class) +public abstract class MinecraftClientMixin { + // there's probably a better way to do this, but atm I don't care + @Inject(method = "", at = @At("HEAD")) + private static void initConfig(CallbackInfo ci) { + WayFix.init(); + } +} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..17a307f --- /dev/null +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,40 @@ +modLoader = "javafml" +loaderVersion = "*" +issueTrackerURL = "https://github.com/not-coded/WayFix/issues" +license = "LGPL-2.1" + +[[mods]] +modId = "wayfix" +version = "${version}" +displayName = "WayFix" +authors = "NotCoded" +description = "Fixes multiple issues regarding Wayland compatibility for Minecraft." +logoFile = "assets/wayfix/icon.png" +logoBlur = false + +[["dependencies.wayfix"]] +modId = "minecraft" +type = "required" +versionRange = "${minecraftVersion}" +ordering = "NONE" +side = "CLIENT" + +[["dependencies.wayfix"]] +modId = "java" +type = "required" +versionRange = "${javaVersion}" +ordering = "NONE" +side = "CLIENT" + +[["dependencies.wayfix"]] +modId = "cloth-config" +type = "required" +versionRange = ">=4.9.0" +ordering = "NONE" +side = "CLIENT" + +[[mixins]] +config = "wayfix-common.mixins.json" + +[[mixins]] +config = "wayfix-neoforge.mixins.json" \ No newline at end of file diff --git a/neoforge/src/main/resources/icon.png b/neoforge/src/main/resources/icon.png new file mode 100644 index 0000000..83f7a39 Binary files /dev/null and b/neoforge/src/main/resources/icon.png differ diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..29358bb --- /dev/null +++ b/neoforge/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "WayFix: Fixes multiple issues regarding Wayland compatibility for Minecraft.", + "forge:server_data_pack_format": 15, + "pack_format": 15 + } +} \ No newline at end of file diff --git a/neoforge/src/main/resources/wayfix-neoforge.mixins.json b/neoforge/src/main/resources/wayfix-neoforge.mixins.json new file mode 100644 index 0000000..7bca50f --- /dev/null +++ b/neoforge/src/main/resources/wayfix-neoforge.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.notcoded.wayfix.forge.mixin", + "compatibilityLevel": "JAVA_8", + "client": [ + "MinecraftClientMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 08149d2..5327be7 100755 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,8 +1,11 @@ pluginManagement { repositories { - maven("https://maven.fabricmc.net/") - + mavenCentral() gradlePluginPortal() + maven("https://maven.fabricmc.net/") + maven("https://maven.architectury.dev") + maven("https://maven.minecraftforge.net") + maven("https://maven.neoforged.net/releases/") maven("https://maven.kikugie.dev/snapshots") } } @@ -12,15 +15,18 @@ plugins { } stonecutter { - kotlinController = true centralScript = "build.gradle.kts" + kotlinController = true - shared { - versions("1.16.5", "1.19", "1.19.3", "1.20.6") - vcsVersion = "1.19.3" - } + create(rootProject) { + versions("1.16.5", "1.19", "1.19.3", "1.20.2") - create(rootProject) + branch("fabric") + branch("forge") + branch("neoforge") { versions("1.20.2") } + + vcsVersion = "1.20.2" + } } rootProject.name = "WayFix" \ No newline at end of file diff --git a/src/main/java/net/notcoded/wayfix/WayFix.java b/src/main/java/net/notcoded/wayfix/common/WayFix.java similarity index 83% rename from src/main/java/net/notcoded/wayfix/WayFix.java rename to src/main/java/net/notcoded/wayfix/common/WayFix.java index ef5549b..763c164 100644 --- a/src/main/java/net/notcoded/wayfix/WayFix.java +++ b/src/main/java/net/notcoded/wayfix/common/WayFix.java @@ -1,19 +1,17 @@ -package net.notcoded.wayfix; +package net.notcoded.wayfix.common; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; -import net.fabricmc.api.ClientModInitializer; -import net.notcoded.wayfix.config.ModConfig; +import net.notcoded.wayfix.common.config.ModConfig; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.glfw.GLFW; -public class WayFix implements ClientModInitializer { +public class WayFix { public static final Logger LOGGER = LogManager.getLogger(WayFix.class); public static ModConfig config; - @Override - public void onInitializeClient() { + public static void init() { AutoConfig.register(ModConfig.class, GsonConfigSerializer::new); WayFix.config = AutoConfig.getConfigHolder(ModConfig.class).getConfig(); } diff --git a/src/main/java/net/notcoded/wayfix/config/ModConfig.java b/src/main/java/net/notcoded/wayfix/common/config/ModConfig.java similarity index 96% rename from src/main/java/net/notcoded/wayfix/config/ModConfig.java rename to src/main/java/net/notcoded/wayfix/common/config/ModConfig.java index 20ef9a8..7300b18 100644 --- a/src/main/java/net/notcoded/wayfix/config/ModConfig.java +++ b/src/main/java/net/notcoded/wayfix/common/config/ModConfig.java @@ -1,11 +1,11 @@ -package net.notcoded.wayfix.config; +package net.notcoded.wayfix.common.config; import me.shedaniel.autoconfig.ConfigData; import me.shedaniel.autoconfig.annotation.Config; import me.shedaniel.autoconfig.annotation.ConfigEntry.Gui.*; import net.minecraft.client.util.Monitor; import net.minecraft.client.util.VideoMode; -import net.notcoded.wayfix.WayFix; +import net.notcoded.wayfix.common.WayFix; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; diff --git a/src/main/java/net/notcoded/wayfix/config/ModMenuIntegration.java b/src/main/java/net/notcoded/wayfix/common/config/ModMenuIntegration.java similarity index 89% rename from src/main/java/net/notcoded/wayfix/config/ModMenuIntegration.java rename to src/main/java/net/notcoded/wayfix/common/config/ModMenuIntegration.java index e2c37c2..13cf105 100644 --- a/src/main/java/net/notcoded/wayfix/config/ModMenuIntegration.java +++ b/src/main/java/net/notcoded/wayfix/common/config/ModMenuIntegration.java @@ -1,4 +1,4 @@ -package net.notcoded.wayfix.config; +package net.notcoded.wayfix.common.config; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; diff --git a/src/main/java/net/notcoded/wayfix/mixin/GLXMixin.java b/src/main/java/net/notcoded/wayfix/common/mixin/GLXMixin.java similarity index 87% rename from src/main/java/net/notcoded/wayfix/mixin/GLXMixin.java rename to src/main/java/net/notcoded/wayfix/common/mixin/GLXMixin.java index e867ad9..b7a1d77 100644 --- a/src/main/java/net/notcoded/wayfix/mixin/GLXMixin.java +++ b/src/main/java/net/notcoded/wayfix/common/mixin/GLXMixin.java @@ -1,4 +1,4 @@ -package net.notcoded.wayfix.mixin; +package net.notcoded.wayfix.common.mixin; import com.mojang.blaze3d.platform.GLX; import org.lwjgl.glfw.GLFW; @@ -9,7 +9,7 @@ import java.util.function.LongSupplier; -import static net.notcoded.wayfix.WayFix.supportsWayland; +import static net.notcoded.wayfix.common.WayFix.supportsWayland; /* - Credits to moehreag diff --git a/src/main/java/net/notcoded/wayfix/mixin/MinecraftClientMixin.java b/src/main/java/net/notcoded/wayfix/common/mixin/MinecraftClientMixin.java similarity index 65% rename from src/main/java/net/notcoded/wayfix/mixin/MinecraftClientMixin.java rename to src/main/java/net/notcoded/wayfix/common/mixin/MinecraftClientMixin.java index 4239b8c..de24cf9 100644 --- a/src/main/java/net/notcoded/wayfix/mixin/MinecraftClientMixin.java +++ b/src/main/java/net/notcoded/wayfix/common/mixin/MinecraftClientMixin.java @@ -1,9 +1,9 @@ -package net.notcoded.wayfix.mixin; +package net.notcoded.wayfix.common.mixin; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.GameOptions; import net.minecraft.client.util.Window; -import net.notcoded.wayfix.WayFix; +import net.notcoded.wayfix.common.WayFix; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -14,10 +14,14 @@ @Mixin(MinecraftClient.class) public abstract class MinecraftClientMixin { + // broken in forge @Shadow @Final private Window window; @Shadow @Final public GameOptions options; + // broken in forge + @Shadow public abstract boolean forcesUnicodeFont(); + @ModifyArg(method = "onResolutionChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/Window;setScaleFactor(D)V")) private double fixHiDPIScaling(double d) { int guiScale; @@ -27,14 +31,19 @@ private double fixHiDPIScaling(double d) { /*guiScale = this.options.guiScale; *///?} + // "Auto" or Gui Scale 0 already auto-scales it - return guiScale != 0 && WayFix.config.autoScaleGUI ? d * getScaleFactor() : d; + + // this.forcesUnicodeFont() doesn't work on forge & neoforge + // TODO: this.options.getForceUnicodeFont().getValue(); + + return guiScale != 0 && WayFix.config.autoScaleGUI ? window.calculateScaleFactor(Math.round(guiScale * wayFix$getScaleFactor()), this.forcesUnicodeFont()) : d; } @Unique - private float getScaleFactor() { + private float wayFix$getScaleFactor() { float[] pos = new float[1]; - GLFW.glfwGetWindowContentScale(this.window.getHandle(), pos, pos); + GLFW.glfwGetWindowContentScale(this.window.getHandle(), pos, pos); return pos[0]; // using x or y doesn't matter } diff --git a/src/main/java/net/notcoded/wayfix/mixin/MonitorTrackerMixin.java b/src/main/java/net/notcoded/wayfix/common/mixin/MonitorTrackerMixin.java similarity index 82% rename from src/main/java/net/notcoded/wayfix/mixin/MonitorTrackerMixin.java rename to src/main/java/net/notcoded/wayfix/common/mixin/MonitorTrackerMixin.java index 128bc09..d822bd9 100644 --- a/src/main/java/net/notcoded/wayfix/mixin/MonitorTrackerMixin.java +++ b/src/main/java/net/notcoded/wayfix/common/mixin/MonitorTrackerMixin.java @@ -1,10 +1,10 @@ -package net.notcoded.wayfix.mixin; +package net.notcoded.wayfix.common.mixin; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import net.minecraft.client.util.Monitor; import net.minecraft.client.util.MonitorTracker; -import net.notcoded.wayfix.WayFix; -import net.notcoded.wayfix.config.ModConfig; +import net.notcoded.wayfix.common.WayFix; +import net.notcoded.wayfix.common.config.ModConfig; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,11 +21,11 @@ public class MonitorTrackerMixin { @Inject(method = {"handleMonitorEvent", ""}, at = @At("TAIL")) private void handleConfigAdditions(CallbackInfo ci) { - this.refreshMonitors(); + this.wayFix$refreshMonitors(); } @Unique - private void refreshMonitors() { + private void wayFix$refreshMonitors() { ArrayList monitors = new ArrayList<>(); this.pointerToMonitorMap.forEach((aLong, monitor1) -> monitors.add(monitor1)); diff --git a/src/main/java/net/notcoded/wayfix/mixin/TextFieldWidgetMixin.java b/src/main/java/net/notcoded/wayfix/common/mixin/TextFieldWidgetMixin.java similarity index 81% rename from src/main/java/net/notcoded/wayfix/mixin/TextFieldWidgetMixin.java rename to src/main/java/net/notcoded/wayfix/common/mixin/TextFieldWidgetMixin.java index cb3f018..78af284 100644 --- a/src/main/java/net/notcoded/wayfix/mixin/TextFieldWidgetMixin.java +++ b/src/main/java/net/notcoded/wayfix/common/mixin/TextFieldWidgetMixin.java @@ -1,8 +1,8 @@ -package net.notcoded.wayfix.mixin; +package net.notcoded.wayfix.common.mixin; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.notcoded.wayfix.WayFix; +import net.notcoded.wayfix.common.WayFix; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -18,11 +18,11 @@ public class TextFieldWidgetMixin { @Inject(method = "charTyped", at = @At("HEAD"), cancellable = true) private void charTyped(char chr, int modifiers, CallbackInfoReturnable cir) { - if (WayFix.config.keyModifiersFix && WayFix.isWayland() && isSpecialChar(chr) && Screen.hasControlDown()) cir.setReturnValue(false); + if (WayFix.config.keyModifiersFix && WayFix.isWayland() && wayFix$isSpecialChar(chr) && Screen.hasControlDown()) cir.setReturnValue(false); } @Unique - private boolean isSpecialChar(char chr) { + private boolean wayFix$isSpecialChar(char chr) { return chr == 'a' // CTRL + A (select all) || chr == 'v' // CTRL + V (paste) || chr == 'c' // CTRL + C (copy) diff --git a/src/main/java/net/notcoded/wayfix/mixin/WindowMixin.java b/src/main/java/net/notcoded/wayfix/common/mixin/WindowMixin.java similarity index 87% rename from src/main/java/net/notcoded/wayfix/mixin/WindowMixin.java rename to src/main/java/net/notcoded/wayfix/common/mixin/WindowMixin.java index f799f7f..e675829 100644 --- a/src/main/java/net/notcoded/wayfix/mixin/WindowMixin.java +++ b/src/main/java/net/notcoded/wayfix/common/mixin/WindowMixin.java @@ -1,13 +1,11 @@ -package net.notcoded.wayfix.mixin; +package net.notcoded.wayfix.common.mixin; -import net.minecraft.client.WindowEventHandler; -import net.minecraft.client.WindowSettings; import net.minecraft.client.util.Monitor; import net.minecraft.client.util.MonitorTracker; import net.minecraft.client.util.Window; -import net.notcoded.wayfix.WayFix; -import net.notcoded.wayfix.config.ModConfig; -import net.notcoded.wayfix.util.DesktopFileInjector; +import net.notcoded.wayfix.common.WayFix; +import net.notcoded.wayfix.common.config.ModConfig; +import net.notcoded.wayfix.common.util.DesktopFileInjector; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -16,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static net.notcoded.wayfix.WayFix.isWayland; +import static net.notcoded.wayfix.common.WayFix.isWayland; //? if >=1.20 { @@ -41,7 +39,7 @@ @Mixin(Window.class) public class WindowMixin { @Inject(method = "", at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwDefaultWindowHints()V", shift = At.Shift.AFTER, remap = false)) - private void onWindowHints(WindowEventHandler windowEventHandler, MonitorTracker monitorTracker, WindowSettings windowSettings, String string, String string2, CallbackInfo ci) { + private void onWindowHints(CallbackInfo ci) { if (isWayland()) { GLFW.glfwWindowHint(GLFW.GLFW_FOCUS_ON_SHOW, GLFW.GLFW_FALSE); diff --git a/src/main/java/net/notcoded/wayfix/util/DesktopFileInjector.java b/src/main/java/net/notcoded/wayfix/common/util/DesktopFileInjector.java similarity index 98% rename from src/main/java/net/notcoded/wayfix/util/DesktopFileInjector.java rename to src/main/java/net/notcoded/wayfix/common/util/DesktopFileInjector.java index b1e25d8..79a7ba2 100644 --- a/src/main/java/net/notcoded/wayfix/util/DesktopFileInjector.java +++ b/src/main/java/net/notcoded/wayfix/common/util/DesktopFileInjector.java @@ -1,4 +1,4 @@ -package net.notcoded.wayfix.util; +package net.notcoded.wayfix.common.util; import net.minecraft.client.MinecraftClient; //? if >=1.19.3 { @@ -9,7 +9,7 @@ import java.util.Arrays; import java.io.ByteArrayInputStream; *///?} -import net.notcoded.wayfix.WayFix; +import net.notcoded.wayfix.common.WayFix; import org.apache.commons.io.IOUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; diff --git a/src/main/java/net/notcoded/wayfix/util/XDGPathResolver.java b/src/main/java/net/notcoded/wayfix/common/util/XDGPathResolver.java similarity index 94% rename from src/main/java/net/notcoded/wayfix/util/XDGPathResolver.java rename to src/main/java/net/notcoded/wayfix/common/util/XDGPathResolver.java index e1ee23f..cba918a 100644 --- a/src/main/java/net/notcoded/wayfix/util/XDGPathResolver.java +++ b/src/main/java/net/notcoded/wayfix/common/util/XDGPathResolver.java @@ -1,4 +1,4 @@ -package net.notcoded.wayfix.util; +package net.notcoded.wayfix.common.util; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/src/main/resources/assets/wayfix/lang/en_us.json b/src/main/resources/assets/wayfix/lang/en_us.json index 7c91fb9..d55f8fd 100755 --- a/src/main/resources/assets/wayfix/lang/en_us.json +++ b/src/main/resources/assets/wayfix/lang/en_us.json @@ -2,7 +2,7 @@ "text.autoconfig.wayfix.title": "WayFix Options", "text.autoconfig.wayfix.option.autoScaleGUI": "Auto Scale GUI", - "text.autoconfig.wayfix.option.autoScaleGUI.@Tooltip": "Auto-scales the GUI scale depending on your display's scaling. [may look weird when windowed] (e.g. 2 GUI Scale on 1920x1080 at 100% -> 4 GUI Scale on 3840x2160 at 200%)", + "text.autoconfig.wayfix.option.autoScaleGUI.@Tooltip": "Auto-scales the GUI scale depending on your display's scaling. (e.g. 2 GUI Scale on 1920x1080 at 100% -> 4 GUI Scale on 3840x2160 at 200%)", "text.autoconfig.wayfix.option.injectIcon": "Inject Minecraft Icon at Startup", "text.autoconfig.wayfix.option.injectIcon.@Tooltip": "Injects the Minecraft Icon at Startup instead of defaulting to the normal Wayland icon (requires restart).", @@ -28,4 +28,4 @@ "text.autoconfig.wayfix.option.Monitors.monitorName": "Monitor Name", "text.autoconfig.wayfix.option.Monitors.primary.@PrefixText": "↑↑ Copy me to the \"Select Monitor\" field! (if you want to choose this monitor as the fullscreen one) ↑↑", "text.autoconfig.wayfix.option.Monitors.primary": "Is Primary Monitor" -} \ No newline at end of file +} diff --git a/src/main/resources/wayfix.mixins.json b/src/main/resources/wayfix-common.mixins.json similarity index 84% rename from src/main/resources/wayfix.mixins.json rename to src/main/resources/wayfix-common.mixins.json index 406761f..e940e32 100644 --- a/src/main/resources/wayfix.mixins.json +++ b/src/main/resources/wayfix-common.mixins.json @@ -1,7 +1,7 @@ { "required": true, "minVersion": "0.8", - "package": "net.notcoded.wayfix.mixin", + "package": "net.notcoded.wayfix.common.mixin", "compatibilityLevel": "JAVA_8", "client": [ "GLXMixin", diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index 8ac44d1..ad7dffb 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -1,7 +1,11 @@ plugins { id("dev.kikugie.stonecutter") + id("dev.architectury.loom") version "1.7-SNAPSHOT" apply false + id("architectury-plugin") version "3.4-SNAPSHOT" apply false + id("com.github.johnrengelman.shadow") version "8.1.1" apply false } -stonecutter active "1.20.6" /* [SC] DO NOT EDIT */ +stonecutter active "1.20.2" /* [SC] DO NOT EDIT */ +stonecutter.automaticPlatformConstants = true stonecutter registerChiseled tasks.register("chiseledBuild", stonecutter.chiseled) { group = "project" @@ -12,3 +16,23 @@ stonecutter registerChiseled tasks.register("chiseledModrinth", stonecutter.chis group = "project" ofTask("modrinth") } + +for (it in stonecutter.tree.branches) { + if (it.id.isEmpty()) continue + val loader = it.id.upperCaseFirst() + stonecutter registerChiseled tasks.register("chiseledBuild$loader", stonecutter.chiseled) { + group = "project" + versions { branch, _ -> branch == it.id } + ofTask("buildAndCollect") + } +} + +// Runs active versions for each loader +for (it in stonecutter.tree.nodes) { + if (it.metadata != stonecutter.current || it.branch.id.isEmpty()) continue + val loader = it.branch.id.upperCaseFirst() + it.tasks.register("runActiveClient$loader") { + group = "project" + dependsOn("runClient") + } +} diff --git a/versions/1.16.5/gradle.properties b/versions/1.16.5/gradle.properties index b961f90..a9e49bc 100644 --- a/versions/1.16.5/gradle.properties +++ b/versions/1.16.5/gradle.properties @@ -2,9 +2,17 @@ deps.minecraft=1.16.5 deps.yarn_mappings=1.16.5+build.10 deps.cloth_config_version=4.10.11 -deps.mod_menu_version=1.16.23 deps.java=9 +# Fabric +deps.mod_menu_version=1.16.23 + +# Forge +deps.forge_loader=36.2.34 + +# NeoForge +deps.neoforge_loader=[UNSUPPORTED] + mod.version_name=1.16-1.18.2 mod.min_target=1.16 diff --git a/versions/1.19.3/gradle.properties b/versions/1.19.3/gradle.properties index d06eb63..3c72099 100644 --- a/versions/1.19.3/gradle.properties +++ b/versions/1.19.3/gradle.properties @@ -2,9 +2,17 @@ deps.minecraft=1.19.3 deps.yarn_mappings=1.19.3+build.5 deps.cloth_config_version=9.0.94 -deps.mod_menu_version=5.1.0 deps.java=17 +# Fabric +deps.mod_menu_version=5.1.0 + +# Forge +deps.forge_loader=44.1.0 + +# NeoForge +deps.neoforge_loader=[UNSUPPORTED] + mod.version_name=1.19.3-1.19.4 mod.min_target=1.19.3 diff --git a/versions/1.19/gradle.properties b/versions/1.19/gradle.properties index 2a3b805..038b442 100644 --- a/versions/1.19/gradle.properties +++ b/versions/1.19/gradle.properties @@ -2,9 +2,17 @@ deps.minecraft=1.19 deps.yarn_mappings=1.19+build.4 deps.cloth_config_version=7.0.69 -deps.mod_menu_version=4.0.0 deps.java=17 +# Fabric +deps.mod_menu_version=4.0.0 + +# Forge +deps.forge_loader=41.1.0 + +# NeoForge +deps.neoforge_loader=[UNSUPPORTED] + mod.version_name=1.19-1.19.2 mod.min_target=1.19 diff --git a/versions/1.20.2/gradle.properties b/versions/1.20.2/gradle.properties new file mode 100644 index 0000000..d9a3512 --- /dev/null +++ b/versions/1.20.2/gradle.properties @@ -0,0 +1,21 @@ +# See latest at https://fabricmc.net/develop/ +deps.minecraft=1.20.2 +deps.yarn_mappings=1.20.2+build.4 +deps.cloth_config_version=12.0.137 +deps.java=17 + +# Fabric +deps.mod_menu_version=8.0.0 + +# Forge +deps.forge_loader=48.1.0 + +# NeoForge +deps.neoforge_loader=20.2.88 + +mod.version_name=1.20 + +mod.min_target=1.20 +mod.max_target=1.22 + +publishing.supported_versions=1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3 diff --git a/versions/1.20.6/gradle.properties b/versions/1.20.6/gradle.properties deleted file mode 100644 index 5597a19..0000000 --- a/versions/1.20.6/gradle.properties +++ /dev/null @@ -1,13 +0,0 @@ -# See latest at https://fabricmc.net/develop/ -deps.minecraft=1.20.6 -deps.yarn_mappings=1.20.6+build.1 -deps.cloth_config_version=14.0.126 -deps.mod_menu_version=10.0.0 -deps.java=17 - -mod.version_name=1.20+ - -mod.min_target=1.20 -mod.max_target=1.22 - -publishing.supported_versions=1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3