diff --git a/scripts/src/lib/Template.svelte b/scripts/src/lib/Template.svelte
index fb5e620e..b3bb17c8 100644
--- a/scripts/src/lib/Template.svelte
+++ b/scripts/src/lib/Template.svelte
@@ -9,6 +9,7 @@
let projectName = "Template Mod";
let packageName = "com.example";
let useKotlin = false;
+ let useKotlinGradle = false;
let dataGeneration = false;
let splitSources = true;
@@ -53,6 +54,7 @@
projectName,
packageName,
useKotlin,
+ useKotlinGradle,
dataGeneration: dataGeneration && supportsDataGen,
splitSources: splitSources && supportsSplitSources,
};
@@ -179,6 +181,16 @@
+
diff --git a/scripts/src/lib/template/gradlekotlin.ts b/scripts/src/lib/template/gradlekotlin.ts
new file mode 100644
index 00000000..3ac5ccbe
--- /dev/null
+++ b/scripts/src/lib/template/gradlekotlin.ts
@@ -0,0 +1,13 @@
+import type { ComputedConfiguration, TemplateWriter } from './template';
+import { renderTemplate } from './eta';
+
+import gradlePropertiesTemplate from './templates/gradle/groovy/gradle.properties.eta?raw';
+import buildGradleTemplate from './templates/gradle/kotlin/build.gradle.kts.eta?raw';
+import settingsGradle from './templates/gradle/kotlin/settings.gradle.kts?raw';
+import { getJavaVersion } from './java';
+
+export async function addKotlinGradle(writer: TemplateWriter, config: ComputedConfiguration) {
+ await writer.write('gradle.properties', renderTemplate(gradlePropertiesTemplate, config));
+ await writer.write('build.gradle.kts', renderTemplate(buildGradleTemplate, {...config, java: getJavaVersion(config.minecraftVersion)}));
+ await writer.write('settings.gradle.kts', settingsGradle);
+}
diff --git a/scripts/src/lib/template/template.ts b/scripts/src/lib/template/template.ts
index a5ba86e8..2d5f676d 100644
--- a/scripts/src/lib/template/template.ts
+++ b/scripts/src/lib/template/template.ts
@@ -1,5 +1,6 @@
import { addGradleWrapper } from './gradlewrapper';
import { addGroovyGradle } from './gradlegroovy';
+import { addKotlinGradle } from './gradlekotlin';
import { getApiVersionForMinecraft, getKotlinAdapterVersions, getLoaderVersions, getMinecraftYarnVersions, type GameVersion, getGameVersions } from '../Api';
import { addModJson } from './modjson';
import { addGitFiles } from './git';
@@ -22,6 +23,7 @@ export interface Configuration {
projectName: string,
packageName: string,
useKotlin: boolean,
+ useKotlinGradle: boolean,
dataGeneration: boolean,
splitSources: boolean,
}
@@ -56,7 +58,11 @@ export async function generateTemplate(options: Options) {
const computedConfig = await computeConfig(options.config);
await addGradleWrapper(options);
- await addGroovyGradle(options.writer, computedConfig);
+ if (options.config.useKotlinGradle) {
+ await addKotlinGradle(options.writer, computedConfig);
+ } else {
+ await addGroovyGradle(options.writer, computedConfig);
+ }
await addModJson(options.writer, computedConfig);
await addGitFiles(options.writer, computedConfig);
}
diff --git a/scripts/src/lib/template/templates/gradle/kotlin/build.gradle.kts.eta b/scripts/src/lib/template/templates/gradle/kotlin/build.gradle.kts.eta
new file mode 100644
index 00000000..1fb7ca02
--- /dev/null
+++ b/scripts/src/lib/template/templates/gradle/kotlin/build.gradle.kts.eta
@@ -0,0 +1,113 @@
+plugins {
+ id("fabric-loom") version "1.2-SNAPSHOT"
+ id("maven-publish")<% if (it.kotlin) { %>
+ kotlin("jvm") version "<%= it.kotlin.kotlinVersion %>"<% } %>
+}
+
+java.sourceCompatibility = JavaVersion.<%= it.java.compatibility %>
+java.targetCompatibility = JavaVersion.<%= it.java.compatibility %>
+
+base.archivesName.set(project.property("archives_base_name") as String)
+version = project.property("mod_version") as String
+group = project.property("maven_group") as String
+
+repositories {
+ // Add repositories to retrieve artifacts from in here.
+ // You should only use this when depending on other mods because
+ // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
+ // See https://docs.gradle.org/current/userguide/declaring_repositories.html
+ // for more information about repositories.
+}
+<% if (it.dataGeneration || it.splitSources) { %>
+loom {
+<% if (it.splitSources) { %> splitEnvironmentSourceSets()
+
+ mods {
+ create("<%= it.modid %>") {
+ sourceSet(sourceSets["main"])
+ sourceSet(sourceSets["client"])
+ }
+ }
+<% } %><% if (it.dataGeneration) { %> runs {
+ create("datagen") {
+ inherit(runConfigs["server"])
+ name("Data Generation")
+ vmArg("-Dfabric-api.datagen")
+ vmArg("-Dfabric-api.datagen.output-dir=${file("src/main/generated")}")
+ vmArg("-Dfabric-api.datagen.modid=<%= it.modid %>")
+
+ runDir("build/datagen")
+ }
+ }<% } %>
+}
+<% } %><% if (it.dataGeneration) { %>
+sourceSets {
+ main {
+ resources {
+ srcDirs += file("src/main/generated")
+ }
+ }
+}<% } %>
+
+dependencies {
+ // To change the versions see the gradle.properties file
+ minecraft("com.mojang:minecraft:${project.property("minecraft_version")}")
+ mappings("net.fabricmc:yarn:${project.property("yarn_mappings")}:v2")
+ modImplementation("net.fabricmc:fabric-loader:${project.property("loader_version")}")
+
+ // Fabric API. This is technically optional, but you probably want it anyway.
+ modImplementation("net.fabricmc.fabric-api:fabric-api:${project.property("fabric_version")}")
+<% if (it.kotlin) { %> modImplementation("net.fabricmc:fabric-language-kotlin:${project.property("fabric_kotlin_version")}")<% } %>
+ // Uncomment the following line to enable the deprecated Fabric API modules.
+ // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time.
+
+ // modImplementation("net.fabricmc.fabric-api:fabric-api-deprecated:${project.property("fabric_version")}")
+}
+
+<% if (it.kotlin) { %>
+kotlin {
+ jvmToolchain(java.targetCompatibility.majorVersion.toInt())
+}
+<% } %>
+tasks {
+ processResources {
+ inputs.property("version", project.version)
+
+ filesMatching("fabric.mod.json") {
+ expand("version" to project.version)
+ }
+ }
+
+ withType {
+ options.release.set(java.targetCompatibility.majorVersion.toInt())
+ }
+ java {
+ // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
+ // if it is present.
+ // If you remove this line, sources will not be generated.
+ withSourcesJar()
+ }
+
+ jar {
+ from("LICENSE") {
+ rename { "${it}_${base.archivesName.get()}" }
+ }
+ }
+}
+
+// configure the maven publication
+publishing {
+ publications {
+ create("mavenJava") {
+ from(components["java"])
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ // Notice: This block does NOT have the same function as the block in the top level.
+ // The repositories here will be used for publishing your artifact, not for
+ // retrieving dependencies.
+ }
+}
diff --git a/scripts/src/lib/template/templates/gradle/kotlin/settings.gradle.kts b/scripts/src/lib/template/templates/gradle/kotlin/settings.gradle.kts
new file mode 100644
index 00000000..e1d9b9c4
--- /dev/null
+++ b/scripts/src/lib/template/templates/gradle/kotlin/settings.gradle.kts
@@ -0,0 +1,9 @@
+pluginManagement {
+ repositories {
+ maven("https://maven.fabricmc.net/") {
+ name = "Fabric"
+ }
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}