From b77bdc215e1df2c751a41d89d0dfdda46b2dd356 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Wed, 19 Nov 2025 16:05:34 +0100 Subject: [PATCH] stonecutter: setup project for multiversion support - Switch to Stonecutter build system - Migrate mappings to Mojmap --- CHANGELOG.md | 0 build.gradle | 119 --------- build.gradle.kts | 230 ++++++++++++++++++ buildSrc/build.gradle.kts | 8 + buildSrc/src/main/kotlin/build-extensions.kt | 34 +++ common/build.gradle | 34 --- .../main/java/net/puzzlemc/gui/PuzzleGui.java | 67 ----- .../net/puzzlemc/gui/compat/CITRCompat.java | 60 ----- .../net/puzzlemc/gui/compat/IrisCompat.java | 25 -- .../net/puzzlemc/gui/compat/LBGCompat.java | 19 -- .../net/puzzlemc/gui/compat/LDLCompat.java | 23 -- .../screen/widget/PuzzleTextFieldWidget.java | 25 -- .../splashscreen/mixin/MixinSplashScreen.java | 106 -------- fabric/build.gradle | 109 --------- .../net/puzzlemc/fabric/PuzzleFabric.java | 28 --- .../fabric/modmenu/ModMenuIntegration.java | 12 - gradle.properties | 90 ++++--- gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle | 115 --------- neoforge/gradle.properties | 1 - .../net/puzzlemc/neoforge/PuzzleNeoForge.java | 31 --- .../MixinNeoForgeLoadingOverlay.java | 30 --- settings.gradle | 15 -- settings.gradle.kts | 33 +++ .../java/net/puzzlemc/core/PuzzleClient.java | 48 ++++ .../java/net/puzzlemc/core/PuzzleCore.java | 0 .../puzzlemc/core/config/PuzzleConfig.java | 0 .../main/java/net/puzzlemc/gui/PuzzleApi.java | 8 +- src/main/java/net/puzzlemc/gui/PuzzleGui.java | 67 +++++ .../gui/compat/BorderlessMiningCompat.java | 9 +- .../net/puzzlemc/gui/compat/CITRCompat.java | 60 +++++ .../puzzlemc/gui/compat/ColormaticCompat.java | 18 +- .../puzzlemc/gui/compat/ContinuityCompat.java | 6 +- .../puzzlemc/gui/compat/CullLeavesCompat.java | 10 +- .../net/puzzlemc/gui/compat/EMFCompat.java | 10 +- .../net/puzzlemc/gui/compat/ETFCompat.java | 16 +- .../net/puzzlemc/gui/compat/IrisCompat.java | 25 ++ .../net/puzzlemc/gui/compat/LBGCompat.java | 19 ++ .../net/puzzlemc/gui/compat/LDLCompat.java | 23 ++ .../gui/mixin/MixinOptionsScreen.java | 25 +- .../gui/screen/PuzzleOptionsScreen.java | 59 ++--- .../gui/screen/widget/ButtonType.java | 0 .../gui/screen/widget/PuzzleButtonWidget.java | 14 +- .../screen/widget/PuzzleOptionListWidget.java | 60 +++-- .../gui/screen/widget/PuzzleSliderWidget.java | 17 +- .../screen/widget/PuzzleTextFieldWidget.java | 25 ++ .../gui/screen/widget/PuzzleWidget.java | 27 +- .../mixin/MixinModelElementDeserializer.java | 20 +- .../splashscreen/PuzzleSplashScreen.java | 86 +++---- .../mixin/MixinNeoForgeLoadingOverlay.java | 32 +++ .../splashscreen/mixin/MixinSplashScreen.java | 106 ++++++++ .../mixin/RenderPipelinesAccessor.java | 4 +- .../resources/META-INF/neoforge.mods.toml | 2 +- .../main/resources/architectury.puzzle.json | 0 .../main/resources/assets/puzzle/icon.png | Bin .../resources/assets/puzzle/lang/be_by.json | 0 .../resources/assets/puzzle/lang/de_de.json | 0 .../resources/assets/puzzle/lang/el_gr.json | 0 .../resources/assets/puzzle/lang/en_us.json | 0 .../resources/assets/puzzle/lang/es_es.json | 0 .../resources/assets/puzzle/lang/et_ee.json | 0 .../resources/assets/puzzle/lang/ko_kr.json | 0 .../resources/assets/puzzle/lang/pl_pl.json | 0 .../resources/assets/puzzle/lang/pt_br.json | 0 .../resources/assets/puzzle/lang/ru_ru.json | 0 .../resources/assets/puzzle/lang/vi_vn.json | 0 .../resources/assets/puzzle/lang/zh_cn.json | 0 .../resources/assets/puzzle/lang/zh_tw.json | 0 .../textures/gui/sprites/icon/button.png | Bin .../main/resources/fabric.mod.json | 6 +- .../main/resources/puzzle-gui.mixins.json | 0 .../resources/puzzle-models.accesswidener | 2 +- .../main/resources/puzzle-models.mixins.json | 0 .../resources/puzzle-splashscreen.mixins.json | 0 .../puzzle-splashscreen_neoforge.mixins.json | 4 +- .../src => src}/main/resources/puzzle.png | Bin stonecutter.gradle.kts | 16 ++ versions/1.20.1-fabric/gradle.properties | 12 + versions/1.20.1-forge/gradle.properties | 13 + versions/1.21.1-fabric/gradle.properties | 13 + versions/1.21.1-neoforge/gradle.properties | 13 + versions/1.21.10-fabric/gradle.properties | 12 + versions/1.21.10-neoforge/gradle.properties | 12 + versions/1.21.5-fabric/gradle.properties | 12 + versions/1.21.5-neoforge/gradle.properties | 12 + versions/1.21.8-fabric/gradle.properties | 12 + versions/1.21.8-neoforge/gradle.properties | 12 + 87 files changed, 1104 insertions(+), 1059 deletions(-) create mode 100644 CHANGELOG.md delete mode 100755 build.gradle create mode 100644 build.gradle.kts create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/kotlin/build-extensions.kt delete mode 100644 common/build.gradle delete mode 100755 common/src/main/java/net/puzzlemc/gui/PuzzleGui.java delete mode 100644 common/src/main/java/net/puzzlemc/gui/compat/CITRCompat.java delete mode 100644 common/src/main/java/net/puzzlemc/gui/compat/IrisCompat.java delete mode 100644 common/src/main/java/net/puzzlemc/gui/compat/LBGCompat.java delete mode 100644 common/src/main/java/net/puzzlemc/gui/compat/LDLCompat.java delete mode 100755 common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java delete mode 100755 common/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java delete mode 100644 fabric/build.gradle delete mode 100644 fabric/src/main/java/net/puzzlemc/fabric/PuzzleFabric.java delete mode 100644 fabric/src/main/java/net/puzzlemc/fabric/modmenu/ModMenuIntegration.java mode change 100755 => 100644 gradle.properties delete mode 100644 neoforge/build.gradle delete mode 100644 neoforge/gradle.properties delete mode 100644 neoforge/src/main/java/net/puzzlemc/neoforge/PuzzleNeoForge.java delete mode 100644 neoforge/src/main/java/net/puzzlemc/neoforge/mixin/splashscreen/MixinNeoForgeLoadingOverlay.java delete mode 100755 settings.gradle create mode 100644 settings.gradle.kts create mode 100644 src/main/java/net/puzzlemc/core/PuzzleClient.java rename {common/src => src}/main/java/net/puzzlemc/core/PuzzleCore.java (100%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/core/config/PuzzleConfig.java (100%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/gui/PuzzleApi.java (88%) mode change 100755 => 100644 create mode 100644 src/main/java/net/puzzlemc/gui/PuzzleGui.java rename {common/src => src}/main/java/net/puzzlemc/gui/compat/BorderlessMiningCompat.java (58%) create mode 100644 src/main/java/net/puzzlemc/gui/compat/CITRCompat.java rename {common/src => src}/main/java/net/puzzlemc/gui/compat/ColormaticCompat.java (55%) rename {common/src => src}/main/java/net/puzzlemc/gui/compat/ContinuityCompat.java (77%) rename {common/src => src}/main/java/net/puzzlemc/gui/compat/CullLeavesCompat.java (50%) rename {common/src => src}/main/java/net/puzzlemc/gui/compat/EMFCompat.java (57%) rename {common/src => src}/main/java/net/puzzlemc/gui/compat/ETFCompat.java (51%) create mode 100644 src/main/java/net/puzzlemc/gui/compat/IrisCompat.java create mode 100644 src/main/java/net/puzzlemc/gui/compat/LBGCompat.java create mode 100644 src/main/java/net/puzzlemc/gui/compat/LDLCompat.java rename {common/src => src}/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java (61%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java (52%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/gui/screen/widget/ButtonType.java (100%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/gui/screen/widget/PuzzleButtonWidget.java (52%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java (58%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/gui/screen/widget/PuzzleSliderWidget.java (62%) mode change 100755 => 100644 create mode 100644 src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java rename {common/src => src}/main/java/net/puzzlemc/gui/screen/widget/PuzzleWidget.java (65%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/models/mixin/MixinModelElementDeserializer.java (71%) mode change 100755 => 100644 rename {common/src => src}/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java (74%) mode change 100755 => 100644 create mode 100644 src/main/java/net/puzzlemc/splashscreen/mixin/MixinNeoForgeLoadingOverlay.java create mode 100644 src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java rename {common/src => src}/main/java/net/puzzlemc/splashscreen/mixin/RenderPipelinesAccessor.java (72%) rename {neoforge/src => src}/main/resources/META-INF/neoforge.mods.toml (95%) rename {common/src => src}/main/resources/architectury.puzzle.json (100%) rename {common/src => src}/main/resources/assets/puzzle/icon.png (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/be_by.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/de_de.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/el_gr.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/en_us.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/es_es.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/et_ee.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/ko_kr.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/pl_pl.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/pt_br.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/ru_ru.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/vi_vn.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/zh_cn.json (100%) rename {common/src => src}/main/resources/assets/puzzle/lang/zh_tw.json (100%) rename {common/src => src}/main/resources/assets/puzzle/textures/gui/sprites/icon/button.png (100%) rename {fabric/src => src}/main/resources/fabric.mod.json (86%) rename {common/src => src}/main/resources/puzzle-gui.mixins.json (100%) rename {common/src => src}/main/resources/puzzle-models.accesswidener (86%) rename {common/src => src}/main/resources/puzzle-models.mixins.json (100%) rename {common/src => src}/main/resources/puzzle-splashscreen.mixins.json (100%) rename {neoforge/src => src}/main/resources/puzzle-splashscreen_neoforge.mixins.json (56%) rename {neoforge/src => src}/main/resources/puzzle.png (100%) create mode 100644 stonecutter.gradle.kts create mode 100644 versions/1.20.1-fabric/gradle.properties create mode 100644 versions/1.20.1-forge/gradle.properties create mode 100644 versions/1.21.1-fabric/gradle.properties create mode 100644 versions/1.21.1-neoforge/gradle.properties create mode 100644 versions/1.21.10-fabric/gradle.properties create mode 100644 versions/1.21.10-neoforge/gradle.properties create mode 100644 versions/1.21.5-fabric/gradle.properties create mode 100644 versions/1.21.5-neoforge/gradle.properties create mode 100644 versions/1.21.8-fabric/gradle.properties create mode 100644 versions/1.21.8-neoforge/gradle.properties diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/build.gradle b/build.gradle deleted file mode 100755 index cec1550..0000000 --- a/build.gradle +++ /dev/null @@ -1,119 +0,0 @@ -import groovy.json.JsonSlurper -import groovy.json.JsonOutput - -plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.11-SNAPSHOT" apply false - id "me.shedaniel.unified-publishing" version "0.1.+" apply false - id 'com.github.johnrengelman.shadow' version '8.1.1' apply false -} - -architectury { - minecraft = rootProject.minecraft_version -} - -subprojects { - apply plugin: "dev.architectury.loom" - - repositories { - maven { - url = "https://api.modrinth.com/maven" - } - maven { url "https://maven.terraformersmc.com/releases" } - maven { - name = 'AperLambda' - url = 'https://aperlambda.github.io/maven' - } - mavenCentral() - maven { - name 'Gegy' - url 'https://maven.gegy.dev' - } - - maven { - url "https://www.cursemaven.com" - content { - includeGroup "curse.maven" - } - } - maven { - name = 'JitPack' - url 'https://jitpack.io' - } - maven { - url "https://maven.shedaniel.me/" - } - maven { url "https://maven.quiltmc.org/repository/release/" } - } - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - // The following line declares the yarn mappings you may select this one as well. - mappings loom.layered { - it.mappings("net.fabricmc:yarn:$rootProject.yarn_mappings:v2") - it.mappings("dev.architectury:yarn-mappings-patch-neoforge:$rootProject.yarn_mappings_patch_neoforge_version") - } - modCompileOnlyApi ("maven.modrinth:cull-leaves:${project.cull_leaves_version}") - - modCompileOnlyApi ("maven.modrinth:iris:${project.iris_version}") - modCompileOnly ("maven.modrinth:cit-resewn:${project.cit_resewn_version}") - modCompileOnlyApi ("maven.modrinth:continuity:${project.continuity_version}") - modCompileOnlyApi ("maven.modrinth:animatica:${project.animatica_version}") - modCompileOnlyApi ("maven.modrinth:colormatic:${project.colormatic_version}") - modCompileOnlyApi ("maven.modrinth:borderless-mining:${project.borderless_mining_version}") - modCompileOnlyApi ("maven.modrinth:dynamic-fps:${project.dynamic_fps_version}") - modCompileOnlyApi ("com.moandjiezana.toml:toml4j:${project.toml4j_version}") - modCompileOnlyApi ("maven.modrinth:entitytexturefeatures:${project.etf_version}") - modCompileOnlyApi ("maven.modrinth:entity-model-features:${project.emf_version}") - modCompileOnlyApi ("maven.modrinth:completeconfig:${project.complete_config_version}") - //modImplementation ("maven.modrinth:exordium:${project.exordium_version}") - - - modCompileOnlyApi ("maven.modrinth:lambdynamiclights:${project.ldl_version}") - modCompileOnly("dev.lambdaurora.lambdynamiclights:lambdynamiclights-api:${project.ldl_version}") - modCompileOnlyApi ("maven.modrinth:lambdabettergrass:${project.lbg_version}") - modCompileOnlyApi "dev.lambdaurora:spruceui:${project.spruceui_version}" - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - archivesBaseName = rootProject.archives_base_name - version = rootProject.mod_version - group = rootProject.maven_group - - tasks.withType(JavaCompile) { - options.encoding = "UTF-8" - options.release = 21 - } - ext { - releaseChangelog = { - def changes = new StringBuilder() - changes << "## Puzzle v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/PuzzleMC/Puzzle/commits/)" - def proc = "git log --max-count=1 --pretty=format:%s".execute() - proc.in.eachLine { line -> - def processedLine = line.toString() - if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) { - changes << "\n- ${processedLine.capitalize()}" - } - } - proc.waitFor() - return changes.toString() - } - } - processResources { - // Minify json resources - doLast { - fileTree(dir: outputs.files.asPath, include: "**/*.json").each { - File file -> file.text = JsonOutput.toJson(new JsonSlurper().parse(file)) - } - } - } - - java { - withSourcesJar() - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..20449c7 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,230 @@ +plugins { + id("dev.architectury.loom") + id("architectury-plugin") + id("me.modmuss50.mod-publish-plugin") + id("com.github.johnrengelman.shadow") +} + +val minecraft = stonecutter.current.version +val loader = loom.platform.get().name.lowercase() + +version = "${mod.version}+$minecraft" +group = mod.group +base { + archivesName.set("${mod.id}-$loader") +} + +repositories { + maven("https://maven.neoforged.net/releases/") + + // ModMenu + maven("https://maven.terraformersmc.com/") + maven("https://maven.nucleoid.xyz/") + + // MidnightLib + maven("https://maven.midnightdust.eu/snapshots/") + + // Jigsaw modules + maven("https://api.modrinth.com/maven") + maven("https://maven.terraformersmc.com/releases") + maven("https://aperlambda.github.io/maven") + mavenCentral() + maven("https://maven.gegy.dev") + + maven("https://www.cursemaven.com") + maven("https://jitpack.io") + maven("https://maven.shedaniel.me/") + maven("https://maven.quiltmc.org/repository/release/") +} +dependencies { + minecraft("com.mojang:minecraft:$minecraft") + + modCompileOnlyApi ("maven.modrinth:cull-leaves:${mod.jigsaw("cull_leaves_version")}") + modCompileOnlyApi ("maven.modrinth:iris:${mod.jigsaw("iris_version")}") + modCompileOnly ("maven.modrinth:cit-resewn:${mod.jigsaw("cit_resewn_version")}") + modCompileOnlyApi ("maven.modrinth:continuity:${mod.jigsaw("continuity_version")}") + modCompileOnlyApi ("maven.modrinth:animatica:${mod.jigsaw("animatica_version")}") + modCompileOnlyApi ("maven.modrinth:colormatic:${mod.jigsaw("colormatic_version")}") + modCompileOnlyApi ("maven.modrinth:borderless-mining:${mod.jigsaw("borderless_mining_version")}") + modCompileOnlyApi ("maven.modrinth:dynamic-fps:${mod.jigsaw("dynamic_fps_version")}") + modCompileOnlyApi ("com.moandjiezana.toml:toml4j:${mod.jigsaw("toml4j_version")}") + modCompileOnlyApi ("maven.modrinth:entitytexturefeatures:${mod.jigsaw("etf_version")}") + modCompileOnlyApi ("maven.modrinth:entity-model-features:${mod.jigsaw("emf_version")}") + modCompileOnlyApi ("maven.modrinth:completeconfig:${mod.jigsaw("complete_config_version")}") + //modImplementation ("maven.modrinth:exordium:${project.exordium_version}") + + + modCompileOnlyApi ("maven.modrinth:lambdynamiclights:${mod.jigsaw("ldl_version")}") + modCompileOnly("dev.lambdaurora.lambdynamiclights:lambdynamiclights-api:${mod.jigsaw("ldl_version")}") + modCompileOnlyApi ("maven.modrinth:lambdabettergrass:${mod.jigsaw("lbg_version")}") + modCompileOnlyApi ("dev.lambdaurora:spruceui:${mod.jigsaw("spruceui_version")}") + + // Required for Lambda's mods (DO NOT DEPEND ON OTHERWISE) + modCompileOnly ("org.quiltmc:quilt-loader:${mod.jigsaw("quilt_loader_version")}") + modCompileOnlyApi ("org.quiltmc.quilted-fabric-api:quilted-fabric-api:${mod.jigsaw("quilt_fabric_api_version")}") + modCompileOnlyApi ("org.aperlambda:lambdajcommon:1.8.1") { + exclude(group = "com.google.code.gson") + exclude(group = "com.google.guava") + } + + modImplementation ("eu.midnightdust:midnightlib:${mod.dep("midnightlib_version")}+${minecraft}-${loader}") + + if (loader == "fabric") { + modImplementation("net.fabricmc:fabric-loader:${mod.dep("fabric_loader")}") + modImplementation("com.terraformersmc:modmenu:${mod.dep("modmenu_version")}") + + // Fabric API is required to load modded resources + modImplementation("net.fabricmc.fabric-api:fabric-api:${mod.dep("fabric_version")}") + } + if (loader == "forge") { + "forge"("net.minecraftforge:forge:${minecraft}-${mod.dep("forge_loader")}") + } + if (loader == "neoforge") { + "neoForge"("net.neoforged:neoforge:${mod.dep("neoforge_loader")}") + } + mappings (loom.officialMojangMappings()) +} + +loom { + accessWidenerPath = rootProject.file("src/main/resources/puzzle-models.accesswidener") + + decompilers { + get("vineflower").apply { // Adds names to lambdas - useful for mixins + options.put("mark-corresponding-synthetics", "1") + } + } + if (loader == "forge") { + forge.mixinConfigs("puzzle.mixins.json") + } +} + +publishMods { + val modrinthToken = System.getenv("MODRINTH_TOKEN") + val curseforgeToken = System.getenv("CURSEFORGE_TOKEN") + val githubToken = System.getenv("GITHUB_TOKEN").orEmpty() + + file = project.tasks.remapJar.get().archiveFile + dryRun = modrinthToken == null || curseforgeToken == null + + displayName = "${mod.name} ${loader.replaceFirstChar { it.uppercase() }} ${property("mod.mc_title")}-${mod.version}" + version = mod.version + changelog = rootProject.file("CHANGELOG.md").readText() + type = BETA + + modLoaders.add(loader) + + val targets = property("mod.mc_targets").toString().split(' ') + modrinth { + projectId = property("publish.modrinth").toString() + accessToken = modrinthToken + targets.forEach(minecraftVersions::add) + if (loader == "fabric") { + requires("fabric-api") + optional("modmenu") + } + } + + curseforge { + projectId = property("publish.curseforge").toString() + accessToken = curseforgeToken.toString() + targets.forEach(minecraftVersions::add) + if (loader == "fabric") { + requires("fabric-api") + optional("modmenu") + } + } + + github { + accessToken = githubToken + repository = "TeamMidnightDust/MidnightLib" + commitish = "multiversion" // This is the branch the release tag will be created from + + tagName = "v" + properties["mod.version"] + + // Allow the release to be initially created without any files. + allowEmptyFiles = true + } +} + +java { + withSourcesJar() + val java = if (stonecutter.eval(minecraft, ">=1.20.5")) JavaVersion.VERSION_21 else JavaVersion.VERSION_17 + targetCompatibility = java + sourceCompatibility = java +} + +val shadowBundle: Configuration by configurations.creating { + isCanBeConsumed = false + isCanBeResolved = true +} + +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" +} + +val buildAndCollect = tasks.register("buildAndCollect") { + group = "build" + from(tasks.remapJar.get().archiveFile, tasks.remapSourcesJar.get().archiveFile) + into(rootProject.layout.buildDirectory.file("libs/${mod.version}/$loader")) + dependsOn("build") +} + +if (stonecutter.current.isActive) { + rootProject.tasks.register("buildActive") { + group = "project" + dependsOn(buildAndCollect) + } + + rootProject.tasks.register("runActive") { + group = "project" + dependsOn(tasks.named("runClient")) + } +} + +tasks.processResources { + properties( + listOf("fabric.mod.json"), + "id" to mod.id, + "name" to mod.name, + "version" to mod.version, + "minecraft" to mod.prop("mc_dep_fabric") + ) + properties( + listOf("META-INF/mods.toml", "pack.mcmeta"), + "id" to mod.id, + "name" to mod.name, + "version" to mod.version, + "minecraft" to mod.prop("mc_dep_forgelike") + ) + properties( + listOf("META-INF/neoforge.mods.toml", "pack.mcmeta"), + "id" to mod.id, + "name" to mod.name, + "version" to mod.version, + "minecraft" to mod.prop("mc_dep_forgelike") + ) +} + +tasks.build { + group = "versioned" + description = "Must run through 'chiseledBuild'" +} + + +stonecutter { + constants { + arrayOf("fabric", "neoforge", "forge").forEach { it -> put(it, loader == it) } + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..74dfa9a --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + `kotlin-dsl` + kotlin("jvm") version "2.0.20" +} + +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..d0ddb1a --- /dev/null +++ b/buildSrc/src/main/kotlin/build-extensions.kt @@ -0,0 +1,34 @@ +import org.gradle.api.Project +import org.gradle.api.artifacts.dsl.RepositoryHandler +import org.gradle.kotlin.dsl.expand +import org.gradle.kotlin.dsl.maven +import org.gradle.language.jvm.tasks.ProcessResources +import java.util.* + +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 group: String get() = requireNotNull(project.prop("mod.group")) { "Missing 'mod.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'" } + fun jigsaw(key: String) = requireNotNull(project.prop("jigsaws.$key")) { "Missing 'jigsaws.$key'" } +} \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index 46eaea8..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,34 +0,0 @@ -architectury { - common(rootProject.enabled_platforms.split(",")) -} -loom { - accessWidenerPath = file("src/main/resources/puzzle-models.accesswidener") -} - -dependencies { - // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies - // Do NOT use other classes from fabric loader - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modCompileOnly "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric" - - modCompileOnly "org.quiltmc:quilt-loader:${rootProject.quilt_loader_version}" - modCompileOnlyApi "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${rootProject.quilt_fabric_api_version}" - modCompileOnlyApi ("org.aperlambda:lambdajcommon:1.8.1") { - exclude group: 'com.google.code.gson' - exclude group: 'com.google.guava' - } -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - } -} diff --git a/common/src/main/java/net/puzzlemc/gui/PuzzleGui.java b/common/src/main/java/net/puzzlemc/gui/PuzzleGui.java deleted file mode 100755 index 4c9d409..0000000 --- a/common/src/main/java/net/puzzlemc/gui/PuzzleGui.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.puzzlemc.gui; - -import eu.midnightdust.core.MidnightLib; -import eu.midnightdust.lib.util.PlatformFunctions; -import net.minecraft.util.Identifier; -import net.puzzlemc.core.config.PuzzleConfig; -import net.puzzlemc.gui.compat.*; -import net.puzzlemc.gui.screen.widget.PuzzleWidget; -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.puzzlemc.splashscreen.PuzzleSplashScreen; - -import static net.puzzlemc.core.PuzzleCore.LOGGER; - -public class PuzzleGui { - public final static String id = "puzzle"; - public static final Text YES = Text.translatable("gui.yes").formatted(Formatting.GREEN); - public static final Text NO = Text.translatable("gui.no").formatted(Formatting.RED); - public static final Identifier PUZZLE_BUTTON = Identifier.of(id, "icon/button"); - - public static void init() { - MidnightLib.hiddenMods.add("puzzle"); - PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("\uD83E\uDDE9 Puzzle"))); - PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("puzzle.midnightconfig.title"), (button) -> button.setMessage(Text.of("OPEN")), (button) -> { - MinecraftClient.getInstance().setScreen(PuzzleConfig.getScreen(MinecraftClient.getInstance().currentScreen, "puzzle")); - })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("\uD83E\uDDE9 Puzzle"))); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("puzzle.option.resourcepack_splash_screen"), (button) -> button.setMessage(PuzzleConfig.resourcepackSplashScreen ? YES : NO), (button) -> { - PuzzleConfig.resourcepackSplashScreen = !PuzzleConfig.resourcepackSplashScreen; - PuzzleSplashScreen.resetColors(); - PuzzleConfig.write(id); - MinecraftClient.getInstance().getTextureManager().registerTexture(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture(PuzzleSplashScreen.LOGO)); - })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("puzzle.option.unlimited_model_rotations"), (button) -> button.setMessage(PuzzleConfig.unlimitedRotations ? YES : NO), (button) -> { - PuzzleConfig.unlimitedRotations = !PuzzleConfig.unlimitedRotations; - PuzzleConfig.write(id); - })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("puzzle.option.bigger_custom_models"), (button) -> button.setMessage(PuzzleConfig.biggerModels ? YES : NO), (button) -> { - PuzzleConfig.biggerModels = !PuzzleConfig.biggerModels; - PuzzleConfig.write(id); - })); - if (isActive("cullleaves")) CullLeavesCompat.init(); - if (isActive("colormatic")) ColormaticCompat.init(); - if (isActive("borderlessmining")) BorderlessMiningCompat.init(); - if (isActive("iris")) IrisCompat.init(); - } - - public static boolean lateInitDone = false; - public static void lateInit() { // Some mods are initialized after Puzzle, so we can't access them in our ClientModInitializer - if (isActive("lambdynlights")) LDLCompat.init(); - if (isActive("citresewn")) CITRCompat.init(); - if (isActive("lambdabettergrass")) LBGCompat.init(); - if (isActive("continuity")) ContinuityCompat.init(); - try { - if (isActive("entity_texture_features")) ETFCompat.init(); - if (isActive("entity_model_features")) EMFCompat.init(); - } catch (Exception e) { - LOGGER.error("ETF/EMF config structure changed. Again...", e); - } - - lateInitDone = true; - } - public static boolean isActive(String modid) { - return PlatformFunctions.isModLoaded(modid) && !PuzzleConfig.disabledIntegrations.contains(modid); - } -} diff --git a/common/src/main/java/net/puzzlemc/gui/compat/CITRCompat.java b/common/src/main/java/net/puzzlemc/gui/compat/CITRCompat.java deleted file mode 100644 index ddda011..0000000 --- a/common/src/main/java/net/puzzlemc/gui/compat/CITRCompat.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.puzzlemc.gui.compat; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.puzzlemc.gui.PuzzleApi; -import net.puzzlemc.gui.screen.widget.PuzzleWidget; -import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig; - -import static net.minecraft.screen.ScreenTexts.NO; -import static net.minecraft.screen.ScreenTexts.YES; - -public class CITRCompat { - public static void init() { - if (CITResewnConfig.INSTANCE != null) { - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("⛏ CIT Resewn"))); - CITResewnConfig citConfig = CITResewnConfig.INSTANCE; - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.enabled.title"), (button) -> button.setMessage(citConfig.enabled ? YES : NO), (button) -> { - citConfig.enabled = !citConfig.enabled; - citConfig.write(); - MinecraftClient.getInstance().reloadResources(); - })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.mute_errors.title"), (button) -> button.setMessage(citConfig.mute_errors ? YES : NO), (button) -> { - citConfig.mute_errors = !citConfig.mute_errors; - citConfig.write(); - })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.mute_warns.title"), (button) -> button.setMessage(citConfig.mute_warns ? YES : NO), (button) -> { - citConfig.mute_warns = !citConfig.mute_warns; - citConfig.write(); - })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.broken_paths.title"), (button) -> button.setMessage(citConfig.broken_paths ? YES : NO), (button) -> { - citConfig.broken_paths = !citConfig.broken_paths; - citConfig.write(); - })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100, Text.translatable("config.citresewn.cache_ms.title"), () -> citConfig.cache_ms, - (button) -> button.setMessage(message(citConfig)), - (slider) -> { - try { - citConfig.cache_ms = slider.getInt(); - } catch (NumberFormatException ignored) { - } - citConfig.write(); - })); - } - } - public static Text message(CITResewnConfig config) { - int ticks = config.cache_ms; - if (ticks <= 1) { - return (Text.translatable("config.citresewn.cache_ms.ticks." + ticks)).formatted(Formatting.AQUA); - } else { - Formatting color = Formatting.DARK_RED; - if (ticks <= 40) color = Formatting.RED; - if (ticks <= 20) color = Formatting.GOLD; - if (ticks <= 10) color = Formatting.DARK_GREEN; - if (ticks <= 5) color = Formatting.GREEN; - - return (Text.translatable("config.citresewn.cache_ms.ticks.any", ticks)).formatted(color); - } - } -} diff --git a/common/src/main/java/net/puzzlemc/gui/compat/IrisCompat.java b/common/src/main/java/net/puzzlemc/gui/compat/IrisCompat.java deleted file mode 100644 index b10ad48..0000000 --- a/common/src/main/java/net/puzzlemc/gui/compat/IrisCompat.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.puzzlemc.gui.compat; - -import net.irisshaders.iris.api.v0.IrisApi; -import net.irisshaders.iris.api.v0.IrisApiConfig; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.puzzlemc.gui.PuzzleApi; -import net.puzzlemc.gui.PuzzleGui; -import net.puzzlemc.gui.screen.widget.PuzzleWidget; - -public class IrisCompat { - public static void init() { - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("\uD83D\uDC41 Iris"))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("iris.puzzle.option.enableShaders"), (button) -> button.setMessage(IrisApi.getInstance().getConfig().areShadersEnabled() ? PuzzleGui.YES : PuzzleGui.NO), (button) -> { - IrisApiConfig irisConfig = IrisApi.getInstance().getConfig(); - irisConfig.setShadersEnabledAndApply(!irisConfig.areShadersEnabled()); - })); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("options.iris.shaderPackSelection.title"), (button) -> button.setMessage(Text.literal("➥ ").append(Text.translatable("iris.puzzle.option.open").formatted(Formatting.GOLD))), (button) -> { - MinecraftClient client = MinecraftClient.getInstance(); - client.setScreen((Screen) IrisApi.getInstance().openMainIrisScreenObj(client.currentScreen)); - })); - } -} diff --git a/common/src/main/java/net/puzzlemc/gui/compat/LBGCompat.java b/common/src/main/java/net/puzzlemc/gui/compat/LBGCompat.java deleted file mode 100644 index 62eacda..0000000 --- a/common/src/main/java/net/puzzlemc/gui/compat/LBGCompat.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.puzzlemc.gui.compat; - -import dev.lambdaurora.lambdabettergrass.LBGConfig; -import dev.lambdaurora.lambdabettergrass.LambdaBetterGrass; -import net.minecraft.text.Text; -import net.puzzlemc.gui.PuzzleApi; -import net.puzzlemc.gui.screen.widget.PuzzleWidget; - -import static net.puzzlemc.gui.PuzzleGui.NO; -import static net.puzzlemc.gui.PuzzleGui.YES; - -public class LBGCompat { - public static void init() { - LBGConfig lbgConfig = LambdaBetterGrass.get().config; - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("\uD83C\uDF31 LambdaBetterGrass"))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("lambdabettergrass.option.mode"), (button) -> button.setMessage(lbgConfig.getMode().getTranslatedText()), (button) -> lbgConfig.setMode(lbgConfig.getMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("lambdabettergrass.option.better_snow"), (button) -> button.setMessage(lbgConfig.hasBetterLayer() ? YES : NO), (button) -> lbgConfig.setBetterLayer(!lbgConfig.hasBetterLayer()))); - } -} diff --git a/common/src/main/java/net/puzzlemc/gui/compat/LDLCompat.java b/common/src/main/java/net/puzzlemc/gui/compat/LDLCompat.java deleted file mode 100644 index 4dd1071..0000000 --- a/common/src/main/java/net/puzzlemc/gui/compat/LDLCompat.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.puzzlemc.gui.compat; - -import dev.lambdaurora.lambdynlights.DynamicLightsConfig; -import dev.lambdaurora.lambdynlights.LambDynLights; -import net.minecraft.text.Text; -import net.puzzlemc.gui.PuzzleApi; -import net.puzzlemc.gui.screen.widget.PuzzleWidget; - -import static net.puzzlemc.gui.PuzzleGui.NO; -import static net.puzzlemc.gui.PuzzleGui.YES; - -public class LDLCompat { - public static void init() { - DynamicLightsConfig ldlConfig = LambDynLights.get().config; - - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("\uD83D\uDCA1 LambDynamicLights"))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("lambdynlights.option.mode"), (button) -> button.setMessage(ldlConfig.getDynamicLightsMode().getTranslatedText()), (button) -> ldlConfig.setDynamicLightsMode(ldlConfig.getDynamicLightsMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.empty().append("DynLights: ").append(Text.translatable("lambdynlights.option.light_sources.entities")), (button) -> button.setMessage(ldlConfig.getEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getEntitiesLightSource().set(!ldlConfig.getEntitiesLightSource().get()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.empty().append("DynLights: ").append(Text.translatable("entity.minecraft.creeper")), (button) -> button.setMessage(ldlConfig.getCreeperLightingMode().getTranslatedText()), (button) -> ldlConfig.setCreeperLightingMode(ldlConfig.getCreeperLightingMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.empty().append("DynLights: ").append(Text.translatable("block.minecraft.tnt")), (button) -> button.setMessage(ldlConfig.getTntLightingMode().getTranslatedText()), (button) -> ldlConfig.setTntLightingMode(ldlConfig.getTntLightingMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.empty().append("DynLights: ").append(Text.translatable("lambdynlights.option.light_sources.water_sensitive_check")), (button) -> button.setMessage(ldlConfig.getWaterSensitiveCheck().get() ? YES : NO), (button) -> ldlConfig.getWaterSensitiveCheck().set(!ldlConfig.getWaterSensitiveCheck().get()))); - } -} diff --git a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java b/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java deleted file mode 100755 index e7e349b..0000000 --- a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.puzzlemc.gui.screen.widget; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.text.Text; - -public class PuzzleTextFieldWidget extends TextFieldWidget { - private final PuzzleWidget.SetTextValueAction setValueAction; - private final PuzzleWidget.ChangeTextValueAction change; - - public PuzzleTextFieldWidget(TextRenderer textRenderer, int x, int y, int width, int height, PuzzleWidget.SetTextValueAction setValue, PuzzleWidget.ChangeTextValueAction change) { - super(textRenderer, x, y, width, height, Text.of("")); - this.setValueAction = setValue; - this.change = change; - try { - setValueAction.setTextValue(this); - } catch (Exception e) {e.fillInStackTrace(); this.setVisible(false);} - } - @Override - public void write(String text) { - super.write(text); - this.change.onChange(this); - setValueAction.setTextValue(this); - } -} diff --git a/common/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java b/common/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java deleted file mode 100755 index 241750f..0000000 --- a/common/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java +++ /dev/null @@ -1,106 +0,0 @@ -package net.puzzlemc.splashscreen.mixin; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.RenderPipelines; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Overlay; -import net.minecraft.client.gui.screen.SplashOverlay; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.NativeImageBackedTexture; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; -import net.minecraft.util.math.ColorHelper; -import net.minecraft.util.math.MathHelper; -import net.puzzlemc.core.config.PuzzleConfig; -import net.puzzlemc.splashscreen.PuzzleSplashScreen; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.util.function.IntSupplier; - -import static net.puzzlemc.splashscreen.PuzzleSplashScreen.BACKGROUND; - -@Mixin(value = SplashOverlay.class, priority = 2000) -public abstract class MixinSplashScreen extends Overlay { - @Shadow @Final public static Identifier LOGO; - @Shadow private long reloadCompleteTime; - @Shadow @Final private MinecraftClient client; - @Shadow @Final private boolean reloading; - @Shadow private long reloadStartTime; - @Shadow - private static int withAlpha(int color, int alpha) { - return 0; - } - - @Inject(method = "init", at = @At("TAIL")) - private static void puzzle$initSplashscreen(TextureManager textureManager, CallbackInfo ci) { // Load our custom textures at game start // - if (PuzzleConfig.resourcepackSplashScreen) { - if (PuzzleSplashScreen.LOGO_TEXTURE.toFile().exists()) { - textureManager.registerTexture(LOGO, new PuzzleSplashScreen.DynamicLogoTexture()); - } - if (PuzzleSplashScreen.BACKGROUND_TEXTURE.toFile().exists()) { - try { - InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.BACKGROUND_TEXTURE)); - textureManager.registerTexture(BACKGROUND, new NativeImageBackedTexture(() -> "splash_screen_background", NativeImage.read(input))); - } catch (IOException ignored) {} - } - } - } - - @Redirect(method = "render", at = @At(value = "INVOKE", target = "Ljava/util/function/IntSupplier;getAsInt()I")) - private int puzzle$modifyBackground(IntSupplier instance) { // Set the Progress Bar Frame Color to our configured value // - return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) ? instance.getAsInt() : PuzzleConfig.backgroundColor | 255 << 24; - } - - @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTexture(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/util/Identifier;IIFFIIIIIII)V")) - private void puzzle$modifyRenderLayer(DrawContext instance, RenderPipeline pipeline, Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWidth, int regionHeight, int textureWidth, int textureHeight, int color, Operation original) { - if (PuzzleConfig.resourcepackSplashScreen) - instance.drawTexture(PuzzleSplashScreen.getCustomLogoRenderPipeline(), sprite, x, y, u, v, width, height, regionWidth, regionHeight, textureWidth, textureHeight, color); - else instance.drawTexture(pipeline, sprite, x, y, u, v, width, height, textureWidth, textureHeight, color); - } - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;getScaledWindowWidth()I", ordinal = 2)) - private void puzzle$renderSplashBackground(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (Files.exists(PuzzleSplashScreen.BACKGROUND_TEXTURE) && PuzzleConfig.resourcepackSplashScreen) { - int width = client.getWindow().getScaledWidth(); - int height = client.getWindow().getScaledHeight(); - long l = Util.getMeasuringTimeMs(); - float f = this.reloadCompleteTime > -1L ? (float)(l - this.reloadCompleteTime) / 1000.0F : -1.0F; - float g = this.reloadStartTime> -1L ? (float)(l - this.reloadStartTime) / 500.0F : -1.0F; - float s; - if (f >= 1.0F) s = 1.0F - MathHelper.clamp(f - 1.0F, 0.0F, 1.0F); - else if (reloading) s = MathHelper.clamp(g, 0.0F, 1.0F); - else s = 1.0F; - context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND, 0, 0, 0, 0, width, height, width, height, ColorHelper.getWhite(s)); - } - } - - @Inject(method = "renderProgressBar", at = @At("HEAD")) - private void puzzle$addProgressBarBackground(DrawContext context, int minX, int minY, int maxX, int maxY, float opacity, CallbackInfo ci) { - if (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) return; - long l = Util.getMeasuringTimeMs(); - float f = this.reloadCompleteTime > -1L ? (float)(l - this.reloadCompleteTime) / 1000.0F : -1.0F; - int m = MathHelper.ceil((1.0F - MathHelper.clamp(f - 1.0F, 0.0F, 1.0F)) * 255.0F); - context.fill(minX, minY, maxX, maxY, withAlpha(PuzzleConfig.progressBarBackgroundColor, m)); - } - - @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fill(IIIII)V"), index = 4) - private int puzzle$modifyProgressFrame(int color) { // Set the Progress Bar Frame Color to our configured value // - return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressFrameColor == 16777215) ? color : PuzzleConfig.progressFrameColor | 255 << 24; - } - @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fill(IIIII)V", ordinal = 0), index = 4) - private int puzzle$modifyProgressColor(int color) { // Set the Progress Bar Color to our configured value // - return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarColor == 16777215) ? color : PuzzleConfig.progressBarColor | 255 << 24; - } -} diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index 572350f..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,109 +0,0 @@ -plugins { - id 'com.github.johnrengelman.shadow' - id "me.shedaniel.unified-publishing" -} -repositories { - maven { url "https://maven.terraformersmc.com/releases" } -} - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common - archivesBaseName = rootProject.archives_base_name + "-fabric" - version = rootProject.mod_version + "+" + rootProject.minecraft_version -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - modImplementation include ("maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric") - - modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") { - exclude(group: "net.fabricmc.fabric-api") - } - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} - -processResources { - inputs.property "version", rootProject.version - - filesMatching("fabric.mod.json") { - expand "version": rootProject.version - } -} - -shadowJar { - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -unifiedPublishing { - project { - displayName = "Puzzle $rootProject.version - Fabric $project.minecraft_version" - releaseType = "$project.release_type" - changelog = releaseChangelog() - gameVersions = [] - gameLoaders = ["fabric","quilt"] - mainPublication remapJar - relations { - depends { - curseforge = "fabric-api" - modrinth = "fabric-api" - } - includes { - curseforge = "midnightlib" - modrinth = "midnightlib" - } - } - - var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN") - if (CURSEFORGE_TOKEN != null) { - curseforge { - token = CURSEFORGE_TOKEN - id = rootProject.curseforge_id - gameVersions.addAll "Java 21", project.minecraft_version - if (project.supported_versions != "") gameVersions.addAll project.supported_versions - } - } - - var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN") - if (MODRINTH_TOKEN != null) { - modrinth { - token = MODRINTH_TOKEN - id = rootProject.modrinth_id - version = "$rootProject.version-$project.name" - gameVersions.addAll project.minecraft_version - if (project.supported_versions != "") gameVersions.addAll project.supported_versions - } - } - } -} \ No newline at end of file diff --git a/fabric/src/main/java/net/puzzlemc/fabric/PuzzleFabric.java b/fabric/src/main/java/net/puzzlemc/fabric/PuzzleFabric.java deleted file mode 100644 index 647504e..0000000 --- a/fabric/src/main/java/net/puzzlemc/fabric/PuzzleFabric.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.puzzlemc.fabric; - -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.resource.ResourceManagerHelper; -import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resource.ResourceType; -import net.minecraft.util.Identifier; -import net.puzzlemc.core.PuzzleCore; -import net.puzzlemc.splashscreen.PuzzleSplashScreen; - -public class PuzzleFabric implements ClientModInitializer { - @Override - public void onInitializeClient() { - PuzzleCore.initModules(); - - ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(new SimpleSynchronousResourceReloadListener() { - @Override - public Identifier getFabricId() { - return Identifier.of("puzzle", "splash_screen"); - } - @Override - public void reload(ResourceManager manager) { - PuzzleSplashScreen.ReloadListener.INSTANCE.reload(manager); - } - }); - } -} diff --git a/fabric/src/main/java/net/puzzlemc/fabric/modmenu/ModMenuIntegration.java b/fabric/src/main/java/net/puzzlemc/fabric/modmenu/ModMenuIntegration.java deleted file mode 100644 index 777d57c..0000000 --- a/fabric/src/main/java/net/puzzlemc/fabric/modmenu/ModMenuIntegration.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.puzzlemc.fabric.modmenu; - -import com.terraformersmc.modmenu.api.ConfigScreenFactory; -import com.terraformersmc.modmenu.api.ModMenuApi; -import net.puzzlemc.gui.screen.PuzzleOptionsScreen; - -public class ModMenuIntegration implements ModMenuApi { - @Override - public ConfigScreenFactory getModConfigScreenFactory() { - return PuzzleOptionsScreen::new; - } -} diff --git a/gradle.properties b/gradle.properties old mode 100755 new mode 100644 index d764bda..21f6058 --- a/gradle.properties +++ b/gradle.properties @@ -1,47 +1,59 @@ # Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx2G +org.gradle.jvmargs=-Xmx3G +#org.gradle.parallel=true +org.gradle.caching=false +org.gradle.caching.debug=false +org.gradle.parallel=false +#org.gradle.configureondemand=true -minecraft_version=1.21.9 -supported_versions= -yarn_mappings=1.21.9+build.1 -enabled_platforms=fabric,neoforge +# Mod properties +mod.version=2.2.0 +mod.group=eu.midnightdust +mod.id=puzzle +mod.name=Puzzle -# Mod Properties -mod_version = 2.1.2 -maven_group = net.puzzlemc -archives_base_name = puzzle -release_type=release -curseforge_id=563977 -modrinth_id=3IuO68q1 +# Used for the mod metadata +mod.mc_dep_fabric=[VERSIONED] +mod.mc_dep_forgelike=[VERSIONED] +# Used for the release title. I.e. '1.20.x' +mod.mc_title=[VERSIONED] +# Space separated versions for publishing. I.e. '1.20, 1.20.1' +mod.mc_targets=[VERSIONED] -# Modloaders -fabric_loader_version=0.17.2 -fabric_api_version=0.133.14+1.21.9 +# Mod setup +deps.fabric_loader=0.17.3 +deps.fabric_version=[VERSIONED] -neoforge_version=21.9.3-beta -yarn_mappings_patch_neoforge_version = 1.21+build.4 +deps.forge_loader=[VERSIONED] +deps.neoforge_loader=[VERSIONED] +deps.neoforge_patch=[VERSIONED] -# Libraries -midnightlib_version = 1.8.1+1.21.9 -modmenu_version = 15.0.0-beta.1 +# Mod dependencies +deps.yarn_build=[VERSIONED] +deps.modmenu_version=[VERSIONED] +deps.midnightlib_version=1.9.0-alpha.1 -# Mod Integrations -cull_leaves_version = 3.0.2-fabric -ldl_version = 4.0.0+1.21.4 -lbg_version = 1.5.2+1.20.1 -iris_version = 1.8.0-beta.3+1.21-fabric -continuity_version = 3.0.0-beta.5+1.21 -animatica_version = 0.6.1+1.21 -colormatic_version = 3.1.2 -borderless_mining_version = 1.1.8+1.20.1 -dynamic_fps_version = 3.6.3 -toml4j_version = 0.7.2 -cit_resewn_version = 1.1.3+1.20 -complete_config_version = 2.3.0 -spruceui_version=5.0.0+1.20 -emf_version=2.4.1 -etf_version=6.2.10 -exordium_version=1.2.1-1.20.2 +# Mod integrations +jigsaws.cull_leaves_version = 3.0.2-fabric +jigsaws.ldl_version = 4.0.0+1.21.4 +jigsaws.lbg_version = 1.5.2+1.20.1 +jigsaws.iris_version = 1.8.0-beta.3+1.21-fabric +jigsaws.continuity_version = 3.0.0-beta.5+1.21 +jigsaws.animatica_version = 0.6.1+1.21 +jigsaws.colormatic_version = 3.1.2 +jigsaws.borderless_mining_version = 1.1.8+1.20.1 +jigsaws.dynamic_fps_version = 3.6.3 +jigsaws.toml4j_version = 0.7.2 +jigsaws.cit_resewn_version = 1.1.3+1.20 +jigsaws.complete_config_version = 2.3.0 +jigsaws.spruceui_version=5.0.0+1.20 +jigsaws.emf_version=2.4.1 +jigsaws.etf_version=6.2.10 +jigsaws.exordium_version=1.2.1-1.20.2 # Required for LBG -quilt_loader_version=0.19.0-beta.18 -quilt_fabric_api_version=7.0.1+0.83.0-1.20 +jigsaws.quilt_loader_version=0.19.0-beta.18 +jigsaws.quilt_fabric_api_version=7.0.1+0.83.0-1.20 + +# Publishing +publish.modrinth=3IuO68q1 +publish.curseforge=563977 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2733ed5..3ae1e2f 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle deleted file mode 100644 index 33ada1d..0000000 --- a/neoforge/build.gradle +++ /dev/null @@ -1,115 +0,0 @@ -plugins { - id 'com.github.johnrengelman.shadow' - id "me.shedaniel.unified-publishing" -} - -repositories { - maven { - name = 'NeoForged' - url = 'https://maven.neoforged.net/releases' - } -} - - -architectury { - platformSetupLoomIde() - neoForge() -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - -configurations { - common { - canBeResolved = true - canBeConsumed = false - } - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common - - // Files in this configuration will be bundled into your mod using the Shadow plugin. - // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. - shadowBundle { - canBeResolved = true - canBeConsumed = false - } - archivesBaseName = rootProject.archives_base_name + "-neoforge" - version = rootProject.mod_version + "+" + rootProject.minecraft_version -} - -dependencies { - neoForge "net.neoforged:neoforge:$rootProject.neoforge_version" - modImplementation ("maven.modrinth:midnightlib:${rootProject.midnightlib_version}-neoforge") - - common(project(path: ':common', configuration: 'namedElements')) { transitive false } - shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge') -} - -processResources { - inputs.property 'version', rootProject.version - - filesMatching('META-INF/neoforge.mods.toml') { - expand version: rootProject.version - } -} - -shadowJar { - configurations = [project.configurations.shadowBundle] - archiveClassifier = 'dev-shadow' -} - -remapJar { - input.set shadowJar.archiveFile -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -unifiedPublishing { - project { - displayName = "Puzzle $rootProject.version - NeoForge $project.minecraft_version" - releaseType = "alpha" - changelog = releaseChangelog() - gameVersions = [] - gameLoaders = ["neoforge"] - mainPublication remapJar - relations { - depends { - curseforge = "midnightlib" - modrinth = "midnightlib" - } - } - - var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN") - if (CURSEFORGE_TOKEN != null) { - curseforge { - token = CURSEFORGE_TOKEN - id = rootProject.curseforge_id - gameVersions.addAll "Java 21", project.minecraft_version - if (project.supported_versions != "") gameVersions.addAll project.supported_versions - } - } - - var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN") - if (MODRINTH_TOKEN != null) { - modrinth { - token = MODRINTH_TOKEN - id = rootProject.modrinth_id - version = "$rootProject.version-$project.name" - gameVersions.addAll project.minecraft_version - if (project.supported_versions != "") gameVersions.addAll project.supported_versions - } - } - } -} diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties deleted file mode 100644 index 2914393..0000000 --- a/neoforge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=neoforge \ No newline at end of file diff --git a/neoforge/src/main/java/net/puzzlemc/neoforge/PuzzleNeoForge.java b/neoforge/src/main/java/net/puzzlemc/neoforge/PuzzleNeoForge.java deleted file mode 100644 index 6a7002a..0000000 --- a/neoforge/src/main/java/net/puzzlemc/neoforge/PuzzleNeoForge.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.puzzlemc.neoforge; - -import net.minecraft.util.Identifier; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.ModList; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.client.event.AddClientReloadListenersEvent; -import net.neoforged.neoforge.client.gui.IConfigScreenFactory; -import net.puzzlemc.core.PuzzleCore; -import net.puzzlemc.gui.screen.PuzzleOptionsScreen; -import net.puzzlemc.splashscreen.PuzzleSplashScreen; - -import static net.puzzlemc.core.PuzzleCore.MOD_ID; - -@Mod(value = MOD_ID, dist = Dist.CLIENT) -public class PuzzleNeoForge { - public PuzzleNeoForge() { - PuzzleCore.initModules(); - ModList.get().getModContainerById(MOD_ID).orElseThrow().registerExtensionPoint(IConfigScreenFactory.class, (client, parent) -> new PuzzleOptionsScreen(parent)); - } - - @EventBusSubscriber(modid = MOD_ID, value = Dist.CLIENT) - public static class MidnightLibBusEvents { - @SubscribeEvent - public static void onResourceReload(AddClientReloadListenersEvent event) { - event.addListener(Identifier.of(MOD_ID, "splash_screen"), PuzzleSplashScreen.ReloadListener.INSTANCE); - } - } -} diff --git a/neoforge/src/main/java/net/puzzlemc/neoforge/mixin/splashscreen/MixinNeoForgeLoadingOverlay.java b/neoforge/src/main/java/net/puzzlemc/neoforge/mixin/splashscreen/MixinNeoForgeLoadingOverlay.java deleted file mode 100644 index c19d29b..0000000 --- a/neoforge/src/main/java/net/puzzlemc/neoforge/mixin/splashscreen/MixinNeoForgeLoadingOverlay.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.puzzlemc.neoforge.mixin.splashscreen; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.SplashOverlay; -import net.minecraft.resource.ResourceReload; -import net.neoforged.neoforge.client.loading.NeoForgeLoadingOverlay; -import net.puzzlemc.core.config.PuzzleConfig; -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; - -import java.util.Optional; -import java.util.function.Consumer; - -@Mixin(NeoForgeLoadingOverlay.class) -public class MixinNeoForgeLoadingOverlay extends SplashOverlay { - public MixinNeoForgeLoadingOverlay(MinecraftClient client, ResourceReload monitor, Consumer> exceptionHandler, boolean reloading) { - super(client, monitor, exceptionHandler, reloading); - } - - @Inject(method = "render", at = @At("HEAD"), cancellable = true) // Replaces the NeoForge loading screen in later stages with the (customized) vanilla version - private void redirectNeoForgeLoading(DrawContext context, int mouseX, int mouseY, float tickDelta, CallbackInfo ci) { - if (PuzzleConfig.resourcepackSplashScreen && PuzzleConfig.hasCustomSplashScreen) { - super.render(context, mouseX, mouseY, tickDelta); - ci.cancel(); - } - } -} diff --git a/settings.gradle b/settings.gradle deleted file mode 100755 index 3041029..0000000 --- a/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } - maven { url "https://maven.neoforged.net/releases" } - gradlePluginPortal() - } -} - -include("common") -include("fabric") -include("neoforge") -//include("quilt") - -rootProject.name = "puzzle" diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..3cf6caa --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,33 @@ +pluginManagement { + repositories { + 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") + } +} + +plugins { + id("dev.kikugie.stonecutter") version "0.7" +} + +stonecutter { + centralScript = "build.gradle.kts" + kotlinController = true + shared { + fun mc(loader: String, vararg versions: String) { + for (version in versions) vers("$version-$loader", version) + } + //i would recommend to use neoforge for mc > 1.20.1, i haven't tested template for forge on versions higher than that + mc("fabric","1.20.1", "1.21.1", "1.21.5", "1.21.8", "1.21.10") + mc("forge","1.20.1") + //WARNING: neoforge uses mods.toml instead of neoforge.mods.toml for versions 1.20.4 (?) and earlier + mc("neoforge", "1.21.1", "1.21.5", "1.21.8", "1.21.10") + } + create(rootProject) +} + +rootProject.name = "Puzzle" \ No newline at end of file diff --git a/src/main/java/net/puzzlemc/core/PuzzleClient.java b/src/main/java/net/puzzlemc/core/PuzzleClient.java new file mode 100644 index 0000000..71be9b1 --- /dev/null +++ b/src/main/java/net/puzzlemc/core/PuzzleClient.java @@ -0,0 +1,48 @@ +package net.puzzlemc.core; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.resource.v1.ResourceLoader; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.puzzlemc.gui.screen.PuzzleOptionsScreen; +import net.puzzlemc.splashscreen.PuzzleSplashScreen; + +import static net.puzzlemc.core.PuzzleCore.MOD_ID; + +//? fabric { +public class PuzzleClient implements ClientModInitializer, ModMenuApi { + + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return PuzzleOptionsScreen::new; + } + + @Override + public void onInitializeClient() { + PuzzleCore.initModules(); + + //ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(ResourceLocation.fromNamespaceAndPath(MOD_ID, "splash_screen"), PuzzleSplashScreen.ReloadListener.INSTANCE); + } +} +//?} + +//? neoforge { +// @Mod(value = MOD_ID, dist = Dist.CLIENT) +// public class PuzzleClient { +// public PuzzleClient() { +// PuzzleCore.initModules(); +// ModList.get().getModContainerById(MOD_ID).orElseThrow().registerExtensionPoint(IConfigScreenFactory.class, (client, parent) -> new PuzzleOptionsScreen(parent)); +// } +// +// @EventBusSubscriber(modid = MOD_ID, value = Dist.CLIENT) +// public static class MidnightLibBusEvents { +// @SubscribeEvent +// public static void onResourceReload(AddClientReloadListenersEvent event) { +// event.addListener(ResourceLocation.of(MOD_ID, "splash_screen"), PuzzleSplashScreen.ReloadListener.INSTANCE); +// } +// } +// } + //?} \ No newline at end of file diff --git a/common/src/main/java/net/puzzlemc/core/PuzzleCore.java b/src/main/java/net/puzzlemc/core/PuzzleCore.java old mode 100755 new mode 100644 similarity index 100% rename from common/src/main/java/net/puzzlemc/core/PuzzleCore.java rename to src/main/java/net/puzzlemc/core/PuzzleCore.java diff --git a/common/src/main/java/net/puzzlemc/core/config/PuzzleConfig.java b/src/main/java/net/puzzlemc/core/config/PuzzleConfig.java old mode 100755 new mode 100644 similarity index 100% rename from common/src/main/java/net/puzzlemc/core/config/PuzzleConfig.java rename to src/main/java/net/puzzlemc/core/config/PuzzleConfig.java diff --git a/common/src/main/java/net/puzzlemc/gui/PuzzleApi.java b/src/main/java/net/puzzlemc/gui/PuzzleApi.java old mode 100755 new mode 100644 similarity index 88% rename from common/src/main/java/net/puzzlemc/gui/PuzzleApi.java rename to src/main/java/net/puzzlemc/gui/PuzzleApi.java index 1391c39..0b8d6f5 --- a/common/src/main/java/net/puzzlemc/gui/PuzzleApi.java +++ b/src/main/java/net/puzzlemc/gui/PuzzleApi.java @@ -17,21 +17,21 @@ public class PuzzleApi { public static void addToGraphicsOptions(PuzzleWidget button) { GRAPHICS_OPTIONS.add(button); if (PuzzleConfig.debugMessages) - LOGGER.info("{} -> Graphics Options", button.descriptionText.getContent().toString()); + LOGGER.info("{} -> Graphics Options", button.descriptionText.getContents().toString()); } public static void addToMiscOptions(PuzzleWidget button) { MISC_OPTIONS.add(button); if (PuzzleConfig.debugMessages) - LOGGER.info("{} -> Misc Options", button.descriptionText.getContent().toString()); + LOGGER.info("{} -> Misc Options", button.descriptionText.getContents().toString()); } public static void addToPerformanceOptions(PuzzleWidget button) { PERFORMANCE_OPTIONS.add(button); if (PuzzleConfig.debugMessages) - LOGGER.info("{}- > Performance Options", button.descriptionText.getContent().toString()); + LOGGER.info("{}- > Performance Options", button.descriptionText.getContents().toString()); } public static void addToResourceOptions(PuzzleWidget button) { RESOURCE_OPTIONS.add(button); if (PuzzleConfig.debugMessages) - LOGGER.info("{} -> Resource Options", button.descriptionText.getContent().toString()); + LOGGER.info("{} -> Resource Options", button.descriptionText.getContents().toString()); } } diff --git a/src/main/java/net/puzzlemc/gui/PuzzleGui.java b/src/main/java/net/puzzlemc/gui/PuzzleGui.java new file mode 100644 index 0000000..022a8c0 --- /dev/null +++ b/src/main/java/net/puzzlemc/gui/PuzzleGui.java @@ -0,0 +1,67 @@ +package net.puzzlemc.gui; + +import eu.midnightdust.core.MidnightLib; +import eu.midnightdust.lib.util.PlatformFunctions; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.puzzlemc.core.config.PuzzleConfig; +import net.puzzlemc.gui.compat.*; +import net.puzzlemc.gui.screen.widget.PuzzleWidget; +import net.minecraft.client.Minecraft; +import net.puzzlemc.splashscreen.PuzzleSplashScreen; + +import static net.puzzlemc.core.PuzzleCore.LOGGER; +import static net.puzzlemc.core.PuzzleCore.MOD_ID; + +public class PuzzleGui { + public static final Component YES = Component.translatable("gui.yes").withStyle(ChatFormatting.GREEN); + public static final Component NO = Component.translatable("gui.no").withStyle(ChatFormatting.RED); + public static final ResourceLocation PUZZLE_BUTTON = ResourceLocation.fromNamespaceAndPath(MOD_ID, "icon/button"); + + public static void init() { + MidnightLib.hiddenMods.add(MOD_ID); + PuzzleApi.addToMiscOptions(new PuzzleWidget(Component.literal("\uD83E\uDDE9 Puzzle"))); + PuzzleApi.addToMiscOptions(new PuzzleWidget(Component.translatable("puzzle.midnightconfig.title"), (button) -> button.setMessage(Component.literal("OPEN")), (button) -> { + Minecraft.getInstance().setScreen(PuzzleConfig.getScreen(Minecraft.getInstance().screen, MOD_ID)); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.literal("\uD83E\uDDE9 Puzzle"))); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("puzzle.option.resourcepack_splash_screen"), (button) -> button.setMessage(PuzzleConfig.resourcepackSplashScreen ? YES : NO), (button) -> { + PuzzleConfig.resourcepackSplashScreen = !PuzzleConfig.resourcepackSplashScreen; + PuzzleSplashScreen.resetColors(); + PuzzleConfig.write(MOD_ID); + Minecraft.getInstance().getTextureManager().registerAndLoad(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture(PuzzleSplashScreen.LOGO)); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("puzzle.option.unlimited_model_rotations"), (button) -> button.setMessage(PuzzleConfig.unlimitedRotations ? YES : NO), (button) -> { + PuzzleConfig.unlimitedRotations = !PuzzleConfig.unlimitedRotations; + PuzzleConfig.write(MOD_ID); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("puzzle.option.bigger_custom_models"), (button) -> button.setMessage(PuzzleConfig.biggerModels ? YES : NO), (button) -> { + PuzzleConfig.biggerModels = !PuzzleConfig.biggerModels; + PuzzleConfig.write(MOD_ID); + })); + if (isActive("cullleaves")) CullLeavesCompat.init(); + if (isActive("colormatic")) ColormaticCompat.init(); + if (isActive("borderlessmining")) BorderlessMiningCompat.init(); + if (isActive("iris")) IrisCompat.init(); + } + + public static boolean lateInitDone = false; + public static void lateInit() { // Some mods are initialized after Puzzle, so we can't access them in our ClientModInitializer + if (isActive("lambdynlights")) LDLCompat.init(); + if (isActive("citresewn")) CITRCompat.init(); + if (isActive("lambdabettergrass")) LBGCompat.init(); + if (isActive("continuity")) ContinuityCompat.init(); + try { + if (isActive("entity_Componenture_features")) ETFCompat.init(); + if (isActive("entity_model_features")) EMFCompat.init(); + } catch (Exception e) { + LOGGER.error("ETF/EMF config structure changed. Again...", e); + } + + lateInitDone = true; + } + public static boolean isActive(String modid) { + return PlatformFunctions.isModLoaded(modid) && !PuzzleConfig.disabledIntegrations.contains(modid); + } +} diff --git a/common/src/main/java/net/puzzlemc/gui/compat/BorderlessMiningCompat.java b/src/main/java/net/puzzlemc/gui/compat/BorderlessMiningCompat.java similarity index 58% rename from common/src/main/java/net/puzzlemc/gui/compat/BorderlessMiningCompat.java rename to src/main/java/net/puzzlemc/gui/compat/BorderlessMiningCompat.java index 2b342b5..44f2dd2 100644 --- a/common/src/main/java/net/puzzlemc/gui/compat/BorderlessMiningCompat.java +++ b/src/main/java/net/puzzlemc/gui/compat/BorderlessMiningCompat.java @@ -2,8 +2,7 @@ package net.puzzlemc.gui.compat; import com.mojang.text2speech.OperatingSystem; import link.infra.borderlessmining.config.ConfigHandler; -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.screen.widget.PuzzleWidget; @@ -12,14 +11,14 @@ import static net.puzzlemc.gui.PuzzleGui.YES; public class BorderlessMiningCompat { public static void init() { - PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("\uD83E\uDE9F Borderless Mining"))); + PuzzleApi.addToMiscOptions(new PuzzleWidget(Component.literal("\uD83E\uDE9F Borderless Mining"))); ConfigHandler bmConfig = ConfigHandler.getInstance(); - PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("config.borderlessmining.general.enabled"), (button) -> button.setMessage(bmConfig.isEnabledOrPending() ? YES : NO), (button) -> { + PuzzleApi.addToMiscOptions(new PuzzleWidget(Component.translatable("config.borderlessmining.general.enabled"), (button) -> button.setMessage(bmConfig.isEnabledOrPending() ? YES : NO), (button) -> { bmConfig.setEnabledPending(!bmConfig.isEnabledOrPending()); bmConfig.save(); })); if (OperatingSystem.get() == OperatingSystem.MAC_OS) { - PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("config.borderlessmining.general.enabledmac"), (button) -> button.setMessage(bmConfig.enableMacOS ? YES : NO), (button) -> { + PuzzleApi.addToMiscOptions(new PuzzleWidget(Component.translatable("config.borderlessmining.general.enabledmac"), (button) -> button.setMessage(bmConfig.enableMacOS ? YES : NO), (button) -> { bmConfig.enableMacOS = !bmConfig.enableMacOS; bmConfig.setEnabledPending(bmConfig.isEnabled()); bmConfig.save(); diff --git a/src/main/java/net/puzzlemc/gui/compat/CITRCompat.java b/src/main/java/net/puzzlemc/gui/compat/CITRCompat.java new file mode 100644 index 0000000..e06caf7 --- /dev/null +++ b/src/main/java/net/puzzlemc/gui/compat/CITRCompat.java @@ -0,0 +1,60 @@ +package net.puzzlemc.gui.compat; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.puzzlemc.gui.PuzzleApi; +import net.puzzlemc.gui.screen.widget.PuzzleWidget; +import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig; + +import static net.minecraft.network.chat.CommonComponents.GUI_NO; +import static net.minecraft.network.chat.CommonComponents.GUI_YES; + +public class CITRCompat { + public static void init() { + if (CITResewnConfig.INSTANCE != null) { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.literal("⛏ CIT Resewn"))); + CITResewnConfig citConfig = CITResewnConfig.INSTANCE; + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.citresewn.enabled.title"), (button) -> button.setMessage(citConfig.enabled ? GUI_YES : GUI_NO), (button) -> { + citConfig.enabled = !citConfig.enabled; + citConfig.write(); + Minecraft.getInstance().reloadResourcePacks(); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.citresewn.mute_errors.title"), (button) -> button.setMessage(citConfig.mute_errors ? GUI_YES : GUI_NO), (button) -> { + citConfig.mute_errors = !citConfig.mute_errors; + citConfig.write(); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.citresewn.mute_warns.title"), (button) -> button.setMessage(citConfig.mute_warns ? GUI_YES : GUI_NO), (button) -> { + citConfig.mute_warns = !citConfig.mute_warns; + citConfig.write(); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.citresewn.broken_paths.title"), (button) -> button.setMessage(citConfig.broken_paths ? GUI_YES : GUI_NO), (button) -> { + citConfig.broken_paths = !citConfig.broken_paths; + citConfig.write(); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100, Component.translatable("config.citresewn.cache_ms.title"), () -> citConfig.cache_ms, + (button) -> button.setMessage(message(citConfig)), + (slider) -> { + try { + citConfig.cache_ms = slider.getInt(); + } catch (NumberFormatException ignored) { + } + citConfig.write(); + })); + } + } + public static Component message(CITResewnConfig config) { + int ticks = config.cache_ms; + if (ticks <= 1) { + return (Component.translatable("config.citresewn.cache_ms.ticks." + ticks)).withStyle(ChatFormatting.AQUA); + } else { + ChatFormatting color = ChatFormatting.DARK_RED; + if (ticks <= 40) color = ChatFormatting.RED; + if (ticks <= 20) color = ChatFormatting.GOLD; + if (ticks <= 10) color = ChatFormatting.DARK_GREEN; + if (ticks <= 5) color = ChatFormatting.GREEN; + + return (Component.translatable("config.citresewn.cache_ms.ticks.any", ticks)).withStyle(color); + } + } +} diff --git a/common/src/main/java/net/puzzlemc/gui/compat/ColormaticCompat.java b/src/main/java/net/puzzlemc/gui/compat/ColormaticCompat.java similarity index 55% rename from common/src/main/java/net/puzzlemc/gui/compat/ColormaticCompat.java rename to src/main/java/net/puzzlemc/gui/compat/ColormaticCompat.java index 0039ded..d9d64cc 100644 --- a/common/src/main/java/net/puzzlemc/gui/compat/ColormaticCompat.java +++ b/src/main/java/net/puzzlemc/gui/compat/ColormaticCompat.java @@ -3,7 +3,7 @@ package net.puzzlemc.gui.compat; import io.github.kvverti.colormatic.Colormatic; import io.github.kvverti.colormatic.ColormaticConfig; import io.github.kvverti.colormatic.ColormaticConfigController; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.screen.widget.PuzzleWidget; @@ -12,29 +12,29 @@ import static net.puzzlemc.gui.PuzzleGui.YES; public class ColormaticCompat { public static void init() { - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("\uD83C\uDF08 Colormatic"))); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.literal("\uD83C\uDF08 Colormatic"))); ColormaticConfig colormaticConfig = Colormatic.config(); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.clearSky"), (button) -> button.setMessage(colormaticConfig.clearSky ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("colormatic.config.option.clearSky"), (button) -> button.setMessage(colormaticConfig.clearSky ? YES : NO), (button) -> { colormaticConfig.clearSky = !colormaticConfig.clearSky; ColormaticConfigController.persist(colormaticConfig); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.clearVoid"), (button) -> button.setMessage(colormaticConfig.clearVoid ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("colormatic.config.option.clearVoid"), (button) -> button.setMessage(colormaticConfig.clearVoid ? YES : NO), (button) -> { colormaticConfig.clearVoid = !colormaticConfig.clearVoid; ColormaticConfigController.persist(colormaticConfig); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.blendSkyLight"), (button) -> button.setMessage(colormaticConfig.blendSkyLight ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("colormatic.config.option.blendSkyLight"), (button) -> button.setMessage(colormaticConfig.blendSkyLight ? YES : NO), (button) -> { colormaticConfig.blendSkyLight = !colormaticConfig.blendSkyLight; ColormaticConfigController.persist(colormaticConfig); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.flickerBlockLight"), (button) -> button.setMessage(colormaticConfig.flickerBlockLight ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("colormatic.config.option.flickerBlockLight"), (button) -> button.setMessage(colormaticConfig.flickerBlockLight ? YES : NO), (button) -> { colormaticConfig.flickerBlockLight = !colormaticConfig.flickerBlockLight; ColormaticConfigController.persist(colormaticConfig); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100, Text.translatable("colormatic.config.option.relativeBlockLightIntensity"), + PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100, Component.translatable("colormatic.config.option.relativeBlockLightIntensity"), () -> (int) (100*(1.0 - colormaticConfig.relativeBlockLightIntensityExponent / -16.0)), - (button) -> button.setMessage(Text.translatable("colormatic.config.option.relativeBlockLightIntensity") + (button) -> button.setMessage(Component.translatable("colormatic.config.option.relativeBlockLightIntensity") .append(": ") - .append(Text.literal(String.valueOf((int)(100 * Math.exp(ColormaticConfig.scaled(colormaticConfig.relativeBlockLightIntensityExponent))))).append("%"))), + .append(Component.literal(String.valueOf((int)(100 * Math.exp(ColormaticConfig.scaled(colormaticConfig.relativeBlockLightIntensityExponent))))).append("%"))), (slider) -> { try { colormaticConfig.relativeBlockLightIntensityExponent = ((1.00 - ((slider.getInt())/100f)) * -16.0); diff --git a/common/src/main/java/net/puzzlemc/gui/compat/ContinuityCompat.java b/src/main/java/net/puzzlemc/gui/compat/ContinuityCompat.java similarity index 77% rename from common/src/main/java/net/puzzlemc/gui/compat/ContinuityCompat.java rename to src/main/java/net/puzzlemc/gui/compat/ContinuityCompat.java index 911b323..d0751f5 100644 --- a/common/src/main/java/net/puzzlemc/gui/compat/ContinuityCompat.java +++ b/src/main/java/net/puzzlemc/gui/compat/ContinuityCompat.java @@ -2,7 +2,7 @@ package net.puzzlemc.gui.compat; import me.pepperbell.continuity.client.config.ContinuityConfig; import me.pepperbell.continuity.client.config.Option; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.screen.widget.PuzzleWidget; @@ -11,13 +11,13 @@ import static net.puzzlemc.gui.PuzzleGui.YES; public class ContinuityCompat { public static void init() { - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("▒ Continuity"))); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.literal("▒ Continuity"))); ContinuityConfig contConfig = ContinuityConfig.INSTANCE; contConfig.getOptionMapView().forEach((s, option) -> { if (s.equals("use_manual_culling")) return; try { Option.BooleanOption booleanOption = ((Option.BooleanOption)option); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("options.continuity."+s), (button) -> button.setMessage(booleanOption.get() ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("options.continuity."+s), (button) -> button.setMessage(booleanOption.get() ? YES : NO), (button) -> { booleanOption.set(!booleanOption.get()); contConfig.save(); })); diff --git a/common/src/main/java/net/puzzlemc/gui/compat/CullLeavesCompat.java b/src/main/java/net/puzzlemc/gui/compat/CullLeavesCompat.java similarity index 50% rename from common/src/main/java/net/puzzlemc/gui/compat/CullLeavesCompat.java rename to src/main/java/net/puzzlemc/gui/compat/CullLeavesCompat.java index dcb8b01..b183598 100644 --- a/common/src/main/java/net/puzzlemc/gui/compat/CullLeavesCompat.java +++ b/src/main/java/net/puzzlemc/gui/compat/CullLeavesCompat.java @@ -1,8 +1,8 @@ package net.puzzlemc.gui.compat; import eu.midnightdust.cullleaves.config.CullLeavesConfig; -import net.minecraft.client.MinecraftClient; -import net.minecraft.text.Text; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.screen.widget.PuzzleWidget; @@ -11,11 +11,11 @@ import static net.puzzlemc.gui.PuzzleGui.YES; public class CullLeavesCompat { public static void init() { - PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("\uD83C\uDF43 Cull Leaves"))); - PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("cullleaves.puzzle.option.enabled"), (button) -> button.setMessage(CullLeavesConfig.enabled ? YES : NO), (button) -> { + PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Component.literal("\uD83C\uDF43 Cull Leaves"))); + PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Component.translatable("cullleaves.puzzle.option.enabled"), (button) -> button.setMessage(CullLeavesConfig.enabled ? YES : NO), (button) -> { CullLeavesConfig.enabled = !CullLeavesConfig.enabled; CullLeavesConfig.write("cullleaves"); - MinecraftClient.getInstance().worldRenderer.reload(); + Minecraft.getInstance().levelRenderer.needsUpdate(); })); } } diff --git a/common/src/main/java/net/puzzlemc/gui/compat/EMFCompat.java b/src/main/java/net/puzzlemc/gui/compat/EMFCompat.java similarity index 57% rename from common/src/main/java/net/puzzlemc/gui/compat/EMFCompat.java rename to src/main/java/net/puzzlemc/gui/compat/EMFCompat.java index b2c3b71..e568b27 100644 --- a/common/src/main/java/net/puzzlemc/gui/compat/EMFCompat.java +++ b/src/main/java/net/puzzlemc/gui/compat/EMFCompat.java @@ -1,8 +1,8 @@ package net.puzzlemc.gui.compat; import eu.midnightdust.lib.util.PlatformFunctions; -import net.minecraft.screen.ScreenTexts; -import net.minecraft.text.Text; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.screen.widget.PuzzleWidget; import traben.entity_model_features.EMF; @@ -15,11 +15,11 @@ import java.util.TreeSet; public class EMFCompat { public static void init() { - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.literal("\uD83D\uDC37 ").append(Text.translatable("entity_model_features.title")))); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.literal("\uD83D\uDC37 ").append(Component.translatable("entity_model_features.title")))); EMFConfig emfConfig = EMF.config().getConfig(); if (PlatformFunctions.isModLoaded("physicsmod")) { - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("entity_model_features.config.physics"), (button) -> button.setMessage(emfConfig.attemptPhysicsModPatch_2 != EMFConfig.PhysicsModCompatChoice.OFF ? - Text.translatable("entity_model_features.config." + (emfConfig.attemptPhysicsModPatch_2 == EMFConfig.PhysicsModCompatChoice.VANILLA ? "physics.1" : "physics.2")) : ScreenTexts.OFF), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("entity_model_features.config.physics"), (button) -> button.setMessage(emfConfig.attemptPhysicsModPatch_2 != EMFConfig.PhysicsModCompatChoice.OFF ? + Component.translatable("entity_model_features.config." + (emfConfig.attemptPhysicsModPatch_2 == EMFConfig.PhysicsModCompatChoice.VANILLA ? "physics.1" : "physics.2")) : CommonComponents.OPTION_OFF), (button) -> { final NavigableSet set = new TreeSet<>(EnumSet.allOf(EMFConfig.PhysicsModCompatChoice.class)); diff --git a/common/src/main/java/net/puzzlemc/gui/compat/ETFCompat.java b/src/main/java/net/puzzlemc/gui/compat/ETFCompat.java similarity index 51% rename from common/src/main/java/net/puzzlemc/gui/compat/ETFCompat.java rename to src/main/java/net/puzzlemc/gui/compat/ETFCompat.java index 785d9c7..ff305b8 100644 --- a/common/src/main/java/net/puzzlemc/gui/compat/ETFCompat.java +++ b/src/main/java/net/puzzlemc/gui/compat/ETFCompat.java @@ -1,6 +1,6 @@ package net.puzzlemc.gui.compat; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.screen.widget.PuzzleWidget; import traben.entity_texture_features.ETFApi; @@ -16,18 +16,18 @@ import static net.puzzlemc.gui.PuzzleGui.YES; public class ETFCompat { public static void init() { - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.literal("\uD83D\uDC2E ").append(Text.translatable("config.entity_texture_features.title")))); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.literal("\uD83D\uDC2E ").append(Component.translatable("config.entity_texture_features.title")))); ETFConfig etfConfig = ETFApi.getETFConfigObject(); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.enable_custom_textures.title"), (button) -> button.setMessage(etfConfig.enableCustomTextures ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.entity_texture_features.enable_custom_textures.title"), (button) -> button.setMessage(etfConfig.enableCustomTextures ? YES : NO), (button) -> { etfConfig.enableCustomTextures = !etfConfig.enableCustomTextures; ETFApi.saveETFConfigChangesAndResetETF(); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.enable_emissive_textures.title"), (button) -> button.setMessage(etfConfig.enableEmissiveTextures ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.entity_texture_features.enable_emissive_textures.title"), (button) -> button.setMessage(etfConfig.enableEmissiveTextures ? YES : NO), (button) -> { etfConfig.enableEmissiveTextures = !etfConfig.enableEmissiveTextures; ETFApi.saveETFConfigChangesAndResetETF(); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.emissive_mode.title"), (button) -> button.setMessage( - Text.literal(etfConfig.emissiveRenderMode.toString())), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.entity_texture_features.emissive_mode.title"), (button) -> button.setMessage( + Component.literal(etfConfig.emissiveRenderMode.toString())), (button) -> { final NavigableSet set = new TreeSet<>(EnumSet.allOf(ETFConfig.EmissiveRenderModes.class)); @@ -35,11 +35,11 @@ public class ETFCompat { set.higher(etfConfig.emissiveRenderMode), set::first); ETFApi.saveETFConfigChangesAndResetETF(); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.blinking_mob_settings.title"), (button) -> button.setMessage(etfConfig.enableBlinking ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.entity_texture_features.blinking_mob_settings.title"), (button) -> button.setMessage(etfConfig.enableBlinking ? YES : NO), (button) -> { etfConfig.enableBlinking = !etfConfig.enableBlinking; ETFApi.saveETFConfigChangesAndResetETF(); })); - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.player_skin_features.title"), (button) -> button.setMessage(etfConfig.skinFeaturesEnabled ? YES : NO), (button) -> { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Component.translatable("config.entity_texture_features.player_skin_features.title"), (button) -> button.setMessage(etfConfig.skinFeaturesEnabled ? YES : NO), (button) -> { etfConfig.skinFeaturesEnabled = !etfConfig.skinFeaturesEnabled; ETFApi.saveETFConfigChangesAndResetETF(); })); diff --git a/src/main/java/net/puzzlemc/gui/compat/IrisCompat.java b/src/main/java/net/puzzlemc/gui/compat/IrisCompat.java new file mode 100644 index 0000000..d179fe5 --- /dev/null +++ b/src/main/java/net/puzzlemc/gui/compat/IrisCompat.java @@ -0,0 +1,25 @@ +package net.puzzlemc.gui.compat; + +import net.irisshaders.iris.api.v0.IrisApi; +import net.irisshaders.iris.api.v0.IrisApiConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.puzzlemc.gui.PuzzleApi; +import net.puzzlemc.gui.PuzzleGui; +import net.puzzlemc.gui.screen.widget.PuzzleWidget; + +public class IrisCompat { + public static void init() { + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.literal("\uD83D\uDC41 Iris"))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.translatable("iris.puzzle.option.enableShaders"), (button) -> button.setMessage(IrisApi.getInstance().getConfig().areShadersEnabled() ? PuzzleGui.YES : PuzzleGui.NO), (button) -> { + IrisApiConfig irisConfig = IrisApi.getInstance().getConfig(); + irisConfig.setShadersEnabledAndApply(!irisConfig.areShadersEnabled()); + })); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.translatable("options.iris.shaderPackSelection.title"), (button) -> button.setMessage(Component.literal("➥ ").append(Component.translatable("iris.puzzle.option.open").withStyle(ChatFormatting.GOLD))), (button) -> { + Minecraft client = Minecraft.getInstance(); + client.setScreen((Screen) IrisApi.getInstance().openMainIrisScreenObj(client.screen)); + })); + } +} diff --git a/src/main/java/net/puzzlemc/gui/compat/LBGCompat.java b/src/main/java/net/puzzlemc/gui/compat/LBGCompat.java new file mode 100644 index 0000000..3416b68 --- /dev/null +++ b/src/main/java/net/puzzlemc/gui/compat/LBGCompat.java @@ -0,0 +1,19 @@ +package net.puzzlemc.gui.compat; + +import dev.lambdaurora.lambdabettergrass.LBGConfig; +import dev.lambdaurora.lambdabettergrass.LambdaBetterGrass; +import net.minecraft.network.chat.Component; +import net.puzzlemc.gui.PuzzleApi; +import net.puzzlemc.gui.screen.widget.PuzzleWidget; + +import static net.puzzlemc.gui.PuzzleGui.NO; +import static net.puzzlemc.gui.PuzzleGui.YES; + +public class LBGCompat { + public static void init() { + LBGConfig lbgConfig = LambdaBetterGrass.get().config; + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.literal("\uD83C\uDF31 LambdaBetterGrass"))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.translatable("lambdabettergrass.option.mode"), (button) -> button.setMessage(lbgConfig.getMode().getTranslatedText()), (button) -> lbgConfig.setMode(lbgConfig.getMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.translatable("lambdabettergrass.option.better_snow"), (button) -> button.setMessage(lbgConfig.hasBetterLayer() ? YES : NO), (button) -> lbgConfig.setBetterLayer(!lbgConfig.hasBetterLayer()))); + } +} diff --git a/src/main/java/net/puzzlemc/gui/compat/LDLCompat.java b/src/main/java/net/puzzlemc/gui/compat/LDLCompat.java new file mode 100644 index 0000000..8644028 --- /dev/null +++ b/src/main/java/net/puzzlemc/gui/compat/LDLCompat.java @@ -0,0 +1,23 @@ +package net.puzzlemc.gui.compat; + +import dev.lambdaurora.lambdynlights.DynamicLightsConfig; +import dev.lambdaurora.lambdynlights.LambDynLights; +import net.minecraft.network.chat.Component; +import net.puzzlemc.gui.PuzzleApi; +import net.puzzlemc.gui.screen.widget.PuzzleWidget; + +import static net.puzzlemc.gui.PuzzleGui.NO; +import static net.puzzlemc.gui.PuzzleGui.YES; + +public class LDLCompat { + public static void init() { + DynamicLightsConfig ldlConfig = LambDynLights.get().config; + + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.literal("\uD83D\uDCA1 LambDynamicLights"))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.translatable("lambdynlights.option.mode"), (button) -> button.setMessage(ldlConfig.getDynamicLightsMode().getTranslatedText()), (button) -> ldlConfig.setDynamicLightsMode(ldlConfig.getDynamicLightsMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.empty().append("DynLights: ").append(Component.translatable("lambdynlights.option.light_sources.entities")), (button) -> button.setMessage(ldlConfig.getEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getEntitiesLightSource().set(!ldlConfig.getEntitiesLightSource().get()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.empty().append("DynLights: ").append(Component.translatable("entity.minecraft.creeper")), (button) -> button.setMessage(ldlConfig.getCreeperLightingMode().getTranslatedText()), (button) -> ldlConfig.setCreeperLightingMode(ldlConfig.getCreeperLightingMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.empty().append("DynLights: ").append(Component.translatable("block.minecraft.tnt")), (button) -> button.setMessage(ldlConfig.getTntLightingMode().getTranslatedText()), (button) -> ldlConfig.setTntLightingMode(ldlConfig.getTntLightingMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Component.empty().append("DynLights: ").append(Component.translatable("lambdynlights.option.light_sources.water_sensitive_check")), (button) -> button.setMessage(ldlConfig.getWaterSensitiveCheck().get() ? YES : NO), (button) -> ldlConfig.getWaterSensitiveCheck().set(!ldlConfig.getWaterSensitiveCheck().get()))); + } +} diff --git a/common/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java b/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java old mode 100755 new mode 100644 similarity index 61% rename from common/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java rename to src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java index 9ad37e4..7804a95 --- a/common/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java +++ b/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java @@ -2,14 +2,14 @@ package net.puzzlemc.gui.mixin; import eu.midnightdust.core.config.MidnightLibConfig; import eu.midnightdust.lib.util.PlatformFunctions; -import net.minecraft.client.gui.widget.TextIconButtonWidget; -import net.minecraft.client.gui.widget.ThreePartsLayoutWidget; +import net.minecraft.client.gui.components.SpriteIconButton; +import net.minecraft.client.gui.layouts.HeaderAndFooterLayout; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.options.OptionsScreen; +import net.minecraft.network.chat.Component; import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.gui.PuzzleGui; import net.puzzlemc.gui.screen.PuzzleOptionsScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.option.OptionsScreen; -import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -22,22 +22,23 @@ import java.util.Objects; @Mixin(OptionsScreen.class) public abstract class MixinOptionsScreen extends Screen { - @Shadow @Final private ThreePartsLayoutWidget layout; - @Unique TextIconButtonWidget puzzle$button = TextIconButtonWidget.builder(Text.translatable("puzzle.screen.title"), (buttonWidget) -> - (Objects.requireNonNull(this.client)).setScreen(new PuzzleOptionsScreen(this)), true) - .dimension(20, 20).texture(PuzzleGui.PUZZLE_BUTTON, 20, 20).build(); + @Shadow @Final private HeaderAndFooterLayout layout; + @Unique + SpriteIconButton puzzle$button = SpriteIconButton.builder(Component.translatable("puzzle.screen.title"), (buttonWidget) -> + (Objects.requireNonNull(this.minecraft)).setScreen(new PuzzleOptionsScreen(this)), true) + .size(20, 20).sprite(PuzzleGui.PUZZLE_BUTTON, 20, 20).build(); - private MixinOptionsScreen(Text title) {super(title);} + private MixinOptionsScreen(Component title) {super(title);} @Inject(at = @At("HEAD"), method = "init") public void puzzle$onInit(CallbackInfo ci) { if (PuzzleConfig.enablePuzzleButton) { this.puzzle$setButtonPos(); - this.addDrawableChild(puzzle$button); + this.addRenderableWidget(puzzle$button); } } - @Inject(at = @At("TAIL"), method = "refreshWidgetPositions") + @Inject(at = @At("TAIL"), method = "repositionElements") public void puzzle$onResize(CallbackInfo ci) { if (PuzzleConfig.enablePuzzleButton) this.puzzle$setButtonPos(); } diff --git a/common/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java b/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java old mode 100755 new mode 100644 similarity index 52% rename from common/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java rename to src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java index c424e99..55fc8f1 --- a/common/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java +++ b/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java @@ -1,35 +1,36 @@ package net.puzzlemc.gui.screen; import com.google.common.collect.Lists; -import net.minecraft.client.gui.tab.GridScreenTab; -import net.minecraft.client.gui.tab.Tab; -import net.minecraft.client.gui.tab.TabManager; -import net.minecraft.client.gui.widget.TabNavigationWidget; -import net.minecraft.client.input.KeyInput; -import net.minecraft.screen.ScreenTexts; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.tabs.GridLayoutTab; +import net.minecraft.client.gui.components.tabs.Tab; +import net.minecraft.client.gui.components.tabs.TabManager; +import net.minecraft.client.gui.components.tabs.TabNavigationBar; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.Component; import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.PuzzleGui; import net.puzzlemc.gui.screen.widget.*; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; import java.util.List; import java.util.Objects; +import static net.minecraft.network.chat.CommonComponents.GUI_DONE; + public class PuzzleOptionsScreen extends Screen { public PuzzleOptionListWidget list; - public List tooltip = null; + public List tooltip = null; public TabManager tabManager = new TabManager(a -> {}, a -> {}); public Tab prevTab; - public TabNavigationWidget tabNavigation; - public static Text graphicsTab = Text.translatable("puzzle.page.graphics"); - public static Text miscTab = Text.translatable("puzzle.page.misc"); - public static Text performanceTab = Text.translatable("puzzle.page.performance"); - public static Text resourcesTab = Text.translatable("puzzle.page.resources"); + public TabNavigationBar tabNavigation; + public static Component graphicsTab = Component.translatable("puzzle.page.graphics"); + public static Component miscTab = Component.translatable("puzzle.page.misc"); + public static Component performanceTab = Component.translatable("puzzle.page.performance"); + public static Component resourcesTab = Component.translatable("puzzle.page.resources"); public PuzzleOptionsScreen(Screen parent) { - super(Text.translatable("puzzle.screen.title")); + super(Component.translatable("puzzle.screen.title")); this.parent = parent; } private final Screen parent; @@ -39,34 +40,34 @@ public class PuzzleOptionsScreen extends Screen { if (!PuzzleGui.lateInitDone) PuzzleGui.lateInit(); List tabs = Lists.newArrayList(); - if (!PuzzleApi.GRAPHICS_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(graphicsTab)); - if (!PuzzleApi.RESOURCE_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(resourcesTab)); - if (!PuzzleApi.PERFORMANCE_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(performanceTab)); - if (!PuzzleApi.MISC_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(miscTab)); + if (!PuzzleApi.GRAPHICS_OPTIONS.isEmpty()) tabs.add(new GridLayoutTab(graphicsTab)); + if (!PuzzleApi.RESOURCE_OPTIONS.isEmpty()) tabs.add(new GridLayoutTab(resourcesTab)); + if (!PuzzleApi.PERFORMANCE_OPTIONS.isEmpty()) tabs.add(new GridLayoutTab(performanceTab)); + if (!PuzzleApi.MISC_OPTIONS.isEmpty()) tabs.add(new GridLayoutTab(miscTab)); - tabNavigation = TabNavigationWidget.builder(tabManager, this.width).tabs(tabs.toArray(new Tab[0])).build(); + tabNavigation = TabNavigationBar.builder(tabManager, this.width).addTabs(tabs.toArray(new Tab[0])).build(); tabNavigation.selectTab(0, false); - tabNavigation.init(); + tabNavigation.arrangeElements(); prevTab = tabManager.getCurrentTab(); - this.list = new PuzzleOptionListWidget(this.client, this.width, this.height - 57, 24, 25); + this.list = new PuzzleOptionListWidget(this.minecraft, this.width, this.height - 57, 24, 25); fillList(); if (tabs.size() > 1) { - this.addDrawableChild(tabNavigation); + this.addRenderableWidget(tabNavigation); list.renderHeaderSeparator = false; } - this.addDrawableChild(list); + this.addRenderableWidget(list); super.init(); - this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 26, 200, 20).build()); + this.addRenderableWidget(Button.builder(GUI_DONE, (button) -> Objects.requireNonNull(minecraft).setScreen(parent)).bounds(this.width / 2 - 100, this.height - 26, 200, 20).build()); } private void fillList() { List options = List.of(); if (tabManager.getCurrentTab() == null) return; else { - Text title = tabManager.getCurrentTab().getTitle(); + Component title = tabManager.getCurrentTab().getTabTitle(); if (title.equals(graphicsTab)) options = PuzzleApi.GRAPHICS_OPTIONS; else if (title.equals(miscTab)) options = PuzzleApi.MISC_OPTIONS; else if (title.equals(performanceTab)) @@ -76,7 +77,7 @@ public class PuzzleOptionsScreen extends Screen { list.addAll(options); } @Override - public boolean keyPressed(KeyInput input) { + public boolean keyPressed(KeyEvent input) { return this.tabNavigation.keyPressed(input) || super.keyPressed(input); } @Override @@ -86,7 +87,7 @@ public class PuzzleOptionsScreen extends Screen { prevTab = tabManager.getCurrentTab(); this.list.clear(); fillList(); - list.setScrollY(0); + list.setScrollAmount(0); } } } diff --git a/common/src/main/java/net/puzzlemc/gui/screen/widget/ButtonType.java b/src/main/java/net/puzzlemc/gui/screen/widget/ButtonType.java old mode 100755 new mode 100644 similarity index 100% rename from common/src/main/java/net/puzzlemc/gui/screen/widget/ButtonType.java rename to src/main/java/net/puzzlemc/gui/screen/widget/ButtonType.java diff --git a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleButtonWidget.java b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleButtonWidget.java old mode 100755 new mode 100644 similarity index 52% rename from common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleButtonWidget.java rename to src/main/java/net/puzzlemc/gui/screen/widget/PuzzleButtonWidget.java index 0e88c96..79598b0 --- a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleButtonWidget.java +++ b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleButtonWidget.java @@ -1,20 +1,20 @@ package net.puzzlemc.gui.screen.widget; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.text.Text; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.network.chat.Component; import java.util.function.Supplier; -public class PuzzleButtonWidget extends ButtonWidget { +public class PuzzleButtonWidget extends Button { private final PuzzleWidget.TextAction title; - public PuzzleButtonWidget(int x, int y, int width, int height, PuzzleWidget.TextAction title, PressAction onPress) { - super(x, y, width, height, Text.of(""), onPress, Supplier::get); + public PuzzleButtonWidget(int x, int y, int width, int height, PuzzleWidget.TextAction title, OnPress onPress) { + super(x, y, width, height, Component.empty(), onPress, Supplier::get); this.title = title; } @Override - public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + public void renderWidget(GuiGraphics context, int mouseX, int mouseY, float delta) { try { title.setTitle(this); } catch (Exception e) {e.fillInStackTrace(); this.visible = false;} super.renderWidget(context, mouseX, mouseY, delta); diff --git a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java old mode 100755 new mode 100644 similarity index 58% rename from common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java rename to src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java index cbbb744..7a4f706 --- a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java +++ b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java @@ -4,16 +4,14 @@ import eu.midnightdust.lib.config.ButtonEntry; import eu.midnightdust.lib.config.EntryInfo; import eu.midnightdust.lib.config.MidnightConfig; import eu.midnightdust.lib.config.MidnightConfigListWidget; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableTextContent; -import net.minecraft.util.Formatting; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.contents.TranslatableContents; import net.puzzlemc.gui.screen.PuzzleOptionsScreen; import java.lang.annotation.Annotation; @@ -23,12 +21,12 @@ import java.util.List; import static net.puzzlemc.core.PuzzleCore.LOGGER; public class PuzzleOptionListWidget extends MidnightConfigListWidget { - TextRenderer textRenderer; + Font textRenderer; - public PuzzleOptionListWidget(MinecraftClient minecraftClient, int i, int j, int k, int l) { + public PuzzleOptionListWidget(Minecraft minecraftClient, int i, int j, int k, int l) { super(minecraftClient, i, j, k, l); this.centerListVertically = false; - textRenderer = minecraftClient.textRenderer; + textRenderer = minecraftClient.font; } public void addAll(List buttons) { @@ -36,7 +34,7 @@ public class PuzzleOptionListWidget extends MidnightConfigListWidget { for (PuzzleWidget button : buttons) { try { if (button.buttonType == ButtonType.TEXT) - this.addButton(List.of(), Text.literal("").append(button.descriptionText).formatted(Formatting.BOLD)); + this.addButton(List.of(), Component.literal("").append(button.descriptionText).withStyle(ChatFormatting.BOLD)); else if (button.buttonType == ButtonType.BUTTON) this.addButton(List.of(new PuzzleButtonWidget(buttonX, 0, 150, 20, button.buttonTextAction, button.onPress)), button.descriptionText); else if (button.buttonType == ButtonType.SLIDER) @@ -52,7 +50,7 @@ public class PuzzleOptionListWidget extends MidnightConfigListWidget { } } - public void addButton(List buttons, Text text) { + public void addButton(List buttons, Component text) { EntryInfo info = new EntryInfo(null, "puzzle"); if (buttons.isEmpty()) info.comment = new MidnightConfig.Comment(){ public Class annotationType() {return null;} @@ -65,36 +63,36 @@ public class PuzzleOptionListWidget extends MidnightConfigListWidget { var entry = new ButtonEntry(buttons, text, info); this.addEntry(entry); } - public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + public void renderWidget(GuiGraphics context, int mouseX, int mouseY, float delta) { super.renderWidget(context, mouseX, mouseY, delta); - ButtonEntry e = this.getHoveredEntry(); - if (client.currentScreen instanceof PuzzleOptionsScreen page && e != null && !e.buttons.isEmpty() && - e.text.getContent() instanceof TranslatableTextContent content) { - ClickableWidget button = e.buttons.getFirst(); + ButtonEntry e = this.getHovered(); + if (minecraft.screen instanceof PuzzleOptionsScreen page && e != null && !e.buttons.isEmpty() && + e.text.getContents() instanceof TranslatableContents content) { + AbstractWidget button = e.buttons.getFirst(); String key = null; - if (I18n.hasTranslation(content.getKey() + ".tooltip")) key = content.getKey() + ".tooltip"; - else if (I18n.hasTranslation(content.getKey() + ".desc")) key = content.getKey() + ".desc"; + if (I18n.exists(content.getKey() + ".tooltip")) key = content.getKey() + ".tooltip"; + else if (I18n.exists(content.getKey() + ".desc")) key = content.getKey() + ".desc"; if (key == null && content.getKey().endsWith(".title")) { String strippedContent = content.getKey().substring(0, content.getKey().length()-6); - if (I18n.hasTranslation(strippedContent + ".tooltip")) key = strippedContent + ".tooltip"; - else if (I18n.hasTranslation(strippedContent + ".desc")) key = strippedContent + ".desc"; + if (I18n.exists(strippedContent + ".tooltip")) key = strippedContent + ".tooltip"; + else if (I18n.exists(strippedContent + ".desc")) key = strippedContent + ".desc"; } if (key != null) { - List list = new ArrayList<>(); - for (String str : I18n.translate(key).split("\n")) - list.add(Text.literal(str)); + List list = new ArrayList<>(); + for (String str : I18n.get(key).split("\n")) + list.add(Component.literal(str)); page.tooltip = list; if (!button.isMouseOver(mouseX, mouseY)) { - context.drawTooltip(textRenderer, list, button.getX(), button.getY() + (button.getHeight() * 2)); + context.setComponentTooltipForNextFrame(textRenderer, list, button.getX(), button.getY() + (button.getHeight() * 2)); } - else context.drawTooltip(textRenderer, list, mouseX, mouseY); + else context.setComponentTooltipForNextFrame(textRenderer, list, mouseX, mouseY); } } } @Override - public ButtonEntry getHoveredEntry() { - return super.getHoveredEntry(); + public ButtonEntry getHovered() { + return super.getHovered(); } } diff --git a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleSliderWidget.java b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleSliderWidget.java old mode 100755 new mode 100644 similarity index 62% rename from common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleSliderWidget.java rename to src/main/java/net/puzzlemc/gui/screen/widget/PuzzleSliderWidget.java index ec58e8c..756aa89 --- a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleSliderWidget.java +++ b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleSliderWidget.java @@ -1,21 +1,22 @@ package net.puzzlemc.gui.screen.widget; -import net.minecraft.client.gui.widget.SliderWidget; -import net.minecraft.text.Text; -public class PuzzleSliderWidget extends SliderWidget { +import net.minecraft.client.gui.components.AbstractSliderButton; +import net.minecraft.network.chat.Component; + +public class PuzzleSliderWidget extends AbstractSliderButton { private final int min; private final int max; - private final PuzzleWidget.TextAction setTextAction; + private final PuzzleWidget.TextAction setComponentAction; private final PuzzleWidget.ChangeSliderValueAction changeAction; - public PuzzleSliderWidget(int min, int max, int x, int y, int width, int height, float defaultValue, PuzzleWidget.TextAction setTextAction, PuzzleWidget.ChangeSliderValueAction changeAction) { - super(x,y,width,height,Text.of(""),(defaultValue-min) / (max - min)); + public PuzzleSliderWidget(int min, int max, int x, int y, int width, int height, float defaultValue, PuzzleWidget.TextAction setComponentAction, PuzzleWidget.ChangeSliderValueAction changeAction) { + super(x,y,width,height, Component.empty(),(defaultValue-min) / (max - min)); this.min = min; this.max = max; - this.setTextAction = setTextAction; + this.setComponentAction = setComponentAction; this.changeAction = changeAction; try { this.updateMessage(); @@ -32,7 +33,7 @@ public class PuzzleSliderWidget extends SliderWidget { @Override protected void updateMessage() { - this.setTextAction.setTitle(this); + this.setComponentAction.setTitle(this); } @Override diff --git a/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java new file mode 100644 index 0000000..e7550cd --- /dev/null +++ b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleTextFieldWidget.java @@ -0,0 +1,25 @@ +package net.puzzlemc.gui.screen.widget; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.Component; + +public class PuzzleTextFieldWidget extends EditBox { + private final PuzzleWidget.SetTextValueAction setValueAction; + private final PuzzleWidget.ChangeTextValueAction change; + + public PuzzleTextFieldWidget(Font font, int x, int y, int width, int height, PuzzleWidget.SetTextValueAction setValue, PuzzleWidget.ChangeTextValueAction change) { + super(font, x, y, width, height, Component.empty()); + this.setValueAction = setValue; + this.change = change; + try { + setValueAction.setTextValue(this); + } catch (Exception e) {e.fillInStackTrace(); this.setVisible(false);} + } + @Override + public void setValue(String text) { + super.setValue(text); + this.change.onChange(this); + setValueAction.setTextValue(this); + } +} diff --git a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleWidget.java b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleWidget.java old mode 100755 new mode 100644 similarity index 65% rename from common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleWidget.java rename to src/main/java/net/puzzlemc/gui/screen/widget/PuzzleWidget.java index ee3f7bd..488a519 --- a/common/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleWidget.java +++ b/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleWidget.java @@ -1,9 +1,10 @@ package net.puzzlemc.gui.screen.widget; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.AbstractTextAreaWidget; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.Component; import java.util.function.IntSupplier; @@ -11,9 +12,9 @@ public class PuzzleWidget { public ButtonType buttonType; public int min; public int max; - public Text descriptionText; + public Component descriptionText; public TextAction buttonTextAction; - public ButtonWidget.PressAction onPress; + public Button.OnPress onPress; public PuzzleWidget.SetTextValueAction setTextValue; public IntSupplier defaultSliderValue; public PuzzleWidget.ChangeTextValueAction changeTextValue; @@ -23,7 +24,7 @@ public class PuzzleWidget { * Puzzle Text Widget Container * @param descriptionText The text you want to display. */ - public PuzzleWidget(Text descriptionText) { + public PuzzleWidget(Component descriptionText) { this.buttonType = ButtonType.TEXT; this.descriptionText = descriptionText; } @@ -34,7 +35,7 @@ public class PuzzleWidget { * @param getTitle Function to set the text on the button. * @param onPress Function to call when the user presses the button. */ - public PuzzleWidget(Text descriptionText, PuzzleWidget.TextAction getTitle, ButtonWidget.PressAction onPress) { + public PuzzleWidget(Component descriptionText, PuzzleWidget.TextAction getTitle, Button.OnPress onPress) { this.buttonType = ButtonType.BUTTON; this.descriptionText = descriptionText; this.buttonTextAction = getTitle; @@ -43,7 +44,7 @@ public class PuzzleWidget { /** * Puzzle Slider Widget Container */ - public PuzzleWidget(int min, int max, Text descriptionText, IntSupplier defaultSliderValue, PuzzleWidget.TextAction setTextAction, PuzzleWidget.ChangeSliderValueAction changeAction) { + public PuzzleWidget(int min, int max, Component descriptionText, IntSupplier defaultSliderValue, PuzzleWidget.TextAction setTextAction, PuzzleWidget.ChangeSliderValueAction changeAction) { this.buttonType = ButtonType.SLIDER; this.min = min; this.max = max; @@ -55,7 +56,7 @@ public class PuzzleWidget { /** * Puzzle Text Field Widget Container (WIP - Doesn't work) */ - public PuzzleWidget(int min, int max, Text descriptionText, PuzzleWidget.SetTextValueAction setValue, ChangeTextValueAction changeAction) { + public PuzzleWidget(int min, int max, Component descriptionText, PuzzleWidget.SetTextValueAction setValue, ChangeTextValueAction changeAction) { this.buttonType = ButtonType.TEXT_FIELD; this.min = min; this.max = max; @@ -64,15 +65,15 @@ public class PuzzleWidget { this.changeTextValue = changeAction; } public interface ChangeTextValueAction { - void onChange(TextFieldWidget textField); + void onChange(EditBox textField); } public interface ChangeSliderValueAction { void onChange(PuzzleSliderWidget slider); } public interface SetTextValueAction { - void setTextValue(TextFieldWidget textField); + void setTextValue(EditBox textField); } public interface TextAction { - void setTitle(ClickableWidget button); + void setTitle(AbstractWidget button); } } diff --git a/common/src/main/java/net/puzzlemc/models/mixin/MixinModelElementDeserializer.java b/src/main/java/net/puzzlemc/models/mixin/MixinModelElementDeserializer.java old mode 100755 new mode 100644 similarity index 71% rename from common/src/main/java/net/puzzlemc/models/mixin/MixinModelElementDeserializer.java rename to src/main/java/net/puzzlemc/models/mixin/MixinModelElementDeserializer.java index b45c5c7..cfd1211 --- a/common/src/main/java/net/puzzlemc/models/mixin/MixinModelElementDeserializer.java +++ b/src/main/java/net/puzzlemc/models/mixin/MixinModelElementDeserializer.java @@ -2,8 +2,8 @@ package net.puzzlemc.models.mixin; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; -import net.minecraft.client.render.model.json.ModelElement; -import net.minecraft.util.JsonHelper; +import net.minecraft.client.renderer.block.model.BlockElement; +import net.minecraft.util.GsonHelper; import net.puzzlemc.core.config.PuzzleConfig; import org.joml.Vector3f; import org.spongepowered.asm.mixin.Mixin; @@ -12,21 +12,21 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(ModelElement.Deserializer.class) +@Mixin(BlockElement.Deserializer.class) public abstract class MixinModelElementDeserializer { - @Shadow protected abstract Vector3f deserializeVec3f(JsonObject object, String name); + @Shadow protected abstract Vector3f getVector3f(JsonObject jsonObject, String string); - @Inject(at = @At("HEAD"),method = "deserializeRotationAngle", cancellable = true) + @Inject(at = @At("HEAD"),method = "getAngle", cancellable = true) private void puzzle$deserializeRotationAngle(JsonObject object, CallbackInfoReturnable cir) { if (PuzzleConfig.unlimitedRotations) { - float angle = JsonHelper.getFloat(object, "angle"); + float angle = GsonHelper.getAsFloat(object, "angle"); cir.setReturnValue(angle); } } - @Inject(at = @At("HEAD"),method = "deserializeTo", cancellable = true) + @Inject(at = @At("HEAD"),method = "getTo", cancellable = true) private void puzzle$deserializeTo(JsonObject object, CallbackInfoReturnable cir) { if (PuzzleConfig.biggerModels) { - Vector3f vec3f = this.deserializeVec3f(object, "to"); + Vector3f vec3f = this.getVector3f(object, "to"); if (!(vec3f.x < -32.0F) && !(vec3f.y < -32.0F) && !(vec3f.z < -32.0F) && !(vec3f.x > 48.0F) && !(vec3f.y > 48.0F) && !(vec3f.z > 48.0F)) { cir.setReturnValue(vec3f); } else { @@ -34,10 +34,10 @@ public abstract class MixinModelElementDeserializer { } } } - @Inject(at = @At("HEAD"),method = "deserializeFrom", cancellable = true) + @Inject(at = @At("HEAD"),method = "getFrom", cancellable = true) private void puzzle$deserializeFrom(JsonObject object, CallbackInfoReturnable cir) { if (PuzzleConfig.biggerModels) { - Vector3f vec3f = this.deserializeVec3f(object, "from"); + Vector3f vec3f = this.getVector3f(object, "from"); if (!(vec3f.x < -32.0F) && !(vec3f.y < -32.0F) && !(vec3f.z < -32.0F) && !(vec3f.x > 48.0F) && !(vec3f.y > 48.0F) && !(vec3f.z > 48.0F)) { cir.setReturnValue(vec3f); } else { diff --git a/common/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java b/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java old mode 100755 new mode 100644 similarity index 74% rename from common/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java rename to src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java index 213b0db..0b853aa --- a/common/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java +++ b/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java @@ -4,20 +4,24 @@ import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.DestFactor; +import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.SourceFactor; import eu.midnightdust.lib.util.MidnightColorUtil; import eu.midnightdust.lib.util.PlatformFunctions; -import net.minecraft.client.texture.NativeImageBackedTexture; -import net.minecraft.client.texture.TextureContents; -import net.minecraft.resource.*; -import net.minecraft.util.Util; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.renderer.texture.ReloadableTexture; +import net.minecraft.client.renderer.texture.TextureContents; +import net.minecraft.client.resources.metadata.texture.TextureMetadataSection; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.VanillaPackResources; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.puzzlemc.core.config.PuzzleConfig; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.resource.metadata.TextureResourceMetadata; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.ResourceTexture; -import net.minecraft.util.Identifier; import net.puzzlemc.splashscreen.mixin.RenderPipelinesAccessor; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileInputStream; @@ -34,19 +38,19 @@ import static net.puzzlemc.core.PuzzleCore.LOGGER; import static net.puzzlemc.core.PuzzleCore.MOD_ID; public class PuzzleSplashScreen { - public static final Identifier LOGO = Identifier.of("textures/gui/title/mojangstudios.png"); - public static final Identifier BACKGROUND = Identifier.of("puzzle/splash_background.png"); + public static final ResourceLocation LOGO = ResourceLocation.withDefaultNamespace("textures/gui/title/mojangstudios.png"); + public static final ResourceLocation BACKGROUND = ResourceLocation.withDefaultNamespace("puzzle/splash_background.png"); public static File CONFIG_PATH = new File(String.valueOf(PlatformFunctions.getConfigDirectory().resolve(".puzzle_cache"))); public static Path LOGO_TEXTURE = Paths.get(CONFIG_PATH + "/mojangstudios.png"); public static Path BACKGROUND_TEXTURE = Paths.get(CONFIG_PATH + "/splash_background.png"); - private static MinecraftClient client = MinecraftClient.getInstance(); + private static Minecraft client = Minecraft.getInstance(); private static boolean keepBackground = false; private static RenderPipeline CUSTOM_LOGO_PIPELINE; public static void init() { if (!CONFIG_PATH.exists()) { // Run when config directory is nonexistent // if (CONFIG_PATH.mkdir()) { // Create our custom config directory // - if (Util.getOperatingSystem().equals(Util.OperatingSystem.WINDOWS)) { + if (Util.getPlatform().equals(Util.OS.WINDOWS)) { try { Files.setAttribute(CONFIG_PATH.toPath(), "dos:hidden", true); } catch (IOException ignored) {} } @@ -75,7 +79,7 @@ public class PuzzleSplashScreen { } } - var CUSTOM_LOGO_PIPELINE_BUILDER = RenderPipeline.builder(RenderPipelinesAccessor.getPOSITION_TEX_COLOR_SNIPPET()) + var CUSTOM_LOGO_PIPELINE_BUILDER = RenderPipeline.builder(RenderPipelinesAccessor.getGUI_TEXTURED_SNIPPET()) .withLocation("pipeline/mojang_logo_puzzle") .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) .withDepthWrite(false); @@ -85,21 +89,21 @@ public class PuzzleSplashScreen { } } - public static class ReloadListener implements SynchronousResourceReloader { + public static class ReloadListener implements ResourceManagerReloadListener { public static final ReloadListener INSTANCE = new ReloadListener(); private ReloadListener() {} @Override - public void reload(ResourceManager manager) { - client = MinecraftClient.getInstance(); + public void onResourceManagerReload(ResourceManager manager) { + client = Minecraft.getInstance(); if (PuzzleConfig.resourcepackSplashScreen) { PuzzleSplashScreen.resetColors(); - client.getTextureManager().registerTexture(LOGO, new LogoTexture(LOGO)); - client.getTextureManager().registerTexture(BACKGROUND, new LogoTexture(BACKGROUND)); + client.getTextureManager().registerAndLoad(LOGO, new LogoTexture(LOGO)); + client.getTextureManager().registerAndLoad(BACKGROUND, new LogoTexture(BACKGROUND)); - manager.findResources("optifine", path -> path.getPath().contains("color.properties")).forEach((id, resource) -> { - try (InputStream stream = resource.getInputStream()) { + manager.listResources("optifine", path -> path.getPath().contains("color.properties")).forEach((id, resource) -> { + try (InputStream stream = resource.open()) { Properties properties = new Properties(); properties.load(stream); @@ -131,21 +135,21 @@ public class PuzzleSplashScreen { } }); AtomicInteger logoCount = new AtomicInteger(); - manager.findResources("textures", path -> path.getPath().contains("mojangstudios.png")).forEach((id, resource) -> { - try (InputStream stream = resource.getInputStream()) { + manager.listResources("textures", path -> path.getPath().contains("mojangstudios.png")).forEach((id, resource) -> { + try (InputStream stream = resource.open()) { Files.copy(stream, LOGO_TEXTURE, StandardCopyOption.REPLACE_EXISTING); - client.getTextureManager().registerTexture(LOGO, new DynamicLogoTexture()); + client.getTextureManager().registerAndLoad(LOGO, new DynamicLogoTexture()); if (logoCount.get() > 0) PuzzleConfig.hasCustomSplashScreen = true; logoCount.getAndIncrement(); } catch (Exception e) { LOGGER.error("Error occurred while loading custom minecraft logo {}", id.toString(), e); } }); - manager.findResources(MOD_ID, path -> path.getPath().contains("splash_background.png")).forEach((id, resource) -> { - try (InputStream stream = resource.getInputStream()) { + manager.listResources(MOD_ID, path -> path.getPath().contains("splash_background.png")).forEach((id, resource) -> { + try (InputStream stream = resource.open()) { Files.copy(stream, BACKGROUND_TEXTURE, StandardCopyOption.REPLACE_EXISTING); InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.BACKGROUND_TEXTURE)); - client.getTextureManager().registerTexture(BACKGROUND, new NativeImageBackedTexture(() -> "splash_screen_background", NativeImage.read(input))); + client.getTextureManager().register(BACKGROUND, new DynamicTexture(() -> "splash_screen_background", NativeImage.read(input))); keepBackground = true; PuzzleConfig.hasCustomSplashScreen = true; } catch (Exception e) { @@ -174,39 +178,37 @@ public class PuzzleSplashScreen { PuzzleConfig.hasCustomSplashScreen = false; } - public static class LogoTexture extends ResourceTexture { - public LogoTexture(Identifier logo) { super(logo); } + public static class LogoTexture extends ReloadableTexture { + public LogoTexture(ResourceLocation logo) { super(logo); } @Override - public TextureContents loadContents(ResourceManager resourceManager) { - MinecraftClient minecraftClient = MinecraftClient.getInstance(); - DefaultResourcePack defaultResourcePack = minecraftClient.getDefaultResourcePack(); + public @NotNull TextureContents loadContents(ResourceManager resourceManager) { + Minecraft client = Minecraft.getInstance(); + VanillaPackResources defaultResourcePack = client.getVanillaPackResources(); try { - InputStream inputStream = Objects.requireNonNull(defaultResourcePack.open(ResourceType.CLIENT_RESOURCES, LOGO)).get(); - TextureContents var6; + InputStream inputStream = Objects.requireNonNull(defaultResourcePack.getResource(PackType.CLIENT_RESOURCES, LOGO)).get(); + TextureContents tex; try { - var6 = new TextureContents(NativeImage.read(inputStream), new TextureResourceMetadata(true, true)); + tex = new TextureContents(NativeImage.read(inputStream), new TextureMetadataSection(true, true)); } finally { - if (inputStream != null) { - inputStream.close(); - } + inputStream.close(); } - return var6; + return tex; } catch (IOException var18) { return TextureContents.createMissing(); } } } - public static class DynamicLogoTexture extends ResourceTexture { + public static class DynamicLogoTexture extends ReloadableTexture { public DynamicLogoTexture() { super(LOGO); } @Override - public TextureContents loadContents(ResourceManager resourceManager) { + public @NotNull TextureContents loadContents(ResourceManager resourceManager) { try { InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE)); - return new TextureContents(NativeImage.read(input), new TextureResourceMetadata(true, true)); + return new TextureContents(NativeImage.read(input), new TextureMetadataSection(true, true)); } catch (IOException e) { LOGGER.error("Encountered an error during logo loading: ", e); try { diff --git a/src/main/java/net/puzzlemc/splashscreen/mixin/MixinNeoForgeLoadingOverlay.java b/src/main/java/net/puzzlemc/splashscreen/mixin/MixinNeoForgeLoadingOverlay.java new file mode 100644 index 0000000..58e68fb --- /dev/null +++ b/src/main/java/net/puzzlemc/splashscreen/mixin/MixinNeoForgeLoadingOverlay.java @@ -0,0 +1,32 @@ +package net.puzzlemc.splashscreen.mixin; + +//? neoforge || forge { +//import net.minecraft.client.MinecraftClient; +//import net.minecraft.client.gui.DrawContext; +//import net.minecraft.client.gui.screen.SplashOverlay; +//import net.minecraft.resource.ResourceReload; +//import net.neoforged.neoforge.client.loading.NeoForgeLoadingOverlay; +//import net.puzzlemc.core.config.PuzzleConfig; +//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; +// +//import java.util.Optional; +//import java.util.function.Consumer; +// +//@Mixin(NeoForgeLoadingOverlay.class) +//public class MixinNeoForgeLoadingOverlay extends SplashOverlay { +// public MixinNeoForgeLoadingOverlay(MinecraftClient client, ResourceReload monitor, Consumer> exceptionHandler, boolean reloading) { +// super(client, monitor, exceptionHandler, reloading); +// } +// +// @Inject(method = "render", at = @At("HEAD"), cancellable = true) // Replaces the NeoForge loading screen in later stages with the (customized) vanilla version +// private void redirectNeoForgeLoading(DrawContext context, int mouseX, int mouseY, float tickDelta, CallbackInfo ci) { +// if (PuzzleConfig.resourcepackSplashScreen && PuzzleConfig.hasCustomSplashScreen) { +// super.render(context, mouseX, mouseY, tickDelta); +// ci.cancel(); +// } +// } +//} +//?} diff --git a/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java b/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java new file mode 100644 index 0000000..a862dca --- /dev/null +++ b/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java @@ -0,0 +1,106 @@ +package net.puzzlemc.splashscreen.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.NativeImage; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.LoadingOverlay; +import net.minecraft.client.gui.screens.Overlay; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.ARGB; +import net.minecraft.util.Mth; +import net.puzzlemc.core.config.PuzzleConfig; +import net.puzzlemc.splashscreen.PuzzleSplashScreen; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.function.IntSupplier; + +import static net.puzzlemc.splashscreen.PuzzleSplashScreen.BACKGROUND; + +@Mixin(value = LoadingOverlay.class, priority = 2000) +public abstract class MixinSplashScreen extends Overlay { + @Shadow @Final public static ResourceLocation MOJANG_STUDIOS_LOGO_LOCATION; + @Shadow private long fadeInStart; + @Shadow @Final private Minecraft minecraft; + @Shadow @Final private boolean fadeIn; + @Shadow private long fadeOutStart; + @Shadow + private static int replaceAlpha(int color, int alpha) { + return 0; + } + + @Inject(method = "registerTextures", at = @At("TAIL")) + private static void puzzle$initSplashscreen(TextureManager textureManager, CallbackInfo ci) { // Load our custom textures at game start // + if (PuzzleConfig.resourcepackSplashScreen) { + if (PuzzleSplashScreen.LOGO_TEXTURE.toFile().exists()) { + textureManager.registerAndLoad(MOJANG_STUDIOS_LOGO_LOCATION, new PuzzleSplashScreen.DynamicLogoTexture()); + } + if (PuzzleSplashScreen.BACKGROUND_TEXTURE.toFile().exists()) { + try { + InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.BACKGROUND_TEXTURE)); + textureManager.register(BACKGROUND, new DynamicTexture(() -> "splash_screen_background", NativeImage.read(input))); + } catch (IOException ignored) {} + } + } + } + + @Redirect(method = "render", at = @At(value = "INVOKE", target = "Ljava/util/function/IntSupplier;getAsInt()I")) + private int puzzle$modifyBackground(IntSupplier instance) { // Set the Progress Bar Frame Color to our configured value // + return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) ? instance.getAsInt() : PuzzleConfig.backgroundColor | 255 << 24; + } + + @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;blit(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/ResourceLocation;IIFFIIIIIII)V")) + private void puzzle$modifyRenderLayer(GuiGraphics context, RenderPipeline pipeline, ResourceLocation sprite, int x, int y, float u, float v, int width, int height, int regionWidth, int regionHeight, int textureWidth, int textureHeight, int color, Operation original) { + if (PuzzleConfig.resourcepackSplashScreen) + context.blit(PuzzleSplashScreen.getCustomLogoRenderPipeline(), sprite, x, y, u, v, width, height, regionWidth, regionHeight, textureWidth, textureHeight, color); + else context.blit(pipeline, sprite, x, y, u, v, width, height, textureWidth, textureHeight, color); + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;guiWidth()I", ordinal = 2)) + private void puzzle$renderSplashBackground(GuiGraphics context, int mouseX, int mouseY, float delta, CallbackInfo ci) { + if (Files.exists(PuzzleSplashScreen.BACKGROUND_TEXTURE) && PuzzleConfig.resourcepackSplashScreen) { + int width = minecraft.getWindow().getGuiScaledWidth(); + int height = minecraft.getWindow().getGuiScaledHeight(); + long l = Util.getMillis(); + float f = this.fadeOutStart > -1L ? (float)(l - this.fadeOutStart) / 1000.0F : -1.0F; + float g = this.fadeInStart> -1L ? (float)(l - this.fadeInStart) / 500.0F : -1.0F; + float s; + if (f >= 1.0F) s = 1.0F - Mth.clamp(f - 1.0F, 0.0F, 1.0F); + else if (fadeIn) s = Mth.clamp(g, 0.0F, 1.0F); + else s = 1.0F; + context.blit(RenderPipelines.GUI_TEXTURED, BACKGROUND, 0, 0, 0, 0, width, height, width, height, ARGB.white(s)); + } + } + + @Inject(method = "drawProgressBar", at = @At("HEAD")) + private void puzzle$addProgressBarBackground(GuiGraphics context, int minX, int minY, int maxX, int maxY, float opacity, CallbackInfo ci) { + if (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) return; + long l = Util.getMillis(); + float f = this.fadeOutStart > -1L ? (float)(l - this.fadeOutStart) / 1000.0F : -1.0F; + int m = Mth.ceil((1.0F - Mth.clamp(f - 1.0F, 0.0F, 1.0F)) * 255.0F); + context.fill(minX, minY, maxX, maxY, replaceAlpha(PuzzleConfig.progressBarBackgroundColor, m)); + } + + @ModifyArg(method = "drawProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;fill(IIIII)V"), index = 4) + private int puzzle$modifyProgressFrame(int color) { // Set the Progress Bar Frame Color to our configured value // + return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressFrameColor == 16777215) ? color : PuzzleConfig.progressFrameColor | 255 << 24; + } + @ModifyArg(method = "drawProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;fill(IIIII)V", ordinal = 0), index = 4) + private int puzzle$modifyProgressColor(int color) { // Set the Progress Bar Color to our configured value // + return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarColor == 16777215) ? color : PuzzleConfig.progressBarColor | 255 << 24; + } +} diff --git a/common/src/main/java/net/puzzlemc/splashscreen/mixin/RenderPipelinesAccessor.java b/src/main/java/net/puzzlemc/splashscreen/mixin/RenderPipelinesAccessor.java similarity index 72% rename from common/src/main/java/net/puzzlemc/splashscreen/mixin/RenderPipelinesAccessor.java rename to src/main/java/net/puzzlemc/splashscreen/mixin/RenderPipelinesAccessor.java index 9b15367..26601f9 100644 --- a/common/src/main/java/net/puzzlemc/splashscreen/mixin/RenderPipelinesAccessor.java +++ b/src/main/java/net/puzzlemc/splashscreen/mixin/RenderPipelinesAccessor.java @@ -1,14 +1,14 @@ package net.puzzlemc.splashscreen.mixin; import com.mojang.blaze3d.pipeline.RenderPipeline; -import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.renderer.RenderPipelines; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(RenderPipelines.class) public interface RenderPipelinesAccessor { @Accessor - static RenderPipeline.Snippet getPOSITION_TEX_COLOR_SNIPPET() { + static RenderPipeline.Snippet getGUI_TEXTURED_SNIPPET() { return null; } } diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 95% rename from neoforge/src/main/resources/META-INF/neoforge.mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml index 160dc32..eb324ad 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -4,7 +4,7 @@ loaderVersion = "[2,)" license = "MIT License" [[mods]] -modId = "puzzle" +modId = "${id}" version = "${version}" displayName = "Puzzle" logoFile = "puzzle.png" diff --git a/common/src/main/resources/architectury.puzzle.json b/src/main/resources/architectury.puzzle.json similarity index 100% rename from common/src/main/resources/architectury.puzzle.json rename to src/main/resources/architectury.puzzle.json diff --git a/common/src/main/resources/assets/puzzle/icon.png b/src/main/resources/assets/puzzle/icon.png similarity index 100% rename from common/src/main/resources/assets/puzzle/icon.png rename to src/main/resources/assets/puzzle/icon.png diff --git a/common/src/main/resources/assets/puzzle/lang/be_by.json b/src/main/resources/assets/puzzle/lang/be_by.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/be_by.json rename to src/main/resources/assets/puzzle/lang/be_by.json diff --git a/common/src/main/resources/assets/puzzle/lang/de_de.json b/src/main/resources/assets/puzzle/lang/de_de.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/de_de.json rename to src/main/resources/assets/puzzle/lang/de_de.json diff --git a/common/src/main/resources/assets/puzzle/lang/el_gr.json b/src/main/resources/assets/puzzle/lang/el_gr.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/el_gr.json rename to src/main/resources/assets/puzzle/lang/el_gr.json diff --git a/common/src/main/resources/assets/puzzle/lang/en_us.json b/src/main/resources/assets/puzzle/lang/en_us.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/en_us.json rename to src/main/resources/assets/puzzle/lang/en_us.json diff --git a/common/src/main/resources/assets/puzzle/lang/es_es.json b/src/main/resources/assets/puzzle/lang/es_es.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/es_es.json rename to src/main/resources/assets/puzzle/lang/es_es.json diff --git a/common/src/main/resources/assets/puzzle/lang/et_ee.json b/src/main/resources/assets/puzzle/lang/et_ee.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/et_ee.json rename to src/main/resources/assets/puzzle/lang/et_ee.json diff --git a/common/src/main/resources/assets/puzzle/lang/ko_kr.json b/src/main/resources/assets/puzzle/lang/ko_kr.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/ko_kr.json rename to src/main/resources/assets/puzzle/lang/ko_kr.json diff --git a/common/src/main/resources/assets/puzzle/lang/pl_pl.json b/src/main/resources/assets/puzzle/lang/pl_pl.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/pl_pl.json rename to src/main/resources/assets/puzzle/lang/pl_pl.json diff --git a/common/src/main/resources/assets/puzzle/lang/pt_br.json b/src/main/resources/assets/puzzle/lang/pt_br.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/pt_br.json rename to src/main/resources/assets/puzzle/lang/pt_br.json diff --git a/common/src/main/resources/assets/puzzle/lang/ru_ru.json b/src/main/resources/assets/puzzle/lang/ru_ru.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/ru_ru.json rename to src/main/resources/assets/puzzle/lang/ru_ru.json diff --git a/common/src/main/resources/assets/puzzle/lang/vi_vn.json b/src/main/resources/assets/puzzle/lang/vi_vn.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/vi_vn.json rename to src/main/resources/assets/puzzle/lang/vi_vn.json diff --git a/common/src/main/resources/assets/puzzle/lang/zh_cn.json b/src/main/resources/assets/puzzle/lang/zh_cn.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/zh_cn.json rename to src/main/resources/assets/puzzle/lang/zh_cn.json diff --git a/common/src/main/resources/assets/puzzle/lang/zh_tw.json b/src/main/resources/assets/puzzle/lang/zh_tw.json similarity index 100% rename from common/src/main/resources/assets/puzzle/lang/zh_tw.json rename to src/main/resources/assets/puzzle/lang/zh_tw.json diff --git a/common/src/main/resources/assets/puzzle/textures/gui/sprites/icon/button.png b/src/main/resources/assets/puzzle/textures/gui/sprites/icon/button.png similarity index 100% rename from common/src/main/resources/assets/puzzle/textures/gui/sprites/icon/button.png rename to src/main/resources/assets/puzzle/textures/gui/sprites/icon/button.png diff --git a/fabric/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json similarity index 86% rename from fabric/src/main/resources/fabric.mod.json rename to src/main/resources/fabric.mod.json index 90303f9..22d10c7 100755 --- a/fabric/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "id": "puzzle", + "id": "${id}", "version": "${version}", "name": "Puzzle", @@ -22,10 +22,10 @@ "entrypoints": { "client": [ - "net.puzzlemc.fabric.PuzzleFabric" + "net.puzzlemc.core.PuzzleClient" ], "modmenu": [ - "net.puzzlemc.fabric.modmenu.ModMenuIntegration" + "net.puzzlemc.core.PuzzleClient" ] }, diff --git a/common/src/main/resources/puzzle-gui.mixins.json b/src/main/resources/puzzle-gui.mixins.json similarity index 100% rename from common/src/main/resources/puzzle-gui.mixins.json rename to src/main/resources/puzzle-gui.mixins.json diff --git a/common/src/main/resources/puzzle-models.accesswidener b/src/main/resources/puzzle-models.accesswidener similarity index 86% rename from common/src/main/resources/puzzle-models.accesswidener rename to src/main/resources/puzzle-models.accesswidener index 71080a7..22dd658 100755 --- a/common/src/main/resources/puzzle-models.accesswidener +++ b/src/main/resources/puzzle-models.accesswidener @@ -1,5 +1,5 @@ accessWidener v1 named -accessible class net/minecraft/client/render/model/json/ModelElement$Deserializer +accessible class net/minecraft/client/renderer/block/model/BlockElement$Deserializer accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;ILcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; accessible class net/minecraft/client/render/RenderLayer$MultiPhaseParameters accessible class net/minecraft/client/render/RenderPhase$Texture diff --git a/common/src/main/resources/puzzle-models.mixins.json b/src/main/resources/puzzle-models.mixins.json similarity index 100% rename from common/src/main/resources/puzzle-models.mixins.json rename to src/main/resources/puzzle-models.mixins.json diff --git a/common/src/main/resources/puzzle-splashscreen.mixins.json b/src/main/resources/puzzle-splashscreen.mixins.json similarity index 100% rename from common/src/main/resources/puzzle-splashscreen.mixins.json rename to src/main/resources/puzzle-splashscreen.mixins.json diff --git a/neoforge/src/main/resources/puzzle-splashscreen_neoforge.mixins.json b/src/main/resources/puzzle-splashscreen_neoforge.mixins.json similarity index 56% rename from neoforge/src/main/resources/puzzle-splashscreen_neoforge.mixins.json rename to src/main/resources/puzzle-splashscreen_neoforge.mixins.json index 11aff9a..56e437d 100644 --- a/neoforge/src/main/resources/puzzle-splashscreen_neoforge.mixins.json +++ b/src/main/resources/puzzle-splashscreen_neoforge.mixins.json @@ -1,9 +1,9 @@ { "required": true, - "package": "net.puzzlemc.neoforge.mixin", + "package": "net.puzzlemc.splashscreen.mixin", "compatibilityLevel": "JAVA_17", "client": [ - "splashscreen.MixinNeoForgeLoadingOverlay" + "MixinNeoForgeLoadingOverlay" ], "injectors": { "defaultRequire": 1 diff --git a/neoforge/src/main/resources/puzzle.png b/src/main/resources/puzzle.png similarity index 100% rename from neoforge/src/main/resources/puzzle.png rename to src/main/resources/puzzle.png diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts new file mode 100644 index 0000000..c569200 --- /dev/null +++ b/stonecutter.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("dev.kikugie.stonecutter") + id("dev.architectury.loom") version "1.13-SNAPSHOT" apply false + id("architectury-plugin") version "3.4-SNAPSHOT" apply false + id("com.github.johnrengelman.shadow") version "8.1.1" apply false + id("me.modmuss50.mod-publish-plugin") version "0.8.4" apply false +} +stonecutter active "1.21.10-fabric" /* [SC] DO NOT EDIT */ + +// See https://stonecutter.kikugie.dev/wiki/config/params +stonecutter parameters { + swaps["mod_version"] = "\"" + property("mod.version") + "\";" + swaps["minecraft"] = "\"" + node.metadata.version + "\";" + constants["release"] = property("mod.id") != "template" + dependencies["fapi"] = node.project.property("deps.fabric_version") as String +} \ No newline at end of file diff --git a/versions/1.20.1-fabric/gradle.properties b/versions/1.20.1-fabric/gradle.properties new file mode 100644 index 0000000..5e6477a --- /dev/null +++ b/versions/1.20.1-fabric/gradle.properties @@ -0,0 +1,12 @@ +mod.mc_dep_fabric==1.20.1 +mod.mc_dep_forgelike=[1.20, 1.20.1] +mod.mc_title=1.20.1 +mod.mc_targets=1.20.1 + +deps.forge_loader=47.3.0 +deps.neoforge_loader=[UNSUPPORTED] + +deps.fabric_version=0.92.3+1.20.1 +deps.modmenu_version=7.2.2 + +loom.platform=fabric diff --git a/versions/1.20.1-forge/gradle.properties b/versions/1.20.1-forge/gradle.properties new file mode 100644 index 0000000..7829d34 --- /dev/null +++ b/versions/1.20.1-forge/gradle.properties @@ -0,0 +1,13 @@ +mod.mc_dep_fabric==1.20.1 +mod.mc_dep_forgelike=[1.20, 1.20.1] +mod.mc_title=1.20.1 +mod.mc_targets=1.20.1 + +deps.forge_loader=47.3.0 +deps.neoforge_loader=[UNSUPPORTED] + +deps.fabric_version=0.92.3+1.20.1 + +deps.modmenu_version=[UNSUPPORTED] + +loom.platform=forge \ No newline at end of file diff --git a/versions/1.21.1-fabric/gradle.properties b/versions/1.21.1-fabric/gradle.properties new file mode 100644 index 0000000..2493151 --- /dev/null +++ b/versions/1.21.1-fabric/gradle.properties @@ -0,0 +1,13 @@ +mod.mc_dep_fabric=>=1.21 <=1.21.1 +mod.mc_dep_forgelike=[1.21, 1.21.1] +mod.mc_title=1.21.1 +mod.mc_targets=1.21 1.21.1 + +deps.forge_loader=0 +deps.neoforge_loader=21.1.66 + +deps.fabric_version=0.114.0+1.21.1 + +deps.modmenu_version=11.0.3 + +loom.platform=fabric \ No newline at end of file diff --git a/versions/1.21.1-neoforge/gradle.properties b/versions/1.21.1-neoforge/gradle.properties new file mode 100644 index 0000000..3a1c734 --- /dev/null +++ b/versions/1.21.1-neoforge/gradle.properties @@ -0,0 +1,13 @@ +mod.mc_dep_fabric=>=1.21 <=1.21.1 +mod.mc_dep_forgelike=[1.21, 1.21.1] +mod.mc_title=1.21.1 +mod.mc_targets=1.21 1.21.1 + +deps.forge_loader=0 +deps.neoforge_loader=21.1.66 + +deps.fabric_version=0.114.0+1.21.1 + +deps.modmenu_version=[UNSUPPORTED] + +loom.platform=neoforge \ No newline at end of file diff --git a/versions/1.21.10-fabric/gradle.properties b/versions/1.21.10-fabric/gradle.properties new file mode 100644 index 0000000..ecfd4dd --- /dev/null +++ b/versions/1.21.10-fabric/gradle.properties @@ -0,0 +1,12 @@ +mod.mc_dep_fabric=>=1.21.9 +mod.mc_dep_forgelike=[1.21.10,) +mod.mc_title=1.21.10 +mod.mc_targets=1.21.9, 1.21.10 + +deps.forge_loader=0 +deps.neoforge_loader=21.10.47-beta + +deps.fabric_version=0.138.0+1.21.10 +deps.modmenu_version=16.0.0-rc.1 + +loom.platform=fabric \ No newline at end of file diff --git a/versions/1.21.10-neoforge/gradle.properties b/versions/1.21.10-neoforge/gradle.properties new file mode 100644 index 0000000..baf58ca --- /dev/null +++ b/versions/1.21.10-neoforge/gradle.properties @@ -0,0 +1,12 @@ +mod.mc_dep_fabric=>=1.21.9 +mod.mc_dep_forgelike=[1.21.10,) +mod.mc_title=1.21.10 +mod.mc_targets=1.21.9, 1.21.10 + +deps.forge_loader=0 +deps.neoforge_loader=21.10.47-beta + +deps.fabric_version=0.138.0+1.21.10 +deps.modmenu_version=16.0.0-rc.1 + +loom.platform=neoforge \ No newline at end of file diff --git a/versions/1.21.5-fabric/gradle.properties b/versions/1.21.5-fabric/gradle.properties new file mode 100644 index 0000000..7e266b9 --- /dev/null +++ b/versions/1.21.5-fabric/gradle.properties @@ -0,0 +1,12 @@ +mod.mc_dep_fabric==1.21.5 +mod.mc_dep_forgelike=[1.21.5] +mod.mc_title=1.21.5 +mod.mc_targets=1.21.5 + +deps.forge_loader=54.0.13 +deps.neoforge_loader=21.4.47-beta + +deps.fabric_version=0.121.0+1.21.5 +deps.modmenu_version=14.0.0-rc.1 + +loom.platform=fabric \ No newline at end of file diff --git a/versions/1.21.5-neoforge/gradle.properties b/versions/1.21.5-neoforge/gradle.properties new file mode 100644 index 0000000..e36ac2e --- /dev/null +++ b/versions/1.21.5-neoforge/gradle.properties @@ -0,0 +1,12 @@ +mod.mc_dep_fabric==1.21.5 +mod.mc_dep_forgelike=[1.21.5] +mod.mc_title=1.21.5 +mod.mc_targets=1.21.5 + +deps.forge_loader=0 +deps.neoforge_loader=21.5.54-beta + +deps.fabric_version=0.121.0+1.21.5 +deps.modmenu_version=[UNSUPPORTED] + +loom.platform=neoforge \ No newline at end of file diff --git a/versions/1.21.8-fabric/gradle.properties b/versions/1.21.8-fabric/gradle.properties new file mode 100644 index 0000000..0da1f37 --- /dev/null +++ b/versions/1.21.8-fabric/gradle.properties @@ -0,0 +1,12 @@ +mod.mc_dep_fabric==1.21.8 +mod.mc_dep_forgelike=[1.21.8] +mod.mc_title=1.21.8 +mod.mc_targets=1.21.8 + +deps.forge_loader=0 +deps.neoforge_loader=21.8.50 + +deps.fabric_version=0.136.0+1.21.8 +deps.modmenu_version=15.0.0 + +loom.platform=fabric \ No newline at end of file diff --git a/versions/1.21.8-neoforge/gradle.properties b/versions/1.21.8-neoforge/gradle.properties new file mode 100644 index 0000000..0e4c559 --- /dev/null +++ b/versions/1.21.8-neoforge/gradle.properties @@ -0,0 +1,12 @@ +mod.mc_dep_fabric==1.21.5 +mod.mc_dep_forgelike=[1.21.5] +mod.mc_title=1.21.5 +mod.mc_targets=1.21.5 + +deps.forge_loader=0 +deps.neoforge_loader=21.8.50 + +deps.fabric_version=0.136.0+1.21.8 +deps.modmenu_version=[UNSUPPORTED] + +loom.platform=neoforge \ No newline at end of file