plugins { id 'java-library' id 'net.neoforged.moddev' version '2.0.143' } group = mod_group_id version = mod_version base { archivesName = mod_id } java.toolchain.languageVersion = JavaLanguageVersion.of(21) repositories { mavenCentral() } neoForge { version = project.neo_version // Expose the mojmapped, decompiled Minecraft sources so they can be grepped. // `./gradlew createMinecraftArtifacts` produces them under build/ + the MDG cache. accessTransformers.from('src/main/resources/META-INF/accesstransformer.cfg') runs { configureEach { systemProperty 'forge.logging.markers', 'REGISTRIES' logLevel = org.slf4j.event.Level.DEBUG } client { client() } server { server() programArgument '--nogui' } } mods { "$mod_id" { sourceSet sourceSets.main } } } // The end-to-end suite asserts on reports produced by a real dedicated server, so it is kept out of // `check`: it downloads and installs NeoForge and takes minutes. Run it with `./gradlew e2eTest`. sourceSets { e2e { compileClasspath += sourceSets.main.output runtimeClasspath += sourceSets.main.output } } configurations { e2eImplementation.extendsFrom testImplementation e2eRuntimeOnly.extendsFrom testRuntimeOnly } dependencies { compileOnly 'org.projectlombok:lombok:1.18.34' annotationProcessor 'org.projectlombok:lombok:1.18.34' testCompileOnly 'org.projectlombok:lombok:1.18.34' testAnnotationProcessor 'org.projectlombok:lombok:1.18.34' testImplementation platform('org.junit:junit-bom:5.11.3') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testImplementation 'org.assertj:assertj-core:3.26.3' // The analysis, report and origin packages are deliberately free of Minecraft types so they can be // unit-tested without a game runtime. These two are the only libraries they touch, at the versions // Minecraft 1.21.1 itself ships. testImplementation 'it.unimi.dsi:fastutil:8.5.12' testImplementation 'com.google.code.gson:gson:2.10.1' } // Interpolate mod metadata into neoforge.mods.toml var generateModMetadata = tasks.register('generateModMetadata', ProcessResources) { var replaceProperties = [ minecraft_version : minecraft_version, neo_version : neo_version, mod_id : mod_id, mod_name : mod_name, mod_license : mod_license, mod_version : mod_version, mod_authors : mod_authors, mod_description : mod_description, ] inputs.properties replaceProperties expand replaceProperties from 'src/main/templates' into "$buildDir/generated/sources/modMetadata" } sourceSets.main.resources.srcDir generateModMetadata neoForge.ideSyncTask generateModMetadata tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' options.release = 21 options.compilerArgs << '-Xlint:all,-processing,-serial' } tasks.named('test', Test) { useJUnitPlatform() testLogging { events 'passed', 'skipped', 'failed' exceptionFormat 'full' showStandardStreams = false } } var e2eRoot = layout.buildDirectory.dir('e2e') var e2eServers = tasks.register('e2eServers', Exec) { group = 'verification' description = 'Installs a NeoForge dedicated server, runs the mod on it twice and keeps its reports.' dependsOn tasks.named('jar') workingDir projectDir commandLine 'bash', 'e2e/run-servers.sh' environment 'E2E_OUT', e2eRoot.get().asFile.absolutePath outputs.upToDateWhen { false } } tasks.register('e2eTest', Test) { group = 'verification' description = 'Asserts on the reports the dedicated servers produced. Not part of `check`: it is slow.' dependsOn e2eServers testClassesDirs = sourceSets.e2e.output.classesDirs classpath = sourceSets.e2e.runtimeClasspath systemProperty 'e2e.root', e2eRoot.get().asFile.absolutePath useJUnitPlatform() testLogging { events 'passed', 'skipped', 'failed' exceptionFormat 'full' } outputs.upToDateWhen { false } }