diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 33a58b6..35f2bb6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,21 +14,22 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up JDK ${{ matrix.java }} - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: temurin java-version: ${{ matrix.java }} - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v1 - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | ~/.gradle/caches ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: ${{ runner.os }}-gradle- - name: Build with Gradle run: ./gradlew build diff --git a/.github/workflows/publish-curseforge.yml b/.github/workflows/publish-curseforge.yml deleted file mode 100644 index 8134cdb..0000000 --- a/.github/workflows/publish-curseforge.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: publish-curseforge - -on: - workflow_dispatch: - inputs: - version: - description: 'Mod Version' - required: true - default: '0.0.0' - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Set up JDK - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ubuntu-latest-gradle-${{ hashFiles('**/*.gradle*') }} - restore-keys: ubuntu-latest-gradle- - - - name: Publish to Curseforge (Forge) - run: ./gradlew -Psemver='${{ github.event.inputs.version }}' forge:curseforge - env: - CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} - - - name: Publish to Curseforge (Fabric) - run: ./gradlew -Psemver='${{ github.event.inputs.version }}' fabric:curseforge - env: - CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} diff --git a/.github/workflows/publish-modrinth.yml b/.github/workflows/publish-modrinth.yml deleted file mode 100644 index 8728068..0000000 --- a/.github/workflows/publish-modrinth.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: publish-modrinth - -on: - workflow_dispatch: - inputs: - version: - description: 'Mod Version' - required: true - default: '0.0.0' - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Set up JDK - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ubuntu-latest-gradle-${{ hashFiles('**/*.gradle*') }} - restore-keys: ubuntu-latest-gradle- - - - name: Publish to modrinth (Forge) - run: ./gradlew -Psemver='${{ github.event.inputs.version }}' forge:modrinth - env: - MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} - - - name: Publish to modrinth (Fabric) - run: ./gradlew -Psemver='${{ github.event.inputs.version }}' fabric:modrinth - env: - MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 50e2f94..c43a295 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -9,79 +9,71 @@ jobs: name: publish runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Extract Version from Tag - uses: rishabhgupta/split-by@v1 id: split_tag - with: - string: ${{ github.event.release.tag_name }} - split-by: '/' + run: | + tag=${{ github.event.release.tag_name }} + parts=(${tag//\// }) + echo "mc_version=${parts[0]}" >> $GITHUB_OUTPUT + echo "mod_version=${parts[1]}" >> $GITHUB_OUTPUT - name: Set up JDK - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: temurin java-version: 17 - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v1 - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | ~/.gradle/caches ~/.gradle/wrapper - key: ubuntu-latest-gradle-${{ hashFiles('**/*.gradle*') }} + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: ubuntu-latest-gradle- - name: Build with Gradle - run: ./gradlew -Psemver='${{ steps.split_tag.outputs._1 }}' build + run: ./gradlew -PmodVersion='${{ steps.split_tag.outputs.mod_version }}' build - name: Remove extra JARs run: | rm fabric/build/libs/*-dev-shadow.jar - rm fabric/build/libs/*-sources.jar rm forge/build/libs/*-dev-shadow.jar - rm forge/build/libs/*-sources.jar - name: Add Artifacts to Github Release - uses: alexellis/upload-assets@0.3.0 + uses: alexellis/upload-assets@0.4.0 env: GITHUB_TOKEN: ${{ github.token }} with: - asset_paths: '["./forge/build/libs/*.jar","./fabric/build/libs/*.jar"]' + asset_paths: '["./forge/build/libs/*.jar","./fabric/build/libs/*.jar","./common/build/libs/*-api.jar"]' - - name: Publish to Github Packages (Forge) - run: gradle -Psemver='${{ steps.split_tag.outputs._1 }}' forge:publish - env: - GITHUB_MAVEN_URL: 'https://maven.pkg.github.com/${{ github.repository }}' - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Publish to Curseforge and Minotaur (Forge) + uses: Kir-Antipov/mc-publish@v3.3 + with: + name: Scannable MC${{ steps.split_tag.outputs.mc_version }}-${{ steps.split_tag.outputs.mod_version }} + version: ${{ steps.split_tag.outputs.mod_version }} + java: Java 17 - - name: Publish to Github Packages (Fabric) - run: gradle -Psemver='${{ steps.split_tag.outputs._1 }}' fabric:publish - env: - GITHUB_MAVEN_URL: 'https://maven.pkg.github.com/${{ github.repository }}' - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + files: | + forge/build/libs/*.jar + common/build/libs/*-api.jar - - name: Publish to Curseforge (Forge) - run: ./gradlew -Psemver='${{ steps.split_tag.outputs._1 }}' forge:curseforge - env: - CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} + modrinth-token: ${{ secrets.MODRINTH_API_KEY }} + curseforge-token: ${{ secrets.CURSEFORGE_API_KEY }} - - name: Publish to Curseforge (Fabric) - run: ./gradlew -Psemver='${{ steps.split_tag.outputs._1 }}' fabric:curseforge - env: - CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} + - name: Publish to Curseforge and Minotaur (Fabric) + uses: Kir-Antipov/mc-publish@v3.3 + with: + name: Scannable MC${{ steps.split_tag.outputs.mc_version }}-${{ steps.split_tag.outputs.mod_version }} + version: ${{ steps.split_tag.outputs.mod_version }} + java: Java 17 - - name: Publish to modrinth (Forge) - run: ./gradlew -Psemver='${{ steps.split_tag.outputs._1 }}' forge:modrinth - env: - MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} + files: | + fabric/build/libs/*.jar + common/build/libs/*-api.jar - - name: Publish to modrinth (Fabric) - run: ./gradlew -Psemver='${{ steps.split_tag.outputs._1 }}' fabric:modrinth - env: - MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }} - CHANGELOG: ${{ github.event.release.body }} + modrinth-token: ${{ secrets.MODRINTH_API_KEY }} + curseforge-token: ${{ secrets.CURSEFORGE_API_KEY }} diff --git a/build.gradle b/build.gradle deleted file mode 100644 index c1db393..0000000 --- a/build.gradle +++ /dev/null @@ -1,82 +0,0 @@ -plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.0-SNAPSHOT" apply false - id "com.matthewprenger.cursegradle" version "1.4.0" apply false - id "com.modrinth.minotaur" version "2.5.0" apply false -} - -architectury { - minecraft = rootProject.minecraft_version -} - -subprojects { - apply plugin: "dev.architectury.loom" - - loom { - silentMojangMappingsLicense() - } - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.officialMojangMappings() - } -} - -def getGitRef() { - try { - final def stdout = new ByteArrayOutputStream() - exec { - commandLine "git", "rev-parse", "--short", "HEAD" - standardOutput = stdout - } - return stdout.toString().trim() - } catch (final Throwable ignored) { - return "unknown" - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "com.matthewprenger.cursegradle" - apply plugin: "com.modrinth.minotaur" - apply plugin: "maven-publish" - - archivesBaseName = "${rootProject.archives_base_name}-MC${rootProject.minecraft_version}-${project.name}" - version = "${rootProject.semver}+${getGitRef()}" - group = rootProject.maven_group - - repositories { - maven { - url "https://cursemaven.com" - content { includeGroup "curse.maven" } - } - } - - dependencies { - compileOnly "com.google.code.findbugs:jsr305:3.0.2" - } - - tasks.withType(JavaCompile) { - options.encoding = "UTF-8" - options.release = 17 - } - - java { - withSourcesJar() - } - - jar { - from("LICENSE") { - rename { "${it}_${rootProject.archivesBaseName}" } - } - } - - idea { - module { - for (final String exclude in ["out", "logs"]) { - excludeDirs += file(exclude) - } - } - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..5a6b7eb --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,145 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import net.fabricmc.loom.api.LoomGradleExtensionAPI +import net.fabricmc.loom.task.RemapJarTask +import org.gradle.configurationcache.extensions.capitalized + +plugins { + java + alias(libs.plugins.architectury) + alias(libs.plugins.loom) apply false + alias(libs.plugins.shadow) apply false + alias(libs.plugins.spotless) +} + +val modId: String by project +val modVersion: String by project +val mavenGroup: String by project +val enabledPlatforms: String by project +val minecraftVersion: String = libs.versions.minecraft.get() + +fun getGitRef(): String { + return providers.exec { + commandLine("git", "rev-parse", "--short", "HEAD") + isIgnoreExitValue = true + }.standardOutput.asText.get().trim() +} + +subprojects { + apply(plugin = "java") + apply(plugin = rootProject.libs.plugins.architectury.get().pluginId) + apply(plugin = rootProject.libs.plugins.loom.get().pluginId) + + version = "${modVersion}+${getGitRef()}" + group = mavenGroup + base.archivesName.set("${modId}-MC${minecraftVersion}-${project.name}") + + architectury { + minecraft = minecraftVersion + } + + configure { + silentMojangMappingsLicense() + } + + repositories { + exclusiveContent { + forRepository { maven("https://maven.parchmentmc.org") } + filter { includeGroupByRegex("org\\.parchmentmc.*") } + } + exclusiveContent { + forRepository { maven("https://cursemaven.com") } + filter { includeGroup("curse.maven") } + } + } + + dependencies { + "minecraft"(rootProject.libs.minecraft) + val loom = project.extensions.getByName("loom") + "mappings"(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-$minecraftVersion:${rootProject.libs.versions.parchment.get()}@zip") + }) + "compileOnly"("com.google.code.findbugs:jsr305:3.0.2") + } + + tasks { + jar { + from("LICENSE") { + rename { "${it}_${modId}" } + } + } + + withType().configureEach { + options.encoding = "utf-8" + options.release.set(17) + } + } + + idea { + module { + for (exclude in arrayOf("out", "logs")) { + excludeDirs.add(file(exclude)) + } + } + } +} + +for (platform in enabledPlatforms.split(',')) { + project(":$platform") { + apply(plugin = rootProject.libs.plugins.shadow.get().pluginId) + + architectury { + platformSetupLoomIde() + loader(platform) + } + + val common: Configuration by configurations.creating + val shadowCommon: Configuration by configurations.creating + + configurations { + compileClasspath.get().extendsFrom(common) + runtimeClasspath.get().extendsFrom(common) + getByName("development${platform.capitalized()}").extendsFrom(common) + } + + dependencies { + common(project(path = ":common", configuration = "namedElements")) { isTransitive = false } + shadowCommon(project(path = ":common", configuration = "transformProduction${platform.capitalized()}")) { isTransitive = false } + } + + tasks { + withType { + exclude("architectury.common.json") + configurations = listOf(shadowCommon) + archiveClassifier.set("dev-shadow") + } + + withType { + val shadowJarTask = getByName("shadowJar") + inputFile.set(shadowJarTask.archiveFile) + dependsOn(shadowJarTask) + archiveClassifier.set(null as String?) + } + + jar { + archiveClassifier.set("dev") + } + } + + (components["java"] as AdhocComponentWithVariants) + .withVariantsFromConfiguration(configurations["shadowRuntimeElements"]) { + skip() + } + } +} + +spotless { + java { + target("*/src/*/java/li/cil/**/*.java") + + endWithNewline() + trimTrailingWhitespace() + removeUnusedImports() + indentWithSpaces() + } +} diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index 35b2319..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -architectury { - common(rootProject.enabled_platforms.split(",")) -} - -loom { - accessWidenerPath = file("src/main/resources/markdown_manual.accesswidener") -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "dev.architectury:architectury:${rootProject.architectury_version}" -} - -task apiJar(type: Jar) { - from sourceSets.main.allSource - from sourceSets.main.output - archiveClassifier.set("api") - include "li/cil/manual/api/**" -} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..b815dbf --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,28 @@ +val enabledPlatforms: String by project +val modId: String by project + +architectury { + common(enabledPlatforms.split(",")) +} + +loom { + accessWidenerPath.set(file("src/main/resources/${modId}.accesswidener")) +} + +dependencies { + modImplementation(libs.fabric.loader) + modApi(libs.architectury.api) +} + +tasks { + register("apiJar") { + from(sourceSets.main.get().allSource) + from(sourceSets.main.get().output) + archiveClassifier.set("api") + include("li/cil/manual/api/**") + } + + jar { + dependsOn("apiJar") + } +} diff --git a/common/src/main/java/li/cil/manual/api/Tab.java b/common/src/main/java/li/cil/manual/api/Tab.java index a08ebe0..6d516c0 100644 --- a/common/src/main/java/li/cil/manual/api/Tab.java +++ b/common/src/main/java/li/cil/manual/api/Tab.java @@ -1,7 +1,7 @@ package li.cil.manual.api; -import com.mojang.blaze3d.vertex.PoseStack; import li.cil.manual.api.util.MarkdownManualRegistryEntry; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import java.util.List; @@ -21,9 +21,9 @@ public interface Tab extends MarkdownManualRegistryEntry { * This should render something in a 16x16 area. The OpenGL state has been * adjusted so that drawing starts at (0,0,0), and should go to (16,16,0). * - * @param matrixStack the current matrix stack. + * @param graphics the current graphics context. */ - void renderIcon(PoseStack matrixStack); + void renderIcon(GuiGraphics graphics); /** * The (ideally localized) tooltip for the tab. diff --git a/common/src/main/java/li/cil/manual/api/content/package-info.java b/common/src/main/java/li/cil/manual/api/content/package-info.java index b956a2d..bf70fe2 100644 --- a/common/src/main/java/li/cil/manual/api/content/package-info.java +++ b/common/src/main/java/li/cil/manual/api/content/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/package-info.java b/common/src/main/java/li/cil/manual/api/package-info.java index 1007d6e..651acd1 100644 --- a/common/src/main/java/li/cil/manual/api/package-info.java +++ b/common/src/main/java/li/cil/manual/api/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/prefab/Manual.java b/common/src/main/java/li/cil/manual/api/prefab/Manual.java index cc2cb05..9d9ad28 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/Manual.java +++ b/common/src/main/java/li/cil/manual/api/prefab/Manual.java @@ -80,7 +80,7 @@ public Optional pathFor(final Level world, final BlockPos pos, final Dir */ @Override public Optional documentFor(final String path) { - final String language = Minecraft.getInstance().getLanguageManager().getSelected().getCode(); + final String language = Minecraft.getInstance().getLanguageManager().getSelected(); final Optional document = documentFor(path.replace(LANGUAGE_KEY, language), language, new LinkedHashSet<>()); return document.isPresent() ? document : documentFor(path.replace(LANGUAGE_KEY, FALLBACK_LANGUAGE), FALLBACK_LANGUAGE, new LinkedHashSet<>()); } diff --git a/common/src/main/java/li/cil/manual/api/prefab/item/package-info.java b/common/src/main/java/li/cil/manual/api/prefab/item/package-info.java index c3587f6..7257610 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/item/package-info.java +++ b/common/src/main/java/li/cil/manual/api/prefab/item/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/prefab/package-info.java b/common/src/main/java/li/cil/manual/api/prefab/package-info.java index 1919bb9..1a26a89 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/package-info.java +++ b/common/src/main/java/li/cil/manual/api/prefab/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/prefab/provider/package-info.java b/common/src/main/java/li/cil/manual/api/prefab/provider/package-info.java index d8d90f9..fdf5d02 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/provider/package-info.java +++ b/common/src/main/java/li/cil/manual/api/prefab/provider/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/prefab/renderer/BitmapFontRenderer.java b/common/src/main/java/li/cil/manual/api/prefab/renderer/BitmapFontRenderer.java index bff2525..ef4c207 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/renderer/BitmapFontRenderer.java +++ b/common/src/main/java/li/cil/manual/api/prefab/renderer/BitmapFontRenderer.java @@ -1,7 +1,6 @@ package li.cil.manual.api.prefab.renderer; import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormat; import it.unimi.dsi.fastutil.chars.Char2IntMap; @@ -12,6 +11,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import org.joml.Matrix4f; import java.util.Optional; @@ -42,13 +42,13 @@ protected BitmapFontRenderer() { /** * {@inheritDoc} */ - public void drawBatch(final PoseStack matrixStack, final MultiBufferSource bufferFactory, final CharSequence value, final int argb) { + public void drawInBatch(final CharSequence value, final int argb, final Matrix4f matrix, final MultiBufferSource bufferFactory) { final VertexConsumer buffer = getDefaultBuffer(bufferFactory); float tx = 0f; for (int i = 0; i < value.length(); i++) { final char ch = value.charAt(i); - drawChar(matrixStack, buffer, argb, tx, ch); + drawChar(matrix, buffer, argb, tx, ch); tx += width(" ") + getGapU(); } } @@ -136,7 +136,7 @@ private VertexConsumer getDefaultBuffer(final MultiBufferSource bufferFactory) { return bufferFactory.getBuffer(renderLayer); } - private void drawChar(final PoseStack matrixStack, final VertexConsumer buffer, final int argb, final float x, final char ch) { + private void drawChar(final Matrix4f matrix, final VertexConsumer buffer, final int argb, final float x, final char ch) { if (Character.isWhitespace(ch) || Character.isISOControl(ch)) { return; } @@ -153,7 +153,6 @@ private void drawChar(final PoseStack matrixStack, final VertexConsumer buffer, final float u = column * U_STEP; final float v = row * V_STEP; - final var matrix = matrixStack.last().pose(); buffer.vertex(matrix, x, lineHeight(), 0) .color(r, g, b, a) .uv(u, v + V_SIZE) diff --git a/common/src/main/java/li/cil/manual/api/prefab/renderer/MinecraftFontRenderer.java b/common/src/main/java/li/cil/manual/api/prefab/renderer/MinecraftFontRenderer.java index a456bf3..d3897b6 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/renderer/MinecraftFontRenderer.java +++ b/common/src/main/java/li/cil/manual/api/prefab/renderer/MinecraftFontRenderer.java @@ -1,10 +1,12 @@ package li.cil.manual.api.prefab.renderer; -import com.mojang.blaze3d.vertex.PoseStack; import li.cil.manual.api.render.FontRenderer; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.LightTexture; import net.minecraft.network.chat.Component; +import org.joml.Matrix4f; /** * Implementation of the {@link FontRenderer} interface using the default Minecraft font renderer. @@ -17,13 +19,13 @@ public MinecraftFontRenderer(final net.minecraft.client.gui.Font font) { } @Override - public void draw(final PoseStack matrixStack, final CharSequence value, final int argb) { - font.draw(matrixStack, value.toString(), 0, 0, argb); + public void draw(final GuiGraphics graphics, final CharSequence value, final int argb) { + graphics.drawString(font, value.toString(), 0, 0, argb); } @Override - public void drawBatch(final PoseStack matrixStack, final MultiBufferSource buffer, final CharSequence value, final int argb) { - font.drawInBatch(value.toString(), 0, 0, argb, false, matrixStack.last().pose(), buffer, false, 0, LightTexture.pack(0xF, 0xF)); + public void drawInBatch(final CharSequence value, final int argb, final Matrix4f matrix, final MultiBufferSource buffer) { + font.drawInBatch(value.toString(), 0, 0, argb, false, matrix, buffer, Font.DisplayMode.NORMAL, 0, LightTexture.pack(0xF, 0xF)); } @Override diff --git a/common/src/main/java/li/cil/manual/api/prefab/renderer/package-info.java b/common/src/main/java/li/cil/manual/api/prefab/renderer/package-info.java index 2dcd4e6..37bad2c 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/renderer/package-info.java +++ b/common/src/main/java/li/cil/manual/api/prefab/renderer/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/prefab/tab/ItemStackTab.java b/common/src/main/java/li/cil/manual/api/prefab/tab/ItemStackTab.java index 8b33538..74aa8a5 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/tab/ItemStackTab.java +++ b/common/src/main/java/li/cil/manual/api/prefab/tab/ItemStackTab.java @@ -1,11 +1,8 @@ package li.cil.manual.api.prefab.tab; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; -import org.joml.Vector4f; import javax.annotation.Nullable; @@ -21,23 +18,7 @@ public ItemStackTab(final String path, @Nullable final Component tooltip, final } @Override - public void renderIcon(final PoseStack matrixStack) { - // This is *nasty*, but sadly there's no renderItemAndEffectIntoGUI() variant that - // takes a MatrixStack. Yet. - - final var position = new Vector4f(); - position.mul(matrixStack.last().pose()); - - final PoseStack renderSystemPoseStack = RenderSystem.getModelViewStack(); - renderSystemPoseStack.pushPose(); - renderSystemPoseStack.translate(position.x(), position.y(), 0); - - Minecraft.getInstance().getItemRenderer().renderGuiItem(stack, 0, 0); - - renderSystemPoseStack.popPose(); - RenderSystem.applyModelViewMatrix(); - - // Unfuck GL state. - RenderSystem.enableBlend(); + public void renderIcon(final GuiGraphics graphics) { + graphics.renderFakeItem(stack, 0, 0); } } diff --git a/common/src/main/java/li/cil/manual/api/prefab/tab/TextureTab.java b/common/src/main/java/li/cil/manual/api/prefab/tab/TextureTab.java index 7203006..70db5c5 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/tab/TextureTab.java +++ b/common/src/main/java/li/cil/manual/api/prefab/tab/TextureTab.java @@ -1,9 +1,6 @@ package li.cil.manual.api.prefab.tab; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -21,9 +18,7 @@ public TextureTab(final String path, @Nullable final Component tooltip, final Re } @Override - public void renderIcon(final PoseStack matrixStack) { - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, location); - Screen.blit(matrixStack, 0, 0, 16, 16, 0, 0, 1, 1, 1, 1); + public void renderIcon(final GuiGraphics graphics) { + graphics.blit(location, 0, 0, 0, 0, 16, 16, 16, 16); } } diff --git a/common/src/main/java/li/cil/manual/api/prefab/tab/package-info.java b/common/src/main/java/li/cil/manual/api/prefab/tab/package-info.java index c5ac41b..8a32c4a 100644 --- a/common/src/main/java/li/cil/manual/api/prefab/tab/package-info.java +++ b/common/src/main/java/li/cil/manual/api/prefab/tab/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/provider/package-info.java b/common/src/main/java/li/cil/manual/api/provider/package-info.java index b23624c..381dee8 100644 --- a/common/src/main/java/li/cil/manual/api/provider/package-info.java +++ b/common/src/main/java/li/cil/manual/api/provider/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/render/ContentRenderer.java b/common/src/main/java/li/cil/manual/api/render/ContentRenderer.java index e9a3110..e12816f 100644 --- a/common/src/main/java/li/cil/manual/api/render/ContentRenderer.java +++ b/common/src/main/java/li/cil/manual/api/render/ContentRenderer.java @@ -1,6 +1,6 @@ package li.cil.manual.api.render; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; /** * This allows implementing custom image renderers. @@ -17,7 +17,7 @@ public interface ContentRenderer { * The width of the area this renderer uses. *

* This is used to offset the OpenGL state properly before calling - * {@link #render(PoseStack, int, int)}, to correctly align the image horizontally. + * {@link #render(GuiGraphics, int, int)}, to correctly align the image horizontally. * * @return the width of the rendered image. */ @@ -27,7 +27,7 @@ public interface ContentRenderer { * The height of the area this renderer uses. *

* This is used to offset the OpenGL state properly before calling - * {@link #render(PoseStack, int, int)}, as well as to know where to resume rendering + * {@link #render(GuiGraphics, int, int)}, as well as to know where to resume rendering * other content below the image. * * @return the height of the rendered image. @@ -42,9 +42,9 @@ public interface ContentRenderer { * (getWidth,getHeight,*), i.e. translation and scaling are taken care * of for you. * - * @param matrixStack the current matrix stack. - * @param mouseX the X position of the mouse relative to the element. - * @param mouseY the Y position of the mouse relative to the element. + * @param graphics the current graphics context. + * @param mouseX the X position of the mouse relative to the element. + * @param mouseY the Y position of the mouse relative to the element. */ - void render(final PoseStack matrixStack, final int mouseX, final int mouseY); + void render(final GuiGraphics graphics, final int mouseX, final int mouseY); } diff --git a/common/src/main/java/li/cil/manual/api/render/FontRenderer.java b/common/src/main/java/li/cil/manual/api/render/FontRenderer.java index e89f135..6a04870 100644 --- a/common/src/main/java/li/cil/manual/api/render/FontRenderer.java +++ b/common/src/main/java/li/cil/manual/api/render/FontRenderer.java @@ -1,10 +1,11 @@ package li.cil.manual.api.render; import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.Component; +import org.joml.Matrix4f; /** * Base interface for font renderers. @@ -13,24 +14,24 @@ public interface FontRenderer { /** * Render up to the specified amount of characters of the specified string. * - * @param matrixStack the current matrix stack. - * @param buffer the buffer to render the string into. - * @param value the string to render. - * @param argb the color to render the string with. + * @param value the string to render. + * @param argb the color to render the string with. + * @param matrix the current transform matrix. + * @param buffer the buffer to render the string into. */ - void drawBatch(final PoseStack matrixStack, final MultiBufferSource buffer, final CharSequence value, final int argb); + void drawInBatch(final CharSequence value, final int argb, final Matrix4f matrix, final MultiBufferSource buffer); /** * Draws a string in immediate mode. * - * @param matrixStack the current matrix stack. - * @param value the string to render. - * @param argb the color to render the string with. + * @param graphics the current graphics context. + * @param value the string to render. + * @param argb the color to render the string with. */ - default void draw(final PoseStack matrixStack, final CharSequence value, final int argb) { + default void draw(final GuiGraphics graphics, final CharSequence value, final int argb) { final BufferBuilder builder = Tesselator.getInstance().getBuilder(); final MultiBufferSource.BufferSource buffer = MultiBufferSource.immediate(builder); - drawBatch(matrixStack, buffer, value, argb); + drawInBatch(value, argb, graphics.pose().last().pose(), buffer); buffer.endBatch(); } diff --git a/common/src/main/java/li/cil/manual/api/render/package-info.java b/common/src/main/java/li/cil/manual/api/render/package-info.java index 5d29f44..f41b15c 100644 --- a/common/src/main/java/li/cil/manual/api/render/package-info.java +++ b/common/src/main/java/li/cil/manual/api/render/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/api/util/package-info.java b/common/src/main/java/li/cil/manual/api/util/package-info.java index a50abc0..7df2ec8 100644 --- a/common/src/main/java/li/cil/manual/api/util/package-info.java +++ b/common/src/main/java/li/cil/manual/api/util/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/client/document/DocumentRenderer.java b/common/src/main/java/li/cil/manual/client/document/DocumentRenderer.java index b6a9cc6..aa1705c 100644 --- a/common/src/main/java/li/cil/manual/client/document/DocumentRenderer.java +++ b/common/src/main/java/li/cil/manual/client/document/DocumentRenderer.java @@ -1,12 +1,11 @@ package li.cil.manual.client.document; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import li.cil.manual.api.ManualModel; import li.cil.manual.api.ManualStyle; import li.cil.manual.api.content.Document; import li.cil.manual.client.document.segment.*; -import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import org.apache.commons.lang3.StringUtils; import org.lwjgl.opengl.GL11; @@ -37,13 +36,17 @@ public final class DocumentRenderer { private final ManualModel model; private final ManualStyle style; - @Nullable private ResourceLocation location; - @Nullable private Segment root; - @Nullable private InteractiveSegment lastHovered; + @Nullable + private ResourceLocation location; + @Nullable + private Segment root; + @Nullable + private InteractiveSegment lastHovered; private int lastScrollY; private int lastGlobalY; - @Nullable private NextSegmentInfo lastFirstVisible; + @Nullable + private NextSegmentInfo lastFirstVisible; /** * Creates a new document instance with the specified configuration. @@ -103,7 +106,7 @@ public void parse(final Document document) { segments.get(i).setNext(segments.get(i + 1)); } - root = segments.size() > 0 ? segments.get(0) : new TextSegment(this, null, ""); + root = !segments.isEmpty() ? segments.get(0) : new TextSegment(this, null, ""); if (lastHovered != null) { lastHovered.setMouseHovered(false); @@ -164,15 +167,15 @@ public int height(final int width) { * Renders a list of segments and tooltips if a segment with a tooltip is hovered. * Returns the hovered interactive segment, if any. * - * @param matrixStack the current matrix stack. - * @param scrollY the vertical scroll offset of the document. - * @param width the width of the area to render the document in. - * @param height the height of the area to render the document in. - * @param mouseX the x position of the mouse relative to the document. - * @param mouseY the y position of the mouse relative to the document. + * @param graphics the current graphics context. + * @param scrollY the vertical scroll offset of the document. + * @param width the width of the area to render the document in. + * @param height the height of the area to render the document in. + * @param mouseX the x position of the mouse relative to the document. + * @param mouseY the y position of the mouse relative to the document. * @return the interactive segment being hovered, if any. */ - public Optional render(final PoseStack matrixStack, final int scrollY, final int width, final int height, final int mouseX, final int mouseY) { + public Optional render(final GuiGraphics graphics, final int scrollY, final int width, final int height, final int mouseX, final int mouseY) { if (root == null) { return Optional.empty(); } @@ -182,11 +185,12 @@ public Optional render(final PoseStack matrixStack, final in RenderSystem.colorMask(false, false, false, false); - matrixStack.pushPose(); - matrixStack.translate(0, 0, 500); - Screen.fill(matrixStack, -10, -1000, width + 20, 0, 0xFFFFFFFF); - Screen.fill(matrixStack, -10, height, width + 20, height + 1000, 0xFFFFFFFF); - matrixStack.popPose(); + final var pose = graphics.pose(); + pose.pushPose(); + pose.translate(0, 0, 500); + graphics.fill(-10, -1000, width + 20, 0, 0xFFFFFFFF); + graphics.fill(-10, height, width + 20, height + 1000, 0xFFFFFFFF); + pose.popPose(); RenderSystem.colorMask(true, true, true, true); @@ -234,12 +238,12 @@ public Optional render(final PoseStack matrixStack, final in lastFirstVisible = info; } - matrixStack.pushPose(); - matrixStack.translate(0, globalY, 0); + pose.pushPose(); + pose.translate(0, globalY, 0); - final Optional result = segment.render(matrixStack, localX, lineHeight, width, mouseX, mouseY - globalY); + final Optional result = segment.render(graphics, localX, lineHeight, width, mouseX, mouseY - globalY); - matrixStack.popPose(); + pose.popPose(); if (isMouseOverDocument && hovered.isEmpty()) { hovered = result; diff --git a/common/src/main/java/li/cil/manual/client/document/package-info.java b/common/src/main/java/li/cil/manual/client/document/package-info.java index c7f8fb6..20be69c 100644 --- a/common/src/main/java/li/cil/manual/client/document/package-info.java +++ b/common/src/main/java/li/cil/manual/client/document/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/client/document/segment/RenderSegment.java b/common/src/main/java/li/cil/manual/client/document/segment/RenderSegment.java index b59729e..b34c9bf 100644 --- a/common/src/main/java/li/cil/manual/client/document/segment/RenderSegment.java +++ b/common/src/main/java/li/cil/manual/client/document/segment/RenderSegment.java @@ -1,6 +1,5 @@ package li.cil.manual.client.document.segment; -import com.mojang.blaze3d.vertex.PoseStack; import li.cil.manual.api.render.ContentRenderer; import li.cil.manual.api.render.InteractiveContentRenderer; import li.cil.manual.api.util.PathUtils; @@ -8,6 +7,7 @@ import li.cil.manual.client.document.DocumentRenderer; import li.cil.manual.client.document.Strings; import li.cil.manual.client.document.segment.render.MissingContentRenderer; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; @@ -61,7 +61,7 @@ public int getLineHeight(final int segmentX, final int documentWidth) { } @Override - public Optional render(final PoseStack matrixStack, final int segmentX, final int lineHeight, final int documentWidth, final int mouseX, final int mouseY) { + public Optional render(final GuiGraphics graphics, final int segmentX, final int lineHeight, final int documentWidth, final int mouseX, final int mouseY) { final int width = imageWidth(segmentX, documentWidth); final int height = imageHeight(segmentX, documentWidth); @@ -73,15 +73,16 @@ public Optional render(final PoseStack matrixStack, final in final float scale = scale(segmentX, documentWidth); - matrixStack.pushPose(); - matrixStack.translate(x, y, 0); - matrixStack.scale(scale, scale, scale); + final var pose = graphics.pose(); + pose.pushPose(); + pose.translate(x, y, 0); + pose.scale(scale, scale, scale); final boolean isHovered = mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height; if (isHovered) { DocumentRenderTypes.draw(DocumentRenderTypes.highlight(), (buffer) -> { - final var matrix = matrixStack.last().pose(); + final var matrix = pose.last().pose(); final float r = 0.2f, g = 0.4f, b = 0.6f, a = 0.25f; @@ -92,9 +93,9 @@ public Optional render(final PoseStack matrixStack, final in }); } - renderer.render(matrixStack, mouseX, mouseY); + renderer.render(graphics, mouseX, mouseY); - matrixStack.popPose(); + pose.popPose(); return isHovered ? Optional.of(this) : Optional.empty(); } diff --git a/common/src/main/java/li/cil/manual/client/document/segment/Segment.java b/common/src/main/java/li/cil/manual/client/document/segment/Segment.java index 1455cc9..ee40d00 100644 --- a/common/src/main/java/li/cil/manual/client/document/segment/Segment.java +++ b/common/src/main/java/li/cil/manual/client/document/segment/Segment.java @@ -1,6 +1,6 @@ package li.cil.manual.client.document.segment; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import java.util.Optional; import java.util.regex.Pattern; @@ -53,7 +53,7 @@ public interface Segment { * Render the segment at the specified coordinates with the specified * properties. * - * @param matrixStack the current matrix stack. + * @param graphics the current graphics context. * @param segmentX the current indentation. * @param lineHeight the maximum height of the current line. * @param documentWidth the maximum width of the document. @@ -61,7 +61,7 @@ public interface Segment { * @param mouseY the y mouse position. * @return the hovered interactive segment, if any. */ - Optional render(final PoseStack matrixStack, final int segmentX, final int lineHeight, final int documentWidth, final int mouseX, final int mouseY); + Optional render(final GuiGraphics graphics, final int segmentX, final int lineHeight, final int documentWidth, final int mouseX, final int mouseY); // ----------------------------------------------------------------------- // diff --git a/common/src/main/java/li/cil/manual/client/document/segment/TextSegment.java b/common/src/main/java/li/cil/manual/client/document/segment/TextSegment.java index 6f1ffd2..a0fc32a 100644 --- a/common/src/main/java/li/cil/manual/client/document/segment/TextSegment.java +++ b/common/src/main/java/li/cil/manual/client/document/segment/TextSegment.java @@ -1,10 +1,10 @@ package li.cil.manual.client.document.segment; import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; import li.cil.manual.api.render.FontRenderer; import li.cil.manual.client.document.DocumentRenderer; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.MultiBufferSource; import org.apache.commons.lang3.ArrayUtils; @@ -72,7 +72,7 @@ public NextSegmentInfo getNext(final int segmentX, final int lineHeight, final i } @Override - public Optional render(final PoseStack matrixStack, final int segmentX, final int lineHeight, final int documentWidth, final int mouseX, final int mouseY) { + public Optional render(final GuiGraphics graphics, final int segmentX, final int lineHeight, final int documentWidth, final int mouseX, final int mouseY) { final String format = getFormat(); final float scale = getFontScale() * getScale(); final int color = getColor(); @@ -92,13 +92,14 @@ public Optional render(final PoseStack matrixStack, final in hovered.value = interactive; } - matrixStack.pushPose(); - matrixStack.translate(block.x, block.y, 0); - matrixStack.scale(scale, scale, scale); + final var pose = graphics.pose(); + pose.pushPose(); + pose.translate(block.x, block.y, 0); + pose.scale(scale, scale, scale); - getFont().drawBatch(matrixStack, bufferSource, format + block.chars, color); + getFont().drawInBatch(format + block.chars, color, graphics.pose().last().pose(), bufferSource); - matrixStack.popPose(); + pose.popPose(); }); bufferSource.endBatch(); @@ -189,7 +190,7 @@ private void forEachBlock(final int segmentX, final int lineHeight, final int do int currentY = 0; int charCount = computeCharsFittingOnLine(chars, documentWidth - currentX, documentWidth - wrappedIndent); - while (chars.length() > 0) { + while (!chars.isEmpty()) { final String blockChars = chars.substring(0, charCount); blockCache.add(new TextBlock( currentX, diff --git a/common/src/main/java/li/cil/manual/client/document/segment/package-info.java b/common/src/main/java/li/cil/manual/client/document/segment/package-info.java index 534eac5..0cf53e1 100644 --- a/common/src/main/java/li/cil/manual/client/document/segment/package-info.java +++ b/common/src/main/java/li/cil/manual/client/document/segment/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/client/document/segment/render/ItemStackContentRenderer.java b/common/src/main/java/li/cil/manual/client/document/segment/render/ItemStackContentRenderer.java index 73ff837..162f26f 100644 --- a/common/src/main/java/li/cil/manual/client/document/segment/render/ItemStackContentRenderer.java +++ b/common/src/main/java/li/cil/manual/client/document/segment/render/ItemStackContentRenderer.java @@ -1,11 +1,8 @@ package li.cil.manual.client.document.segment.render; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import li.cil.manual.api.render.ContentRenderer; -import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.item.ItemStack; -import org.joml.Vector4f; public final class ItemStackContentRenderer implements ContentRenderer { /** @@ -36,31 +33,20 @@ public int getHeight() { } @Override - public void render(final PoseStack matrixStack, final int mouseX, final int mouseY) { - final Minecraft mc = Minecraft.getInstance(); + public void render(final GuiGraphics graphics, final int mouseX, final int mouseY) { final int index = (int) (System.currentTimeMillis() % (CYCLE_SPEED * stacks.length)) / CYCLE_SPEED; final ItemStack stack = stacks[index]; final float scaleX = getWidth() / 16f; final float scaleY = getHeight() / 16f; - // This is *nasty*, but sadly there's no renderItemAndEffectIntoGUI() variant that - // takes a MatrixStack. Yet. + final var pose = graphics.pose(); - final var position = new Vector4f(); - position.mul(matrixStack.last().pose()); + pose.pushPose(); + pose.scale(scaleX, scaleY, 1); - final PoseStack renderSystemPoseStack = RenderSystem.getModelViewStack(); - renderSystemPoseStack.pushPose(); - renderSystemPoseStack.translate(position.x(), position.y(), 0); - renderSystemPoseStack.scale(scaleX, scaleY, 1); + graphics.renderFakeItem(stack, 0, 0); - mc.getItemRenderer().renderGuiItem(stack, 0, 0); - - renderSystemPoseStack.popPose(); - RenderSystem.applyModelViewMatrix(); - - // Unfuck GL state. - RenderSystem.enableBlend(); + pose.popPose(); } } diff --git a/common/src/main/java/li/cil/manual/client/document/segment/render/TextureContentRenderer.java b/common/src/main/java/li/cil/manual/client/document/segment/render/TextureContentRenderer.java index 1f967e1..92cebc5 100644 --- a/common/src/main/java/li/cil/manual/client/document/segment/render/TextureContentRenderer.java +++ b/common/src/main/java/li/cil/manual/client/document/segment/render/TextureContentRenderer.java @@ -1,10 +1,10 @@ package li.cil.manual.client.document.segment.render; import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.vertex.PoseStack; import li.cil.manual.api.render.ContentRenderer; import li.cil.manual.client.document.DocumentRenderTypes; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.client.renderer.texture.SimpleTexture; import net.minecraft.client.renderer.texture.TextureManager; @@ -48,9 +48,9 @@ public int getHeight() { } @Override - public void render(final PoseStack matrixStack, final int mouseX, final int mouseY) { + public void render(final GuiGraphics graphics, final int mouseX, final int mouseY) { DocumentRenderTypes.draw(DocumentRenderTypes.texture(location), (buffer) -> { - final var matrix = matrixStack.last().pose(); + final var matrix = graphics.pose().last().pose(); buffer.vertex(matrix, 0, texture.height, 0).uv(0, 1).endVertex(); buffer.vertex(matrix, texture.width, texture.height, 0).uv(1, 1).endVertex(); buffer.vertex(matrix, texture.width, 0, 0).uv(1, 0).endVertex(); diff --git a/common/src/main/java/li/cil/manual/client/document/segment/render/package-info.java b/common/src/main/java/li/cil/manual/client/document/segment/render/package-info.java index a4cea10..db9daff 100644 --- a/common/src/main/java/li/cil/manual/client/document/segment/render/package-info.java +++ b/common/src/main/java/li/cil/manual/client/document/segment/render/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/client/gui/ManualScreen.java b/common/src/main/java/li/cil/manual/client/gui/ManualScreen.java index 0c915ce..26f714a 100644 --- a/common/src/main/java/li/cil/manual/client/gui/ManualScreen.java +++ b/common/src/main/java/li/cil/manual/client/gui/ManualScreen.java @@ -1,7 +1,6 @@ package li.cil.manual.client.gui; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; import li.cil.manual.api.ManualModel; import li.cil.manual.api.ManualScreenStyle; import li.cil.manual.api.ManualStyle; @@ -11,11 +10,11 @@ import li.cil.manual.client.document.segment.InteractiveSegment; import li.cil.manual.client.util.IterableUtils; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.Rect2i; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.client.sounds.SoundManager; @@ -74,8 +73,8 @@ public void init() { } @Override - public void render(final PoseStack matrixStack, final int mouseX, final int mouseY, final float partialTicks) { - renderBackground(matrixStack); + public void render(final GuiGraphics graphics, final int mouseX, final int mouseY, final float partialTicks) { + renderBackground(graphics); if (!Objects.equals(currentPath, model.peek())) { refreshPage(); @@ -93,36 +92,35 @@ public void render(final PoseStack matrixStack, final int mouseX, final int mous scrollButton.active = false; // Render tabs behind manual. - super.render(matrixStack, mouseX, mouseY, partialTicks); + super.render(graphics, mouseX, mouseY, partialTicks); // Render manual background. - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, screenStyle.getWindowBackground()); final Rect2i windowRect = screenStyle.getWindowRect(); - blit(matrixStack, leftPos, topPos, 0, 0, windowRect.getWidth(), windowRect.getHeight(), windowRect.getWidth(), windowRect.getHeight()); + graphics.blit(screenStyle.getWindowBackground(), leftPos, topPos, 0, 0, windowRect.getWidth(), windowRect.getHeight(), windowRect.getWidth(), windowRect.getHeight()); // Render scroll bar tooltip (button will override this tooltip if currently dragging). renderScrollbarTooltip(mouseX, mouseY); // Render scroll button in front of manual. scrollButton.active = canScroll(); - scrollButton.render(matrixStack, mouseX, mouseY, partialTicks); + scrollButton.render(graphics, mouseX, mouseY, partialTicks); final Rect2i documentRect = screenStyle.getDocumentRect(); final int documentX = leftPos + documentRect.getX(); final int documentY = topPos + documentRect.getY(); - matrixStack.pushPose(); - matrixStack.translate(documentX, documentY, 0); + final var pose = graphics.pose(); + pose.pushPose(); + pose.translate(documentX, documentY, 0); - currentSegment = documentRenderer.render(matrixStack, getSmoothScrollPosition(), + currentSegment = documentRenderer.render(graphics, getSmoothScrollPosition(), documentRect.getWidth(), documentRect.getHeight(), mouseX - documentX, mouseY - documentY); - matrixStack.popPose(); + pose.popPose(); currentSegment.flatMap(InteractiveSegment::getTooltip).ifPresent(t -> - renderComponentTooltip(matrixStack, Collections.singletonList(t), mouseX, mouseY)); + graphics.renderComponentTooltip(font, Collections.singletonList(t), mouseX, mouseY)); } @Override @@ -309,8 +307,8 @@ private class TabButton extends Button { } @Override - public void renderButton(final PoseStack matrixStack, final int mouseX, final int mouseY, final float partialTicks) { - if (isHoveredOrFocused()) { + public void renderWidget(final GuiGraphics graphics, final int mouseX, final int mouseY, final float partialTicks) { + if (isHoveredOrFocusedUsingKeyboard()) { targetX = baseX; } else { targetX = baseX + screenStyle.getTabHoverShift(); @@ -326,28 +324,27 @@ public void renderButton(final PoseStack matrixStack, final int mouseX, final in width = screenStyle.getTabAreaRect().getWidth() - (getX() - baseX); - final int v0 = isHoveredOrFocused() ? screenStyle.getTabRect().getHeight() : 0; + final int v0 = isHoveredOrFocusedUsingKeyboard() ? screenStyle.getTabRect().getHeight() : 0; final int visualWidth = screenStyle.getTabRect().getWidth(); final int visualHeight = screenStyle.getTabRect().getHeight(); final int textureWidth = screenStyle.getTabRect().getWidth(); final int textureHeight = screenStyle.getTabRect().getHeight() * 2; - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, screenStyle.getTabButtonTexture()); - blit(matrixStack, getX(), getY(), 0, v0, visualWidth, visualHeight, textureWidth, textureHeight); + graphics.blit(screenStyle.getTabButtonTexture(), getX(), getY(), 0, v0, visualWidth, visualHeight, textureWidth, textureHeight); - matrixStack.pushPose(); - matrixStack.translate(getX() + 12, (float) (getY() + (screenStyle.getTabRect().getHeight() - 18) / 2), 0); + final var pose = graphics.pose(); + pose.pushPose(); + pose.translate(getX() + 12, (float) (getY() + (screenStyle.getTabRect().getHeight() - 18) / 2), 0); - tab.renderIcon(matrixStack); + tab.renderIcon(graphics); - matrixStack.popPose(); + pose.popPose(); updateTooltip(); } private void updateTooltip() { - if (!isHoveredOrFocused() || isDraggingScrollButton) { + if (!isHoveredOrFocusedUsingKeyboard() || isDraggingScrollButton) { return; } @@ -366,6 +363,10 @@ private void updateTooltip() { @Override public void playDownSound(final SoundManager soundHandler) { } + + private boolean isHoveredOrFocusedUsingKeyboard() { + return isHovered() || isFocused() && Minecraft.getInstance().getLastInputType().isKeyboard(); + } } private class ScrollButton extends Button { @@ -388,30 +389,11 @@ protected boolean clicked(final double mouseX, final double mouseY) { } @Override - public void renderButton(final PoseStack matrixStack, final int mouseX, final int mouseY, final float partialTicks) { + public void renderWidget(final GuiGraphics graphics, final int mouseX, final int mouseY, final float partialTicks) { setY(baseY + getScrollButtonY()); - final int x0 = getX(); - final int x1 = x0 + width; - final int y0 = getY(); - final int y1 = y0 + height; - - final float u0 = 0; - final float u1 = u0 + 1; - final float v0 = (isDraggingScrollButton || isHoveredOrFocused()) ? 0.5f : 0; - final float v1 = v0 + 0.5f; - - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, screenStyle.getScrollButtonTexture()); - - final Tesselator t = Tesselator.getInstance(); - final BufferBuilder builder = t.getBuilder(); - builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - builder.vertex(x0, y1, getBlitOffset()).uv(u0, v1).endVertex(); - builder.vertex(x1, y1, getBlitOffset()).uv(u1, v1).endVertex(); - builder.vertex(x1, y0, getBlitOffset()).uv(u1, v0).endVertex(); - builder.vertex(x0, y0, getBlitOffset()).uv(u0, v0).endVertex(); - t.end(); + final int vOffset = (isDraggingScrollButton || isHoveredOrFocusedUsingKeyboard()) ? height : 0; + graphics.blit(screenStyle.getScrollButtonTexture(), getX(), getY(), 0, vOffset, width, height, width, height * 2); updateTooltip(); } @@ -424,7 +406,7 @@ public void applyTooltip(final boolean fixedY) { } private void updateTooltip() { - if (!isHoveredOrFocused() && !isDraggingScrollButton) { + if (!isHoveredOrFocusedUsingKeyboard() && !isDraggingScrollButton) { return; } @@ -436,9 +418,13 @@ private List getTooltipContent() { } private ClientTooltipPositioner getClientTooltipPositioner(final boolean fixedY) { - return (screen, mouseX, mouseY, tooltipWidth, tooltipHeight) -> new Vector2i( + return (screenWidth, screenHeight, mouseX, mouseY, tooltipWidth, tooltipHeight) -> new Vector2i( leftPos + screenStyle.getScrollBarRect().getX() + screenStyle.getScrollBarRect().getWidth(), fixedY ? getY() + (getHeight() + TOOLTIP_HEIGHT) / 2 : mouseY); } + + private boolean isHoveredOrFocusedUsingKeyboard() { + return isHovered() || isFocused() && Minecraft.getInstance().getLastInputType().isKeyboard(); + } } } diff --git a/common/src/main/java/li/cil/manual/client/gui/package-info.java b/common/src/main/java/li/cil/manual/client/gui/package-info.java index f8aefa5..17614b9 100644 --- a/common/src/main/java/li/cil/manual/client/gui/package-info.java +++ b/common/src/main/java/li/cil/manual/client/gui/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/client/package-info.java b/common/src/main/java/li/cil/manual/client/package-info.java index f88631d..9063117 100644 --- a/common/src/main/java/li/cil/manual/client/package-info.java +++ b/common/src/main/java/li/cil/manual/client/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/client/provider/package-info.java b/common/src/main/java/li/cil/manual/client/provider/package-info.java index 9b0fb99..c78520c 100644 --- a/common/src/main/java/li/cil/manual/client/provider/package-info.java +++ b/common/src/main/java/li/cil/manual/client/provider/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/common/src/main/java/li/cil/manual/client/util/package-info.java b/common/src/main/java/li/cil/manual/client/util/package-info.java index fd65b04..d56482c 100644 --- a/common/src/main/java/li/cil/manual/client/util/package-info.java +++ b/common/src/main/java/li/cil/manual/client/util/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index c1d253f..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,132 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "7.1.2" -} - -architectury { - platformSetupLoomIde() - fabric() -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - -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}" - modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -shadowJar { - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" -} - -remapJar { - injectAccessWidener = true - inputFile.set shadowJar.archiveFile - dependsOn shadowJar - classifier null -} - -jar { - classifier "dev" -} - -def commonApiJar = project(":common").apiJar - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -publishing { - publications { - mavenFabric(MavenPublication) { - artifactId = "${rootProject.archives_base_name}-${rootProject.minecraft_version}-${project.name}" - from components.java - } - } - - repositories { - maven { - name = "GitHubPackages" - url = System.getenv("GITHUB_MAVEN_URL") ?: "" - credentials { - username = System.getenv("GITHUB_ACTOR") - password = System.getenv("GITHUB_TOKEN") - } - } - } -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_API_KEY") ?: "" - project { - id = rootProject.curse_project_id - releaseType = "release" - changelogType = "markdown" - changelog = System.getenv("CHANGELOG") ?: "Changelog not available." - addGameVersion "Fabric" - addGameVersion rootProject.minecraft_version - addGameVersion "Java 17" - relations { - requiredDependency "fabric-api" - requiredDependency "architectury-api" - requiredDependency "forge-config-api-port-fabric" - } - mainArtifact(remapJar) - addArtifact(commonApiJar) - afterEvaluate { - uploadTask.dependsOn(remapJar) - uploadTask.dependsOn(commonApiJar) - } - } - options { - forgeGradleIntegration = false - } -} - -modrinth { - token = System.getenv("MODRINTH_API_KEY") ?: "" - projectId = rootProject.modrinth_project_id - changelog = System.getenv("CHANGELOG") ?: "Changelog not available." - versionNumber = "MC${rootProject.minecraft_version}-${project.name}-${rootProject.semver}" - versionName = "${rootProject.archives_base_name}-${project.version}" - versionType = "release" - uploadFile = remapJar - gameVersions = [rootProject.minecraft_version] - loaders = ["fabric"] - dependencies { - required.project "fabric-api" - required.project "architectury-api" - } -} diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 0000000..4b02e15 --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,33 @@ +val modId: String by project +val minecraftVersion: String = libs.versions.minecraft.get() +val fabricApiVersion: String = libs.versions.fabric.api.get() +val architecturyVersion: String = libs.versions.architectury.get() + +loom { + accessWidenerPath.set(project(":common").loom.accessWidenerPath) +} + +dependencies { + modImplementation(libs.fabric.loader) + modApi(libs.fabric.api) + modApi(libs.fabric.architectury) +} + +tasks { + processResources { + val properties = mapOf( + "version" to project.version, + "minecraftVersion" to minecraftVersion, + "fabricApiVersion" to fabricApiVersion, + "architecturyVersion" to architecturyVersion + ) + inputs.properties(properties) + filesMatching("fabric.mod.json") { + expand(properties) + } + } + + remapJar { + injectAccessWidener.set(true) + } +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 81c6028..676e145 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,25 +1,36 @@ { - "schemaVersion": 1, - "id": "markdown_manual", - "version": "${version}", - "name": "Markdown Manual", - "description": "Library mod providing a convenient way of defining in-game manuals.", - "authors": [ - "Sangar" - ], - "contact": { - "sources": "https://github.com/MightyPirates/MarkdownManual" - }, - "license": "MIT", - "environment": "*", - "entrypoints": { - "client": [ - "li.cil.manual.client.fabric.MarkdownManualFabric" - ] - }, - "depends": { - "fabric": "*", - "minecraft": ">=1.19.3", - "architectury": ">=7" - } + "schemaVersion": 1, + "id": "markdown_manual", + "version": "${version}", + "name": "Markdown Manual", + "description": "Library mod providing a convenient way of defining in-game manuals.", + "authors": [ + "Sangar" + ], + "contact": { + "sources": "https://github.com/MightyPirates/MarkdownManual" + }, + "license": "MIT", + "environment": "*", + "entrypoints": { + "client": [ + "li.cil.manual.client.fabric.MarkdownManualFabric" + ] + }, + "depends": { + "fabric-api": ">=${fabricApiVersion}", + "architectury": ">=${architecturyVersion}", + "minecraft": ">=${minecraftVersion}", + "java": ">=17" + }, + "custom": { + "mc-publish": { + "modrinth": "nPQ9xkPg", + "curseforge": 502485, + "dependencies": [ + "fabric-api@>=${fabricApiVersion}(required){modrinth:P7dR8mSH}{curseforge:306612}", + "architectury@>=${architecturyVersion}(required){modrinth:lhGA9TYQ}{curseforge:419699}" + ] + } + } } diff --git a/forge/build.gradle b/forge/build.gradle deleted file mode 100644 index 7917577..0000000 --- a/forge/build.gradle +++ /dev/null @@ -1,126 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "7.1.2" -} - -architectury { - platformSetupLoomIde() - forge() -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath - - forge { - convertAccessWideners = true - extraAccessWideners.add loom.accessWidenerPath.get().asFile.name - } -} - -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 - developmentForge.extendsFrom common -} - -dependencies { - forge "net.minecraftforge:forge:${rootProject.forge_version}" - modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } -} - -processResources { - inputs.property "version", project.version - - filesMatching("META-INF/mods.toml") { - expand "version": project.version - } -} - -shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" -} - -remapJar { - inputFile.set shadowJar.archiveFile - dependsOn shadowJar - classifier null -} - -jar { - classifier "dev" -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -publishing { - publications { - mavenForge(MavenPublication) { - artifactId = "${rootProject.archives_base_name}-${rootProject.minecraft_version}-${project.name}" - from components.java - } - } - - repositories { - maven { - name = "GitHubPackages" - url = System.getenv("GITHUB_MAVEN_URL") ?: "" - credentials { - username = System.getenv("GITHUB_ACTOR") - password = System.getenv("GITHUB_TOKEN") - } - } - } -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_API_KEY") ?: "" - project { - id = rootProject.curse_project_id - releaseType = "release" - changelogType = "markdown" - changelog = System.getenv("CHANGELOG") ?: "Changelog not available." - addGameVersion "Forge" - addGameVersion rootProject.minecraft_version - addGameVersion "Java 17" - relations { - requiredDependency "architectury-api" - } - mainArtifact(remapJar) - afterEvaluate { - uploadTask.dependsOn(remapJar) - } - } -} - -modrinth { - token = System.getenv("MODRINTH_API_KEY") ?: "" - projectId = rootProject.modrinth_project_id - changelog = System.getenv("CHANGELOG") ?: "Changelog not available." - versionNumber = "MC${rootProject.minecraft_version}-${project.name}-${rootProject.semver}" - versionName = "${rootProject.archives_base_name}-${project.version}" - versionType = "release" - uploadFile = remapJar - gameVersions = [rootProject.minecraft_version] - loaders = ["forge"] - dependencies { - required.project "architectury-api" - } -} diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts new file mode 100644 index 0000000..1c5a3a3 --- /dev/null +++ b/forge/build.gradle.kts @@ -0,0 +1,34 @@ +val modId: String by project +val minecraftVersion: String = libs.versions.minecraft.get() +val forgeVersion: String = libs.versions.forge.platform.get().split("-")[1] +val architecturyVersion: String = libs.versions.architectury.get() + +loom { + accessWidenerPath.set(project(":common").loom.accessWidenerPath) + + forge { + convertAccessWideners.set(true) + extraAccessWideners.add(loom.accessWidenerPath.get().asFile.name) + } +} + +dependencies { + forge(libs.forge.platform) + modApi(libs.forge.architectury) +} + +tasks { + processResources { + val properties = mapOf( + "version" to project.version, + "minecraftVersion" to minecraftVersion, + "loaderVersion" to forgeVersion.split(".").first(), + "forgeVersion" to forgeVersion, + "architecturyVersion" to architecturyVersion + ) + inputs.properties(properties) + filesMatching("META-INF/mods.toml") { + expand(properties) + } + } +} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index cfa85fd..6898ede 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[44,)" +loaderVersion = "[${loaderVersion},)" issueTrackerURL = "https://github.com/MightyPirates/MarkdownManual/issues" license = "MIT" @@ -15,20 +15,26 @@ Library mod providing a convenient way of defining in-game manuals. [[dependencies.markdown_manual]] modId = "forge" mandatory = true -versionRange = "[44.1,)" +versionRange = "[${forgeVersion},)" ordering = "NONE" side = "BOTH" - [[dependencies.markdown_manual]] modId = "minecraft" mandatory = true -versionRange = "[1.19.3,)" +versionRange = "[${minecraftVersion},)" ordering = "NONE" side = "BOTH" [[dependencies.markdown_manual]] modId = "architectury" mandatory = true -versionRange = "[7,)" +versionRange = "[${architecturyVersion},)" ordering = "AFTER" side = "BOTH" + +[mc-publish] +modrinth = "nPQ9xkPg" +curseforge = 502485 +dependencies = [ + "architectury@>=${architecturyVersion}(required){modrinth:lhGA9TYQ}{curseforge:419699}" +] diff --git a/gradle.properties b/gradle.properties index ed0e71c..16af04f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,10 @@ -org.gradle.jvmargs=-Xmx3G +org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false -minecraft_version=1.19.3 -enabled_platforms=fabric,forge +enabledPlatforms=fabric,forge -archives_base_name=markdown_manual -maven_group=li.cil.markdown_manual - -architectury_version=7.0.66 - -fabric_loader_version=0.14.12 -fabric_api_version=0.70.0+1.19.3 - -forge_version=1.19.3-44.1.0 - -curse_project_id=502485 -modrinth_project_id=markdownmanual +modId=markdown_manual +mavenGroup=li.cil.markdown_manual # Set by build pipeline. -semver=0.0.0 +modVersion=0.0.0 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..72a862b --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,27 @@ +[versions] +minecraft = "1.20.1" +parchment = "2023.08.13" + +architectury = "9.1.12" + +fabric-loader = "0.14.22" +fabric-api = "0.87.0+1.20.1" + +forge-platform = "1.20.1-47.1.0" + +[plugins] +loom = { id = "dev.architectury.loom", version = "1.3-SNAPSHOT" } +architectury = { id = "architectury-plugin", version = "3.4-SNAPSHOT" } +shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } +spotless = { id = "com.diffplug.spotless", version = "6.20.0" } + +[libraries] +minecraft = { group = "com.mojang", name = "minecraft", version.ref = "minecraft" } +architectury-api = { group = "dev.architectury", name = "architectury", version.ref = "architectury" } + +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" } +fabric-architectury = { group = "dev.architectury", name = "architectury-fabric", version.ref = "architectury" } + +forge-platform = { group = "net.minecraftforge", name = "forge", version.ref = "forge-platform" } +forge-architectury = { group = "dev.architectury", name = "architectury-forge", version.ref = "architectury" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c..41d9927 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 41dfb87..fae0804 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 533a2cd..0000000 --- a/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } - maven { url "https://maven.minecraftforge.net/" } - gradlePluginPortal() - } -} - -include("common") -include("fabric") -include("forge") - -rootProject.name = archives_base_name diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..75306c2 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,33 @@ +pluginManagement { + repositories { + exclusiveContent { + forRepository { maven("https://maven.architectury.dev") } + filter { + includeGroup("architectury-plugin") + includeGroupByRegex("dev\\.architectury.*") + } + } + exclusiveContent { + forRepository { maven("https://maven.fabricmc.net") } + filter { + includeGroup("net.fabricmc") + includeGroup("fabric-loom") + } + } + exclusiveContent { + forRepository { maven("https://maven.minecraftforge.net") } + filter { + includeGroupByRegex("net\\.minecraftforge.*") + includeGroup("de.oceanlabs.mcp") + } + } + gradlePluginPortal() + } +} + +include("common") +include("fabric") +include("forge") + +val modId: String by settings +rootProject.name = modId