import proguard.gradle.ProGuardTask buildscript { repositories { mavenCentral() } dependencies { classpath 'com.guardsquare:proguard-gradle:7.7.0' } } plugins { id 'java' id 'idea' id 'java-library' id 'maven-publish' id 'com.github.johnrengelman.shadow' version '8.1.1' id 'net.neoforged.moddev.legacyforge' version '2.0.103' } // ===================== 基础配置 ===================== def enableProguard = project.hasProperty("enableProguard") && project.enableProguard.toBoolean() tasks.named('wrapper', Wrapper).configure { distributionType = Wrapper.DistributionType.BIN } group = mod_group_id version = "${minecraft_version}-${mod_version}" java { toolchain.languageVersion = JavaLanguageVersion.of(17) } base { archivesName = mod_id } println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" // ===================== 仓库配置 ===================== repositories { mavenCentral() maven { url = "https://libraries.minecraft.net/" } maven { url = "https://neoforged.forgecdn.net/releases" } maven { url = "https://neoforged.forgecdn.net/mojang-meta" } maven { url "https://cursemaven.com" content { includeGroup "curse.maven" } } maven { name = "Progwml6" url = "https://dvs1.progwml6.com/files/maven/" } maven { name = "BlameJared" url = "https://maven.blamejared.com/" } maven { name = "ModMaven" url = "https://modmaven.dev" } maven { name = "Lucko" url = "https://repo.lucko.me/" content { includeModule 'me.lucko', 'spark-api' } } maven { name = "KosmX" url = "https://maven.kosmx.dev/" } maven { name = "Curios" url = "https://maven.theillusivec4.top/" } maven { name = "GeckoLib" url = "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" content { includeGroupByRegex("software\\.bernie.*") includeGroup("com.eliotlash.mclib") } } maven { name = "LTD Maven" url = "https://nexus.bot.leisuretimedock.top/repository/maven-public/" } flatDir { dir "libs" } } // ===================== Forge 配置 ===================== legacyForge { version = "${minecraft_version}-${forge_version}" parchment { minecraftVersion = parchment_minecraft_version mappingsVersion = parchment_mappings_version } runs { configureEach { systemProperty 'forge.logging.console.level', 'debug' systemProperty 'forge.logging.markers', 'REGISTRIES' logLevel = org.slf4j.event.Level.DEBUG } client { client() systemProperty 'forge.enabledGameTestNamespaces', mod_id } clientAuth { devLogin = true client() systemProperty 'forge.enabledGameTestNamespaces', mod_id } server { server() } data { data() programArguments.addAll '--mod', mod_id, '--all', '--output', file('src/generated/resources/').absolutePath, '--existing', file('src/main/resources/').absolutePath } } mods { "${mod_id}" { sourceSet sourceSets.main } } } // ===================== 源码与资源 ===================== sourceSets.main.resources { srcDir 'src/generated/resources' srcDir 'src/main/resources' } // ===================== 编译配置 ===================== tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' } // ===================== 依赖 ===================== configurations { runtimeClasspath.extendsFrom localRuntime proguardLibs { canBeResolved = true canBeConsumed = false extendsFrom modCompileOnly } } dependencies { implementation(jarJar("io.github.llamalad7:mixinextras-forge:[0.4.1,)")) modRuntimeOnly("curse.maven:debug-utils-forge-783008:5337491") modImplementation("blank:curtain-1.20.1:1.3.2") modImplementation("blank:freecam-1.20.1:1.2.1") modImplementation("blank:carryon-1.20.1:2.1.2.7") modCompileOnly("mezz.jei:jei-${minecraft_version}-forge-api:${jei_version}") modCompileOnly("mezz.jei:jei-${minecraft_version}-common-api:${jei_version}") modRuntimeOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") modImplementation(jarJar("dev.kosmx.player-anim:player-animation-lib-forge:${player_anim_version}")) modImplementation(jarJar("curse.maven:bendy-lib-623373:4550371")) modImplementation(jarJar("software.bernie.geckolib:geckolib-forge-${minecraft_version}:${geckolib_version}")) implementation(jarJar("com.eliotlash.mclib:mclib:20")) modCompileOnly("top.theillusivec4.curios:curios-forge:${curios_version}:api") modImplementation("top.theillusivec4.curios:curios-forge:${curios_version}") modRuntimeOnly("top.theillusivec4.curios:curios-forge:${curios_version}") implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")) modImplementation(jarJar("io.github.llamalad7:mixinextras-forge:0.4.1")) modRuntimeOnly("curse.maven:spark-361579:4738952") compileOnly ('me.lucko:spark-api:0.1-SNAPSHOT') modImplementation("top.r3944realms.lib39:lib39:1.20.1-${lib39_version}") implementation("com.linearpast:sccore:1.20.1-${sccore_version}") } mixin { add sourceSets.main, "${mod_id}.refmap.json" config "${mod_id}.mixins.json" } dependencies { annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' } // ===================== 主 Jar 与混淆 ===================== jar { manifest { attributes([ 'Specification-Title' : mod_id, 'Specification-Vendor' : mod_authors, 'Specification-Version' : '1', 'Implementation-Title' : project.name, 'Implementation-Version' : archiveVersion, 'Implementation-Vendor' : mod_authors, 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), 'MixinConfigs' : "${mod_id}.mixins.json" ]) } archiveFileName = "${mod_id}-${mod_version}-origin.jar" // 可选:排除 API 类(如果你不想在主 jar 中包含 API) // exclude "top/r3944realms/superleadrope/api/**/*" finalizedBy 'proguard' } tasks.register('proguard', ProGuardTask) { onlyIf { enableProguard } dependsOn tasks.jar configuration 'proguard.pro' libraryjars "${System.getProperty('java.home')}/jmods" configurations.proguardLibs.resolve().each { file -> libraryjars file.absolutePath } def inputJar = tasks.jar.archiveFile.get().asFile injars inputJar outjars "${buildDir}/libs/[NOTUSE]${mod_id}-${minecraft_version}-${mod_version}-proguard.jar" doFirst { copy { from inputJar into "${buildDir}/libs" rename { "[NOTUSE]${mod_id}-${minecraft_version}-${mod_version}-origin.jar" } } } inputs.files tasks.jar.archiveFile finalizedBy 'reobfJar' } processResources { def props = [ minecraft_version : minecraft_version, minecraft_version_range : minecraft_version_range, forge_version : forge_version, forge_version_range : forge_version_range, loader_version_range : loader_version_range, mod_id : mod_id, mod_name : mod_name, mod_license : mod_license, mod_version : mod_version, mod_authors : mod_authors, mod_description : mod_description, mod_credits : mod_credits, lib39_version : lib39_version, player_animation_version : player_anim_version, sccore_version : sccore_version, geckolib_version : geckolib_version, curios_version : curios_version ] inputs.properties props from "src/main/templates" filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { expand props + [project: project] } duplicatesStrategy = DuplicatesStrategy.EXCLUDE into "build/generated/sources/modMetadata" } afterEvaluate { tasks.named('reobfJar') { if (enableProguard) { dependsOn 'proguard' input = file("${buildDir}/libs/[NOTUSE]${mod_id}-${minecraft_version}-${mod_version}-proguard.jar") } else { dependsOn 'jar' input = tasks.jar.archiveFile.get().asFile } } } tasks.named('clean') { delete fileTree(dir: "${project.projectDir}/mcmodsrepo") } // ===================== IDEA 支持 ===================== idea { module { downloadSources = true downloadJavadoc = true } }