A new era

- Switch to MDG instead of using FG
- Implement CI-based mod publishing
- Embed commit hash into the built jar
- Log commit hash
This commit is contained in:
IThundxr 2025-01-10 10:39:48 -05:00
parent d567f76e5e
commit a962ade027
Failed to generate hash of commit
21 changed files with 445 additions and 481 deletions

View file

@ -5,36 +5,33 @@ body:
- type: textarea - type: textarea
attributes: attributes:
label: Description label: Description
description: " description: >
Please describe the issue with as much detail as possible. Please describe the issue with as much detail as possible.
Explain what happened, and what should have happened instead. Explain what happened, and what should have happened instead.
Add images, screenshots, or videos if they could be useful." Add images, screenshots, or videos if they could be useful.
validations: validations:
required: true required: true
- type: input - type: input
attributes: attributes:
label: Game Log label: Game Log
description: " description: >
We need the game log for additional information about the bug. We need the game log for additional information about the bug.
This file can be found in the \"logs\" folder of your Minecraft folder as \"latest.log\". This file can be found in the \"logs\" folder of your Minecraft folder as \"latest.log\".
Please upload the file to https://mclo.gs/ and put the link here. Please upload the file to https://mclo.gs/ and put the link here.
Do **not** paste the *contents* of the file here, because that will make this issue very hard to read. Do **not** paste the *contents* of the file here, because that will make this issue very hard to read.
"
validations: validations:
required: true required: true
- type: textarea - type: textarea
attributes: attributes:
label: Debug Information label: Debug Information
description: " description: >
Please run the \"/create debuginfo\" command in-game. Please run the \"/create debuginfo\" command in-game.
This will copy useful information to your clipboard that will greatly help with debugging. This will copy useful information to your clipboard that will greatly help with debugging.
Please paste this information here. Please paste this information here.
If this command does not exist, you can skip this part.
"
validations: validations:
required: false required: true
- type: markdown - type: markdown
attributes: attributes:

View file

@ -12,13 +12,12 @@ body:
- type: input - type: input
attributes: attributes:
label: Crash Report label: Crash Report
description: " description: >
We need the crash report to figure out why the crash happened. We need the crash report to figure out why the crash happened.
This file can be found in the \"crash-reports\" folder of your Minecraft folder. This file can be found in the \"crash-reports\" folder of your Minecraft folder.
It will be the newest file there. It will be the newest file there.
Please upload the file to https://mclo.gs/ and put the link here. Please upload the file to https://mclo.gs/ and put the link here.
Do **not** paste the *contents* of the file here, because that will make this issue very hard to read. Do **not** paste the *contents* of the file here, because that will make this issue very hard to read.
"
validations: validations:
required: true required: true

View file

@ -1,23 +0,0 @@
name: gametest
on: [ workflow_dispatch ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: checkout repository
uses: actions/checkout@v3
- name: setup Java
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
cache: gradle
- name: make gradle wrapper executable
run: chmod +x ./gradlew
- name: run gametests
run: ./gradlew prepareRunGameTestServer runGameTestServer --no-daemon

View file

@ -1,9 +1,9 @@
name: "Label Actions" name: Label Actions
on: on:
issues: issues:
types: [labeled, unlabeled] types: [ labeled, unlabeled ]
pull_request_target: pull_request_target:
types: [labeled, unlabeled] types: [ labeled, unlabeled ]
permissions: permissions:
contents: read contents: read

View file

@ -1,27 +1,11 @@
# This workflow will run Crowdin Action that will upload new texts to Crowdin, download the newest translations and create a PR # This workflow will run Crowdin Action that will upload new texts to Crowdin, download the newest translations and create a PR
# For more information see: https://github.com/crowdin/github-action # For more information see: https://github.com/crowdin/github-action
name: Crowdin Action name: Crowdin Action
# Controls when the action will run.
on: workflow_dispatch on: workflow_dispatch
# Only run when started manually
#:
# inputs:
# uploadTranslations:
# description: "Set to true to upload (changed) translations to Crowdin"
# type: boolean
# required: true
# default: false
#schedule:
#- cron: '0 */6 * * *' # Every 6 hours - https://crontab.guru/#0_*/6_*_*_*
jobs: jobs:
synchronize-with-crowdin: synchronize-with-crowdin:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2

27
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,27 @@
name: Publish Release
on: workflow_dispatch
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Java
run: echo "JAVA_HOME=$JAVA_HOME_17_X64" >> "$GITHUB_ENV"
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- name: Validate Gradle Wrapper Integrity
uses: gradle/wrapper-validation-action@v2
- name: Build & Publish
env:
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }}
run: ./gradlew build publish publishMods

View file

