diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 111d075..619dc5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,11 +14,11 @@ jobs: uses: actions/checkout@v4 - name: Validate Gradle wrapper uses: gradle/actions/wrapper-validation@v4 - - name: Set up JDK 21 + - name: Set up JDK 25 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: 21 + java-version: 25 check-latest: true - name: Build with Gradle run: | diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 45a8251..a407946 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -15,11 +15,11 @@ jobs: uses: christian-draeger/read-properties@1.1.1 with: path: gradle.properties - properties: mod_version minecraft_version + properties: mod_version - name: Create a release uses: softprops/action-gh-release@v2.3.2 with: - tag_name: "${{ steps.mod_properties.outputs.mod_version }}-mc${{ steps.mod_properties.outputs.minecraft_version }}" - name: "${{ steps.mod_properties.outputs.mod_version }}-mc${{ steps.mod_properties.outputs.minecraft_version }}" + tag_name: "${{ steps.mod_properties.outputs.mod_version }}-mc0.0" + name: "${{ steps.mod_properties.outputs.mod_version }}-mc0.0" body: No changelog available. token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} diff --git a/.github/workflows/publish-fabric.yml b/.github/workflows/publish-fabric.yml index ae786a3..f9534f2 100644 --- a/.github/workflows/publish-fabric.yml +++ b/.github/workflows/publish-fabric.yml @@ -12,11 +12,11 @@ jobs: uses: actions/checkout@v4 - name: Validate Gradle wrapper uses: gradle/actions/wrapper-validation@v4 - - name: Set up JDK 21 + - name: Set up JDK 25 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: 21 + java-version: 25 check-latest: true - name: Build with Gradle run: | @@ -39,11 +39,11 @@ jobs: uses: shogo82148/actions-upload-release-asset@v1.8.1 with: upload_url: ${{ steps.latest_release.outputs.upload_url }} - asset_path: fabric/build/libs/craftgr-*-mc*-fabric.jar + asset_path: fabric/build/libs/craftgr-fabric-*-mc*.jar - name: Publish Fabric artifact uses: Kir-Antipov/mc-publish@v3.3.0 with: - files: fabric/build/libs/craftgr-*-mc*-fabric.jar + files: fabric/build/libs/craftgr-fabric-*-mc*.jar modrinth-id: lKYr4L6w modrinth-token: ${{ secrets.MODRINTH_TOKEN }} curseforge-id: 1009348 diff --git a/.github/workflows/publish-neoforge.yml b/.github/workflows/publish-neoforge.yml index 48ddd85..b5e8619 100644 --- a/.github/workflows/publish-neoforge.yml +++ b/.github/workflows/publish-neoforge.yml @@ -12,11 +12,11 @@ jobs: uses: actions/checkout@v4 - name: Validate Gradle wrapper uses: gradle/actions/wrapper-validation@v4 - - name: Set up JDK 21 + - name: Set up JDK 25 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: 21 + java-version: 25 check-latest: true - name: Build with Gradle run: | @@ -39,11 +39,11 @@ jobs: uses: shogo82148/actions-upload-release-asset@v1.8.1 with: upload_url: ${{ steps.latest_release.outputs.upload_url }} - asset_path: neoforge/build/libs/craftgr-*-mc*-neoforge.jar + asset_path: neoforge/build/libs/craftgr-neoforge-*-mc*.jar - name: Publish NeoForge artifact uses: Kir-Antipov/mc-publish@v3.3.0 with: - files: neoforge/build/libs/craftgr-*-mc*-neoforge.jar + files: neoforge/build/libs/craftgr-neoforge-*-mc*.jar modrinth-id: lKYr4L6w modrinth-token: ${{ secrets.MODRINTH_TOKEN }} curseforge-id: 1009348 diff --git a/.gitignore b/.gitignore index ce9de47..2dee0f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,44 @@ +.gradle build/ -*.ipr -run/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ +.kotlin + +### IntelliJ IDEA ### +.idea/ *.iws -out/ *.iml -.gradle/ -output/ -bin/ -libs/ +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ +### Eclipse ### +.apt_generated .classpath +.factorypath .project -.idea/ -classes/ -.metadata -.vscode .settings -*.launch +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ -.architectury-transformer/ +### Mac OS ### +.DS_Store -/clean.bat +### Test output ### +fabric/run/ +neoforge/run/ diff --git a/build.gradle b/build.gradle deleted file mode 100644 index aaf3dff..0000000 --- a/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.13-SNAPSHOT" apply false -} - -architectury { - minecraft = project.minecraft_version -} - -def platforms = subprojects.name.clone() -platforms.remove("common") -project.ext.set("platforms", platforms) - -subprojects { - apply plugin: "dev.architectury.loom" - - repositories { - mavenCentral() - maven { url "https://jitpack.io" } - maven { url "https://maven.parchmentmc.org" } - maven { url "https://maven.shedaniel.me/" } - maven { url "https://maven.neoforged.net/releases" } - maven { url "https://maven.isxander.dev/releases" } - maven { url "https://maven.terraformersmc.com/" } - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } - } - - dependencies { - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings loom.layered() { - officialMojangMappings() - } - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - archivesBaseName = project.archives_base_name - version = project.mod_version - group = project.maven_group - - repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. - } - - tasks.withType(JavaCompile) { - options.encoding = "UTF-8" - options.release = 21 - } -} - -build { - dependsOn subprojects.build -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..59b968a --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + alias(libs.plugins.fabric.loom) apply false + alias(libs.plugins.neoforge.moddev) apply false +} + +/* Project Properties */ +val modGroup = project.property("mod_group") as String +val modId = project.property("mod_id") as String +val modVersion = project.property("mod_version") as String + +allprojects { + group = modGroup + version = modVersion +} + +subprojects { + repositories { + mavenCentral() + maven("https://maven.isxander.dev/releases") + maven("https://maven.terraformersmc.com/") + maven("https://jitpack.io/") + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..aa7a2cd --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() +} + +kotlin { + jvmToolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} diff --git a/buildSrc/src/main/kotlin/common.gradle.kts b/buildSrc/src/main/kotlin/common.gradle.kts new file mode 100644 index 0000000..623aa28 --- /dev/null +++ b/buildSrc/src/main/kotlin/common.gradle.kts @@ -0,0 +1,81 @@ +package io.github.kabanfriends.craftgr.build + +plugins { + `java-library` +} + +/* Project Properties */ +val modName = project.property("mod_name") as String +val modId = project.property("mod_id") as String + +val minecraftVersion = versionCatalogs.named("libs").findVersion("minecraft").get().toString() + +base { + archivesName.set("${modId}-${project.name}") +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } + withSourcesJar() +} + +repositories { + mavenCentral() +} + +listOf("apiElements", "runtimeElements", "sourcesElements", "javadocElements").forEach { it -> + configurations.findByName(it)?.let { cfg -> + cfg.outgoing { + capability("${group}:${project.name}:${version}") + capability("${group}:${base.archivesName.get()}:${version}") + capability("${group}:${modId}-${project.name}-${minecraftVersion}:${version}") + capability("${group}:${modId}:${version}") + } + } +} + +tasks { + jar { + from(rootProject.file("LICENSE")) { + into("/") + } + + manifest { + attributes( + "Specification-Title" to project.name, + "Specification-Version" to project.version, + "Implementation-Title" to tasks.jar.get().archiveVersion, + "Implementation-Title" to project.name, + ) + } + + archiveClassifier.set("mc${minecraftVersion}") + } + + processResources { + val props = mapOf( + "version" to project.version, + "name" to modName, + "id" to modId, + "minecraft_version" to minecraftVersion.replace("rc-", "rc."), + "fabric_loader_version" to versionCatalogs.named("libs").findVersion("fabric-loader").get().toString(), + "fabric_api_version" to versionCatalogs.named("libs").findVersion("fabric-api").get().toString(), + "neoforge_version" to versionCatalogs.named("libs").findVersion("neoforge-loader").get().toString(), + "mod_menu_version" to versionCatalogs.named("libs").findVersion("mod-menu").get().toString(), + "yacl_version_fabric" to versionCatalogs.named("libs").findVersion("yacl-fabric").get().toString(), + "yacl_version_neoforge" to versionCatalogs.named("libs").findVersion("yacl-neoforge").get().toString(), + ) + + filesMatching(listOf("META-INF/mods.toml", "META-INF/neoforge.mods.toml")) { + expand(props) + } + + filesMatching(listOf("pack.mcmeta", "fabric.mod.json", "*.mixins.json")) { + expand(props) + } + + inputs.properties(props) + } +} diff --git a/buildSrc/src/main/kotlin/loader.gradle.kts b/buildSrc/src/main/kotlin/loader.gradle.kts new file mode 100644 index 0000000..3506f33 --- /dev/null +++ b/buildSrc/src/main/kotlin/loader.gradle.kts @@ -0,0 +1,58 @@ +package io.github.kabanfriends.craftgr.build + +plugins { + id("io.github.kabanfriends.craftgr.build.common") +} + +/* Project Properties */ +val modId = project.property("mod_id") as String + +configurations { + val commonJava by creating { + isCanBeResolved = true + } + val commonResources by creating { + isCanBeResolved = true + } +} + +dependencies { + compileOnly(project(":common")) { + capabilities { + requireCapability("${group}:${modId}") + } + attributes { + attribute( + Attribute.of("io.github.mcgradleconventions.loader", String::class.java), + "common" + ) + } + } + + "commonJava"(project(path = ":common", configuration = "commonJava")) + "commonResources"(project(path = ":common", configuration = "commonResources")) +} + +tasks { + processResources { + dependsOn(configurations["commonResources"]) + from(configurations["commonResources"]) + } + + named("compileJava", JavaCompile::class) { + dependsOn(configurations["commonJava"]) + source(configurations["commonJava"]) + } + + named("javadoc", Javadoc::class) { + dependsOn(configurations["commonJava"]) + source(configurations["commonJava"]) + } + + named("sourcesJar", Jar::class) { + dependsOn(configurations["commonJava"]) + from(configurations["commonJava"]) + dependsOn(configurations["commonResources"]) + from(configurations["commonResources"]) + } +} diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index b6d82dc..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -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 "dev.isxander:yet-another-config-lib:${rootProject.yacl_version}-fabric" - - compileOnly("org.apache.commons:commons-math3:${rootProject.math3_version}") - compileOnly "com.github.umjammer:jlayer:${rootProject.jlayer_version}" -} - -loom { - accessWidenerPath = file("src/main/resources/craftgr.accesswidener") -} - -architectury { - common(rootProject.platforms) -} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..3544151 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,59 @@ +plugins { + id("io.github.kabanfriends.craftgr.build.common") + alias(libs.plugins.neoforge.moddev) +} + +neoForge { + neoFormVersion = libs.versions.neoform.get() as String? + + val at = file("src/main/resources/META-INF/accesstransformer.cfg") + if (at.exists()) { + accessTransformers.from(at.absolutePath) + } +} + +dependencies { + compileOnly(libs.mixin) + compileOnly(libs.mixinextras) + annotationProcessor(libs.mixinextras) + + compileOnly(libs.jlayer) + compileOnly(libs.math3) + + compileOnly(libs.yacl.neoforge) +} + +configurations { + val commonJava by creating { + isCanBeResolved = false + isCanBeConsumed = true + } + val commonResources by creating { + isCanBeResolved = true + isCanBeConsumed = true + } +} + +artifacts { + add("commonJava", sourceSets.main.get().java.sourceDirectories.singleFile) + add("commonResources", sourceSets.main.get().resources.sourceDirectories.singleFile) +} + +val attribute = Attribute.of("io.github.mcgradleconventions.loader", String::class.java) +listOf("apiElements", "runtimeElements", "sourcesElements", "javadocElements").forEach { it -> + configurations.findByName(it)?.let { cfg -> + cfg.attributes { + attribute(attribute, "common") + } + } +} + +sourceSets.configureEach { + listOf(compileClasspathConfigurationName, runtimeClasspathConfigurationName).forEach { variant -> + configurations.named(variant) { + attributes { + attribute(attribute, "common") + } + } + } +} diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/config/controller/RadioStateController.java b/common/src/main/java/io/github/kabanfriends/craftgr/config/controller/RadioStateController.java index f715006..ed395e9 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/config/controller/RadioStateController.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/config/controller/RadioStateController.java @@ -12,6 +12,7 @@ import io.github.kabanfriends.craftgr.CraftGR; import io.github.kabanfriends.craftgr.audio.Radio; import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.input.KeyEvent; import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.network.chat.Component; @@ -48,6 +49,11 @@ public Element(RadioStateController control, Option option, YACLScreen this.option = option; } + @Override + public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { + throw new UnsupportedOperationException("Not implemented yet"); // TODO: fix! + } + @Override protected int getHoveredControlWidth() { return getUnhoveredControlWidth(); diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/event/ClientEvents.java b/common/src/main/java/io/github/kabanfriends/craftgr/event/ClientEvents.java index 7388a4c..f8cf5f6 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/event/ClientEvents.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/event/ClientEvents.java @@ -2,11 +2,8 @@ import io.github.kabanfriends.craftgr.CraftGR; import io.github.kabanfriends.craftgr.config.ModConfig; -import io.github.kabanfriends.craftgr.overlay.SongInfoOverlay; import io.github.kabanfriends.craftgr.song.SongProviderType; -import net.minecraft.client.gui.GuiGraphics; - -import java.io.IOException; +import net.minecraft.client.gui.GuiGraphicsExtractor; public class ClientEvents { @@ -30,7 +27,7 @@ public void onClientTick() { craftGR.getKeybinds().tick(); } - public void onGameRender(GuiGraphics graphics, int mouseX, int mouseY) { + public void onGameRender(GuiGraphicsExtractor graphics, int mouseX, int mouseY) { if (!craftGR.getSongInfoOverlay().shouldRender()) { return; } diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/gui/RadioOptionContainer.java b/common/src/main/java/io/github/kabanfriends/craftgr/gui/RadioOptionContainer.java index a9545e9..5dc95d1 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/gui/RadioOptionContainer.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/gui/RadioOptionContainer.java @@ -4,7 +4,7 @@ import io.github.kabanfriends.craftgr.config.ModConfig; import io.github.kabanfriends.craftgr.util.ModUtil; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.*; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -35,7 +35,7 @@ public class RadioOptionContainer extends AbstractContainerWidget { private final List children; public RadioOptionContainer(int x, int y, int width) { - super(x, y, width, 20, CommonComponents.EMPTY); + super(x, y, width, 20, CommonComponents.EMPTY, AbstractScrollArea.defaultSettings(0)); volumeSlider = new RadioVolumeSliderButton(x, y, width - CONFIG_BUTTON_SIZE - CONFIG_BUTTON_PADDING); configButton = new ImageButton( @@ -74,12 +74,11 @@ protected void updateWidgetNarration(NarrationElementOutput output) { } } - @Override - protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) { + protected void extractWidgetRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { repositionChildren(); for (AbstractWidget widget : children) { - widget.render(guiGraphics, mouseX, mouseY, delta); + widget.extractRenderState(graphics, mouseX, mouseY, delta); } } diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/Overlay.java b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/Overlay.java index c520232..b23f1ad 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/Overlay.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/Overlay.java @@ -1,6 +1,6 @@ package io.github.kabanfriends.craftgr.overlay; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; public abstract class Overlay { @@ -18,7 +18,7 @@ public void setActive(boolean active) { this.active = active; } - public abstract void render(GuiGraphics graphics, int mouseX, int mouseY); + public abstract void render(GuiGraphicsExtractor graphics, int mouseX, int mouseY); public abstract boolean mouseClick(int mouseX, int mouseY); } diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/SongInfoOverlay.java b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/SongInfoOverlay.java index d91011e..64186a6 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/SongInfoOverlay.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/SongInfoOverlay.java @@ -1,6 +1,7 @@ package io.github.kabanfriends.craftgr.overlay; import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.platform.cursor.CursorTypes; import dev.isxander.yacl3.gui.YACLScreen; import io.github.kabanfriends.craftgr.CraftGR; import io.github.kabanfriends.craftgr.audio.FreqRenderer; @@ -13,7 +14,7 @@ import io.github.kabanfriends.craftgr.util.Http; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.client.gui.screens.ConfirmLinkScreen; import net.minecraft.client.gui.screens.Screen; @@ -99,7 +100,7 @@ public SongInfoOverlay(CraftGR craftGR) { } @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY) { + public void render(GuiGraphicsExtractor graphics, int mouseX, int mouseY) { Font font = Minecraft.getInstance().font; float scale = ModConfig.get("overlayScale"); @@ -158,6 +159,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY) { if (isClickable() && isHovered(mouseX, mouseY)) { graphics.blitSprite(RenderPipelines.GUI_TEXTURED, HIGHLIGHTED_BORDER_SPRITE, x - 2, y - 2, width + 4, height + 4); + graphics.requestCursor(CursorTypes.POINTING_HAND); } matrixStack.pushMatrix(); @@ -186,7 +188,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY) { } } - graphics.drawString(Minecraft.getInstance().font, str, (x + ART_LEFT_PADDING + ART_INFO_SPACE_WIDTH + albumArtWidth) / 2, (y + INFO_TOP_PADDING + (i > 0 ? YEAR_ARTIST_SPACE_HEIGHT : 0) + INFO_LINE_HEIGHT * (i + 1)) / 2, Color.LIGHT_GRAY.getRGB()); + graphics.text(Minecraft.getInstance().font, str, (x + ART_LEFT_PADDING + ART_INFO_SPACE_WIDTH + albumArtWidth) / 2, (y + INFO_TOP_PADDING + (i > 0 ? YEAR_ARTIST_SPACE_HEIGHT : 0) + INFO_LINE_HEIGHT * (i + 1)) / 2, Color.LIGHT_GRAY.getRGB()); } } } @@ -197,7 +199,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY) { muted = true; updateScrollWidth(); } - graphics.drawString(Minecraft.getInstance().font, CraftGR.AUDIO_MUTED_ICON, (x + (int) width - MUTED_ICON_RIGHT_PADDING - MUTED_ICON_SIZE) / 2, (y + MUTED_ICON_TOP_PADDING) / 2, 0xFFFFFFFF); + graphics.text(Minecraft.getInstance().font, CraftGR.AUDIO_MUTED_ICON, (x + (int) width - MUTED_ICON_RIGHT_PADDING - MUTED_ICON_SIZE) / 2, (y + MUTED_ICON_TOP_PADDING) / 2, 0xFFFFFFFF); } else if (muted) { muted = false; updateScrollWidth(); @@ -213,10 +215,10 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY) { graphics.fill((int) (x + (float) song.getLocalPlayedTime() / durationMillis * width), y + ART_TOP_PADDING + ART_SIZE + ART_BOTTOM_PADDING, x + width, y + height, 0x40000000); } - graphics.drawString(Minecraft.getInstance().font, formatTime(song.getLocalPlayedTime() / 1000L), x + ART_LEFT_PADDING, y + ART_TOP_PADDING + ART_SIZE + ART_TIMER_SPACE_HEIGHT, 0xFFFFFFFF); + graphics.text(Minecraft.getInstance().font, formatTime(song.getLocalPlayedTime() / 1000L), x + ART_LEFT_PADDING, y + ART_TOP_PADDING + ART_SIZE + ART_TIMER_SPACE_HEIGHT, 0xFFFFFFFF); int timerWidth = font.width(formatTime(song.metadata().duration())); - graphics.drawString(Minecraft.getInstance().font, formatTime(song.metadata().duration()), x + (int) width - timerWidth - TIMER_RIGHT_PADDING, y + ART_TOP_PADDING + ART_SIZE + ART_TIMER_SPACE_HEIGHT, 0xFFFFFFFF); + graphics.text(Minecraft.getInstance().font, formatTime(song.metadata().duration()), x + (int) width - timerWidth - TIMER_RIGHT_PADDING, y + ART_TOP_PADDING + ART_SIZE + ART_TIMER_SPACE_HEIGHT, 0xFFFFFFFF); } else if (showVisualizer) { graphics.fill(x, y + ART_SIZE + ART_TOP_PADDING + ART_BOTTOM_PADDING, x + width, y + height, 0x40000000); } @@ -280,10 +282,10 @@ public boolean shouldRender() { OverlayVisibility visibility = ModConfig.get("overlayVisibility"); if (Minecraft.getInstance().screen == null) { - if (visibility != SongInfoOverlay.OverlayVisibility.ALWAYS) return false; + if (visibility != OverlayVisibility.ALWAYS) return false; } else { - if (visibility == SongInfoOverlay.OverlayVisibility.NONE) return false; - if (visibility == SongInfoOverlay.OverlayVisibility.CHAT && !(Minecraft.getInstance().screen instanceof ChatScreen)) return false; + if (visibility == OverlayVisibility.NONE) return false; + if (visibility == OverlayVisibility.CHAT && !(Minecraft.getInstance().screen instanceof ChatScreen)) return false; } return true; diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/UIWidget.java b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/UIWidget.java index f2078f1..0bbe097 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/UIWidget.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/UIWidget.java @@ -1,6 +1,6 @@ package io.github.kabanfriends.craftgr.overlay.widget; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; public abstract class UIWidget { @@ -28,5 +28,5 @@ public void setY(float y) { this.y = y; } - public abstract void render(GuiGraphics graphics, int mouseX, int mouseY); + public abstract void render(GuiGraphicsExtractor graphics, int mouseX, int mouseY); } diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/impl/ScrollingText.java b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/impl/ScrollingText.java index 99e71aa..3037922 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/impl/ScrollingText.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/overlay/widget/impl/ScrollingText.java @@ -2,7 +2,7 @@ import io.github.kabanfriends.craftgr.overlay.widget.UIWidget; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; import net.minecraft.util.Util; import org.joml.Matrix3x2fStack; @@ -71,7 +71,7 @@ public void setWaitTime(int waittime) { } @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY) { + public void render(GuiGraphicsExtractor graphics, int mouseX, int mouseY) { int fontX = (int) getMovingX(x / 2); int fontY = (int) y / 2; @@ -83,7 +83,7 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY) { graphics.enableScissor(scissorX - 1, fontY - 1, scissorX + width + 2, fontY + Minecraft.getInstance().font.lineHeight + 2); //graphics.fill(0, 0, Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight(), 0x8F00FF00); - graphics.drawString(Minecraft.getInstance().font, component, fontX, fontY, Color.WHITE.getRGB()); + graphics.text(Minecraft.getInstance().font, component, fontX, fontY, Color.WHITE.getRGB()); graphics.disableScissor(); matrixStack.popMatrix();} diff --git a/common/src/main/java/io/github/kabanfriends/craftgr/util/ActionBarMessage.java b/common/src/main/java/io/github/kabanfriends/craftgr/util/ActionBarMessage.java index 0ce3688..348c65c 100644 --- a/common/src/main/java/io/github/kabanfriends/craftgr/util/ActionBarMessage.java +++ b/common/src/main/java/io/github/kabanfriends/craftgr/util/ActionBarMessage.java @@ -34,6 +34,6 @@ public void show() { return; } - Minecraft.getInstance().player.displayClientMessage(Component.empty().append(icon).append(SPACE).append(body), true); + Minecraft.getInstance().player.sendOverlayMessage(Component.empty().append(icon).append(SPACE).append(body)); } } diff --git a/common/src/main/resources/META-INF/accesstransformer.cfg b/common/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..56feaa2 --- /dev/null +++ b/common/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,4 @@ +public-f net.minecraft.client.gui.navigation.ScreenRectangle + +public net.minecraft.client.gui.components.OptionsList$Entry +public net.minecraft.client.gui.components.AbstractSelectionList$Entry \ No newline at end of file diff --git a/common/src/main/resources/assets/craftgr/lang/en_us.json b/common/src/main/resources/assets/craftgr/lang/en_us.json index 364059a..d5090ee 100644 --- a/common/src/main/resources/assets/craftgr/lang/en_us.json +++ b/common/src/main/resources/assets/craftgr/lang/en_us.json @@ -68,6 +68,6 @@ "text.craftgr.song.unknown": "Unknown Song", "text.craftgr.song.intermission": "Intermission", - "key.category.craftgr": "CraftGR", + "key.category.craftgr.craftgr": "CraftGR", "key.craftgr.toggle": "Pause/Resume" } \ No newline at end of file diff --git a/common/src/main/resources/assets/craftgr/lang/ja_jp.json b/common/src/main/resources/assets/craftgr/lang/ja_jp.json index 70a20a6..aafca12 100644 --- a/common/src/main/resources/assets/craftgr/lang/ja_jp.json +++ b/common/src/main/resources/assets/craftgr/lang/ja_jp.json @@ -69,6 +69,6 @@ "text.craftgr.song.unknown": "不明な楽曲", "text.craftgr.song.intermission": "インターミッション", - "key.category.craftgr": "CraftGR", + "key.category.craftgr.craftgr": "CraftGR", "key.craftgr.toggle": "再生/停止" } \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index f6bc343..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,68 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "8.1.1" -} - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } - - modApi("com.terraformersmc:modmenu:${rootProject.mod_menu_version}") { transitive(false) } - modApi "dev.isxander:yet-another-config-lib:${rootProject.yacl_version}-fabric" - - include "org.apache.commons:commons-math3:${rootProject.math3_version}" - include "com.github.umjammer:jlayer:${rootProject.jlayer_version}" - - //modRuntimeOnly("com.terraformersmc:modmenu:${rootProject.mod_menu_version}") { transitive(false) } - //modRuntimeOnly "dev.isxander:yet-another-config-lib:${rootProject.yacl_version}-fabric" - - runtimeOnly "org.apache.commons:commons-math3:${rootProject.math3_version}" - runtimeOnly "com.github.umjammer:jlayer:${rootProject.jlayer_version}" -} - -processResources { - inputs.property "version", rootProject.version - - // Dev - from(project(":common").file("src/main/resources/craftgr.accesswidener")) { - into("/"); - } - - filesMatching("fabric.mod.json") { - expand "version": rootProject.version - } -} - -shadowJar { - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - archiveClassifier.set "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier.set "mc${rootProject.minecraft_version}-fabric" -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 0000000..6f26d8d --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,62 @@ +plugins { + id("io.github.kabanfriends.craftgr.build.loader") + alias(libs.plugins.fabric.loom) +} + +/* Project Properties */ +val modId = project.property("mod_id") as String + +dependencies { + minecraft(libs.minecraft) + + implementation(libs.fabric.loader) + implementation(libs.fabric.api) + + implementation(libs.mod.menu) + compileOnly(libs.yacl.neoforge) // TODO: use fabric / use implementation for test runs + + implementation(libs.jlayer) + include(libs.jlayer) + implementation(libs.math3) + include(libs.math3) +} + +loom { + val aw = file("src/main/resources/${modId}.accesswidener") + if (aw.exists()) { + accessWidenerPath.set(aw) + } + + runs { + named("client") { + client() + ideConfigGenerated(true) + runDir("run/client") + configName = "Fabric Client" + } + named("server") { + server() + ideConfigGenerated(true) + runDir("run/server") + configName = "Fabric Server" + } + } +} + +val attribute = Attribute.of("io.github.mcgradleconventions.loader", String::class.java) +listOf("apiElements", "runtimeElements", "sourcesElements", "javadocElements").forEach { it -> + configurations.findByName(it)?.let { cfg -> + cfg.attributes { + attribute(attribute, "fabric") + } + } +} +sourceSets.configureEach { + listOf(compileClasspathConfigurationName, runtimeClasspathConfigurationName).forEach { variant -> + configurations.named(variant) { + attributes { + attribute(attribute, "fabric") + } + } + } +} diff --git a/fabric/gradle.properties b/fabric/gradle.properties deleted file mode 100644 index eaeaf94..0000000 --- a/fabric/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platformAdapter = fabric \ No newline at end of file diff --git a/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/CraftGRFabric.java b/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/CraftGRFabric.java index f30b4c5..f9d969b 100644 --- a/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/CraftGRFabric.java +++ b/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/CraftGRFabric.java @@ -2,7 +2,7 @@ import io.github.kabanfriends.craftgr.CraftGR; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -16,7 +16,7 @@ public void onInitializeClient() { // Keybinds for (KeyMapping keyMapping : craftGR.getKeybinds().getKeyMappings()) { - KeyBindingHelper.registerKeyBinding(keyMapping); + KeyMappingHelper.registerKeyMapping(keyMapping); } // Events diff --git a/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/FabricEvents.java b/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/FabricEvents.java index b607016..589beba 100644 --- a/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/FabricEvents.java +++ b/fabric/src/main/java/io/github/kabanfriends/craftgr/fabric/FabricEvents.java @@ -38,7 +38,7 @@ public static void setup() { } return CraftGR.getInstance().clientEvents().onMouseClick((int) event.x(), (int) event.y()); }); - ScreenEvents.afterRender(initScreen).register((screen, graphics, mouseX, mouseY, tickDelta) -> CraftGR.getInstance().clientEvents().onGameRender(graphics, mouseX, mouseY)); + ScreenEvents.afterExtract(initScreen).register((screen, graphics, mouseX, mouseY, tickDelta) -> CraftGR.getInstance().clientEvents().onGameRender(graphics, mouseX, mouseY)); }); } } diff --git a/common/src/main/resources/craftgr.accesswidener b/fabric/src/main/resources/craftgr.accesswidener similarity index 90% rename from common/src/main/resources/craftgr.accesswidener rename to fabric/src/main/resources/craftgr.accesswidener index 9ca4995..a3c9436 100644 --- a/common/src/main/resources/craftgr.accesswidener +++ b/fabric/src/main/resources/craftgr.accesswidener @@ -1,4 +1,4 @@ -accessWidener v2 named +accessWidener v2 official extendable class net/minecraft/client/gui/navigation/ScreenRectangle diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 4cdd95b..c84607d 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "craftgr", + "id": "${id}", "version": "${version}", - "name": "CraftGR", + "name": "${name}", "description": "Touhou Project music player for Minecraft", "authors": [ "KabanFriends" @@ -30,18 +30,18 @@ ], "accessWidener": "craftgr.accesswidener", "depends": { - "minecraft": ">=1.21.11-", - "fabricloader": "*", - "fabric-key-binding-api-v1": "*", + "minecraft": ">=${minecraft_version}", + "fabricloader": ">=${fabric_loader_version}", + "fabric-key-mapping-api-v1": "*", "fabric-lifecycle-events-v1": "*", "fabric-rendering-v1": "*", "fabric-screen-api-v1": "*" }, "recommends": { - "yet_another_config_lib_v3": ">=3.8.1" + "yet_another_config_lib_v3": ">=${yacl_version_fabric}" }, "suggests": { - "modmenu": ">=17.0.0-" + "modmenu": ">=${mod_menu_version}-" }, "custom": { "modmenu:clientsideOnly": true diff --git a/gradle.properties b/gradle.properties index 792e266..0bb640d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,25 +1,6 @@ org.gradle.jvmargs = -Xmx2G -maven_group = io.github.kabanfriends.craftgr -archives_base_name = craftgr - -# Mod Properties -minecraft_version = 1.21.11 +mod_group = io.github.kabanfriends.craftgr +mod_name = CraftGR +mod_id = craftgr mod_version = 1.9.8 - -# Fabric Properties -# See: https://fabricmc.net/develop/ -fabric_loader_version = 0.18.0 -fabric_api_version = 0.139.4+1.21.11 - -# NeoForge Properties -# See: https://neoforged.net/ -neoforge_version = 21.11.0-beta - -# Library Dependencies -jlayer_version = 1.0.3 -math3_version = 3.6.1 - -# Mod Dependencies -mod_menu_version = 17.0.0-alpha.1 -yacl_version = 3.8.1+1.21.11 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..a9e2739 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,45 @@ +[versions] +# Fabric: https://fabricmc.net/develop/ +# NeoForge: https://neoforged.net/ + +# Toolchains +fabric-loom = "1.15-SNAPSHOT" +neoforge-moddev = "2.0.141" + +# Minecraft +minecraft = "26.1" +neoform = "26.1-1" + +# Mod loader platforms +neoforge-loader = "26.1.0.1-beta" +fabric-loader = "0.18.4" +fabric-api = "0.144.0+26.1" + +mixin = "0.17.0+mixin.0.8.7" +mixinextras = "0.5.3" + +# Library dependencies +jlayer = "1.0.3" +math3 = "3.6.1" + +# Mod dependencies +mod-menu = "18.0.0-alpha.6" +yacl-fabric = "3.8.1+1.21.11-fabric" +yacl-neoforge = "3.8.1+1.21.11-neoforge" + +[libraries] +minecraft = { group = "com.mojang", name = "minecraft", version.ref = "minecraft" } +neoforge-loader = { group = "net.neoforged", name = "neoforge", version.ref = "neoforge-loader" } +fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric-loader" } +fabric-api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabric-api" } +mixin = { group = "net.fabricmc", name = "sponge-mixin", version.ref = "mixin" } +mixinextras = { group = "io.github.llamalad7", name = "mixinextras-fabric", version.ref = "mixinextras" } +jlayer = { group = "com.github.umjammer", name = "jlayer", version.ref = "jlayer" } +math3 = { group = "org.apache.commons", name = "commons-math3", version.ref = "math3" } +mod-menu = { group = "com.terraformersmc", name = "modmenu", version.ref = "mod-menu" } +yacl-fabric = { group = "dev.isxander", name = "yet-another-config-lib", version.ref = "yacl-fabric" } +yacl-neoforge = { group = "dev.isxander", name = "yet-another-config-lib", version.ref = "yacl-neoforge" } + +[plugins] +fabric-loom = { id = "net.fabricmc.fabric-loom", version.ref = "fabric-loom" } +neoforge-moddev = { id = "net.neoforged.moddev", version.ref = "neoforge-moddev" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c..249e583 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e382118..2ac0d72 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Tue Mar 24 19:39:44 JST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0..1b6c787 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 107acd3..ac1b06f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/neoforge/build.gradle b/neoforge/build.gradle deleted file mode 100644 index 3d63063..0000000 --- a/neoforge/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "8.1.1" -} - -architectury { - platformSetupLoomIde() - neoForge() -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common -} - -dependencies { - neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive false } - - include "org.apache.commons:commons-math3:${rootProject.math3_version}" - include "com.github.umjammer:jlayer:${rootProject.jlayer_version}" - - // TODO: reenable - /* - modRuntimeOnly("dev.isxander:yet-another-config-lib:${rootProject.yacl_version}-neoforge") { - exclude module: "kotlinforforge-neoforge" - } - */ - - runtimeOnly "org.apache.commons:commons-math3:${rootProject.math3_version}" - runtimeOnly "com.github.umjammer:jlayer:${rootProject.jlayer_version}" - runtimeOnly "org.quiltmc.parsers:gson:0.2.1" -} - -processResources { - inputs.property "version", rootProject.version - - filesMatching("META-INF/neoforge.mods.toml") { - expand "version": rootProject.version - } -} - -shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - archiveClassifier.set "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier.set "mc${rootProject.minecraft_version}-neoforge" - - atAccessWideners.add("craftgr.accesswidener") -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 0000000..cc7aade --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,71 @@ +plugins { + id("io.github.kabanfriends.craftgr.build.loader") + alias(libs.plugins.neoforge.moddev) +} + +/* Project Properties */ +val modId = project.property("mod_id") as String + +dependencies { + implementation(libs.neoforge.loader) + + compileOnly(libs.yacl.neoforge) // TODO: use implementation for test runs + + implementation(libs.jlayer) + jarJar(libs.jlayer) + implementation(libs.math3) + jarJar(libs.math3) +} + +neoForge { + version = libs.versions.neoforge.loader.get() as String? + + val at = file("${rootDir}/common/src/main/resources/META-INF/accesstransformer.cfg") + if (at.exists()) { + accessTransformers.from(at.absolutePath) + } + + runs { + configureEach { + systemProperty("neoforge.enabledGameTestNamespaces", modId) + ideName = "NeoForge ${name.capitalize()} (${project.path})" + } + create("client") { + client() + } + create("data") { + clientData() + } + create("server") { + server() + } + } + + mods { + create(modId) { + sourceSet(sourceSets.main.get()) + } + } +} + +sourceSets.main.get().resources { + srcDir("src/generated/resources") +} + +val attribute = Attribute.of("io.github.mcgradleconventions.loader", String::class.java) +listOf("apiElements", "runtimeElements", "sourcesElements", "javadocElements").forEach { it -> + configurations.findByName(it)?.let { cfg -> + cfg.attributes { + attribute(attribute, "neoforge") + } + } +} +sourceSets.configureEach { + listOf(compileClasspathConfigurationName, runtimeClasspathConfigurationName).forEach { variant -> + configurations.named(variant) { + attributes { + attribute(attribute, "neoforge") + } + } + } +} diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties deleted file mode 100644 index 4f8c488..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/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 1d1ee54..49106c4 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -4,9 +4,9 @@ issueTrackerURL = "https://github.com/KabanFriends/CraftGR/issues" license = "LGPL-3.0" [[mods]] -modId = "craftgr" +modId = "${id}" version = "${version}" -displayName = "CraftGR" +displayName = "${name}" authors = "KabanFriends" description = "Touhou Project music player for Minecraft" modUrl = "https://modrinth.com/mod/craftgr" @@ -21,20 +21,20 @@ file = "META-INF/accesstransformer.cfg" [[dependencies.craftgr]] modId = "minecraft" type = "required" -versionRange = "[1.21.11-,)" +versionRange = "[${minecraft_version},)" ordering = "NONE" side = "CLIENT" [[dependencies.craftgr]] modId = "neoforge" type = "required" -versionRange = "[21.11.0-beta,)" +versionRange = "[${neoforge_version},)" ordering = "NONE" side = "CLIENT" [[dependencies.craftgr]] modId = "yet_another_config_lib_v3" type = "optional" -versionRange="[3.8.1,)" +versionRange="[${yacl_version_neoforge},)" ordering = "NONE" side = "CLIENT" diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta deleted file mode 100644 index a7fb77d..0000000 --- a/neoforge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "CraftGR", - "pack_format": 6 - } -} diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index bfd354b..0000000 --- a/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.architectury.dev/" } - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.neoforged.net/" } - gradlePluginPortal() - } -} - -include("common") -include("fabric") -include("neoforge") - -rootProject.name = "CraftGR" diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..ff381f9 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven("https://maven.fabricmc.net/") + maven("https://maven.minecraftforge.net/") + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} + +rootProject.name = "CraftGR" +include("common") +include("fabric") +include("neoforge")