mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-01-07 16:00:31 +00:00
Convert build script to Kotlin
- Add a new Node plugin. This automatically installs npm dependencies and provides a "NpxExecToDir" to dir task. This allows us to make the doc website task dependencies a little nicer, by simply chaining tasks together, rather than doing dependsOn + `input.files(the other task output)`. - Switch over to CurseForgeGradle from CurseGradle. The latter is super clunky to use in non-Groovy languages. - Copy our Modrinth description body to our repo, and add support for syncing it. We'll still have to do CF manually I think.
This commit is contained in:
parent
0cfdd7b5e9
commit
6ab90dc30d
459
build.gradle
459
build.gradle
@ -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<String> 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)
|
|
||||||
}
|
|
445
build.gradle.kts
Normal file
445
build.gradle.kts
Normal file
@ -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<JavaExec>("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<MavenPublication>("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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -23,5 +23,10 @@ gradlePlugin {
|
|||||||
id = "cc-tweaked.illuaminate"
|
id = "cc-tweaked.illuaminate"
|
||||||
implementationClass = "cc.tweaked.gradle.IlluaminatePlugin"
|
implementationClass = "cc.tweaked.gradle.IlluaminatePlugin"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
register("cc-tweaked.node") {
|
||||||
|
id = "cc-tweaked.node"
|
||||||
|
implementationClass = "cc.tweaked.gradle.NodePlugin"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
60
buildSrc/src/main/kotlin/cc/tweaked/gradle/Node.kt
Normal file
60
buildSrc/src/main/kotlin/cc/tweaked/gradle/Node.kt
Normal file
@ -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<Project> {
|
||||||
|
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<File> = projectRoot.file("package-lock.json").map { it.asFile }
|
||||||
|
|
||||||
|
@get:OutputDirectory
|
||||||
|
val nodeModules: Provider<Directory> = 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"
|
||||||
|
}
|
||||||
|
}
|
61
doc/mod-page.md
Normal file
61
doc/mod-page.md
Normal file
@ -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"
|
@ -1,11 +1,11 @@
|
|||||||
org.gradle.jvmargs=-Xmx3G
|
org.gradle.jvmargs=-Xmx3G
|
||||||
|
org.gradle.parallel=true
|
||||||
|
|
||||||
kotlin.stdlib.default.dependency=false
|
kotlin.stdlib.default.dependency=false
|
||||||
|
kotlin.jvm.target.validation.mode=error
|
||||||
|
|
||||||
# Mod properties
|
# Mod properties
|
||||||
mod_version=1.100.10
|
modVersion=1.100.10
|
||||||
|
|
||||||
# Minecraft properties (update mods.toml when changing)
|
# Minecraft properties: We want to configure this here so we can read it in settings.gradle
|
||||||
mc_version=1.16.5
|
mcVersion=1.16.5
|
||||||
mapping_version=2021.08.08
|
|
||||||
forge_version=36.2.34
|
|
||||||
# NO SERIOUSLY, UPDATE mods.toml WHEN CHANGING
|
|
||||||
|
@ -1,5 +1,13 @@
|
|||||||
[versions]
|
[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"
|
autoService = "1.0.1"
|
||||||
|
cobalt = { strictly = "[0.5.7,0.6.0)", prefer = "0.5.7" }
|
||||||
jetbrainsAnnotations = "23.0.0"
|
jetbrainsAnnotations = "23.0.0"
|
||||||
kotlin = "1.7.10"
|
kotlin = "1.7.10"
|
||||||
kotlin-coroutines = "1.6.0"
|
kotlin-coroutines = "1.6.0"
|
||||||
@ -10,11 +18,22 @@ jqwik = "1.7.0"
|
|||||||
junit = "5.9.1"
|
junit = "5.9.1"
|
||||||
|
|
||||||
# Build tools
|
# 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.
|
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"
|
spotless = "6.8.0"
|
||||||
|
taskTree = "2.1.0"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
autoService = { module = "com.google.auto.service:auto-service", version.ref = "autoService" }
|
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" }
|
jetbrainsAnnotations = { module = "org.jetbrains:annotations", version.ref = "jetbrainsAnnotations" }
|
||||||
kotlin-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlin-coroutines" }
|
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" }
|
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" }
|
junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit" }
|
||||||
|
|
||||||
# Build tools
|
# Build tools
|
||||||
|
cctJavadoc = { module = "cc.tweaked:cct-javadoc", version.ref = "cctJavadoc" }
|
||||||
checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyle" }
|
checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyle" }
|
||||||
spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" }
|
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]
|
[bundles]
|
||||||
kotlin = ["kotlin-stdlib", "kotlin-coroutines"]
|
kotlin = ["kotlin-stdlib", "kotlin-coroutines"]
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
|
|
||||||
(doc
|
(doc
|
||||||
(destination build/docs/lua)
|
(destination build/illuaminate)
|
||||||
(index doc/index.md)
|
(index doc/index.md)
|
||||||
|
|
||||||
(site
|
(site
|
||||||
|
@ -13,5 +13,5 @@ pluginManagement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val mc_version: String by settings
|
val mcVersion: String by settings
|
||||||
rootProject.name = "cc-tweaked-$mc_version"
|
rootProject.name = "cc-tweaked-$mcVersion"
|
||||||
|
@ -11,7 +11,7 @@ license="ComputerCraft Public License (https://raw.githubusercontent.com/dan200/
|
|||||||
|
|
||||||
[[mods]]
|
[[mods]]
|
||||||
modId="computercraft"
|
modId="computercraft"
|
||||||
version="${version}"
|
version="${file.jarVersion}"
|
||||||
displayName="CC: Tweaked"
|
displayName="CC: Tweaked"
|
||||||
description='''
|
description='''
|
||||||
CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.
|
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]]
|
[[dependencies.computercraft]]
|
||||||
modId="forge"
|
modId="forge"
|
||||||
mandatory=true
|
mandatory=true
|
||||||
versionRange="[36.2.34,37)"
|
versionRange="[${forgeVersion},37)"
|
||||||
ordering="NONE"
|
ordering="NONE"
|
||||||
side="BOTH"
|
side="BOTH"
|
||||||
|
@ -24,7 +24,7 @@ import { DataExport, WithExport } from "./components/WithExport.js";
|
|||||||
const glob = promisify(globModule);
|
const glob = promisify(globModule);
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const base = "build/docs/lua";
|
const base = "build/illuaminate";
|
||||||
|
|
||||||
const processor = unified()
|
const processor = unified()
|
||||||
.use(rehypeParse, { emitParseErrors: true })
|
.use(rehypeParse, { emitParseErrors: true })
|
||||||
@ -46,7 +46,7 @@ const glob = promisify(globModule);
|
|||||||
|
|
||||||
const { result } = await processor.process(contents);
|
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.mkdir(path.dirname(outputPath), { recursive: true });
|
||||||
await fs.writeFile(outputPath, "<!doctype HTML>" + renderToStaticMarkup(<WithExport data={dataExport}>{result}</WithExport>));
|
await fs.writeFile(outputPath, "<!doctype HTML>" + renderToStaticMarkup(<WithExport data={dataExport}>{result}</WithExport>));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user