@ -1,21 +1,21 @@
import dev.ithundxr.silk.ChangelogText
plugins { plugins {
id 'idea' id "idea"
id 'eclipse' id "eclipse"
id 'maven-publish' id "maven-publish"
id "net.neoforged.moddev.legacyforge" version "2.0.74"
id 'net.minecraftforge.gradle' version "${forgegradle_version}" id "me.modmuss50.mod-publish-plugin" version "0.8.3"
id 'org.spongepowered.mixin' version "${mixingradle_version}" id "dev.ithundxr.silk" version "0.11.15"
id 'org.parchmentmc.librarian.forgegradle' version "${librarian_version}" id "net.kyori.blossom" version "2.1.0" // https://github.com/KyoriPowered/blossom
id "org.jetbrains.gradle.plugin.idea-ext" version "1.1.8" // https://github.com/JetBrains/gradle-idea-ext-plugin
id 'com.matthewprenger.cursegradle' version "${cursegradle_version}"
} }
apply from: './gradle/java.gradle' apply from: './gradle/java.gradle'
jarJar.enable()
boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false') boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false')
ext.buildNumber = System.getenv('BUILD_NUMBER') ext.buildNumber = System.getenv('BUILD_NUMBER')
String gitHash = "\"${calculateGitHash() + (hasUnstaged() ? "-modified" : "")}\""
base { base {
archivesName = "create-${artifact_minecraft_version}" archivesName = "create-${artifact_minecraft_version}"
@ -46,13 +46,6 @@ mixin {
println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}"
mixin {
add sourceSets.main, 'create.refmap.json'
debug.verbose = true
debug.export = true
}
idea { idea {
module { module {
downloadJavadoc = true downloadJavadoc = true
@ -60,152 +53,103 @@ idea {
} }
} }
minecraft { legacyForge {
version = "$minecraft_version-$forge_version"
if (Boolean.parseBoolean(use_parchment)) { // TODO - Try turning this on later
mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" validateAccessTransformers = false
} else {
mappings channel: 'official', version: "${minecraft_version}"
}
// This property allows configuring Gradle's ProcessResources task(s) to run on IDE output locations before launching the game.
copyIdeResources = true
if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) { if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) {
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') accessTransformers.from "src/main/resources/META-INF/accesstransformer.cfg"
}
parchment {
minecraftVersion = minecraft_version
mappingsVersion = parchment_version
} }
runs { runs {
// applies to all the run configs below // applies to all the run configs below
configureEach { configureEach {
if (inMultiModWorkspace) systemProperty 'forge.logging.markers', ''
ideaModule "createmod.Create.main" systemProperty 'forge.logging.console.level', 'info'
else jvmArguments = ["-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition"]
ideaModule "Create.main"
property 'forge.logging.markers', ''
property 'forge.logging.console.level', 'info'
jvmArgs '-XX:+IgnoreUnrecognizedVMOptions', '-XX:+AllowEnhancedClassRedefinition'
//jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc //jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc
//jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling
property 'mixin.debug.export', 'true' systemProperty 'mixin.debug.export', 'true'
property 'mixin.env.remapRefMap', 'true' systemProperty 'mixin.debug.verbose', 'true'
property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" systemProperty 'mixin.env.remapRefMap', 'true'
systemProperty 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"
arg '-mixin.config=create.mixins.json' programArgument '-mixin.config=create.mixins.json'
arg '-mixin.config=catnip.mixins.json' programArgument '-mixin.config=catnip.mixins.json'
mods { mods {
create {
source sourceSets.main
}
if (catnipInWorkspace) { if (catnipInWorkspace) {
catnip { catnip {
source project(":catnip:Common").sourceSets.main sourceSet project(":catnip:Common").sourceSets.main
source project(":catnip:Forge").sourceSets.main sourceSet project(":catnip:Forge").sourceSets.main
} }
} }
if (ponderInWorkspace) { if (ponderInWorkspace) {
ponder { ponder {
source project(":ponder:Common").sourceSets.main sourceSet project(":ponder:Common").sourceSets.main
source project(":ponder:Forge").sourceSets.main sourceSet project(":ponder:Forge").sourceSets.main
} }
} }
} }
} }
client { client {
workingDirectory project.file('run') client()
gameDirectory = project.file('run')
} }
server { server {
workingDirectory project.file('run/server') server()
gameDirectory = project.file('run/server')
} }
data { data {
workingDirectory project.file('run') data()
property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
property 'forge.logging.console.level', 'debug' gameDirectory = project.file('run')
args '--mod', 'create', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources') systemProperty 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
systemProperty 'forge.logging.console.level', 'debug'
programArguments = ["--mod", mod_id, "--all", "--output", file("src/generated/resources/").getAbsolutePath(), "--existing", file("src/main/resources").getAbsolutePath()]
} }
gameTestServer { gameTestServer {
workingDirectory project.file('run/gametest') type = "gameTestServer"
gameDirectory = project.file('run/gametest')
// setForceExit false <- FIXME 1.20 // setForceExit false <- FIXME 1.20
} }
} }
} }
repositories { repositories {
maven { maven { url = "https://maven.createmod.net" } // Ponder, Catnip
// location of the maven for Registrate and Flywheel maven { url = "https://maven.tterrag.com" } // Registrate, Flywheel
name = 'tterrag maven' maven { url = "https://maven.blamejared.com" } // JEI, Vazkii's Mods
url = 'https://maven.tterrag.com' maven { url = "https://harleyoconnor.com/maven" } // Dynamic Trees
} maven { url = "https://maven.theillusivec4.top/" } // Curios API
maven { maven { url = "https://maven.squiddev.cc" } // CC: Tweaked
// location of the maven that hosts JEI files since January 2023 maven { url = "https://www.cursemaven.com" }
// location of the maven for Vazkii's mods maven { url = "https://api.modrinth.com/maven" }
name = "Jared's maven" maven { url = "https://maven.saps.dev/releases" } // FTB Mods
url = "https://maven.blamejared.com/" maven { url = "https://maven.architectury.dev" } // Arch API
} maven { url = "https://jm.gserv.me/repository/maven-public" // JourneyMap
/*maven {
// location of a maven mirror for JEI files, as a fallback
name = "ModMaven"
url = "https://modmaven.dev"
}*/
maven {
// location of the maven for Dynamic Trees
url = 'https://harleyoconnor.com/maven'
}
maven {
// location of the maven for Curios API
url = "https://maven.theillusivec4.top/"
}
maven {
// location of maven for CC: Tweaked
name = "squiddev"
url = "https://squiddev.cc/maven/"
}
maven {
name = "ftb"
url = "https://maven.saps.dev/releases"
}
maven {
name = "architectury"
url = "https://maven.architectury.dev/"
}
maven {
url = "https://jm.gserv.me/repository/maven-public/"
content { content {
includeGroup "info.journeymap" includeGroup "info.journeymap"
includeGroup "mysticdrew" includeGroup "mysticdrew"
} }
} }
maven {
url = 'https://www.cursemaven.com'
content {
includeGroup "curse.maven"
}
}
maven {
// Location of the maven for Ponder, Catnip
name = 'createmod maven'
url 'https://maven.createmod.net'
}
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
content {
includeGroup "maven.modrinth"
}
}
maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" }
// Mirror of maven.createmod.net // Mirror of maven.createmod.net
if (System.getProperty("os.name").contains("Mac") && System.getenv("USER") == "ithundxr") { if (System.getProperty("os.name").contains("Mac") && System.getenv("USER") == "ithundxr") {
maven { url = "https://maven.ithundxr.dev/mirror" } maven { url = "https://maven.ithundxr.dev/mirror" }
@ -214,136 +158,143 @@ repositories {
mavenCentral() mavenCentral()
mavenLocal() mavenLocal()
flatDir { flatDir {
dirs 'libs' dirs "libs"
} }
} }
sourceSets.main.resources {
srcDir 'src/generated/resources'
exclude '.cache/'
}
dependencies { dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
jarJar("com.tterrag.registrate:Registrate:${registrate_version}") { jarJar("com.tterrag.registrate:Registrate:${registrate_version}") {
jarJar.ranged(it, '[MC1.19.3-1.1.10,)') version {
strictly "[MC1.20-1.3.3,)"
}
} }
jarJar("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { jarJar("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") {
jarJar.ranged(it, '[1.0,2.0)') version {
strictly "[1.0,2.0)"
}
} }
jarJar("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") { jarJar("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") {
jarJar.ranged(it, '[0.7.5,)') version {
strictly "[0.7.5,)"
}
} }
jarJar("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") { jarJar("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") {
jarJar.ranged(it, '[0.7.5,)') version {
strictly "[0.7.5,)"
}
} }
implementation(jarJar("io.github.llamalad7:mixinextras-forge:${mixin_extras_version}")) { implementation(jarJar("io.github.llamalad7:mixinextras-forge:${mixin_extras_version}")) {
jarJar.ranged(it, "[${mixin_extras_version},)") version {
strictly "[${mixin_extras_version},)"
}
} }
implementation fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}") modImplementation("com.tterrag.registrate:Registrate:${registrate_version}")
compileOnly fg.deobf("dev.engine_room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}") modCompileOnly("dev.engine_room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}")
runtimeOnly fg.deobf("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") modRuntimeOnly("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}")
if (catnipInWorkspace) { if (catnipInWorkspace) {
implementation project(":catnip:Common") implementation project(":catnip:Common")
implementation project(":catnip:Forge") implementation project(":catnip:Forge")
} else { } else {
implementation fg.deobf("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") modImplementation("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}")
} }
if (ponderInWorkspace) { if (ponderInWorkspace) {
implementation project(":ponder:Common") implementation project(":ponder:Common")
implementation project(":ponder:Forge") implementation project(":ponder:Forge")
} else { } else {
implementation fg.deobf("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") modImplementation("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}")
} }
compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras_version}")) compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras_version}"))
// compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}") // modCompileOnly("mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}")
// compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge-api:${jei_version}") // modCompileOnly("mezz.jei:jei-${jei_minecraft_version}-forge-api:${jei_version}")
implementation fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge:${jei_version}") modImplementation("mezz.jei:jei-${jei_minecraft_version}-forge:${jei_version}")
compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}:api") modCompileOnly("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}:api")
runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}") modRuntimeOnly("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}")
if (cc_tweaked_enable.toBoolean()) { if (cc_tweaked_enable.toBoolean()) {
compileOnly("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-core-api:${cc_tweaked_version}") compileOnly("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-core-api:${cc_tweaked_version}")
compileOnly fg.deobf("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge-api:${cc_tweaked_version}") modCompileOnly("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge-api:${cc_tweaked_version}")
runtimeOnly fg.deobf("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge:${cc_tweaked_version}") modRuntimeOnly("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge:${cc_tweaked_version}")
} }
if (dynamic_trees_enable.toBoolean()) { if (dynamic_trees_enable.toBoolean()) {
compileOnly fg.deobf("com.ferreusveritas.dynamictrees:DynamicTrees-${dynamic_trees_minecraft_version}:${dynamic_trees_version}") modCompileOnly("com.ferreusveritas.dynamictrees:DynamicTrees-${dynamic_trees_minecraft_version}:${dynamic_trees_version}")
} }
// implementation fg.deobf("curse.maven:ic2-classic-242942:5555152") // modImplementation("curse.maven:ic2-classic-242942:5555152")
// implementation fg.deobf("curse.maven:druidcraft-340991:3101903") // modImplementation("curse.maven:druidcraft-340991:3101903")
// implementation fg.deobf("com.railwayteam.railways:railways-1.19.2-1.6.4:all") { transitive = false } // modImplementation("com.railwayteam.railways:railways-1.19.2-1.6.4:all") { transitive = false }
implementation fg.deobf("dev.architectury:architectury-forge:9.1.12") modRuntimeOnly("dev.architectury:architectury-forge:9.1.12")
implementation fg.deobf("dev.ftb.mods:ftb-chunks-forge:2001.3.1") modImplementation("dev.ftb.mods:ftb-chunks-forge:2001.3.1")
implementation fg.deobf("dev.ftb.mods:ftb-teams-forge:2001.3.0") modImplementation("dev.ftb.mods:ftb-teams-forge:2001.3.0")
implementation fg.deobf("dev.ftb.mods:ftb-library-forge:2001.2.4") modImplementation("dev.ftb.mods:ftb-library-forge:2001.2.4")
implementation fg.deobf("curse.maven:journeymap-32274:5457831") modImplementation("curse.maven:journeymap-32274:5457831")
// implementation fg.deobf("ignored:journeymap-1.20.1-5.10.1-forge") // modImplementation("ignored:journeymap-1.20.1-5.10.1-forge")
// runtimeOnly fg.deobf("curse.maven:framedblocks-441647:5399211") // modRuntimeOnly("curse.maven:framedblocks-441647:5399211")
// runtimeOnly fg.deobf("curse.maven:galosphere-631098:4574834") // modRuntimeOnly("curse.maven:galosphere-631098:4574834")
// runtimeOnly fg.deobf("curse.maven:elementary-ores-332609:4514276") 1.19.4 only // modRuntimeOnly("curse.maven:elementary-ores-332609:4514276") 1.19.4 only
// runtimeOnly fg.deobf("curse.maven:flib-661261:4479544") // modRuntimeOnly("curse.maven:flib-661261:4479544")
// runtimeOnly fg.deobf("curse.maven:infernal-expansion-395078:4002091") // modRuntimeOnly("curse.maven:infernal-expansion-395078:4002091")
// runtimeOnly fg.deobf("vazkii.autoreglib:AutoRegLib:1.8.2-58.126") // modRuntimeOnly("vazkii.autoreglib:AutoRegLib:1.8.2-58.126")
// runtimeOnly fg.deobf("curse.maven:quark-243121:4812006") // modRuntimeOnly("curse.maven:quark-243121:4812006")
// runtimeOnly fg.deobf("curse.maven:mantle-74924:5339977") // modRuntimeOnly("curse.maven:mantle-74924:5339977")
// runtimeOnly fg.deobf("curse.maven:tinkers-construct-74072:5358052") // modRuntimeOnly("curse.maven:tinkers-construct-74072:5358052")
// runtimeOnly fg.deobf("maven.modrinth:rubidium:0.6.2c") // modRuntimeOnly("maven.modrinth:rubidium:0.6.2c")
// runtimeOnly fg.deobf("maven.modrinth:aether:1.19.2-1.4.2-forge") // modRuntimeOnly("maven.modrinth:aether:1.19.2-1.4.2-forge")
// runtimeOnly fg.deobf("maven.modrinth:spark:1.10.38-forge") // modRuntimeOnly("maven.modrinth:spark:1.10.38-forge")
// runtimeOnly fg.deobf("curse.maven:forbidden-arcanus-309858:4852521") // modRuntimeOnly("curse.maven:forbidden-arcanus-309858:4852521")
// runtimeOnly fg.deobf("curse.maven:valhelsia-core-416935:4181245") // modRuntimeOnly("curse.maven:valhelsia-core-416935:4181245")
// runtimeOnly fg.deobf("curse.maven:modern-ui-352491:5229370") // modRuntimeOnly("curse.maven:modern-ui-352491:5229370")
// runtimeOnly fg.deobf("curse.maven:sophisticated-storage-619320:5194750") // modRuntimeOnly("curse.maven:sophisticated-storage-619320:5194750")
// runtimeOnly fg.deobf("curse.maven:sophisticated-core-618298:5296313") // modRuntimeOnly("curse.maven:sophisticated-core-618298:5296313")
// runtimeOnly fg.deobf("curse.maven:functional-storage-556861:5499169") // modRuntimeOnly("curse.maven:functional-storage-556861:5499169")
// runtimeOnly fg.deobf("curse.maven:titanium-287342:5356458") // modRuntimeOnly("curse.maven:titanium-287342:5356458")
// runtimeOnly fg.deobf("curse.maven:storage-drawers-223852:3884263") // modRuntimeOnly("curse.maven:storage-drawers-223852:3884263")
// runtimeOnly fg.deobf("curse.maven:ftb-chunks-forge-314906:5417874") // modRuntimeOnly("curse.maven:ftb-chunks-forge-314906:5417874")
// runtimeOnly fg.deobf("curse.maven:architectury-api-419699:5137942") // modRuntimeOnly("curse.maven:architectury-api-419699:5137942")
// runtimeOnly fg.deobf("curse.maven:ftb-library-forge-404465:4661834") // modRuntimeOnly("curse.maven:ftb-library-forge-404465:4661834")
// runtimeOnly fg.deobf("curse.maven:ftb-teams-forge-404468:4611938") // modRuntimeOnly("curse.maven:ftb-teams-forge-404468:4611938")
// runtimeOnly fg.deobf("curse.maven:citadel-331936:4556677") // modRuntimeOnly("curse.maven:citadel-331936:4556677")
// runtimeOnly fg.deobf("curse.maven:ice-and-fire-dragons-264231:5037952") // modRuntimeOnly("curse.maven:ice-and-fire-dragons-264231:5037952")
// runtimeOnly fg.deobf("curse.maven:exnihilosequentia-400012:4993344") // modRuntimeOnly("curse.maven:exnihilosequentia-400012:4993344")
// runtimeOnly fg.deobf("curse.maven:upgrade-aquatic-326895:4777515") // modRuntimeOnly("curse.maven:upgrade-aquatic-326895:4777515")
// runtimeOnly fg.deobf("curse.maven:blueprint-382216:4749000") // modRuntimeOnly("curse.maven:blueprint-382216:4749000")
// runtimeOnly fg.deobf("curse.maven:windsweptmod-636321:4817132") // modRuntimeOnly("curse.maven:windsweptmod-636321:4817132")
// runtimeOnly fg.deobf("curse.maven:good-ending-690161:4363719") // modRuntimeOnly("curse.maven:good-ending-690161:4363719")
// https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497 // https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497
// Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings // Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings
// This allows 'Settings > Build, Execution, and Deployment > Build Tools > Gradle > Build and run using' set to IntelliJ to work correctly // This allows 'Settings > Build, Execution, and Deployment > Build Tools > Gradle > Build and run using' set to IntelliJ to work correctly
if (!Boolean.getBoolean('idea.sync.active')) { if (!Boolean.getBoolean('idea.sync.active')) {
annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" annotationProcessor "org.spongepowered:mixin:0.8.5:processor"
} }
} }
sourceSets.main.java { sourceSets.main {
java {
if (!cc_tweaked_enable.toBoolean()) { if (!cc_tweaked_enable.toBoolean()) {
exclude 'com/simibubi/create/compat/computercraft/implementation/**' exclude 'com/simibubi/create/compat/computercraft/implementation/**'
} }
} }
resources {
// Workaround for SpongePowered/MixinGradle#38 srcDir 'src/generated/resources'
afterEvaluate { exclude '.cache/'
tasks.configureReobfTaskForReobfJar.mustRunAfter(tasks.compileJava) }
tasks.configureReobfTaskForReobfJarJar.mustRunAfter(tasks.compileJava) blossom.javaSources {
property("version", build_info_mod_version)
property("gitCommit", gitHash.toString())
}
} }
processResources { processResources {
@ -361,31 +312,21 @@ compileJava {
options.compilerArgs = ['-Xdiags:verbose'] options.compilerArgs = ['-Xdiags:verbose']
} }
void addLicense(jarTask) { jar {
jarTask.from('LICENSE') { from('LICENSE') {
rename { "${it}_${project.archivesBaseName}" } rename { "${it}_${archivesBaseName}" }
} }
manifest.attributes([
"MixinConfigs": "create.mixins.json",
"Git-Hash": gitHash
])
} }
tasks.jar { tasks.named("sourcesJar") {
archiveClassifier = 'slim' manifest.attributes([
finalizedBy('reobfJar') "Git-Hash": gitHash
addLicense it ])
}
tasks.jarJar {
finalizedBy('reobfJarJar')
addLicense it
}
task jarJarRelease {
group = 'jarjar'
doLast {
tasks.jarJar {
archiveClassifier = ''
}
}
finalizedBy tasks.jarJar
} }
project.publishing { project.publishing {
@ -393,8 +334,6 @@ project.publishing {
mavenJava(MavenPublication) { mavenJava(MavenPublication) {
artifactId base.archivesName.get() artifactId base.archivesName.get()
from components.java from components.java
fg.component(it)
jarJar.component(it)
} }
} }
@ -405,55 +344,52 @@ project.publishing {
} }
} }
String getChangelogText() { publishMods {
def changelogFile = file('changelog.txt') file = jar.archiveFile
String str = '' changelog = ChangelogText.getChangelogText(project).toString()
int lineCount = 0 type = STABLE
boolean done = false displayName = "$mod_name $minecraft_version $mod_version"
changelogFile.eachLine { modLoaders.add("forge")
if (done || it == null) { modLoaders.add("neoforge")
return
curseforge {
accessToken = providers.environmentVariable("CURSEFORGE_TOKEN")
projectId = "328085"
minecraftVersions.add(minecraft_version)
} }
if (it.size() > 1) {
def temp = it modrinth {
if (lineCount == 0) { accessToken = providers.environmentVariable("MODRINTH_TOKEN")
temp = "Create ${version}" projectId = "LNytGWDc"
temp = "<span style=\"font-size: 18px; color: #333399;\">Create v${mod_version}</span>&nbsp;&nbsp;<em>for Minecraft ${minecraft_version}</em><br/>" minecraftVersions.add(minecraft_version)
} else if (it.startsWith('-')) {
temp = "&nbsp;&nbsp;&nbsp;$temp<br/>"
temp = temp.replaceAll("(\\S+\\/\\S+)#([0-9]+)\\b", "<a href=\"https://github.com/\$1/issues/\$2\">\$0</a>");
temp = temp.replaceAll("#([0-9]+)\\b(?!<\\/a>)", "<a href=\"https://github.com/$github_project/issues/\$1\">\$0</a>");
} else {
temp = "<h4>$temp</h4>"
} }
str += temp
lineCount++
} else {
str += "<p>Please submit any Issues you come across on the&nbsp;<a href=\"https://github.com/${github_project}/issues\" rel=\"nofollow\">Issue Tracker</a>.</p>"
done = true
}
}
return str
} }
// changelog debugging String calculateGitHash() {
// new File("changelog.html").write getChangelogText() try {
// tasks.curseforge.enabled = !dev && project.hasProperty('simi_curseforge_key') ByteArrayOutputStream stdout = new ByteArrayOutputStream()
// curseforge { exec {
// if (project.hasProperty('simi_curseforge_key')) { commandLine("git", "rev-parse", "HEAD")
// apiKey = project.simi_curseforge_key standardOutput = stdout
// } }
// return stdout.toString().trim()
// project { } catch(Throwable ignored) {
// id = project.projectId return "unknown"
// changelog = System.getenv('CHANGELOG') == null || System.getenv('CHANGELOG').equals('none') ? getChangelogText() : System.getenv('CHANGELOG') }
// changelogType = 'html' }
// releaseType = project.curse_type
// mainArtifact(shadowJar) { boolean hasUnstaged() {
// displayName = "Create - ${version}" try {
// } ByteArrayOutputStream stdout = new ByteArrayOutputStream()
// relations { exec {
// optionalDependency 'jei' commandLine("git", "status", "--porcelain")
// } standardOutput = stdout
// } }
// } String result = stdout.toString().replace("/M gradlew(\\.bat)?/", "").trim()
if (!result.isEmpty())
println("Found stageable results:\n${result}\n")
return !result.isEmpty()
} catch(Throwable ignored) {
return false
}
}

