11plugins {
2- id(" fabric-loom" ) version " 1.12-SNAPSHOT"
3- id(" maven-publish" )
4- id(" com.diffplug.spotless" ) version " 8.0.0"
2+ alias(libs.plugins.kotlin.jvm)
3+ alias(libs.plugins.loom)
4+ alias(libs.plugins.publishing)
5+ alias(libs.plugins.blossom)
6+ alias(libs.plugins.ksp)
7+ alias(libs.plugins.fletchingtable.fabric)
58}
69
7- class Loader {
8- val version = property(" loader_version" )
10+ repositories {
11+ maven(" https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1" ) // DevAuth
12+ maven(" https://maven.parchmentmc.org" ) // Parchment
13+ maven(" https://maven.neoforged.net/releases" ) // NeoForge
14+ maven(" https://maven.terraformersmc.com/" ) // Mod Menu
915}
1016
11- class Mod {
12- val version = property(" mod_version" ).toString()
13- val minecraftVersion = property(" minecraft_version" )
14- val description = property(" mod_description" ).toString()
15- val mavenGroup = property(" maven_group" ).toString()
16- val archivesBaseName = property(" archives_base_name" ).toString()
17- val loader = Loader ()
17+ class ModData {
18+ val id = property(" mod.id" ) as String
19+ val name = property(" mod.name" ) as String
20+ val version = property(" mod.version" ) as String
21+ val group = property(" mod.group" ) as String
22+ val description = property(" mod.description" ) as String
23+ val source = property(" mod.source" ) as String
24+ val issues = property(" mod.issues" ) as String
25+ val license = property(" mod.license" ) as String
26+ val modrinth = property(" mod.modrinth" ) as String
27+ val curseforge = property(" mod.curseforge" ) as String
28+ val discord = property(" mod.discord" ) as String
29+
30+ val minecraftVersion = property(" mod.minecraft_version" ) as String
31+ val minecraftVersionRange = property(" mod.minecraft_version_range" ) as String
1832}
1933
20- val mod = Mod ()
21- version = mod.version
22- group = mod.mavenGroup
34+ class Dependencies {
35+ val fabricLoaderVersion = property(" deps.fabric_loader_version" ) as String?
36+
37+ val devAuthVersion = property(" deps.devauth_version" ) as String?
38+ val lombokVersion = property(" deps.lombok_version" ) as String?
2339
24- base {
25- archivesName = mod.archivesBaseName
40+ // Versioned
41+ val neoForgeVersion = property(" deps.neoforge_version" ) as String?
42+ val fabricApiVersion = property(" deps.fabric_api_version" ) as String?
2643}
2744
28- repositories {}
45+ class LoaderData {
46+ val name = loom.platform.get().name.lowercase()
47+ val isFabric = name == " fabric"
48+ val isNeoForge = name == " neoforge"
49+ }
2950
30- dependencies {
31- minecraft(" com.mojang:minecraft:${mod.minecraftVersion} " )
32- mappings(loom.officialMojangMappings())
33- modImplementation(" net.fabricmc:fabric-loader:${mod.loader.version} " )
51+ val mod = ModData ()
52+ val deps = Dependencies ()
53+ val loader = LoaderData ()
54+
55+ group = mod.group
56+ base {
57+ archivesName.set(" ${mod.id} -${mod.version} +${mod.minecraftVersion} -${loader.name} " )
3458}
3559
36- tasks.processResources {
37- val props = buildMap {
38- put(" version" , mod.version)
39- put(" mod_description" , mod.description)
60+ java {
61+ val requiredJava = when {
62+ stonecutter.eval(stonecutter.current.version, " >=1.20.6" ) -> JavaVersion .VERSION_21
63+ stonecutter.eval(stonecutter.current.version, " >=1.18" ) -> JavaVersion .VERSION_17
64+ stonecutter.eval(stonecutter.current.version, " >=1.17" ) -> JavaVersion .VERSION_16
65+ else -> JavaVersion .VERSION_1_8
4066 }
41- props.forEach(inputs::property)
42- filteringCharset = " UTF-8"
43- filesMatching(" fabric.mod.json" ) {
44- expand(props)
67+
68+ sourceCompatibility = requiredJava
69+ targetCompatibility = requiredJava
70+ }
71+
72+ stonecutter {
73+ replacements.string {
74+ direction = eval(current.version, " >=1.21.11" )
75+ replace(" ResourceLocation" , " Identifier" )
4576 }
4677}
4778
48- tasks.withType<JavaCompile >().configureEach {
49- options.encoding = " UTF-8"
50- options.release = 21
79+ val currentCommitHash: String by lazy {
80+ Runtime .getRuntime()
81+ .exec(" git rev-parse --verify --short HEAD" , null , rootDir)
82+ .inputStream.bufferedReader().readText().trim()
5183}
5284
53- tasks.jar {
54- from( " LICENSE " ) {
55- rename { " ${it} _ ${project.base.archivesName.get()} " }
56- }
85+ blossom {
86+ replaceToken( " @MODID@ " , mod.id)
87+ replaceToken( " @VERSION@ " , mod.version)
88+ replaceToken( " @COMMIT@ " , currentCommitHash)
5789}
5890
59- java {
60- sourceCompatibility = JavaVersion .VERSION_21
61- targetCompatibility = JavaVersion .VERSION_21
91+ loom {
92+ silentMojangMappingsLicense()
93+ runConfigs.all {
94+ ideConfigGenerated(stonecutter.current.isActive)
95+ runDir = " ../../run"
96+ }
97+
98+ runConfigs.remove(runConfigs[" server" ]) // Removes server run configs
6299}
63100
64- // configure the maven publication
65- publishing {
66- publications {
67- create<MavenPublication >(" mavenJava" ) {
68- artifactId = mod.archivesBaseName
69- from(components[" java" ])
101+ loom.runs {
102+ afterEvaluate {
103+ configureEach {
104+ property(" devauth.enabled" , " true" )
105+ property(" devauth.account" , " main" )
70106 }
71107 }
108+ }
109+
110+ fletchingTable {
111+ lang.create(" main" ) {
112+ patterns.add(" assets/${mod.id} /lang/**" )
113+ }
114+ }
115+
116+ dependencies {
117+ minecraft(" com.mojang:minecraft:${mod.minecraftVersion} " )
118+
119+ @Suppress(" UnstableApiUsage" )
120+ mappings(loom.layered {
121+ officialMojangMappings()
122+
123+ // Parchment mappings (it adds parameter mappings & javadoc)
124+ optionalProp(" deps.parchment_version" ) {
125+ parchment(" org.parchmentmc.data:parchment-${mod.minecraftVersion} :$it @zip" )
126+ }
127+ })
128+
129+ compileOnly(" org.projectlombok:lombok:${deps.lombokVersion} " )
130+ annotationProcessor(" org.projectlombok:lombok:${deps.lombokVersion} " )
131+ modRuntimeOnly(" me.djtheredstoner:DevAuth-${loader.name} :${deps.devAuthVersion} " )
72132
73- // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
74- repositories {
133+ if (loader.isFabric) {
134+ modImplementation(" net.fabricmc:fabric-loader:${deps.fabricLoaderVersion} " )!!
135+ modImplementation(" net.fabricmc.fabric-api:fabric-api:${deps.fabricApiVersion} " )
136+ optionalProp(" deps.modmenu_version" ) { prop ->
137+ modImplementation(" com.terraformersmc:modmenu:$prop " ) {
138+ exclude(group, " net.fabricmc.fabric-api" )
139+ }
140+ }
141+ } else if (loader.isNeoForge) {
142+ " neoForge" (" net.neoforged:neoforge:${deps.neoForgeVersion} " )
75143 }
76144}
77145
78- spotless {
79- val licenseHeader = rootProject.file(" HEADER" )
80- lineEndings = com.diffplug.spotless.LineEnding .UNIX
81- java {
82- licenseHeaderFile(licenseHeader)
146+ publishMods {
147+ }
148+
149+ tasks {
150+ processResources {
151+ val props = buildMap {
152+ put(" id" , mod.id)
153+ put(" name" , mod.name)
154+ put(" version" , mod.version)
155+ put(" description" , mod.description)
156+ put(" source" , mod.source)
157+ put(" issues" , mod.issues)
158+ put(" license" , mod.license)
159+ put(" modrinth" , mod.modrinth)
160+ put(" curseforge" , mod.curseforge)
161+ put(" discord" , mod.discord)
162+ put(" minecraft_version_range" , mod.minecraftVersionRange)
163+ if (loader.isFabric) {
164+ put(" fabric_api_version" , deps.fabricApiVersion?.trim())
165+ put(" fabric_loader_version" , deps.fabricLoaderVersion?.trim())
166+ } else if (loader.isNeoForge) {
167+ put(" neoforge_version" , deps.neoForgeVersion?.trim())
168+ }
169+ }
170+
171+ props.forEach(inputs::property)
172+ filesMatching(" **/lang/en_us.json" ) { // Defaults description to English translation
173+ expand(props)
174+ filteringCharset = " UTF-8"
175+ }
176+
177+ if (loader.isFabric) {
178+ filesMatching(" fabric.mod.json" ) { expand(props) }
179+ exclude(listOf (" META-INF/neoforge.mods.toml" ))
180+ }
181+
182+ if (loader.isNeoForge) {
183+ filesMatching(" META-INF/neoforge.mods.toml" ) { expand(props) }
184+ exclude(listOf (" fabric.mod.json" ))
185+ }
83186 }
84187
85- kotlin {
86- licenseHeaderFile(licenseHeader)
188+ // Builds the version into a shared folder in `build/libs/${mod version}/`
189+ register<Copy >(" buildAndCollect" ) {
190+ group = " build"
191+ from(remapJar.map { it.archiveFile }, remapSourcesJar.map { it.archiveFile })
192+ into(rootProject.layout.buildDirectory.file(" libs/${project.property(" mod.version" )} " ))
193+ dependsOn(" build" )
87194 }
88- }
195+ }
196+
197+ if (stonecutter.current.isActive) {
198+ rootProject.tasks.register(" buildActive" ) {
199+ group = " project"
200+ dependsOn(tasks.named(" build" ))
201+ }
202+ }
203+
204+ fun <T > optionalProp (property : String , block : (String ) -> T ? ): T ? =
205+ findProperty(property)?.toString()?.takeUnless { it.isBlank() }?.let (block)
0 commit comments