diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 03016cc71..000000000 --- a/build.gradle +++ /dev/null @@ -1,459 +0,0 @@ -plugins { - id "maven-publish" - id "com.matthewprenger.cursegradle" version "1.4.0" - id "com.github.breadmoirai.github-release" version "2.2.12" - id "org.jetbrains.kotlin.jvm" version "1.7.0" - id "com.modrinth.minotaur" version "2.+" - id "net.minecraftforge.gradle" version "5.1.+" - id "org.spongepowered.mixin" version "0.7.+" - id "org.parchmentmc.librarian.forgegradle" version "1.+" - id "com.github.johnrengelman.shadow" version "7.1.2" - id("cc-tweaked.illuaminate") - id("cc-tweaked.java-convention") - id("cc-tweaked") -} - -import cc.tweaked.gradle.CheckChangelog -import cc.tweaked.gradle.ExtensionsKt -import cc.tweaked.gradle.IlluaminateExec -import cc.tweaked.gradle.IlluaminateExecToDir -import org.apache.tools.ant.taskdefs.condition.Os - -version = mod_version - -group = "org.squiddev" -archivesBaseName = "cc-tweaked-${mc_version}" - -java.registerFeature("extraMods") { usingSourceSet(sourceSets.main) } - -sourceSets { - main.resources { - srcDir 'src/generated/resources' - } - - testMod {} -} - -minecraft { - runs { - all { - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - forceExit = false - - mods { - computercraft { - source sourceSets.main - } - } - - arg "-mixin.config=computercraft.mixins.json" - } - - client { - workingDirectory project.file('run') - } - - server { - workingDirectory project.file("run/server") - arg "--nogui" - } - - data { - workingDirectory project.file('run') - args '--mod', 'computercraft', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - property("cct.pretty-json", "true") - } - - testClient { - workingDirectory project.file('test-files/client') - parent runs.client - - mods { - cctest { - source sourceSets.testMod - } - } - } - - testServer { - workingDirectory project.file('test-files/server') - parent runs.server - - property("cctest.run", "true") - property("forge.logging.console.level", "info") - - mods { - cctest { - source sourceSets.testMod - } - } - } - } - - mappings channel: 'parchment', version: "${mapping_version}-${mc_version}" - - accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg') - accessTransformer file('src/testMod/resources/META-INF/accesstransformer.cfg') -} - -mixin { - add sourceSets.main, 'computercraft.mixins.refmap.json' -} - -reobf { - shadowJar {} -} - -configurations { - shade { transitive = false } - implementation.extendsFrom shade - cctJavadoc - - testModImplementation.extendsFrom(implementation) - testModImplementation.extendsFrom(testImplementation) -} - -dependencies { - minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" - annotationProcessor 'org.spongepowered:mixin:0.8.4:processor' - - compileOnly(libs.jetbrainsAnnotations) - ExtensionsKt.annotationProcessorEverywhere(dependencies, libs.autoService) - - extraModsCompileOnly fg.deobf("mezz.jei:jei-1.16.5:7.7.0.104:api") - extraModsRuntimeOnly fg.deobf("mezz.jei:jei-1.16.5:7.7.0.104") - - extraModsCompileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.16.5:7.1.0.313") - extraModsCompileOnly fg.deobf("commoble.morered:morered-1.16.5:2.1.1.0") - - shade 'org.squiddev:Cobalt:0.5.7' - - testImplementation(libs.bundles.test) - testImplementation(libs.bundles.kotlin) - testRuntimeOnly(libs.bundles.testRuntime) - - testModImplementation sourceSets.main.output - - cctJavadoc 'cc.tweaked:cct-javadoc:1.4.7' -} - -illuaminate { - version.set("0.1.0-3-g0f40379") -} - -// Compile tasks - -javadoc { - include "dan200/computercraft/api/**/*.java" -} - -def apiJar = tasks.register("apiJar", Jar.class) { - archiveClassifier.set("api") - from(sourceSets.main.output) { - include "dan200/computercraft/api/**/*" - } -} -assemble.dependsOn(apiJar) - -def luaJavadoc = tasks.register("luaJavadoc", Javadoc.class) { - description "Generates documentation for Java-side Lua functions." - group "documentation" - - source = sourceSets.main.allJava - destinationDir = file("${project.docsDir}/luaJavadoc") - classpath = sourceSets.main.compileClasspath - - options.docletpath = configurations.cctJavadoc.files as List - options.doclet = "cc.tweaked.javadoc.LuaDoclet" - options.noTimestamp = false - - javadocTool = javaToolchains.javadocToolFor { - languageVersion = JavaLanguageVersion.of(11) - } -} - -jar { - finalizedBy("reobfJar") - - archiveClassifier.set("slim") - manifest { - attributes([ - "Specification-Title" : "computercraft", - "Specification-Vendor" : "SquidDev", - "Specification-Version" : "1", - "Implementation-Title" : "CC: Tweaked", - "Implementation-Version" : "${mod_version}", - "Implementation-Vendor" : "SquidDev", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - "MixinConfigs" : "computercraft.mixins.json", - ]) - } -} - -shadowJar { - finalizedBy("reobfShadowJar") - - archiveClassifier.set("") - configurations = [project.configurations.shade] - relocate("org.squiddev.cobalt", "cc.tweaked.internal.cobalt") - minimize() -} - -assemble.dependsOn("shadowJar") - -processResources { - inputs.property "version", mod_version - inputs.property "mcversion", mc_version - - inputs.property("gitHash", cct.gitHash) - - filesMatching("data/computercraft/lua/rom/help/credits.txt") { - expand("gitContributors": cct.gitContributors.get().join("\n")) - } - - filesMatching("META-INF/mods.toml") { - expand("version": mod_version, "mcversion": mc_version) - } -} - -// Web tasks - -List mkCommand(String command) { - return Os.isFamily(Os.FAMILY_WINDOWS) ? ["cmd", "/c", command] : ["sh", "-c", command] -} - -def rollup = tasks.register("rollup", Exec.class) { - group = "build" - description = "Bundles JS into rollup" - - inputs.files(fileTree("src/web")).withPropertyName("sources") - inputs.file("package-lock.json").withPropertyName("package-lock.json") - inputs.file("tsconfig.json").withPropertyName("Typescript config") - inputs.file("rollup.config.js").withPropertyName("Rollup config") - outputs.file("$buildDir/rollup/index.js").withPropertyName("output") - - commandLine mkCommand('"node_modules/.bin/rollup" --config rollup.config.js') -} - -def illuaminateDocs = tasks.register("illuaminateDocs", IlluaminateExecToDir.class) { - group = "documentation" - description = "Generates docs using Illuaminate" - dependsOn(rollup) - - // Config files - inputs.file("illuaminate.sexp").withPropertyName("illuaminate.sexp") - // Sources - inputs.files(fileTree("doc")).withPropertyName("docs") - inputs.files(fileTree("src/main/resources/data/computercraft/lua")).withPropertyName("lua rom") - inputs.files(luaJavadoc) - // Additional assets - inputs.file("$buildDir/rollup/index.js").withPropertyName("scripts") - inputs.file("src/web/styles.css").withPropertyName("styles") - - // Output directory. Also defined in illuaminate.sexp and transform.tsx - output.set(new File(buildDir, "docs/lua")) - - args = ["doc-gen"] -} - -def jsxDocs = tasks.register("jsxDocs", Exec) { - group = "documentation" - description = "Post-processes documentation to statically render some dynamic content." - - inputs.files(fileTree("src/web")).withPropertyName("sources") - inputs.file("src/generated/export/index.json").withPropertyName("export") - inputs.file("package-lock.json").withPropertyName("package-lock.json") - inputs.file("tsconfig.json").withPropertyName("Typescript config") - inputs.files(illuaminateDocs) - outputs.dir("$buildDir/docs/site") - - commandLine mkCommand('"node_modules/.bin/ts-node" -T --esm src/web/transform.tsx') -} - -def docWebsite = tasks.register("docWebsite", Copy.class) { - group = "documentation" - description = "Copy additional assets to the website directory." - dependsOn(jsxDocs) - - from('doc') { - include 'logo.png' - include 'images/**' - } - from("$buildDir/rollup") { - exclude 'index.js' - } - from("$buildDir/docs/lua") { - exclude '**/*.html' - } - from("src/generated/export/items") { - into("images/items") - } - - into "${project.docsDir}/site" -} - -// Check tasks - -test { - useJUnitPlatform() - testLogging { - events "skipped", "failed" - } -} - -def lintLua = tasks.register("lintLua", IlluaminateExec.class) { - group = JavaBasePlugin.VERIFICATION_GROUP - description = "Lint Lua (and Lua docs) with illuaminate" - - // Config files - inputs.file("illuaminate.sexp").withPropertyName("illuaminate.sexp") - // Sources - inputs.files(fileTree("doc")).withPropertyName("docs") - inputs.files(fileTree("src/main/resources/data/computercraft/lua")).withPropertyName("lua rom") - inputs.files(luaJavadoc) - - args = ["lint"] - - doFirst { if (System.getenv("GITHUB_ACTIONS") != null) println("::add-matcher::.github/matchers/illuaminate.json") } - doLast { if (System.getenv("GITHUB_ACTIONS") != null) println("::remove-matcher owner=illuaminate::") } -} - - -def setupServer = tasks.register("setupServer", Copy.class) { - group "test server" - description "Sets up the environment for the test server." - - from("src/testMod/server-files") { - include "eula.txt" - include "server.properties" - } - into "test-files/server" -} - -def runGametest = tasks.register("runGametest", JavaExec.class) { - group("In-game tests") - description("Runs tests on a temporary Minecraft instance.") - dependsOn(setupServer, "cleanRunGametest") - - // Copy from runTestServer. We do it in this slightly odd way as runTestServer - // isn't created until the task is configured (which is no good for us). - ExtensionsKt.copyToFull(tasks.getByName("runTestServer"), it) -} - -cct.jacoco(runGametest) - -tasks.check { dependsOn(runGametest) } - -// Upload tasks - -def checkChangelog = tasks.register("checkChangelog", CheckChangelog.class) { - version.set(mod_version) - whatsNew.set(file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.md")) - changelog.set(file("src/main/resources/data/computercraft/lua/rom/help/changelog.md")) -} - -tasks.check { dependsOn(checkChangelog) } - -def isStable = true - -curseforge { - apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : '' - project { - id = '282001' - releaseType = isStable ? 'release' : 'alpha' - changelog = "Release notes can be found on the GitHub repository (https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." - mainArtifact(shadowJar) - - addGameVersion "${mc_version}" - } -} - -modrinth { - token = project.hasProperty('modrinthApiKey') ? project.getProperty('modrinthApiKey') : '' - projectId = 'gu7yAYhd' - versionNumber = "${project.mc_version}-${project.mod_version}" - versionName = "${project.mod_version}" - versionType = isStable ? 'release' : 'alpha' - uploadFile = shadowJar - gameVersions = [project.mc_version] - changelog = "Release notes can be found on the [GitHub repository](https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." -} - -publishing { - publications { - maven(MavenPublication) { - from components.java - artifact(apiJar) - fg.component(it) - - pom { - name = 'CC: Tweaked' - description = 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.' - url = 'https://github.com/cc-tweaked/CC-Tweaked' - - scm { - url = 'https://github.com/cc-tweaked/CC-Tweaked.git' - } - - issueManagement { - system = 'github' - url = 'https://github.com/cc-tweaked/CC-Tweaked/issues' - } - - licenses { - license { - name = 'ComputerCraft Public License, Version 1.0' - url = 'https://github.com/cc-tweaked/CC-Tweaked/blob/mc-1.16.x/LICENSE' - } - } - } - } - } - - repositories { - if (project.hasProperty("mavenUser")) { - maven { - name = "SquidDev" - url = "https://squiddev.cc/maven" - credentials { - username = project.property("mavenUser") as String - password = project.property("mavenPass") as String - } - } - } - } -} - -githubRelease { - token project.hasProperty('githubApiKey') ? project.githubApiKey : '' - owner 'cc-tweaked' - repo 'CC-Tweaked' - targetCommitish.set(project.provider({ - try { - return ["git", "-C", projectDir, "rev-parse", "--abbrev-ref", "HEAD"].execute().text.trim() - } catch (Exception e) { - e.printStackTrace() - } - return "master" - })) - - tagName "v${mc_version}-${mod_version}" - releaseName "[${mc_version}] ${mod_version}" - body.set(project.provider({ - "## " + new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/whatsnew.md") - .readLines() - .takeWhile { it != 'Type "help changelog" to see the full version history.' } - .join("\n").trim() - })) - prerelease !isStable -} - -def uploadTasks = ["publish", "curseforge", "modrinth", "githubRelease"] -uploadTasks.forEach { tasks.named(it) { dependsOn(checkChangelog) } } - -tasks.register("uploadAll") { - group = "upload" - description = "Uploads to all repositories (Maven, Curse, Modrinth, GitHub release)" - dependsOn(uploadTasks) -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..23a549c95 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,445 @@ +import cc.tweaked.gradle.* +import net.darkhax.curseforgegradle.TaskPublishCurseForge + +plugins { + // Build + alias(libs.plugins.kotlin) + alias(libs.plugins.forgeGradle) + alias(libs.plugins.mixinGradle) + alias(libs.plugins.librarian) + alias(libs.plugins.shadow) + // Publishing + `maven-publish` + alias(libs.plugins.curseForgeGradle) + alias(libs.plugins.githubRelease) + alias(libs.plugins.minotaur) + // Utility + alias(libs.plugins.taskTree) + + id("cc-tweaked.illuaminate") + id("cc-tweaked.node") + id("cc-tweaked.java-convention") + id("cc-tweaked") +} + +val isStable = true +val modVersion: String by extra +val mcVersion: String by extra + +group = "org.squiddev" +version = modVersion +base.archivesName.set("cc-tweaked-$mcVersion") + +java.registerFeature("extraMods") { usingSourceSet(sourceSets.main.get()) } + +sourceSets { + main { + resources.srcDir("src/generated/resources") + } + + register("testMod") +} + +minecraft { + runs { + // configureEach would be better, but we need to eagerly configure configs or otherwise the run task doesn't + // get set up properly. + all { + property("forge.logging.markers", "REGISTRIES") + property("forge.logging.console.level", "debug") + + forceExit = false + + mods.register("computercraft") { source(sourceSets.main.get()) } + } + + val client by registering { + workingDirectory(file("run")) + } + + val server by registering { + workingDirectory(file("run/server")) + arg("--nogui") + } + + val data by registering { + workingDirectory(file("run")) + args( + "--mod", + "computercraft", + "--all", + "--output", + file("src/generated/resources/"), + "--existing", + file("src/main/resources/"), + ) + property("cct.pretty-json", "true") + } + + val testClient by registering { + workingDirectory(project.file("test-files/client")) + parent(client.get()) + + mods.register("cctest") { source(sourceSets["testMod"]) } + } + + val testServer by registering { + workingDirectory(project.file("test-files/server")) + parent(server.get()) + + property("cctest.run", "true") + property("forge.logging.console.level", "info") + + mods.register("cctest") { source(sourceSets["testMod"]) } + } + } + + mappings("parchment", "${libs.versions.parchmentMc.get()}-${libs.versions.parchment.get()}-$mcVersion") + + accessTransformer(file("src/main/resources/META-INF/accesstransformer.cfg")) + accessTransformer(file("src/testMod/resources/META-INF/accesstransformer.cfg")) +} + +mixin { + add(sourceSets.main.get(), "computercraft.mixins.refmap.json") + config("computercraft.mixins.json") +} + +reobf { + register("shadowJar") +} + +configurations { + val shade by registering { isTransitive = false } + implementation { extendsFrom(shade.get()) } + register("cctJavadoc") + + named("testModImplementation") { extendsFrom(implementation.get(), testImplementation.get()) } +} + +dependencies { + minecraft("net.minecraftforge:forge:$mcVersion-${libs.versions.forge.get()}") + annotationProcessor("org.spongepowered:mixin:0.8.4:processor") + + compileOnly(libs.jetbrainsAnnotations) + annotationProcessorEverywhere(libs.autoService) + + "extraModsCompileOnly"(fg.deobf("mezz.jei:jei-1.16.5:7.7.0.104:api")) + "extraModsRuntimeOnly"(fg.deobf("mezz.jei:jei-1.16.5:7.7.0.104")) + + "extraModsCompileOnly"(fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.16.5:7.1.0.313")) + "extraModsCompileOnly"(fg.deobf("commoble.morered:morered-1.16.5:2.1.1.0")) + + "shade"(libs.cobalt) + + testImplementation(libs.bundles.test) + testImplementation(libs.bundles.kotlin) + testRuntimeOnly(libs.bundles.testRuntime) + + "testModImplementation"(sourceSets.main.get().output) + + "cctJavadoc"(libs.cctJavadoc) +} + +illuaminate { + version.set(libs.versions.illuaminate) +} + +// Compile tasks + +tasks.javadoc { + include("dan200/computercraft/api/**/*.java") +} + +val apiJar by tasks.registering(Jar::class) { + archiveClassifier.set("api") + from(sourceSets.main.get().output) { + include("dan200/computercraft/api/**/*") + } +} + +tasks.assemble { dependsOn(apiJar) } + +val luaJavadoc by tasks.registering(Javadoc::class) { + description = "Generates documentation for Java-side Lua functions." + group = JavaBasePlugin.DOCUMENTATION_GROUP + + source(sourceSets.main.get().java) + setDestinationDir(project.buildDir.resolve("docs/luaJavadoc")) + classpath = sourceSets.main.get().compileClasspath + + options.docletpath = configurations["cctJavadoc"].files.toList() + options.doclet = "cc.tweaked.javadoc.LuaDoclet" + (options as StandardJavadocDocletOptions).noTimestamp(false) + + javadocTool.set( + javaToolchains.javadocToolFor { + languageVersion.set(JavaLanguageVersion.of(11)) + }, + ) +} + +tasks.processResources { + inputs.property("modVersion", modVersion) + inputs.property("forgeVersion", libs.versions.forge.get()) + inputs.property("gitHash", cct.gitHash) + + filesMatching("data/computercraft/lua/rom/help/credits.txt") { + expand(mapOf("gitContributors" to cct.gitContributors.get().joinToString("\n"))) + } + + filesMatching("META-INF/mods.toml") { + expand(mapOf("forgeVersion" to libs.versions.forge.get(), "file" to mapOf("jarVersion" to modVersion))) + } +} + +tasks.jar { + isReproducibleFileOrder = true + isPreserveFileTimestamps = false + finalizedBy("reobfJar") + archiveClassifier.set("slim") + + manifest { + attributes( + "Specification-Title" to "computercraft", + "Specification-Vendor" to "SquidDev", + "Specification-Version" to "1", + "specificationVersion" to "cctweaked", + "Implementation-Version" to modVersion, + "Implementation-Vendor" to "SquidDev", + ) + } +} + +tasks.shadowJar { + finalizedBy("reobfShadowJar") + + archiveClassifier.set("") + configurations = listOf(project.configurations["shade"]) + relocate("org.squiddev.cobalt", "cc.tweaked.internal.cobalt") + minimize() +} + +tasks.assemble { dependsOn("shadowJar") } + +// Web tasks + +val rollup by tasks.registering(NpxExecToDir::class) { + group = LifecycleBasePlugin.BUILD_GROUP + description = "Bundles JS into rollup" + + // Sources + inputs.files(fileTree("src/web")).withPropertyName("sources") + // Config files + inputs.file("tsconfig.json").withPropertyName("Typescript config") + inputs.file("rollup.config.js").withPropertyName("Rollup config") + + // Output directory. Also defined in illuaminate.sexp and rollup.config.js + output.set(buildDir.resolve("rollup")) + + args = listOf("rollup", "--config", "rollup.config.js") +} + +val illuaminateDocs by tasks.registering(IlluaminateExecToDir::class) { + group = JavaBasePlugin.DOCUMENTATION_GROUP + description = "Generates docs using Illuaminate" + + // Config files + inputs.file("illuaminate.sexp").withPropertyName("illuaminate.sexp") + // Sources + inputs.files(fileTree("doc")).withPropertyName("docs") + inputs.files(fileTree("src/main/resources/data/computercraft/lua")).withPropertyName("lua rom") + inputs.files(luaJavadoc) + // Additional assets + inputs.files(rollup) + inputs.file("src/web/styles.css").withPropertyName("styles") + + // Output directory. Also defined in illuaminate.sexp and transform.tsx + output.set(buildDir.resolve("illuaminate")) + + args = listOf("doc-gen") +} + +val jsxDocs by tasks.registering(NpxExecToDir::class) { + group = JavaBasePlugin.DOCUMENTATION_GROUP + description = "Post-processes documentation to statically render some dynamic content." + + // Config files + inputs.file("tsconfig.json").withPropertyName("Typescript config") + // Sources + inputs.files(fileTree("src/web")).withPropertyName("sources") + inputs.file("src/generated/export/index.json").withPropertyName("export") + inputs.files(illuaminateDocs) + + // Output directory. Also defined in src/web/transform.tsx + output.set(buildDir.resolve("jsxDocs")) + + args = listOf("ts-node", "-T", "--esm", "src/web/transform.tsx") +} + +val docWebsite by tasks.registering(Copy::class) { + group = JavaBasePlugin.DOCUMENTATION_GROUP + description = "Assemble docs and assets together into the documentation website." + + from(jsxDocs) + + from("doc") { + include("logo.png") + include("images/**") + } + from(rollup) { exclude("index.js") } + from(illuaminateDocs) { exclude("**/*.html") } + from("src/generated/export/items") { into("images/items") } + + into(buildDir.resolve("docs/site")) +} + +// Check tasks + +val lintLua by tasks.registering(IlluaminateExec::class) { + group = JavaBasePlugin.VERIFICATION_GROUP + description = "Lint Lua (and Lua docs) with illuaminate" + + // Config files + inputs.file("illuaminate.sexp").withPropertyName("illuaminate.sexp") + // Sources + inputs.files(fileTree("doc")).withPropertyName("docs") + inputs.files(fileTree("src/main/resources/data/computercraft/lua")).withPropertyName("lua rom") + inputs.files(luaJavadoc) + + args = listOf("lint") + + doFirst { if (System.getenv("GITHUB_ACTIONS") != null) println("::add-matcher::.github/matchers/illuaminate.json") } + doLast { if (System.getenv("GITHUB_ACTIONS") != null) println("::remove-matcher owner=illuaminate::") } +} + +val setupRunGametest by tasks.registering(Copy::class) { + group = LifecycleBasePlugin.VERIFICATION_GROUP + description = "Sets up the environment for the test server." + + from("src/testMod/server-files") { + include("eula.txt") + include("server.properties") + } + into("test-files/server") +} + +val runGametest by tasks.registering(JavaExec::class) { + group = LifecycleBasePlugin.VERIFICATION_GROUP + description = "Runs tests on a temporary Minecraft instance." + dependsOn(setupRunGametest, "cleanRunGametest") + + // Copy from runTestServer. We do it in this slightly odd way as runTestServer + // isn't created until the task is configured (which is no good for us). + val exec = tasks.getByName("runTestServer") + dependsOn(exec.dependsOn) + exec.copyToFull(this) +} + +cct.jacoco(runGametest) + +tasks.check { dependsOn(runGametest) } + +// Upload tasks + +val checkChangelog by tasks.registering(CheckChangelog::class) { + version.set(modVersion) + whatsNew.set(file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.md")) + changelog.set(file("src/main/resources/data/computercraft/lua/rom/help/changelog.md")) +} + +tasks.check { dependsOn(checkChangelog) } + +val publishCurseForge by tasks.registering(TaskPublishCurseForge::class) { + group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Upload artifacts to CurseForge" + + apiToken = project.findProperty("curseForgeApiKey") ?: "" + enabled = apiToken != "" + + val mainFile = upload("282001", tasks.shadowJar) + dependsOn(tasks.shadowJar) // Ughr. + mainFile.changelog = "Release notes can be found on the [GitHub repository](https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v$mcVersion-$modVersion)." + mainFile.changelogType = "markdown" + mainFile.releaseType = if (isStable) "release" else "alpha" + mainFile.gameVersions.add(mcVersion) +} + +tasks.publish { dependsOn(publishCurseForge) } + +modrinth { + token.set(project.findProperty("modrinthApiKey") as String? ?: "") + projectId.set("gu7yAYhd") + versionNumber.set("$mcVersion-$modVersion") + versionName.set(modVersion) + versionType.set(if (isStable) "release" else "alpha") + uploadFile.set(tasks.shadowJar as Any) + gameVersions.add(mcVersion) + changelog.set("Release notes can be found on the [GitHub repository](https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v$mcVersion-$modVersion).") + + syncBodyFrom.set(project.provider { file("doc/mod-page.md").readText() }) +} + +tasks.publish { dependsOn(tasks.modrinth) } + +githubRelease { + token(project.findProperty("githubApiKey") as String? ?: "") + owner.set("cc-tweaked") + repo.set("CC-Tweaked") + targetCommitish.set(cct.gitBranch) + + tagName.set("v$mcVersion-$modVersion") + releaseName.set("[$mcVersion] $modVersion") + body.set( + project.provider( + { + "## " + file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.md") + .readLines() + .takeWhile { it != "Type \"help changelog\" to see the full version history." } + .joinToString("\n").trim() + }, + ), + ) + prerelease.set(!isStable) +} + +tasks.publish { dependsOn(tasks.githubRelease) } + +publishing { + publications { + register("maven") { + artifactId = base.archivesName.get() + from(components["java"]) + artifact(apiJar) + fg.component(this) + + pom { + name.set("CC: Tweaked") + description.set("CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.") + url.set("https://github.com/cc-tweaked/CC-Tweaked") + + scm { + url.set("https://github.com/cc-tweaked/CC-Tweaked.git") + } + + issueManagement { + system.set("github") + url.set("https://github.com/cc-tweaked/CC-Tweaked/issues") + } + + licenses { + license { + name.set("ComputerCraft Public License, Version 1.0") + url.set("https://github.com/cc-tweaked/CC-Tweaked/blob/HEAD/LICENSE") + } + } + } + } + } + + repositories { + maven("https://squiddev.cc/maven") { + name = "SquidDev" + } + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index ab8da4608..6ba68e361 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -23,5 +23,10 @@ gradlePlugin { id = "cc-tweaked.illuaminate" implementationClass = "cc.tweaked.gradle.IlluaminatePlugin" } + + register("cc-tweaked.node") { + id = "cc-tweaked.node" + implementationClass = "cc.tweaked.gradle.NodePlugin" + } } } diff --git a/buildSrc/src/main/kotlin/cc/tweaked/gradle/Node.kt b/buildSrc/src/main/kotlin/cc/tweaked/gradle/Node.kt new file mode 100644 index 000000000..8d66ab454 --- /dev/null +++ b/buildSrc/src/main/kotlin/cc/tweaked/gradle/Node.kt @@ -0,0 +1,60 @@ +package cc.tweaked.gradle + +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.file.Directory +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.* +import java.io.File + +class NodePlugin : Plugin { + override fun apply(project: Project) { + val extension = project.extensions.create("node", NodeExtension::class.java) + project.tasks.register(NpmInstall.TASK_NAME, NpmInstall::class.java) { + projectRoot.convention(extension.projectRoot) + } + } +} + +abstract class NodeExtension(project: Project) { + /** The directory containing `package-lock.json` and `node_modules/`. */ + abstract val projectRoot: DirectoryProperty + + init { + projectRoot.convention(project.layout.projectDirectory) + } +} + +/** Installs node modules as dependencies. */ +abstract class NpmInstall : DefaultTask() { + @get:Internal + abstract val projectRoot: DirectoryProperty + + @get:InputFile + @get:PathSensitive(PathSensitivity.NONE) + val packageLock: Provider = projectRoot.file("package-lock.json").map { it.asFile } + + @get:OutputDirectory + val nodeModules: Provider = projectRoot.dir("node_modules") + + @TaskAction + fun install() { + project.exec { + commandLine("npm", "ci") + workingDir = projectRoot.get().asFile + } + } + + companion object { + internal const val TASK_NAME: String = "npmInstall" + } +} + +abstract class NpxExecToDir : ExecToDir() { + init { + dependsOn(NpmInstall.TASK_NAME) + executable = "npx" + } +} diff --git a/doc/mod-page.md b/doc/mod-page.md new file mode 100644 index 000000000..2f355af45 --- /dev/null +++ b/doc/mod-page.md @@ -0,0 +1,61 @@ +# ![CC: Tweaked](https://tweaked.cc/logo.png) +CC: Tweaked is a mod for Minecraft which adds programmable computers, turtles and more to the game. A fork of the much-beloved [ComputerCraft], it continues its legacy with better performance, stability, and a wealth of new features. + +**Fabric support is added by the [CC: Restitched][ccrestitched] project** + +## Testimonials + +> I'm not sure what that is [...] I don't know where that came from. +> +> \- [direwolf20, December 2020](https://youtu.be/D8Ue9I-SKeM?t=980) + +> It is basically ComputerCraft. It has the turtles, and the computers, and writing Lua programs and all that stuff. +> +> \- [direwolf20, May 2022](https://youtu.be/7Ruq33XmQIQ?t=537) + + +## Features +Controlled using the [Lua programming language][lua], CC: Tweaked's computers provides all the tools you need to start +writing code and automating your Minecraft world. + +![A ComputerCraft terminal open and ready to be programmed.](https://tweaked.cc/images/basic-terminal.png) + +While computers are incredibly powerful, they're rather limited by their inability to move about. *Turtles* are the +solution here. They can move about the world, placing and breaking blocks, swinging a sword to protect you from zombies, +or whatever else you program them to! + +![A turtle tunneling in Minecraft.](https://tweaked.cc/images/turtle.png) + +Not all problems can be solved with a pickaxe though, and so CC: Tweaked also provides a bunch of additional peripherals +for your computers. You can play a tune with speakers, display text or images on a monitor, connect all your +computers together with modems, and much more. + +Computers can now also interact with inventories such as chests, allowing you to build complex inventory and item +management systems. + +![A chest's contents being read by a computer and displayed on a monitor.](https://tweaked.cc/images/peripherals.png) + +## Getting Started +While ComputerCraft is lovely for both experienced programmers and for people who have never coded before, it can be a +little daunting getting started. Thankfully, there's several fantastic tutorials out there: + + - [Direwolf20's ComputerCraft tutorials](https://www.youtube.com/watch?v=wrUHUhfCY5A "ComputerCraft Tutorial Episode 1 - HELP! and Hello World") + - [Sethbling's ComputerCraft series](https://www.youtube.com/watch?v=DSsx4VSe-Uk "Programming Tutorial with Minecraft Turtles -- Ep. 1: Intro to Turtles and If-Then-Else_End") + - [Lyqyd's Computer Basics 1](http://www.computercraft.info/forums2/index.php?/topic/15033-computer-basics-i/ "Computer Basics I") + +Once you're a little more familiar with the mod, the [wiki](https://tweaked.cc/) provides more detailed documentation on the +various APIs and peripherals provided by the mod. + +If you get stuck, do [ask a question on GitHub][GitHub Discussions] or pop in to the ComputerCraft's [IRC channel][IRC]. + +## Get Involved +CC: Tweaked lives on [GitHub]. If you've got any ideas, feedback or bugs please do [create an issue][bug]. + +[github]: https://github.com/cc-tweaked/CC-Tweaked/ "CC: Tweaked on GitHub" +[bug]: https://github.com/cc-tweaked/CC-Tweaked/issues/new/choose +[computercraft]: https://github.com/dan200/ComputerCraft "ComputerCraft on GitHub" +[forge]: https://files.minecraftforge.net/ "Download Minecraft Forge." +[ccrestitched]: https://modrinth.com/mod/cc-restitched "Download CC: Restitched from Modrinth" +[lua]: https://www.lua.org/ "Lua's main website" +[GitHub Discussions]: https://github.com/cc-tweaked/CC-Tweaked/discussions +[IRC]: http://webchat.esper.net/?channels=computercraft "#computercraft on EsperNet" diff --git a/gradle.properties b/gradle.properties index f25c2da25..e180e723d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,11 @@ org.gradle.jvmargs=-Xmx3G +org.gradle.parallel=true + kotlin.stdlib.default.dependency=false +kotlin.jvm.target.validation.mode=error # Mod properties -mod_version=1.100.10 +modVersion=1.100.10 -# Minecraft properties (update mods.toml when changing) -mc_version=1.16.5 -mapping_version=2021.08.08 -forge_version=36.2.34 -# NO SERIOUSLY, UPDATE mods.toml WHEN CHANGING +# Minecraft properties: We want to configure this here so we can read it in settings.gradle +mcVersion=1.16.5 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index db5953d2c..5f164ed3b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,13 @@ [versions] + +# Minecraft +# MC version is specified in gradle.properties, as we need that in settings.gradle. +forge = "36.2.34" +parchment = "2021.08.08" +parchmentMc = "1.16.5" + autoService = "1.0.1" +cobalt = { strictly = "[0.5.7,0.6.0)", prefer = "0.5.7" } jetbrainsAnnotations = "23.0.0" kotlin = "1.7.10" kotlin-coroutines = "1.6.0" @@ -10,11 +18,22 @@ jqwik = "1.7.0" junit = "5.9.1" # Build tools +cctJavadoc = "1.5.0" checkstyle = "8.25" # There's a reason we're pinned on an ancient version, but I can't remember what it is. +curseForgeGradle = "1.0.11" +forgeGradle = "5.1.+" +githubRelease = "2.2.12" +illuaminate = "0.1.0-3-g0f40379" +librarian = "1.+" +minotaur = "2.+" +mixinGradle = "0.7.+" +shadow = "7.1.2" spotless = "6.8.0" +taskTree = "2.1.0" [libraries] autoService = { module = "com.google.auto.service:auto-service", version.ref = "autoService" } +cobalt = { module = "org.squiddev:Cobalt", version.ref = "cobalt" } jetbrainsAnnotations = { module = "org.jetbrains:annotations", version.ref = "jetbrainsAnnotations" } kotlin-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlin-coroutines" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } @@ -28,9 +47,21 @@ junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", vers junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit" } # Build tools +cctJavadoc = { module = "cc.tweaked:cct-javadoc", version.ref = "cctJavadoc" } checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyle" } spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } +[plugins] +kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +taskTree = { id = "com.dorongold.task-tree", version.ref = "taskTree" } +curseForgeGradle = { id = "net.darkhax.curseforgegradle", version.ref = "curseForgeGradle" } +mixinGradle = { id = "org.spongepowered.mixin", version.ref = "mixinGradle" } +minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" } +githubRelease = { id = "com.github.breadmoirai.github-release", version.ref = "githubRelease" } +forgeGradle = { id = "net.minecraftforge.gradle", version.ref = "forgeGradle" } +librarian = { id = "org.parchmentmc.librarian.forgegradle", version.ref = "librarian" } +shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" } + [bundles] kotlin = ["kotlin-stdlib", "kotlin-coroutines"] diff --git a/illuaminate.sexp b/illuaminate.sexp index 7ddafe9e5..c0b3564d9 100644 --- a/illuaminate.sexp +++ b/illuaminate.sexp @@ -10,7 +10,7 @@ (doc - (destination build/docs/lua) + (destination build/illuaminate) (index doc/index.md) (site diff --git a/settings.gradle.kts b/settings.gradle.kts index 153e5d000..998bf3e4c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,5 +13,5 @@ pluginManagement { } } -val mc_version: String by settings -rootProject.name = "cc-tweaked-$mc_version" +val mcVersion: String by settings +rootProject.name = "cc-tweaked-$mcVersion" diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 438eb9b1e..f7377819a 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -11,7 +11,7 @@ license="ComputerCraft Public License (https://raw.githubusercontent.com/dan200/ [[mods]] modId="computercraft" -version="${version}" +version="${file.jarVersion}" displayName="CC: Tweaked" description=''' CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft. @@ -20,6 +20,6 @@ CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles a [[dependencies.computercraft]] modId="forge" mandatory=true - versionRange="[36.2.34,37)" + versionRange="[${forgeVersion},37)" ordering="NONE" side="BOTH" diff --git a/src/web/transform.tsx b/src/web/transform.tsx index 521ee56b8..1cc3131c4 100644 --- a/src/web/transform.tsx +++ b/src/web/transform.tsx @@ -24,7 +24,7 @@ import { DataExport, WithExport } from "./components/WithExport.js"; const glob = promisify(globModule); (async () => { - const base = "build/docs/lua"; + const base = "build/illuaminate"; const processor = unified() .use(rehypeParse, { emitParseErrors: true }) @@ -46,7 +46,7 @@ const glob = promisify(globModule); const { result } = await processor.process(contents); - const outputPath = path.resolve("build/docs/site", path.relative(base, file)); + const outputPath = path.resolve("build/jsxDocs", path.relative(base, file)); await fs.mkdir(path.dirname(outputPath), { recursive: true }); await fs.writeFile(outputPath, "" + renderToStaticMarkup({result})); }