34
changelog.md Normal file
View file

@ -0,0 +1,34 @@
------------------------------------------------------
Create 0.5.2
------------------------------------------------------
Additions
- Example
Changes
- Bumped the defalt max rope length to 384
- Set vault capacity limit to 2048 slots to prevent people from OOM-ing themselves if they set the capacity too high
Bug Fixes
- Fix certain blocks messing up the order scheduled ticks (#7141)
- Fix unbreakable superglue not being usable (#6253)
- Fix update suppression (#7176)
- Fix comparator output of depots ignoring the items max stack size (#7179)
- Fix deployers retaining the damage attribute of their last held weapon (#4870)
- Fix an exploit allowing people to create clipboards that execute commands (#7218)
- Fix redstone links not updating their redstone output when they've been taken out of receiver mode (#7226)
- Fix rare crash related to sliding doors (#6184)
- Verify that schematics are gzip-encoded before trying to read from them (#6087)
- Added workaround for create_tracks.dat getting corrupted during crashes, the mod will try to restore the old track data stored in the create_tracks.dat_old file if the current one is corrupted
- Fix contraptions triggering pressure plates and tripwires (#7255)
- Fix ConditionContext nbt in trains containing a large number of empty tags
- Fix deployers not placing fish from fish buckets (#3705)
- Fix gasses not being visible in basins and item drains (#7236)
Art Changes
- Example
API Changes
- Removed LangMerger and related classes
- Implemented an api to allow mods to register schematic requirements, partial safe nbt and contraption transforms without implementing interfaces (#4702)
- Add a method that developers can override to change the icon in goggle tooltips
- Refactored Item Attributes types, Fan processing types and Arm interaction points, all 3 now use proper registries

View file

@ -4,18 +4,15 @@ org.gradle.jvmargs = -Xmx3G
org.gradle.daemon = false org.gradle.daemon = false
# mod version info # mod version info
# build_info_mod_version is the version that gets filled into CreateBuildInfo.java
mod_version = 0.5.2 mod_version = 0.5.2
build_info_mod_version = 0.5.2-experimental
artifact_minecraft_version = 1.20.1 artifact_minecraft_version = 1.20.1
minecraft_version = 1.20.1 minecraft_version = 1.20.1
forge_version = 47.2.6 forge_version = 47.2.6
# build dependency versions # build dependency versions
forgegradle_version = [6.0.16,6.2)
mixingradle_version = 0.7.+
mixin_version = 0.8.5
librarian_version = 1.+
cursegradle_version = 1.4.0
parchment_version = 2023.09.03 parchment_version = 2023.09.03
use_parchment = true use_parchment = true

View file

@ -16,13 +16,12 @@ jar {
'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
'Timestampe' : System.currentTimeMillis(), 'Timestampe' : System.currentTimeMillis(),
'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})",
'Build-On-Minecraft' : minecraft_version 'Built-On-Minecraft' : minecraft_version
]) ])
} }
} }
tasks.withType(JavaCompile).configureEach { tasks.withType(JavaCompile).configureEach {
it.options.encoding = 'UTF-8' it.options.encoding = 'UTF-8'
it.options.release = 17 it.options.release = 17
} }
@ -31,12 +30,10 @@ tasks.withType(JavaCompile).configureEach {
// metadata includes mapped dependencies which are not reasonably consumable by // metadata includes mapped dependencies which are not reasonably consumable by
// other mod developers. // other mod developers.
tasks.withType(GenerateModuleMetadata) { tasks.withType(GenerateModuleMetadata) {
enabled = false enabled = false
} }
javadoc { javadoc {
// Suppress annoying warnings when generating JavaDoc files. // Suppress annoying warnings when generating JavaDoc files.
options.addStringOption('Xdoclint:none', '-quiet') options.addStringOption('Xdoclint:none', '-quiet')
} }

Binary file not shown.

View file

@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

27
gradlew vendored
View file

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -83,7 +85,9 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -130,10 +134,13 @@ location of your Java installation."
fi fi
else 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. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
@ -141,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
@ -149,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -198,11 +205,11 @@ fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # 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"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command; # Collect all arguments for the java command:
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# shell script including quotes and variable substitutions, so put them in # and any embedded shellness will be escaped.
# double quotes to make sure that they get re-expanded; and # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# * put everything else in single quotes, so that it's not re-expanded. # treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \

22
gradlew.bat vendored
View file

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail

View file

@ -2,7 +2,6 @@ pluginManagement {
repositories { repositories {
gradlePluginPortal() gradlePluginPortal()
mavenCentral() mavenCentral()
jcenter()
maven { url = 'https://maven.minecraftforge.net/' } maven { url = 'https://maven.minecraftforge.net/' }
maven { url = 'https://repo.spongepowered.org/repository/maven-public' } maven { url = 'https://repo.spongepowered.org/repository/maven-public' }
maven { url = 'https://maven.parchmentmc.org' } maven { url = 'https://maven.parchmentmc.org' }
@ -10,7 +9,7 @@ pluginManagement {
} }
plugins { plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
} }
rootProject.name = 'Create' rootProject.name = 'Create'

View file

@ -0,0 +1,6 @@
package com.simibubi.create;
public class CreateBuildInfo {
public static String VERSION = "{{ version }}";
public static String GIT_COMMIT = {{ gitCommit }};
}

View file

@ -61,10 +61,8 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
@Mod(Create.ID) @Mod(Create.ID)
public class Create { public class Create {
public static final String ID = "create"; public static final String ID = "create";
public static final String NAME = "Create"; public static final String NAME = "Create";
public static final String VERSION = "0.5.2-experimental";
public static final Logger LOGGER = LogUtils.getLogger(); public static final Logger LOGGER = LogUtils.getLogger();
@ -102,6 +100,8 @@ public class Create {
} }
public static void onCtor() { public static void onCtor() {
LOGGER.info("{} {} initializing! Commit hash: {}", NAME, CreateBuildInfo.VERSION, CreateBuildInfo.GIT_COMMIT);
ModLoadingContext modLoadingContext = ModLoadingContext.get(); ModLoadingContext modLoadingContext = ModLoadingContext.get();
IEventBus modEventBus = FMLJavaModLoadingContext.get() IEventBus modEventBus = FMLJavaModLoadingContext.get()
@ -187,5 +187,4 @@ public class Create {
public static ResourceLocation asResource(String path) { public static ResourceLocation asResource(String path) {
return new ResourceLocation(ID, path); return new ResourceLocation(ID, path);
} }
} }

View file

@ -11,6 +11,7 @@ import javax.annotation.Nullable;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.platform.GlUtil; import com.mojang.blaze3d.platform.GlUtil;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.CreateBuildInfo;
import com.simibubi.create.foundation.mixin.accessor.SystemReportAccessor; import com.simibubi.create.foundation.mixin.accessor.SystemReportAccessor;
import com.simibubi.create.infrastructure.debugInfo.element.DebugInfoSection; import com.simibubi.create.infrastructure.debugInfo.element.DebugInfoSection;
import com.simibubi.create.infrastructure.debugInfo.element.InfoElement; import com.simibubi.create.infrastructure.debugInfo.element.InfoElement;
@ -68,7 +69,7 @@ public class DebugInformation {
static { static {
DebugInfoSection.builder(Create.NAME) DebugInfoSection.builder(Create.NAME)
.put("Mod Version", Create.VERSION) .put("Mod Version", CreateBuildInfo.VERSION)
.put("Forge Version", getVersionOfMod("forge")) .put("Forge Version", getVersionOfMod("forge"))
.put("Minecraft Version", SharedConstants.getCurrentVersion().getName()) .put("Minecraft Version", SharedConstants.getCurrentVersion().getName())
.buildTo(DebugInformation::registerBothInfo); .buildTo(DebugInformation::registerBothInfo);

View file

@ -5,6 +5,7 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.CreateBuildInfo;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.CreateLang;
@ -130,7 +131,7 @@ public class CreateMainMenuScreen extends AbstractSimiScreen {
ms.translate(0, 0, 200); ms.translate(0, 0, 200);
graphics.drawCenteredString(font, Components.literal(Create.NAME).withStyle(ChatFormatting.BOLD) graphics.drawCenteredString(font, Components.literal(Create.NAME).withStyle(ChatFormatting.BOLD)
.append( .append(
Components.literal(" v" + Create.VERSION).withStyle(ChatFormatting.BOLD, ChatFormatting.WHITE)), Components.literal(" v" + CreateBuildInfo.VERSION).withStyle(ChatFormatting.BOLD, ChatFormatting.WHITE)),
width / 2, 89, 0xFF_E4BB67); width / 2, 89, 0xFF_E4BB67);
ms.popPose(); ms.popPose();