From 48d787f8b648c01caf2488694d8d5b39452a475e Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sun, 28 Apr 2024 11:50:41 +0200 Subject: [PATCH 01/19] Port to NeoForge --- build.gradle.kts | 2 + gradle.properties | 2 +- neoforge/build.gradle.kts | 53 +++++++++++++++ neoforge/gradle.properties | 3 + .../mixins/forge/PlayerListMixin.java | 21 ++++++ .../dev/erdragh/astralbot/forge/BotMod.kt | 65 +++++++++++++++++++ .../forge/event/SystemMessageEvent.kt | 7 ++ .../src/main/resources/META-INF/mods.toml | 32 +++++++++ .../src/main/resources/astralbot.mixins.json | 12 ++++ neoforge/src/main/resources/pack.mcmeta | 6 ++ settings.gradle.kts | 3 +- 11 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 neoforge/build.gradle.kts create mode 100644 neoforge/gradle.properties create mode 100644 neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java create mode 100644 neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt create mode 100644 neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt create mode 100644 neoforge/src/main/resources/META-INF/mods.toml create mode 100644 neoforge/src/main/resources/astralbot.mixins.json create mode 100644 neoforge/src/main/resources/pack.mcmeta diff --git a/build.gradle.kts b/build.gradle.kts index 02b453d..eaf1fb0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,6 +48,7 @@ subprojects { repositories { mavenCentral() + maven(url = "https://maven.neoforged.net/releases/") maven(url = "https://maven.architectury.dev/") // For the parchment mappings maven(url = "https://maven.parchmentmc.org") @@ -110,6 +111,7 @@ subprojects { ) ) }) + compileOnly("org.jetbrains.kotlin:kotlin-stdlib") // Discord Bot dependencies botDependencies.forEach { diff --git a/gradle.properties b/gradle.properties index 7d4726d..26a4016 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ kotlin.code.style=official org.gradle.jvmargs=-Xmx3G # Minecraft things -enabledPlatforms=fabric,forge +enabledPlatforms=fabric,forge,neoforge # Specified here because it's used in both the fabric and common subproject fabricLoaderVersion=0.15.10 diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 0000000..56b7303 --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,53 @@ +architectury { + neoForge() +} + +loom { + // This sets up data generation. At the time of writing this + // Comment, this is useless, as there are no resources to be + // generated. I want to keep it in as a reference tho. + runs { + create("data") { + data() + programArgs("--all", "--mod", "astralbot") + programArgs("--output", project(":common").file("src/main/generated/resources").absolutePath) + programArgs("--existing", project(":common").file("src/main/resources").absolutePath) + } + } +} + +val common: Configuration by configurations.creating { + configurations.compileClasspath.get().extendsFrom(this) + configurations.runtimeClasspath.get().extendsFrom(this) + configurations["developmentNeoForge"].extendsFrom(this) +} + +dependencies { + common(project(":common", configuration = "namedElements")) { + isTransitive = false + } + shadowCommon(project(path = ":common", configuration = "transformProductionNeoForge")) { + isTransitive = false + } + + val minecraftVersion: String by project + val neoVersion: String by project + val kotlinForgeVersion: String by project + + neoForge(group = "net.neoforged", name = "neoforge", version = neoVersion) + // Adds KFF as dependency and Kotlin libs + "thedarkcolour:kotlinforforge:$kotlinForgeVersion".let { + implementation(it) + forgeRuntimeLibrary(it) + } + + val jdaVersion: String by project + + // This *should* theoretically fix the Forge development environment not having + // access to certain classes, but I haven't gotten it to work just yet. + forgeRuntimeLibrary("net.dv8tion:JDA:$jdaVersion") { + exclude(module = "opus-java") + exclude(group = "org.jetbrains.kotlin") + exclude(group = "org.slf4j") + } +} \ No newline at end of file diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 0000000..58a2070 --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1,3 @@ +loom.platform=neoforge +neoVersion=20.4.233 +kotlinForgeVersion=4.10.0 \ No newline at end of file diff --git a/neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java b/neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java new file mode 100644 index 0000000..24a3936 --- /dev/null +++ b/neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java @@ -0,0 +1,21 @@ +package dev.erdragh.astralbot.mixins.forge; + +import dev.erdragh.astralbot.forge.event.SystemMessageEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.PlayerList; +import net.neoforged.neoforge.common.NeoForge; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.function.Function; + +@Mixin(PlayerList.class) +public abstract class PlayerListMixin { + @Inject(method = "broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Ljava/util/function/Function;Z)V", at = @At("HEAD"), cancellable = true) + private void onSendGameMessage(Component message, Function playerMessageFactory, boolean overlay, CallbackInfo ci) { + NeoForge.EVENT_BUS.post(new SystemMessageEvent(message)); + } +} \ No newline at end of file diff --git a/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt b/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt new file mode 100644 index 0000000..ca98de5 --- /dev/null +++ b/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt @@ -0,0 +1,65 @@ +package dev.erdragh.astralbot.forge + +import dev.erdragh.astralbot.* +import dev.erdragh.astralbot.commands.minecraft.registerMinecraftCommands +import dev.erdragh.astralbot.config.AstralBotConfig +import dev.erdragh.astralbot.config.AstralBotTextConfig +import dev.erdragh.astralbot.forge.event.SystemMessageEvent +import dev.erdragh.astralbot.handlers.DiscordMessageComponent +import net.minecraft.server.level.ServerPlayer +import net.neoforged.bus.api.IEventBus +import net.neoforged.fml.ModLoadingContext +import net.neoforged.fml.common.Mod +import net.neoforged.fml.config.ModConfig +import net.neoforged.neoforge.event.RegisterCommandsEvent +import net.neoforged.neoforge.event.ServerChatEvent +import net.neoforged.neoforge.event.entity.player.PlayerEvent +import net.neoforged.neoforge.event.server.ServerStartedEvent +import net.neoforged.neoforge.event.server.ServerStoppingEvent + +@Mod("astralbot") +class BotMod(eventBus: IEventBus) { + init { + ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, AstralBotConfig.SPEC) + ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, AstralBotTextConfig.SPEC, "astralbot-text.toml") + eventBus.addListener(::onServerStart) + eventBus.addListener(::onServerStop) + eventBus.addListener(::onChatMessage) + eventBus.addListener(::onSystemMessage) + eventBus.addListener(::onCommandRegistration) + + eventBus.addListener(::onPlayerJoin) + eventBus.addListener(::onPlayerLeave) + } + + private fun onServerStart(event: ServerStartedEvent) { + LOGGER.info("AstralBot starting on Forge") + startAstralbot(event.server) + } + + private fun onServerStop(event: ServerStoppingEvent) { + stopAstralbot() + } + + private fun onChatMessage(event: ServerChatEvent) { + minecraftHandler?.sendChatToDiscord(event.player, event.message) + } + + private fun onSystemMessage(event: SystemMessageEvent) { + if (event.message !is DiscordMessageComponent) { + minecraftHandler?.sendChatToDiscord(null as ServerPlayer?, event.message) + } + } + + private fun onPlayerJoin(event: PlayerEvent.PlayerLoggedInEvent) { + minecraftHandler?.onPlayerJoin(event.entity.name.string) + } + + private fun onPlayerLeave(event: PlayerEvent.PlayerLoggedOutEvent) { + minecraftHandler?.onPlayerLeave(event.entity.name.string) + } + + private fun onCommandRegistration(event: RegisterCommandsEvent) { + registerMinecraftCommands(event.dispatcher) + } +} \ No newline at end of file diff --git a/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt b/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt new file mode 100644 index 0000000..caddc87 --- /dev/null +++ b/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt @@ -0,0 +1,7 @@ +package dev.erdragh.astralbot.forge.event + +import net.minecraft.network.chat.Component +import net.neoforged.bus.api.Event +import net.neoforged.bus.api.ICancellableEvent + +class SystemMessageEvent(var message: Component) : Event(), ICancellableEvent \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..d9027e3 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,32 @@ +modLoader = "kotlinforforge" +loaderVersion = "[4.10,)" +license = "MIT License" +issueTrackerURL = "https://github.com/Erdragh/AstralBot/issues" + +[[mixins]] +config = "astralbot-common.mixins.json" +[[mixins]] +config = "astralbot.mixins.json" + +[[mods]] +modId = "astralbot" +version = "${version}" +displayName = "AstralBot" +displayURL = "https://modrinth.com/mod/astralbot" +logoFile = "icon.png" +authors = "Erdragh" +description = "Discord Bot and Minecraft Mod in one bundle." + +[[dependencies.astralbot]] +modId = "neoforge" +type = "required" +versionRange = "[47,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.astralbot]] +modId = "minecraft" +type = "required" +versionRange = "[1.20,)" +ordering = "NONE" +side = "BOTH" \ No newline at end of file diff --git a/neoforge/src/main/resources/astralbot.mixins.json b/neoforge/src/main/resources/astralbot.mixins.json new file mode 100644 index 0000000..4b9f0a4 --- /dev/null +++ b/neoforge/src/main/resources/astralbot.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "dev.erdragh.astralbot.mixins.forge", + "compatibilityLevel": "JAVA_17", + "server": [ + "PlayerListMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..9ac0090 --- /dev/null +++ b/neoforge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 18, + "description": "Dummy resource pack for AstralBot" + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 55b0a42..b2058ce 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,4 +18,5 @@ plugins { include("common") include("fabric") -include("forge") \ No newline at end of file +include("forge") +include("neoforge") \ No newline at end of file From 65a8e1c02295e1988b3b2d8d6da9a0ba7dffb3a3 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sun, 28 Apr 2024 15:09:49 +0200 Subject: [PATCH 02/19] Merge multiloader template (removing architectury) --- build.gradle.kts | 133 +++++++++------- common/build.gradle.kts | 34 +++- common/src/main/kotlin/module-info.java | 3 +- fabric/build.gradle.kts | 70 +++++++-- fabric/gradle.properties | 2 - fabric/src/main/resources/fabric.mod.json | 16 +- forge/build.gradle.kts | 145 +++++++++++++----- forge/gradle.properties | 3 - forge/src/main/resources/META-INF/mods.toml | 22 +-- gradle.properties | 24 ++- neoforge/build.gradle.kts | 95 +++++++----- neoforge/gradle.properties | 3 - .../src/main/resources/META-INF/mods.toml | 20 +-- settings.gradle.kts | 14 +- 14 files changed, 388 insertions(+), 196 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index eaf1fb0..8cd2bef 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,9 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import dev.architectury.plugin.ArchitectPluginExtension -import net.fabricmc.loom.api.LoomGradleExtensionAPI -import net.fabricmc.loom.task.RemapJarTask import java.nio.charset.StandardCharsets +import java.text.SimpleDateFormat +import java.util.* plugins { - // This is an Architectury repository, as such the relevant plugins are needed - id("architectury-plugin") version "3.4-SNAPSHOT" - id("dev.architectury.loom") version "1.6-SNAPSHOT" apply false // The shadow plugin is used in both Architectury and when including JDA and Exposed id("com.github.johnrengelman.shadow") version "8.1.1" apply false // Since this mod/bot is written in Kotlin and expected to run on Minecraft and as such @@ -16,17 +12,12 @@ plugins { // For generating documentation based on comments in the code id("org.jetbrains.dokka") version "1.9.10" java -} - -architectury { - val minecraftVersion: String by project - minecraft = minecraftVersion + // Required for NeoGradle + id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" } subprojects { - // All subprojects need Architectury and Kotlin - apply(plugin = "dev.architectury.loom") - apply(plugin = "architectury-plugin") + apply(plugin = "java") apply(plugin = "kotlin") apply(plugin = "org.jetbrains.dokka") @@ -34,7 +25,9 @@ subprojects { // sub- and root projects val minecraftVersion: String by project val modLoader = project.name - val modId = rootProject.name + val modId: String by project + val modName = rootProject.name + val modAuthor: String by project val isCommon = modLoader == rootProject.projects.common.name base { @@ -42,14 +35,16 @@ subprojects { archivesName.set("$modId-$modLoader-$minecraftVersion") } - configure { - silentMojangMappingsLicense() + extensions.configure { + toolchain.languageVersion.set(JavaLanguageVersion.of(17)) + withSourcesJar() } repositories { mavenCentral() maven(url = "https://maven.neoforged.net/releases/") - maven(url = "https://maven.architectury.dev/") + maven("https://repo.spongepowered.org/repository/maven-public/") { name = "Sponge / Mixin" } + maven("https://maven.blamejared.com") { name = "BlameJared Maven (JEI / CraftTweaker / Bookshelf)" } // For the parchment mappings maven(url = "https://maven.parchmentmc.org") maven(url = "https://maven.resourcefulbees.com/repository/maven-public/") @@ -94,25 +89,6 @@ subprojects { ) dependencies { - // Minecraft Mod dependencies - "minecraft"("::$minecraftVersion") - - @Suppress("UnstableApiUsage") - "mappings"(project.the().layered { - val parchmentVersion: String by project - - officialMojangMappings() - - parchment( - create( - group = "org.parchmentmc.data", - name = "parchment-$minecraftVersion", - version = parchmentVersion - ) - ) - }) - compileOnly("org.jetbrains.kotlin:kotlin-stdlib") - // Discord Bot dependencies botDependencies.forEach { implementation(it) { @@ -136,19 +112,68 @@ subprojects { tasks.jar { // Results in the not remapped jars having a -dev at the end archiveClassifier.set("dev") - } - tasks.named("remapJar") { - // Results in the remapped jar not having any extra bit in - // its file name, identifying it as the main distribution - archiveClassifier.set(null as String?) + from(rootProject.file("LICENSE")) { + rename { "${it}_$modId" } + } + + manifest { + attributes( + "Specification-Title" to modId, + "Specification-Vendor" to modAuthor, + "Specification-Version" to archiveVersion, + "Implementation-Title" to project.name, + "Implementation-Version" to archiveVersion, + "Implementation-Vendor" to modAuthor, + "Implementation-Timestamp" to SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(Date()), + "Timestamp" to System.currentTimeMillis(), + "Built-On-Java" to "${System.getProperty("java.vm.version")} (${System.getProperty("java.vm.vendor")})", + "Built-On-Minecraft" to minecraftVersion + ) + } } tasks.processResources { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - filesMatching(listOf("META-INF/mods.toml", "fabric.mod.json")) { - expand("version" to project.version) + val version: String by project + val group: String by project + val forgeVersion: String by project + val kffLoaderRange: String by project + val forgeVersionRange: String by project + val minecraftVersionRange: String by project + val fabricApiVersion: String by project + val fabricLoaderVersion: String by project + val fabricKotlinVersion: String by project + val license: String by project + val description: String by project + val neoVersion: String by project + val neoVersionRange: String by project + val credits: String by project + + val expandProps = mapOf( + "version" to version, + "group" to group, //Else we target the task's group. + "minecraft_version" to minecraftVersion, + "forge_version" to forgeVersion, + "kff_loader_range" to kffLoaderRange, + "forge_version_range" to forgeVersionRange, + "minecraft_version_range" to minecraftVersionRange, + "fabric_version" to fabricApiVersion, + "fabric_loader_version" to fabricLoaderVersion, + "fabric_kotlin_version" to fabricKotlinVersion, + "mod_name" to modName, + "mod_author" to modAuthor, + "mod_id" to modId, + "license" to license, + "description" to description, + "neoforge_version" to neoVersion, + "neoforge_loader_version_range" to neoVersionRange, + "credits" to credits + ) + + filesMatching(listOf("pack.mcmeta", "*.mixins.json", "META-INF/mods.toml", "fabric.mod.json")) { + expand(expandProps) } + inputs.properties(expandProps) } if (!isCommon) { @@ -157,10 +182,6 @@ subprojects { // plugin is used here. apply(plugin = "com.github.johnrengelman.shadow") - configure { - platformSetupLoomIde() - } - // This shadowCommon configuration is used to both shadow the // common project and shadow the dependencies into the final // JARs @@ -210,17 +231,17 @@ subprojects { exclude("**/astralbot/datagen/**") //Remove data gen code from jar. exclude("**/org/slf4j/**") } - - "remapJar"(RemapJarTask::class) { - // This results in the remapped JAR being based on the JAR - // with the dependencies and common project shadowed into it. - dependsOn("shadowJar") - inputFile.set(named("shadowJar").flatMap { it.archiveFile }) - } } } else { sourceSets.main.get().resources.srcDir("src/main/generated/resources") } + + // Disables Gradle's custom module metadata from being published to maven. The + // metadata includes mapped dependencies which are not reasonably consumable by + // other mod developers. + tasks.withType { + enabled = false + } } kotlin { diff --git a/common/build.gradle.kts b/common/build.gradle.kts index e1cdd35..8a1ee68 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,14 +1,36 @@ -architectury { - val enabledPlatforms: String by rootProject - common(enabledPlatforms.split(",")) +plugins { + idea + java + `maven-publish` + id ("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" +} + +val minecraftVersion: String by project +val modId: String by project + +minecraft { + version(minecraftVersion) + if (file("src/main/resources/${modId}.accesswidener").exists()) + accessWideners(file("src/main/resources/${modId}.accesswidener")) } dependencies { val fabricLoaderVersion: String by project val forgeConfigAPIVersion: String by project - // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies - // Do NOT use other classes from fabric loader - modImplementation("net.fabricmc:fabric-loader:${fabricLoaderVersion}") api("fuzs.forgeconfigapiport:forgeconfigapiport-common-neoforgeapi:$forgeConfigAPIVersion") + compileOnly("org.spongepowered:mixin:0.8.5") +} + +publishing { + publications { + register("mavenJava", MavenPublication::class) { + artifactId = base.archivesName.get() + from(components["java"]) + } + } + + repositories { + maven("file://${System.getenv("local_maven")}") + } } \ No newline at end of file diff --git a/common/src/main/kotlin/module-info.java b/common/src/main/kotlin/module-info.java index 42b2eb5..e87cc24 100644 --- a/common/src/main/kotlin/module-info.java +++ b/common/src/main/kotlin/module-info.java @@ -19,9 +19,10 @@ // For Minecraft itself requires authlib; - requires minecraft.merged; requires transitive org.slf4j; requires brigadier; + requires joined; + requires org.spongepowered.mixin; // For accessing the config requires forgeconfigapiport.common.neoforgeapi; diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 4106f77..91256c1 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,30 +1,72 @@ -architectury { - fabric() +plugins { + java + idea + `maven-publish` + id("fabric-loom") version "1.6-SNAPSHOT" } -val common: Configuration by configurations.creating { - configurations.compileClasspath.get().extendsFrom(this) - configurations.runtimeClasspath.get().extendsFrom(this) - configurations["developmentFabric"].extendsFrom(this) -} +val modId: String by project dependencies { - common(project(":common", configuration = "namedElements")) { - isTransitive = false - } - shadowCommon(project(path = ":common", configuration = "transformProductionFabric")) { - isTransitive = false - } - + compileOnly(project(":common")) + mappings(loom.officialMojangMappings()) val minecraftVersion: String by project val fabricLoaderVersion: String by project val fabricApiVersion: String by project val fabricKotlinVersion: String by project val forgeConfigAPIVersion: String by project + minecraft("com.mojang:minecraft:${minecraftVersion}") + modImplementation(group = "net.fabricmc", name = "fabric-loader", version = fabricLoaderVersion) modApi(group = "net.fabricmc.fabric-api", name = "fabric-api", version = "$fabricApiVersion+$minecraftVersion") modImplementation("net.fabricmc:fabric-language-kotlin:${fabricKotlinVersion}") modApi("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:$forgeConfigAPIVersion") +} + +loom { + if (project(":common").file("src/main/resources/${modId}.accesswidener").exists()) + accessWidenerPath.set(project(":common").file("src/main/resources/${modId}.accesswidener")) + + @Suppress("UnstableApiUsage") + mixin { defaultRefmapName.set("${modId}.refmap.json") } + + runs { + named("client") { + client() + configName = "Fabric Client" + ideConfigGenerated(true) + runDir("run") + } + named("server") { + server() + configName = "Fabric Server" + ideConfigGenerated(true) + runDir("run") + } + } +} + +tasks { + withType { source(project(":common").sourceSets.main.get().allSource) } + + javadoc { source(project(":common").sourceSets.main.get().allJava) } + + named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } + + processResources { from(project(":common").sourceSets.main.get().resources) } +} + +publishing { + publications { + register("mavenJava", MavenPublication::class) { + artifactId = base.archivesName.get() + from(components["java"]) + } + } + + repositories { + maven("file://${System.getenv("local_maven")}") + } } \ No newline at end of file diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 9934aec..e69de29 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -1,2 +0,0 @@ -fabricApiVersion=0.97.0 -fabricKotlinVersion=1.10.19+kotlin.1.9.23 \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index f3ff4ab..4d4bb75 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,18 +1,18 @@ { "schemaVersion": 1, - "id": "astralbot", + "id": "${mod_id}", "version": "${version}", - "name": "AstralBot", - "description": "Discord Bot and Minecraft mod in one bundle.", + "name": "${mod_name}", + "description": "${description}", "authors": [ - "Erdragh" + "${mod_author}" ], "contact": { "website": "https://modrinth.com/mod/astralbot", "repo": "https://github.com/Erdragh/AstralBot", "issues": "https://github.com/Erdragh/AstralBot/issues" }, - "license": "MIT Licence", + "license": "${license}", "icon": "icon.png", "environment": "*", "entrypoints": { @@ -29,9 +29,9 @@ ], "depends": { "fabric": "*", - "minecraft": ">=1.20.1", + "minecraft": ">=${minecraft_version}", "java": ">=17", - "fabric-language-kotlin": ">=1.9.0", - "forgeconfigapiport": ">=8.0.0" + "fabric-language-kotlin": ">=${fabric_kotlin_version}", + "forgeconfigapiport": ">=20.0.0" } } \ No newline at end of file diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 8d6603a..d315eec 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -1,60 +1,131 @@ -architectury { - forge() +plugins { + idea + `maven-publish` + id("net.minecraftforge.gradle") version "6.0.22" + id("org.spongepowered.mixin") version "0.7-SNAPSHOT" } -loom { - forge { - mixinConfig("astralbot-common.mixins.json") - mixinConfig("astralbot.mixins.json") - } - // This sets up data generation. At the time of writing this - // Comment, this is useless, as there are no resources to be - // generated. I want to keep it in as a reference tho. +val modId: String by project +val minecraftVersion: String by project + +mixin { + add(sourceSets.main.get(), "$modId.refmap.json") + config("$modId-common.mixins.json") + config("$modId.mixins.json") +} + +minecraft { + mappings("official", minecraftVersion) + + copyIdeResources = true //Calls processResources when in dev + + // Automatically enable forge AccessTransformers if the file exists + // This location is hardcoded in Forge and can not be changed. + // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 + val transformerFile = file("src/main/resources/META-INF/accesstransformer.cfg") + if (transformerFile.exists()) + accessTransformer(transformerFile) + runs { + create("client") { + workingDirectory(project.file("run")) + ideaModule("${rootProject.name}.${project.name}.main") + taskName("Client") + property("mixin.env.remapRefMap", "true") + property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") + mods { + create("modRun") { + source(sourceSets.main.get()) + source(project(":common").sourceSets.main.get()) + } + } + } + + create("server") { + workingDirectory(project.file("run")) + ideaModule("${rootProject.name}.${project.name}.main") + taskName("Server") + property("mixin.env.remapRefMap", "true") + property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") + mods { + create("modServerRun") { + source(sourceSets.main.get()) + source(project(":common").sourceSets.main.get()) + } + } + } + create("data") { - data() - programArgs("--all", "--mod", "astralbot") - programArgs("--output", project(":common").file("src/main/generated/resources").absolutePath) - programArgs("--existing", project(":common").file("src/main/resources").absolutePath) + workingDirectory(project.file("run")) + ideaModule("${rootProject.name}.${project.name}.main") + args( + "--mod", modId, + "--all", + "--output", file("src/generated/resources").absolutePath, + "--existing", file("src/main/resources/").absolutePath + ) + taskName("Data") + property("mixin.env.remapRefMap", "true") + property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") + mods { + create("modDataRun") { + source(sourceSets.main.get()) + source(project(":common").sourceSets.main.get()) + } + } } } } -val common: Configuration by configurations.creating { - configurations.compileClasspath.get().extendsFrom(this) - configurations.runtimeClasspath.get().extendsFrom(this) - configurations["developmentForge"].extendsFrom(this) -} +sourceSets.main.get().resources.srcDir("src/generated/resources") dependencies { - common(project(":common", configuration = "namedElements")) { - isTransitive = false - } - shadowCommon(project(path = ":common", configuration = "transformProductionForge")) { - isTransitive = false - } + compileOnly(project(":common")) + annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor") val minecraftVersion: String by project val forgeVersion: String by project val kotlinForgeVersion: String by project val forgeConfigAPIVersion: String by project - forge(group = "net.minecraftforge", name = "forge", version = "$minecraftVersion-$forgeVersion") + minecraft(group = "net.minecraftforge", name = "forge", version = "$minecraftVersion-$forgeVersion") // Adds KFF as dependency and Kotlin libs implementation("thedarkcolour:kotlinforforge:$kotlinForgeVersion") - val jdaVersion: String by project - - // This *should* theoretically fix the Forge development environment not having - // access to certain classes, but I haven't gotten it to work just yet. - forgeRuntimeLibrary("net.dv8tion:JDA:$jdaVersion") { - exclude(module = "opus-java") - exclude(group = "org.jetbrains.kotlin") - exclude(group = "org.slf4j") - } - // On 1.20.2 upwards, the forge config api port either reimplements neo's // or lexforge's config API. I chose to use Neo's by default, resulting in // an additional dependency on the lexforge side. - modApi("fuzs.forgeconfigapiport:forgeconfigapiport-forge:$forgeConfigAPIVersion") + implementation("fuzs.forgeconfigapiport:forgeconfigapiport-forge:$forgeConfigAPIVersion") +} + +tasks { + withType { source(project(":common").sourceSets.main.get().allSource) } + + javadoc { source(project(":common").sourceSets.main.get().allJava) } + + named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } + + processResources { from(project(":common").sourceSets.main.get().resources) } + + jar { finalizedBy("reobfJar") } +} + +publishing { + publications { + register("mavenJava", MavenPublication::class) { + artifactId = base.archivesName.get() + artifact(tasks.jar) + fg.component(this) + } + } + + repositories { + maven("file://${System.getenv("local_maven")}") + } +} + +sourceSets.forEach { + val dir = layout.buildDirectory.dir("sourceSets/${it.name}") + it.output.setResourcesDir(dir) + it.java.destinationDirectory.set(dir) } \ No newline at end of file diff --git a/forge/gradle.properties b/forge/gradle.properties index b7f4c6d..e69de29 100644 --- a/forge/gradle.properties +++ b/forge/gradle.properties @@ -1,3 +0,0 @@ -loom.platform=forge -forgeVersion=49.0.49 -kotlinForgeVersion=4.10.0 \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index e75bed8..9d9328b 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,32 +1,32 @@ modLoader = "kotlinforforge" -loaderVersion = "[4.6,)" -license = "MIT License" +loaderVersion = "${kff_loader_range}" +license = "${license}" issueTrackerURL = "https://github.com/Erdragh/AstralBot/issues" [[mods]] -modId = "astralbot" +modId = "${mod_id}" version = "${version}" -displayName = "AstralBot" +displayName = "${mod_name}" displayURL = "https://modrinth.com/mod/astralbot" logoFile = "icon.png" -authors = "Erdragh" -description = "Discord Bot and Minecraft Mod in one bundle." +authors = "${mod_author}" +description = "${description}" -[[dependencies.astralbot]] +[[dependencies.${mod_id}]] modId = "forge" mandatory = true -versionRange = "[47,)" +versionRange = "${forge_version_range}" ordering = "NONE" side = "BOTH" -[[dependencies.astralbot]] +[[dependencies.${mod_id}]] modId = "minecraft" mandatory = true -versionRange = "[1.20,)" +versionRange = "${minecraft_version_range}" ordering = "NONE" side = "BOTH" -[[dependencies.astralbot]] +[[dependencies.${mod_id}]] modId = "forgeconfigapiport" mandatory = true versionRange = "[20,)" diff --git a/gradle.properties b/gradle.properties index 26a4016..423595e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,35 @@ org.gradle.jvmargs=-Xmx3G # Minecraft things enabledPlatforms=fabric,forge,neoforge -# Specified here because it's used in both the fabric and common subproject + +# Fabric fabricLoaderVersion=0.15.10 +fabricApiVersion=0.97.0 +fabricKotlinVersion=1.10.19+kotlin.1.9.23 + +# Neo +neoVersion=20.4.233 +neoVersionRange=[20.4.233,) + +# Forge +forgeVersion=49.0.49 +forgeVersionRange=[49,) + +# Neo and Forge +kotlinForgeVersion=4.10.0 +kffLoaderRange=[4,) version=1.3.0 group=dev.erdragh.astralbot +modId=astralbot +modAuthor=Erdragh + +license=MIT +description=Discord Bot and Minecraft Mod in one bundle. +credits=Erdragh minecraftVersion=1.20.4 +minecraftVersionRange=[1.20.4,) parchmentVersion=2024.04.14 forgeConfigAPIVersion=20.4.3 diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 56b7303..8b7ca04 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,53 +1,76 @@ -architectury { - neoForge() +plugins { + idea + `maven-publish` + id("net.neoforged.gradle.userdev") version "7.0.109" } -loom { - // This sets up data generation. At the time of writing this - // Comment, this is useless, as there are no resources to be - // generated. I want to keep it in as a reference tho. - runs { - create("data") { - data() - programArgs("--all", "--mod", "astralbot") - programArgs("--output", project(":common").file("src/main/generated/resources").absolutePath) - programArgs("--existing", project(":common").file("src/main/resources").absolutePath) - } +val modId: String by project + +// Automatically enable neoforge AccessTransformers if the file exists +// This location is hardcoded in FML and can not be changed. +// https://github.com/neoforged/FancyModLoader/blob/a952595eaaddd571fbc53f43847680b00894e0c1/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java#L118 +val transformerFile = file("src/main/resources/META-INF/accesstransformer.cfg") +if (transformerFile.exists()) + minecraft.accessTransformers.file(transformerFile) + +runs { + configureEach { modSource(project.sourceSets.main.get()) } + + create("client") { systemProperty("neoforge.enabledGameTestNamespaces", modId) } + + create("server") { + systemProperty("neoforge.enabledGameTestNamespaces", modId) + programArgument("--nogui") } -} -val common: Configuration by configurations.creating { - configurations.compileClasspath.get().extendsFrom(this) - configurations.runtimeClasspath.get().extendsFrom(this) - configurations["developmentNeoForge"].extendsFrom(this) + create("gameTestServer") { systemProperty("neoforge.enabledGameTestNamespaces", modId) } + + create("data") { + programArguments.addAll( + "--mod", modId, + "--all", + "--output", file("src/generated/resources").absolutePath, + "--existing", file("src/main/resources/").absolutePath + ) + } } +sourceSets.main.get().resources.srcDir("src/generated/resources") + dependencies { - common(project(":common", configuration = "namedElements")) { - isTransitive = false - } - shadowCommon(project(path = ":common", configuration = "transformProductionNeoForge")) { - isTransitive = false - } + compileOnly(project(":common")) val minecraftVersion: String by project val neoVersion: String by project val kotlinForgeVersion: String by project - neoForge(group = "net.neoforged", name = "neoforge", version = neoVersion) + implementation(group = "net.neoforged", name = "neoforge", version = neoVersion) // Adds KFF as dependency and Kotlin libs - "thedarkcolour:kotlinforforge:$kotlinForgeVersion".let { - implementation(it) - forgeRuntimeLibrary(it) - } + implementation("thedarkcolour:kotlinforforge:$kotlinForgeVersion") +} + +// NeoGradle compiles the game, but we don't want to add our common code to the game's code +val notNeoTask: Spec = Spec { !it.name.startsWith("neo") } + +tasks { + withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allSource) } + + withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allJava) } - val jdaVersion: String by project + named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } + + processResources { from(project(":common").sourceSets.main.get().resources) } +} + +publishing { + publications { + register("mavenJava", MavenPublication::class) { + artifactId = base.archivesName.get() + artifact(tasks.jar) + } + } - // This *should* theoretically fix the Forge development environment not having - // access to certain classes, but I haven't gotten it to work just yet. - forgeRuntimeLibrary("net.dv8tion:JDA:$jdaVersion") { - exclude(module = "opus-java") - exclude(group = "org.jetbrains.kotlin") - exclude(group = "org.slf4j") + repositories { + maven("file://${System.getenv("local_maven")}") } } \ No newline at end of file diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties index 58a2070..e69de29 100644 --- a/neoforge/gradle.properties +++ b/neoforge/gradle.properties @@ -1,3 +0,0 @@ -loom.platform=neoforge -neoVersion=20.4.233 -kotlinForgeVersion=4.10.0 \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml index d9027e3..4d4e7e8 100644 --- a/neoforge/src/main/resources/META-INF/mods.toml +++ b/neoforge/src/main/resources/META-INF/mods.toml @@ -1,6 +1,6 @@ modLoader = "kotlinforforge" -loaderVersion = "[4.10,)" -license = "MIT License" +loaderVersion = "${kff_loader_range}" +license = "${license}" issueTrackerURL = "https://github.com/Erdragh/AstralBot/issues" [[mixins]] @@ -9,24 +9,24 @@ config = "astralbot-common.mixins.json" config = "astralbot.mixins.json" [[mods]] -modId = "astralbot" +modId = "${mod_id}" version = "${version}" -displayName = "AstralBot" +displayName = "${mod_name}" displayURL = "https://modrinth.com/mod/astralbot" logoFile = "icon.png" -authors = "Erdragh" -description = "Discord Bot and Minecraft Mod in one bundle." +authors = "${mod_author}" +description = "${description}" -[[dependencies.astralbot]] +[[dependencies.${mod_id}]] modId = "neoforge" type = "required" -versionRange = "[47,)" +versionRange = "${neoforge_loader_version_range}" ordering = "NONE" side = "BOTH" -[[dependencies.astralbot]] +[[dependencies.${mod_id}]] modId = "minecraft" type = "required" -versionRange = "[1.20,)" +versionRange = "${minecraft_version_range}" ordering = "NONE" side = "BOTH" \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index b2058ce..520da9e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,13 +1,14 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -rootProject.name = "astralbot" +rootProject.name = "AstralBot" pluginManagement { repositories { mavenCentral() - maven(url = "https://maven.architectury.dev/") - maven(url = "https://maven.neoforged.net/releases/") - maven(url = "https://maven.resourcefulbees.com/repository/maven-public/") + maven("https://maven.fabricmc.net/") { name = "Fabric" } + maven("https://maven.neoforged.net/releases/") { name = "NeoForge" } + maven("https://maven.minecraftforge.net/") { name = "Forge" } + maven("https://repo.spongepowered.org/repository/maven-public/") { name = "Sponge Snapshots" } gradlePluginPortal() } } @@ -16,7 +17,4 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } -include("common") -include("fabric") -include("forge") -include("neoforge") \ No newline at end of file +include("common", "fabric", "forge", "neoforge") \ No newline at end of file From ff8e1032258f5432c723bebec17971af07a48d9e Mon Sep 17 00:00:00 2001 From: Erdragh Date: Mon, 29 Apr 2024 16:59:59 +0200 Subject: [PATCH 03/19] Rework dependency inclusion --- build.gradle.kts | 58 +++++-------------- common/src/main/kotlin/module-info.java | 31 ---------- fabric/build.gradle.kts | 28 ++++++++- forge/build.gradle.kts | 29 +++++++++- neoforge/.gitignore | 1 + neoforge/build.gradle.kts | 14 ++++- .../mixins/forge/PlayerListMixin.java | 2 +- .../astralbot/{forge => neoforge}/BotMod.kt | 4 +- .../event/SystemMessageEvent.kt | 2 +- 9 files changed, 83 insertions(+), 86 deletions(-) delete mode 100644 common/src/main/kotlin/module-info.java create mode 100644 neoforge/.gitignore rename neoforge/src/main/kotlin/dev/erdragh/astralbot/{forge => neoforge}/BotMod.kt (95%) rename neoforge/src/main/kotlin/dev/erdragh/astralbot/{forge => neoforge}/event/SystemMessageEvent.kt (82%) diff --git a/build.gradle.kts b/build.gradle.kts index 8cd2bef..0e83da2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,10 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.jetbrains.kotlin.gradle.utils.extendsFrom import java.nio.charset.StandardCharsets import java.text.SimpleDateFormat import java.util.* plugins { - // The shadow plugin is used in both Architectury and when including JDA and Exposed + // The shadow plugin is used by the fabric subproject to include dependencies id("com.github.johnrengelman.shadow") version "8.1.1" apply false // Since this mod/bot is written in Kotlin and expected to run on Minecraft and as such // the JVM, the Kotlin plugin is needed @@ -16,6 +16,10 @@ plugins { id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" } +repositories { + mavenCentral() +} + subprojects { apply(plugin = "java") apply(plugin = "kotlin") @@ -110,9 +114,6 @@ subprojects { } tasks.jar { - // Results in the not remapped jars having a -dev at the end - archiveClassifier.set("dev") - from(rootProject.file("LICENSE")) { rename { "${it}_$modId" } } @@ -177,22 +178,16 @@ subprojects { } if (!isCommon) { - // The subprojects for the actual mod loaders need the common - // project and the dependencies shadowed into the jar, so the - // plugin is used here. - apply(plugin = "com.github.johnrengelman.shadow") - - // This shadowCommon configuration is used to both shadow the - // common project and shadow the dependencies into the final - // JARs - val shadowCommon by configurations.creating { - isCanBeConsumed = false - isCanBeResolved = true - } + // This config includes the bot dependencies in the final jar + val botDep by configurations.creating + configurations.implementation.extendsFrom(configurations.named("botDep")) dependencies { + testImplementation(project(":common")) + implementation(project(":common")) + botDependencies.forEach { - if (!it.contains("sqlite-jdbc")) shadowCommon(it) { + if (!it.contains("sqlite-jdbc")) botDep(it) { // opus-java is for audio, which this bot doesn't need exclude(module = "opus-java") // Kotlin would be included as a transitive dependency @@ -205,33 +200,6 @@ subprojects { } } } - - tasks { - "shadowJar"(ShadowJar::class) { - // The resulting JAR of this task will be named ...-dev-shadow, - // as it has the dependencies shadowed into it, but hasn't been - // remapped yet. - archiveClassifier.set("dev-shadow") - configurations = listOf(shadowCommon) - - // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) - mergeServiceFiles() - - // Forge restricts loading certain classes for security reasons. - // Luckily, shadow can relocate them to a different package. - relocate("org.apache.commons.collections4", "dev.erdragh.shadowed.org.apache.commons.collections4") - - // Relocating Exposed somewhere different so other mods not doing that don't run into issues (e.g. Ledger) - relocate("org.jetbrains.exposed", "dev.erdragh.shadowed.org.jetbrains.exposed") - - // Relocating jackson to prevent incompatibilities with other mods also bundling it (e.g. GroovyModLoader on Forge) - relocate("com.fasterxml.jackson", "dev.erdragh.shadowed.com.fasterxml.jackson") - - exclude(".cache/**") //Remove datagen cache from jar. - exclude("**/astralbot/datagen/**") //Remove data gen code from jar. - exclude("**/org/slf4j/**") - } - } } else { sourceSets.main.get().resources.srcDir("src/main/generated/resources") } diff --git a/common/src/main/kotlin/module-info.java b/common/src/main/kotlin/module-info.java deleted file mode 100644 index e87cc24..0000000 --- a/common/src/main/kotlin/module-info.java +++ /dev/null @@ -1,31 +0,0 @@ -module Minecraft.astralbot.common.main { - // For the Usage command - requires transitive jdk.management; - - // For just using Kotlin - requires transitive kotlin.stdlib; - requires transitive kotlinx.coroutines.core; - - // For SQL Interaction - requires transitive java.sql; - requires exposed.core; - requires exposed.dao; - requires exposed.jdbc; - - // For Discord Interaction - requires net.dv8tion.jda; - // For message parsing - requires org.commonmark; - - // For Minecraft itself - requires authlib; - requires transitive org.slf4j; - requires brigadier; - requires joined; - requires org.spongepowered.mixin; - - // For accessing the config - requires forgeconfigapiport.common.neoforgeapi; - - requires java.desktop; -} \ No newline at end of file diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 91256c1..9876591 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,14 +1,17 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { java idea `maven-publish` id("fabric-loom") version "1.6-SNAPSHOT" + id("com.github.johnrengelman.shadow") } val modId: String by project dependencies { - compileOnly(project(":common")) mappings(loom.officialMojangMappings()) val minecraftVersion: String by project val fabricLoaderVersion: String by project @@ -48,11 +51,32 @@ loom { } } +val botDep: Configuration by configurations.getting + tasks { - withType { source(project(":common").sourceSets.main.get().allSource) } + withType { + source(project(":common").sourceSets.main.get().allSource) + } + withType { + source(project(":common").sourceSets.main.get().allSource) + } javadoc { source(project(":common").sourceSets.main.get().allJava) } + jar { + archiveClassifier.set("dev") + } + + withType { + archiveClassifier.set("dev-shadow") + configurations = listOf(botDep) + } + + remapJar { + inputFile.set(named("shadowJar").get().archiveFile) + dependsOn("shadowJar") + } + named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } processResources { from(project(":common").sourceSets.main.get().resources) } diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index d315eec..c30d7ef 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { idea `maven-publish` @@ -14,6 +16,8 @@ mixin { config("$modId.mixins.json") } +jarJar.enable() + minecraft { mappings("official", minecraftVersion) @@ -80,7 +84,6 @@ minecraft { sourceSets.main.get().resources.srcDir("src/generated/resources") dependencies { - compileOnly(project(":common")) annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor") val minecraftVersion: String by project @@ -96,10 +99,32 @@ dependencies { // or lexforge's config API. I chose to use Neo's by default, resulting in // an additional dependency on the lexforge side. implementation("fuzs.forgeconfigapiport:forgeconfigapiport-forge:$forgeConfigAPIVersion") + + val botDep by configurations.getting + botDep.dependencies.forEach { + val versionRange = if (!it.version!!.contains("-")) "[0,${it.version}]" else "[0,${it.version!!.substring(0, it.version!!.indexOf("-"))}]" + jarJar(name = it.name, group = it.group, version = versionRange) { + jarJar.pin(this, it.version) + // opus-java is for audio, which this bot doesn't need + exclude(module = "opus-java") + // Kotlin would be included as a transitive dependency + // on JDA and Exposed, but is already provided by the + // respective Kotlin implementation of the mod loaders + exclude(group = "org.jetbrains.kotlin") + exclude(group = "org.jetbrains.kotlinx") + // Minecraft already ships with a logging system + exclude(group = "org.slf4j") + } + } } tasks { - withType { source(project(":common").sourceSets.main.get().allSource) } + withType { + source(project(":common").sourceSets.main.get().allSource) + } + withType { + source(project(":common").sourceSets.main.get().allSource) + } javadoc { source(project(":common").sourceSets.main.get().allJava) } diff --git a/neoforge/.gitignore b/neoforge/.gitignore new file mode 100644 index 0000000..cb1d07b --- /dev/null +++ b/neoforge/.gitignore @@ -0,0 +1 @@ +runs \ No newline at end of file diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 8b7ca04..837006e 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { idea `maven-publish` @@ -6,6 +8,8 @@ plugins { val modId: String by project +jarJar.enable() + // Automatically enable neoforge AccessTransformers if the file exists // This location is hardcoded in FML and can not be changed. // https://github.com/neoforged/FancyModLoader/blob/a952595eaaddd571fbc53f43847680b00894e0c1/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java#L118 @@ -38,8 +42,6 @@ runs { sourceSets.main.get().resources.srcDir("src/generated/resources") dependencies { - compileOnly(project(":common")) - val minecraftVersion: String by project val neoVersion: String by project val kotlinForgeVersion: String by project @@ -47,6 +49,11 @@ dependencies { implementation(group = "net.neoforged", name = "neoforge", version = neoVersion) // Adds KFF as dependency and Kotlin libs implementation("thedarkcolour:kotlinforforge:$kotlinForgeVersion") + + val botDep by configurations.getting + botDep.dependencies.forEach { + jarJar(it) + } } // NeoGradle compiles the game, but we don't want to add our common code to the game's code @@ -54,6 +61,9 @@ val notNeoTask: Spec = Spec { !it.name.startsWith("neo") } tasks { withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allSource) } + withType().matching(notNeoTask).configureEach { + source(project(":common").sourceSets.main.get().allSource) + } withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allJava) } diff --git a/neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java b/neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java index 24a3936..4193cd1 100644 --- a/neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java +++ b/neoforge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java @@ -1,6 +1,6 @@ package dev.erdragh.astralbot.mixins.forge; -import dev.erdragh.astralbot.forge.event.SystemMessageEvent; +import dev.erdragh.astralbot.neoforge.event.SystemMessageEvent; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; diff --git a/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt similarity index 95% rename from neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt rename to neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt index ca98de5..e7f7f3e 100644 --- a/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt +++ b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt @@ -1,10 +1,10 @@ -package dev.erdragh.astralbot.forge +package dev.erdragh.astralbot.neoforge import dev.erdragh.astralbot.* import dev.erdragh.astralbot.commands.minecraft.registerMinecraftCommands import dev.erdragh.astralbot.config.AstralBotConfig import dev.erdragh.astralbot.config.AstralBotTextConfig -import dev.erdragh.astralbot.forge.event.SystemMessageEvent +import dev.erdragh.astralbot.neoforge.event.SystemMessageEvent import dev.erdragh.astralbot.handlers.DiscordMessageComponent import net.minecraft.server.level.ServerPlayer import net.neoforged.bus.api.IEventBus diff --git a/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/event/SystemMessageEvent.kt similarity index 82% rename from neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt rename to neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/event/SystemMessageEvent.kt index caddc87..c1b358a 100644 --- a/neoforge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt +++ b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/event/SystemMessageEvent.kt @@ -1,4 +1,4 @@ -package dev.erdragh.astralbot.forge.event +package dev.erdragh.astralbot.neoforge.event import net.minecraft.network.chat.Component import net.neoforged.bus.api.Event From 843d9282fc6d71d5670a3242508ef87490ff7dba Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 30 Apr 2024 08:23:04 +0200 Subject: [PATCH 04/19] Fix missing refmap entries in mixins.json --- common/src/main/resources/astralbot-common.mixins.json | 1 + fabric/src/main/resources/astralbot.mixins.json | 1 + forge/src/main/resources/astralbot.mixins.json | 1 + neoforge/src/main/resources/astralbot.mixins.json | 1 + 4 files changed, 4 insertions(+) diff --git a/common/src/main/resources/astralbot-common.mixins.json b/common/src/main/resources/astralbot-common.mixins.json index 215a460..c26658d 100644 --- a/common/src/main/resources/astralbot-common.mixins.json +++ b/common/src/main/resources/astralbot-common.mixins.json @@ -3,6 +3,7 @@ "minVersion": "0.8", "package": "dev.erdragh.astralbot.mixins", "compatibilityLevel": "JAVA_17", + "refmap": "${mod_id}.refmap.json", "server": [ "PlayerListMixin", "DedicatedPlayerListMixin" diff --git a/fabric/src/main/resources/astralbot.mixins.json b/fabric/src/main/resources/astralbot.mixins.json index 5dfcea1..2e68eba 100644 --- a/fabric/src/main/resources/astralbot.mixins.json +++ b/fabric/src/main/resources/astralbot.mixins.json @@ -3,6 +3,7 @@ "minVersion": "0.8", "package": "dev.erdragh.astralbot.mixins.fabric", "compatibilityLevel": "JAVA_17", + "refmap": "${mod_id}.refmap.json", "mixins": [ ], "client": [ diff --git a/forge/src/main/resources/astralbot.mixins.json b/forge/src/main/resources/astralbot.mixins.json index 4b9f0a4..81bac46 100644 --- a/forge/src/main/resources/astralbot.mixins.json +++ b/forge/src/main/resources/astralbot.mixins.json @@ -3,6 +3,7 @@ "minVersion": "0.8", "package": "dev.erdragh.astralbot.mixins.forge", "compatibilityLevel": "JAVA_17", + "refmap": "${mod_id}.refmap.json", "server": [ "PlayerListMixin" ], diff --git a/neoforge/src/main/resources/astralbot.mixins.json b/neoforge/src/main/resources/astralbot.mixins.json index 4b9f0a4..81bac46 100644 --- a/neoforge/src/main/resources/astralbot.mixins.json +++ b/neoforge/src/main/resources/astralbot.mixins.json @@ -3,6 +3,7 @@ "minVersion": "0.8", "package": "dev.erdragh.astralbot.mixins.forge", "compatibilityLevel": "JAVA_17", + "refmap": "${mod_id}.refmap.json", "server": [ "PlayerListMixin" ], From 383ae8a847d543dbf161e3f8959ba06519f446b7 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 08:52:10 +0200 Subject: [PATCH 05/19] WIP fix shadowing dependencies --- build.gradle.kts | 48 +++++++++--------------- fabric/build.gradle.kts | 21 ++++++++++- forge/build.gradle.kts | 77 +++++++++++++++++++++++++++++---------- gradle.properties | 2 +- neoforge/build.gradle.kts | 69 ++++++++++++++++++++++++++++++----- settings.gradle.kts | 7 +++- 6 files changed, 162 insertions(+), 62 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0e83da2..af96f1b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -75,6 +75,7 @@ subprojects { val botDependencies = arrayOf( // Library used to communicate with Discord, see https://jda.wiki "net.dv8tion:JDA:$jdaVersion", + // -- JDA's dependencies // Library to interact with the SQLite database, // see: https://github.com/JetBrains/Exposed @@ -83,19 +84,29 @@ subprojects { "org.jetbrains.exposed:exposed-jdbc:$exposedVersion", "org.jetbrains.exposed:exposed-kotlin-datetime:$exposedVersion", - // Database driver that allows Exposed to communicate with - // the SQLite database. This will not be in the JAR and needs to be provided - // otherwise (e.g. https://www.curseforge.com/minecraft/mc-mods/sqlite-jdbc) - "org.xerial:sqlite-jdbc:$sqliteJDBCVersion", - // Markdown parser used for formatting Discord messages in Minecraft "org.commonmark:commonmark:$commonmarkVersion", ) + + // This config includes the bot dependencies in the final jar + val botDep by configurations.creating { + isTransitive = true + } + val runtimeLib by configurations.creating { + isTransitive = true + } + configurations.implementation.extendsFrom(configurations.named("botDep")) + configurations.implementation.extendsFrom(configurations.named("runtimeLib")) + dependencies { // Discord Bot dependencies + // Database driver that allows Exposed to communicate with + // the SQLite database. This will not be in the JAR and needs to be provided + // otherwise (e.g. https://www.curseforge.com/minecraft/mc-mods/sqlite-jdbc) + runtimeLib("org.xerial:sqlite-jdbc:$sqliteJDBCVersion") botDependencies.forEach { - implementation(it) { + botDep(it) { // opus-java is for audio, which this bot doesn't need exclude(module = "opus-java") // Kotlin would be included as a transitive dependency @@ -177,30 +188,7 @@ subprojects { inputs.properties(expandProps) } - if (!isCommon) { - // This config includes the bot dependencies in the final jar - val botDep by configurations.creating - configurations.implementation.extendsFrom(configurations.named("botDep")) - - dependencies { - testImplementation(project(":common")) - implementation(project(":common")) - - botDependencies.forEach { - if (!it.contains("sqlite-jdbc")) botDep(it) { - // opus-java is for audio, which this bot doesn't need - exclude(module = "opus-java") - // Kotlin would be included as a transitive dependency - // on JDA and Exposed, but is already provided by the - // respective Kotlin implementation of the mod loaders - exclude(group = "org.jetbrains.kotlin") - exclude(group = "org.jetbrains.kotlinx") - // Minecraft already ships with a logging system - exclude(group = "org.slf4j") - } - } - } - } else { + if (isCommon) { sourceSets.main.get().resources.srcDir("src/main/generated/resources") } diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 9876591..56c7a89 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -67,9 +67,28 @@ tasks { archiveClassifier.set("dev") } - withType { + shadowJar { archiveClassifier.set("dev-shadow") + configurations = listOf(botDep) + + // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) + mergeServiceFiles() + + // Relocating Exposed somewhere different so other mods not doing that don't run into issues (e.g. Ledger) + relocate("org.jetbrains.exposed", "dev.erdragh.shadowed.org.jetbrains.exposed") + + // Relocating jackson to prevent incompatibilities with other mods also bundling it (e.g. GroovyModLoader on Forge) + relocate("com.fasterxml.jackson", "dev.erdragh.shadowed.com.fasterxml.jackson") + + exclude(".cache/**") //Remove datagen cache from jar. + exclude("**/astralbot/datagen/**") //Remove data gen code from jar. + exclude("**/org/slf4j/**") + + exclude("kotlinx/**") + exclude("_COROUTINE/**") + exclude("**/org/jetbrains/annotations/*") + exclude("**/org/intellij/**") } remapJar { diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index c30d7ef..8e5aaf1 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -1,3 +1,4 @@ +import net.minecraftforge.gradle.patcher.tasks.ReobfuscateJar import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { @@ -5,19 +6,21 @@ plugins { `maven-publish` id("net.minecraftforge.gradle") version "6.0.22" id("org.spongepowered.mixin") version "0.7-SNAPSHOT" + id("com.github.johnrengelman.shadow") } val modId: String by project val minecraftVersion: String by project +val botDep: Configuration by configurations.getting +val runtimeLib: Configuration by configurations.getting + mixin { add(sourceSets.main.get(), "$modId.refmap.json") config("$modId-common.mixins.json") config("$modId.mixins.json") } -jarJar.enable() - minecraft { mappings("official", minecraftVersion) @@ -43,6 +46,11 @@ minecraft { source(project(":common").sourceSets.main.get()) } } + + dependencies { + botDep.dependencies.configureEach { minecraftLibrary(this) } + runtimeLib.dependencies.configureEach { minecraftLibrary(this) } + } } create("server") { @@ -57,6 +65,11 @@ minecraft { source(project(":common").sourceSets.main.get()) } } + + dependencies { + botDep.dependencies.configureEach { minecraftLibrary(this) } + runtimeLib.dependencies.configureEach { minecraftLibrary(this) } + } } create("data") { @@ -77,6 +90,11 @@ minecraft { source(project(":common").sourceSets.main.get()) } } + + dependencies { + botDep.dependencies.configureEach { minecraftLibrary(this) } + runtimeLib.dependencies.configureEach { minecraftLibrary(this) } + } } } } @@ -99,23 +117,6 @@ dependencies { // or lexforge's config API. I chose to use Neo's by default, resulting in // an additional dependency on the lexforge side. implementation("fuzs.forgeconfigapiport:forgeconfigapiport-forge:$forgeConfigAPIVersion") - - val botDep by configurations.getting - botDep.dependencies.forEach { - val versionRange = if (!it.version!!.contains("-")) "[0,${it.version}]" else "[0,${it.version!!.substring(0, it.version!!.indexOf("-"))}]" - jarJar(name = it.name, group = it.group, version = versionRange) { - jarJar.pin(this, it.version) - // opus-java is for audio, which this bot doesn't need - exclude(module = "opus-java") - // Kotlin would be included as a transitive dependency - // on JDA and Exposed, but is already provided by the - // respective Kotlin implementation of the mod loaders - exclude(group = "org.jetbrains.kotlin") - exclude(group = "org.jetbrains.kotlinx") - // Minecraft already ships with a logging system - exclude(group = "org.slf4j") - } - } } tasks { @@ -132,7 +133,43 @@ tasks { processResources { from(project(":common").sourceSets.main.get().resources) } - jar { finalizedBy("reobfJar") } + jar { + archiveClassifier.set("dev") + finalizedBy(shadowJar) + } + + shadowJar { + archiveClassifier.set("dev-shadow") + + configurations = listOf(botDep) + + // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) + mergeServiceFiles() + + // Forge restricts loading certain classes for security reasons. + // Luckily, shadow can relocate them to a different package. + relocate("org.apache.commons.collections4", "dev.erdragh.shadowed.org.apache.commons.collections4") + + // Relocating Exposed somewhere different so other mods not doing that don't run into issues (e.g. Ledger) + relocate("org.jetbrains.exposed", "dev.erdragh.shadowed.org.jetbrains.exposed") + + // Relocating jackson to prevent incompatibilities with other mods also bundling it (e.g. GroovyModLoader on Forge) + relocate("com.fasterxml.jackson", "dev.erdragh.shadowed.com.fasterxml.jackson") + + exclude(".cache/**") //Remove datagen cache from jar. + exclude("**/astralbot/datagen/**") //Remove data gen code from jar. + exclude("**/org/slf4j/**") + + exclude("kotlinx/**") + exclude("_COROUTINE/**") + exclude("**/org/jetbrains/annotations/*") + exclude("**/org/intellij/**") + } + + withType { + input.set(shadowJar.get().archiveFile) + dependsOn(shadowJar) + } } publishing { diff --git a/gradle.properties b/gradle.properties index 423595e..50a1d02 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ forgeConfigAPIVersion=20.4.3 jdaVersion=5.0.0-beta.23 # Database Interactions -exposedVersion=0.49.0 +exposedVersion=0.50.0 sqliteJDBCVersion=3.44.1.0 # Message parsing diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 837006e..6b9fac2 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,14 +1,19 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.utils.extendsFrom plugins { idea `maven-publish` + java id("net.neoforged.gradle.userdev") version "7.0.109" + id("com.github.johnrengelman.shadow") } val modId: String by project -jarJar.enable() +val botDep: Configuration by configurations.getting +val runtimeLib: Configuration by configurations.getting // Automatically enable neoforge AccessTransformers if the file exists // This location is hardcoded in FML and can not be changed. @@ -20,14 +25,30 @@ if (transformerFile.exists()) runs { configureEach { modSource(project.sourceSets.main.get()) } - create("client") { systemProperty("neoforge.enabledGameTestNamespaces", modId) } + create("client") { + systemProperty("neoforge.enabledGameTestNamespaces", modId) + dependencies { + botDep.dependencies.configureEach { runtime(this) } + runtimeLib.dependencies.configureEach { runtime(this) } + } + } create("server") { systemProperty("neoforge.enabledGameTestNamespaces", modId) programArgument("--nogui") + dependencies { + botDep.dependencies.configureEach { runtime(this) } + runtimeLib.dependencies.configureEach { runtime(this) } + } } - create("gameTestServer") { systemProperty("neoforge.enabledGameTestNamespaces", modId) } + create("gameTestServer") { + systemProperty("neoforge.enabledGameTestNamespaces", modId) + dependencies { + botDep.dependencies.configureEach { runtime(this) } + runtimeLib.dependencies.configureEach { runtime(this) } + } + } create("data") { programArguments.addAll( @@ -36,6 +57,10 @@ runs { "--output", file("src/generated/resources").absolutePath, "--existing", file("src/main/resources/").absolutePath ) + dependencies { + botDep.dependencies.configureEach { runtime(this) } + runtimeLib.dependencies.configureEach { runtime(this) } + } } } @@ -48,12 +73,7 @@ dependencies { implementation(group = "net.neoforged", name = "neoforge", version = neoVersion) // Adds KFF as dependency and Kotlin libs - implementation("thedarkcolour:kotlinforforge:$kotlinForgeVersion") - - val botDep by configurations.getting - botDep.dependencies.forEach { - jarJar(it) - } + implementation("thedarkcolour:kotlinforforge-neoforge:$kotlinForgeVersion") } // NeoGradle compiles the game, but we don't want to add our common code to the game's code @@ -67,6 +87,37 @@ tasks { withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allJava) } + shadowJar { + configurations = listOf(botDep) + + // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) + mergeServiceFiles() + + // Forge restricts loading certain classes for security reasons. + // Luckily, shadow can relocate them to a different package. + relocate("org.apache.commons.collections4", "dev.erdragh.shadowed.org.apache.commons.collections4") + + // Relocating Exposed somewhere different so other mods not doing that don't run into issues (e.g. Ledger) + relocate("org.jetbrains.exposed", "dev.erdragh.shadowed.org.jetbrains.exposed") + + // Relocating jackson to prevent incompatibilities with other mods also bundling it (e.g. GroovyModLoader on Forge) + relocate("com.fasterxml.jackson", "dev.erdragh.shadowed.com.fasterxml.jackson") + + exclude(".cache/**") //Remove datagen cache from jar. + exclude("**/astralbot/datagen/**") //Remove data gen code from jar. + exclude("**/org/slf4j/**") + + exclude("kotlinx/**") + exclude("_COROUTINE/**") + exclude("**/org/jetbrains/annotations/*") + exclude("**/org/intellij/**") + } + + assemble { + inputs.file(shadowJar.get().archiveFile) + dependsOn("shadowJar") + } + named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } processResources { from(project(":common").sourceSets.main.get().resources) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 520da9e..3360226 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,12 @@ pluginManagement { mavenCentral() maven("https://maven.fabricmc.net/") { name = "Fabric" } maven("https://maven.neoforged.net/releases/") { name = "NeoForge" } - maven("https://maven.minecraftforge.net/") { name = "Forge" } + maven("https://maven.minecraftforge.net/") { + name = "Forge" + content { + includeGroup("net.minecraftforge") + } + } maven("https://repo.spongepowered.org/repository/maven-public/") { name = "Sponge Snapshots" } gradlePluginPortal() } From 1afd6ba0f8e7632c48b5cc8a0764a1f46dd2e05f Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 09:17:14 +0200 Subject: [PATCH 06/19] Fix forge reobf apply --- forge/build.gradle.kts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 8e5aaf1..ed34bea 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -135,11 +135,10 @@ tasks { jar { archiveClassifier.set("dev") - finalizedBy(shadowJar) } shadowJar { - archiveClassifier.set("dev-shadow") + archiveClassifier.set(null as String?) configurations = listOf(botDep) @@ -166,9 +165,11 @@ tasks { exclude("**/org/intellij/**") } - withType { - input.set(shadowJar.get().archiveFile) - dependsOn(shadowJar) + reobf.configureEach { + if (this.name == "reobfJar") { + input.set(shadowJar.get().archiveFile) + dependsOn(shadowJar) + } } } From ca4d2fc7f25466783d8bb9d5e19db12fdbe77f5b Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 09:43:13 +0200 Subject: [PATCH 07/19] WIP - Simplify forge runtime lib declaration --- forge/build.gradle.kts | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index ed34bea..db959b8 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -1,5 +1,5 @@ -import net.minecraftforge.gradle.patcher.tasks.ReobfuscateJar import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.utils.extendsFrom plugins { idea @@ -47,10 +47,8 @@ minecraft { } } - dependencies { - botDep.dependencies.configureEach { minecraftLibrary(this) } - runtimeLib.dependencies.configureEach { minecraftLibrary(this) } - } + configurations.minecraftLibrary.extendsFrom(configurations.botDep) + configurations.minecraftLibrary.extendsFrom(configurations.runtimeLib) } create("server") { @@ -66,10 +64,8 @@ minecraft { } } - dependencies { - botDep.dependencies.configureEach { minecraftLibrary(this) } - runtimeLib.dependencies.configureEach { minecraftLibrary(this) } - } + configurations.minecraftLibrary.extendsFrom(configurations.botDep) + configurations.minecraftLibrary.extendsFrom(configurations.runtimeLib) } create("data") { @@ -91,10 +87,8 @@ minecraft { } } - dependencies { - botDep.dependencies.configureEach { minecraftLibrary(this) } - runtimeLib.dependencies.configureEach { minecraftLibrary(this) } - } + configurations.minecraftLibrary.extendsFrom(configurations.botDep) + configurations.minecraftLibrary.extendsFrom(configurations.runtimeLib) } } } From 4f46701d5be29051d2990fa60346279cc890bb3e Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 09:43:30 +0200 Subject: [PATCH 08/19] Exclude kotlinx from bot dependencies by default --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index af96f1b..899fce9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -75,7 +75,6 @@ subprojects { val botDependencies = arrayOf( // Library used to communicate with Discord, see https://jda.wiki "net.dv8tion:JDA:$jdaVersion", - // -- JDA's dependencies // Library to interact with the SQLite database, // see: https://github.com/JetBrains/Exposed @@ -113,6 +112,7 @@ subprojects { // on JDA and Exposed, but is already provided by the // respective Kotlin implementation of the mod loaders exclude(group = "org.jetbrains.kotlin") + exclude(group = "org.jetbrains.kotlinx") // Minecraft already ships with a logging system exclude(group = "org.slf4j") } From c4db3b86d1d3aa1d431a9551f60af36744a94447 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 10:35:38 +0200 Subject: [PATCH 09/19] Fix neoforge build --- neoforge/build.gradle.kts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 6b9fac2..8340774 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,6 +1,4 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.gradle.utils.extendsFrom plugins { idea @@ -87,7 +85,13 @@ tasks { withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allJava) } + jar { + archiveClassifier.set("slim") + } + shadowJar { + archiveClassifier.set(null as String?) + configurations = listOf(botDep) // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) @@ -113,8 +117,7 @@ tasks { exclude("**/org/intellij/**") } - assemble { - inputs.file(shadowJar.get().archiveFile) + build { dependsOn("shadowJar") } From 16f48c038bfc9186965b23751b1f1e0df4fffa17 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 10:48:19 +0200 Subject: [PATCH 10/19] Fix subproject dependencies --- build.gradle.kts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 899fce9..4c1e90b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -112,7 +112,6 @@ subprojects { // on JDA and Exposed, but is already provided by the // respective Kotlin implementation of the mod loaders exclude(group = "org.jetbrains.kotlin") - exclude(group = "org.jetbrains.kotlinx") // Minecraft already ships with a logging system exclude(group = "org.slf4j") } @@ -190,6 +189,10 @@ subprojects { if (isCommon) { sourceSets.main.get().resources.srcDir("src/main/generated/resources") + } else { + dependencies { + implementation(project(":common")) + } } // Disables Gradle's custom module metadata from being published to maven. The From ab8a16263ee1505af0e3154252b275ba72485d6f Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 11:08:57 +0200 Subject: [PATCH 11/19] Fix misuse of mod event bus on Neo --- .../dev/erdragh/astralbot/neoforge/BotMod.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt index e7f7f3e..14625d4 100644 --- a/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt +++ b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt @@ -7,7 +7,6 @@ import dev.erdragh.astralbot.config.AstralBotTextConfig import dev.erdragh.astralbot.neoforge.event.SystemMessageEvent import dev.erdragh.astralbot.handlers.DiscordMessageComponent import net.minecraft.server.level.ServerPlayer -import net.neoforged.bus.api.IEventBus import net.neoforged.fml.ModLoadingContext import net.neoforged.fml.common.Mod import net.neoforged.fml.config.ModConfig @@ -16,20 +15,21 @@ import net.neoforged.neoforge.event.ServerChatEvent import net.neoforged.neoforge.event.entity.player.PlayerEvent import net.neoforged.neoforge.event.server.ServerStartedEvent import net.neoforged.neoforge.event.server.ServerStoppingEvent +import thedarkcolour.kotlinforforge.neoforge.forge.FORGE_BUS @Mod("astralbot") -class BotMod(eventBus: IEventBus) { +object BotMod { init { ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, AstralBotConfig.SPEC) ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, AstralBotTextConfig.SPEC, "astralbot-text.toml") - eventBus.addListener(::onServerStart) - eventBus.addListener(::onServerStop) - eventBus.addListener(::onChatMessage) - eventBus.addListener(::onSystemMessage) - eventBus.addListener(::onCommandRegistration) + FORGE_BUS.addListener(::onServerStart) + FORGE_BUS.addListener(::onServerStop) + FORGE_BUS.addListener(::onChatMessage) + FORGE_BUS.addListener(::onSystemMessage) + FORGE_BUS.addListener(::onCommandRegistration) - eventBus.addListener(::onPlayerJoin) - eventBus.addListener(::onPlayerLeave) + FORGE_BUS.addListener(::onPlayerJoin) + FORGE_BUS.addListener(::onPlayerLeave) } private fun onServerStart(event: ServerStartedEvent) { From 33b6e5007ea3d465a3831212a27c0668ae8ff7a4 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 1 May 2024 17:15:44 +0200 Subject: [PATCH 12/19] use forEach instead of configureEach for runtime deps --- neoforge/build.gradle.kts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 8340774..a054958 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,4 +1,5 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.utils.extendsFrom plugins { idea @@ -25,9 +26,10 @@ runs { create("client") { systemProperty("neoforge.enabledGameTestNamespaces", modId) + dependencies { - botDep.dependencies.configureEach { runtime(this) } - runtimeLib.dependencies.configureEach { runtime(this) } + botDep.dependencies.forEach { runtime(it) } + runtimeLib.dependencies.forEach { runtime(it) } } } @@ -35,16 +37,16 @@ runs { systemProperty("neoforge.enabledGameTestNamespaces", modId) programArgument("--nogui") dependencies { - botDep.dependencies.configureEach { runtime(this) } - runtimeLib.dependencies.configureEach { runtime(this) } + botDep.dependencies.forEach { runtime(it) } + runtimeLib.dependencies.forEach { runtime(it) } } } create("gameTestServer") { systemProperty("neoforge.enabledGameTestNamespaces", modId) dependencies { - botDep.dependencies.configureEach { runtime(this) } - runtimeLib.dependencies.configureEach { runtime(this) } + botDep.dependencies.forEach { runtime(it) } + runtimeLib.dependencies.forEach { runtime(it) } } } @@ -56,8 +58,8 @@ runs { "--existing", file("src/main/resources/").absolutePath ) dependencies { - botDep.dependencies.configureEach { runtime(this) } - runtimeLib.dependencies.configureEach { runtime(this) } + botDep.dependencies.forEach { runtime(it) } + runtimeLib.dependencies.forEach { runtime(it) } } } } From d5088862fe5f855dc3598614045b65fe8d1ac062 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Mon, 13 May 2024 14:12:27 +0200 Subject: [PATCH 13/19] Fix build and nuke Forge --- .github/workflows/build.yml | 22 +- build.gradle.kts | 60 +++--- fabric/build.gradle.kts | 9 +- forge/build.gradle.kts | 188 ------------------ forge/gradle.properties | 0 .../mixins/forge/PlayerListMixin.java | 21 -- .../dev/erdragh/astralbot/forge/BotMod.kt | 66 ------ .../forge/event/SystemMessageEvent.kt | 8 - forge/src/main/resources/META-INF/mods.toml | 34 ---- .../src/main/resources/astralbot.mixins.json | 13 -- forge/src/main/resources/pack.mcmeta | 6 - gradle.properties | 6 +- neoforge/build.gradle.kts | 34 ++-- settings.gradle.kts | 8 +- 14 files changed, 67 insertions(+), 408 deletions(-) delete mode 100644 forge/build.gradle.kts delete mode 100644 forge/gradle.properties delete mode 100644 forge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java delete mode 100644 forge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt delete mode 100644 forge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt delete mode 100644 forge/src/main/resources/META-INF/mods.toml delete mode 100644 forge/src/main/resources/astralbot.mixins.json delete mode 100644 forge/src/main/resources/pack.mcmeta diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ea5ab14..10ebf27 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,12 +50,12 @@ jobs: with: name: build-fabric path: fabric/build/libs - - name: Capture Forge Artifacts + - name: Capture Neo Artifacts if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS uses: actions/upload-artifact@v4 with: - name: build-forge - path: forge/build/libs + name: build-neo + path: neoforge/build/libs - name: Capture Changelog if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS uses: actions/upload-artifact@v4 @@ -78,11 +78,11 @@ jobs: path: build/fabric pattern: build-fabric merge-multiple: true - - name: Download Forge artifacts + - name: Download Neo artifacts uses: actions/download-artifact@v4 with: - path: build/forge - pattern: build-forge + path: build/neo + pattern: build-neo merge-multiple: true - name: Download Changelog uses: actions/download-artifact@v4 @@ -102,9 +102,9 @@ jobs: path: "./gradle.properties" properties: "version enabledPlatforms minecraftVersion" - - name: Upload Forge Releases (Curse/Modrinth) - id: forge_release - if: contains(steps.properties.outputs.enabledPlatforms, 'forge') + - name: Upload Neo Releases (Curse/Modrinth) + id: neo_release + if: contains(steps.properties.outputs.enabledPlatforms, 'neoforge') uses: Kir-Antipov/mc-publish@v3.3.0 with: curseforge-id: ${{ vars.CURSE_ID }} @@ -114,7 +114,7 @@ jobs: modrinth-token: ${{ secrets.MODRINTH_TOKEN }} files: ./build/forge/!(*-@(dev|sources|dev-shadow)).jar - name: "AstralBot ${{ steps.properties.outputs.version }} Forge ${{ steps.properties.output.minecraftVersion }}" + name: "AstralBot ${{ steps.properties.outputs.version }} NeoForge ${{ steps.properties.output.minecraftVersion }}" version: ${{ steps.properties.outputs.version }} version-type: release changelog-file: build-changelog/prepared_changelog.md @@ -122,11 +122,9 @@ jobs: game-versions: ${{ steps.properties.outputs.minecraftVersion }} curseforge-dependencies: | - sqlite-jdbc(optional) kotlin-for-forge(required) forge-config-api-port-fabric(required) modrinth-dependencies: | - sqlite-jdbc(optional) kotlin-for-forge(required) forge-config-api-port(required) diff --git a/build.gradle.kts b/build.gradle.kts index 4c1e90b..836764c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -69,43 +69,42 @@ subprojects { val sqliteJDBCVersion: String by project val commonmarkVersion: String by project - // This array gets used at multiple places, so it's easier to - // just specify all dependencies at once and re-use them. This - // also makes changing them later on easier. - val botDependencies = arrayOf( - // Library used to communicate with Discord, see https://jda.wiki - "net.dv8tion:JDA:$jdaVersion", - - // Library to interact with the SQLite database, - // see: https://github.com/JetBrains/Exposed - "org.jetbrains.exposed:exposed-core:$exposedVersion", - "org.jetbrains.exposed:exposed-dao:$exposedVersion", - "org.jetbrains.exposed:exposed-jdbc:$exposedVersion", - "org.jetbrains.exposed:exposed-kotlin-datetime:$exposedVersion", - - // Markdown parser used for formatting Discord messages in Minecraft - "org.commonmark:commonmark:$commonmarkVersion", - ) - - - // This config includes the bot dependencies in the final jar - val botDep by configurations.creating { + // Configuration for shaded dependencies, get relocated to dev.erdragh.astralbot.shadowed + val shadowBotDep by configurations.creating { isTransitive = true } + // Configuration for JiJ-ed dependencies + val includeBotDep by configurations.creating { + isTransitive = false + } + // Configuration for libraries that are needed at runtime val runtimeLib by configurations.creating { isTransitive = true } - configurations.implementation.extendsFrom(configurations.named("botDep")) + configurations.implementation.extendsFrom(configurations.named("shadowBotDep")) + configurations.implementation.extendsFrom(configurations.named("includeBotDep")) configurations.implementation.extendsFrom(configurations.named("runtimeLib")) dependencies { - // Discord Bot dependencies - // Database driver that allows Exposed to communicate with - // the SQLite database. This will not be in the JAR and needs to be provided - // otherwise (e.g. https://www.curseforge.com/minecraft/mc-mods/sqlite-jdbc) runtimeLib("org.xerial:sqlite-jdbc:$sqliteJDBCVersion") - botDependencies.forEach { - botDep(it) { + includeBotDep("org.xerial:sqlite-jdbc:$sqliteJDBCVersion") + + runtimeLib("org.commonmark:commonmark:$commonmarkVersion") + includeBotDep("org.commonmark:commonmark:$commonmarkVersion") + + + arrayOf( + // Library used to communicate with Discord, see https://jda.wiki + "net.dv8tion:JDA:$jdaVersion", + + // Library to interact with the SQLite database, + // see: https://github.com/JetBrains/Exposed + "org.jetbrains.exposed:exposed-core:$exposedVersion", + "org.jetbrains.exposed:exposed-dao:$exposedVersion", + "org.jetbrains.exposed:exposed-jdbc:$exposedVersion", + "org.jetbrains.exposed:exposed-kotlin-datetime:$exposedVersion", + ).forEach { + runtimeLib(it) { // opus-java is for audio, which this bot doesn't need exclude(module = "opus-java") // Kotlin would be included as a transitive dependency @@ -115,6 +114,11 @@ subprojects { // Minecraft already ships with a logging system exclude(group = "org.slf4j") } + shadowBotDep(it) { + exclude(module = "opus-java") + exclude(group = "org.jetbrains.kotlin") + exclude(group = "org.slf4j") + } } } diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 56c7a89..fe8baf6 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -11,6 +11,9 @@ plugins { val modId: String by project +val includeBotDep: Configuration by configurations.getting +val shadowBotDep: Configuration by configurations.getting + dependencies { mappings(loom.officialMojangMappings()) val minecraftVersion: String by project @@ -26,6 +29,8 @@ dependencies { modImplementation("net.fabricmc:fabric-language-kotlin:${fabricKotlinVersion}") modApi("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:$forgeConfigAPIVersion") + + includeBotDep.dependencies.forEach { include(it) } } loom { @@ -51,8 +56,6 @@ loom { } } -val botDep: Configuration by configurations.getting - tasks { withType { source(project(":common").sourceSets.main.get().allSource) @@ -70,7 +73,7 @@ tasks { shadowJar { archiveClassifier.set("dev-shadow") - configurations = listOf(botDep) + configurations = listOf(shadowBotDep) // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) mergeServiceFiles() diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts deleted file mode 100644 index db959b8..0000000 --- a/forge/build.gradle.kts +++ /dev/null @@ -1,188 +0,0 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.gradle.utils.extendsFrom - -plugins { - idea - `maven-publish` - id("net.minecraftforge.gradle") version "6.0.22" - id("org.spongepowered.mixin") version "0.7-SNAPSHOT" - id("com.github.johnrengelman.shadow") -} - -val modId: String by project -val minecraftVersion: String by project - -val botDep: Configuration by configurations.getting -val runtimeLib: Configuration by configurations.getting - -mixin { - add(sourceSets.main.get(), "$modId.refmap.json") - config("$modId-common.mixins.json") - config("$modId.mixins.json") -} - -minecraft { - mappings("official", minecraftVersion) - - copyIdeResources = true //Calls processResources when in dev - - // Automatically enable forge AccessTransformers if the file exists - // This location is hardcoded in Forge and can not be changed. - // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 - val transformerFile = file("src/main/resources/META-INF/accesstransformer.cfg") - if (transformerFile.exists()) - accessTransformer(transformerFile) - - runs { - create("client") { - workingDirectory(project.file("run")) - ideaModule("${rootProject.name}.${project.name}.main") - taskName("Client") - property("mixin.env.remapRefMap", "true") - property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") - mods { - create("modRun") { - source(sourceSets.main.get()) - source(project(":common").sourceSets.main.get()) - } - } - - configurations.minecraftLibrary.extendsFrom(configurations.botDep) - configurations.minecraftLibrary.extendsFrom(configurations.runtimeLib) - } - - create("server") { - workingDirectory(project.file("run")) - ideaModule("${rootProject.name}.${project.name}.main") - taskName("Server") - property("mixin.env.remapRefMap", "true") - property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") - mods { - create("modServerRun") { - source(sourceSets.main.get()) - source(project(":common").sourceSets.main.get()) - } - } - - configurations.minecraftLibrary.extendsFrom(configurations.botDep) - configurations.minecraftLibrary.extendsFrom(configurations.runtimeLib) - } - - create("data") { - workingDirectory(project.file("run")) - ideaModule("${rootProject.name}.${project.name}.main") - args( - "--mod", modId, - "--all", - "--output", file("src/generated/resources").absolutePath, - "--existing", file("src/main/resources/").absolutePath - ) - taskName("Data") - property("mixin.env.remapRefMap", "true") - property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg") - mods { - create("modDataRun") { - source(sourceSets.main.get()) - source(project(":common").sourceSets.main.get()) - } - } - - configurations.minecraftLibrary.extendsFrom(configurations.botDep) - configurations.minecraftLibrary.extendsFrom(configurations.runtimeLib) - } - } -} - -sourceSets.main.get().resources.srcDir("src/generated/resources") - -dependencies { - annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor") - - val minecraftVersion: String by project - val forgeVersion: String by project - val kotlinForgeVersion: String by project - val forgeConfigAPIVersion: String by project - - minecraft(group = "net.minecraftforge", name = "forge", version = "$minecraftVersion-$forgeVersion") - // Adds KFF as dependency and Kotlin libs - implementation("thedarkcolour:kotlinforforge:$kotlinForgeVersion") - - // On 1.20.2 upwards, the forge config api port either reimplements neo's - // or lexforge's config API. I chose to use Neo's by default, resulting in - // an additional dependency on the lexforge side. - implementation("fuzs.forgeconfigapiport:forgeconfigapiport-forge:$forgeConfigAPIVersion") -} - -tasks { - withType { - source(project(":common").sourceSets.main.get().allSource) - } - withType { - source(project(":common").sourceSets.main.get().allSource) - } - - javadoc { source(project(":common").sourceSets.main.get().allJava) } - - named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } - - processResources { from(project(":common").sourceSets.main.get().resources) } - - jar { - archiveClassifier.set("dev") - } - - shadowJar { - archiveClassifier.set(null as String?) - - configurations = listOf(botDep) - - // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) - mergeServiceFiles() - - // Forge restricts loading certain classes for security reasons. - // Luckily, shadow can relocate them to a different package. - relocate("org.apache.commons.collections4", "dev.erdragh.shadowed.org.apache.commons.collections4") - - // Relocating Exposed somewhere different so other mods not doing that don't run into issues (e.g. Ledger) - relocate("org.jetbrains.exposed", "dev.erdragh.shadowed.org.jetbrains.exposed") - - // Relocating jackson to prevent incompatibilities with other mods also bundling it (e.g. GroovyModLoader on Forge) - relocate("com.fasterxml.jackson", "dev.erdragh.shadowed.com.fasterxml.jackson") - - exclude(".cache/**") //Remove datagen cache from jar. - exclude("**/astralbot/datagen/**") //Remove data gen code from jar. - exclude("**/org/slf4j/**") - - exclude("kotlinx/**") - exclude("_COROUTINE/**") - exclude("**/org/jetbrains/annotations/*") - exclude("**/org/intellij/**") - } - - reobf.configureEach { - if (this.name == "reobfJar") { - input.set(shadowJar.get().archiveFile) - dependsOn(shadowJar) - } - } -} - -publishing { - publications { - register("mavenJava", MavenPublication::class) { - artifactId = base.archivesName.get() - artifact(tasks.jar) - fg.component(this) - } - } - - repositories { - maven("file://${System.getenv("local_maven")}") - } -} - -sourceSets.forEach { - val dir = layout.buildDirectory.dir("sourceSets/${it.name}") - it.output.setResourcesDir(dir) - it.java.destinationDirectory.set(dir) -} \ No newline at end of file diff --git a/forge/gradle.properties b/forge/gradle.properties deleted file mode 100644 index e69de29..0000000 diff --git a/forge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java b/forge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java deleted file mode 100644 index 3efddb6..0000000 --- a/forge/src/main/java/dev/erdragh/astralbot/mixins/forge/PlayerListMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.erdragh.astralbot.mixins.forge; - -import dev.erdragh.astralbot.forge.event.SystemMessageEvent; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.players.PlayerList; -import net.minecraftforge.common.MinecraftForge; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.function.Function; - -@Mixin(PlayerList.class) -public abstract class PlayerListMixin { - @Inject(method = "broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Ljava/util/function/Function;Z)V", at = @At("HEAD"), cancellable = true) - private void onSendGameMessage(Component message, Function playerMessageFactory, boolean overlay, CallbackInfo ci) { - MinecraftForge.EVENT_BUS.post(new SystemMessageEvent(message)); - } -} \ No newline at end of file diff --git a/forge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt b/forge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt deleted file mode 100644 index 68dc355..0000000 --- a/forge/src/main/kotlin/dev/erdragh/astralbot/forge/BotMod.kt +++ /dev/null @@ -1,66 +0,0 @@ -package dev.erdragh.astralbot.forge - -import dev.erdragh.astralbot.* -import dev.erdragh.astralbot.commands.minecraft.registerMinecraftCommands -import dev.erdragh.astralbot.config.AstralBotConfig -import dev.erdragh.astralbot.config.AstralBotTextConfig -import dev.erdragh.astralbot.forge.event.SystemMessageEvent -import dev.erdragh.astralbot.handlers.DiscordMessageComponent -import fuzs.forgeconfigapiport.forge.api.neoforge.v4.NeoForgeConfigRegistry -import net.minecraft.server.level.ServerPlayer -import net.minecraftforge.event.RegisterCommandsEvent -import net.minecraftforge.event.ServerChatEvent -import net.minecraftforge.event.entity.player.PlayerEvent -import net.minecraftforge.event.server.ServerStartedEvent -import net.minecraftforge.event.server.ServerStoppingEvent -import net.minecraftforge.fml.ModLoadingContext -import net.minecraftforge.fml.common.Mod -import net.minecraftforge.fml.config.ModConfig -import thedarkcolour.kotlinforforge.forge.FORGE_BUS - -@Mod("astralbot") -object BotMod { - init { - NeoForgeConfigRegistry.INSTANCE.register(MODID, ModConfig.Type.SERVER, AstralBotConfig.SPEC) - NeoForgeConfigRegistry.INSTANCE.register(MODID, ModConfig.Type.SERVER, AstralBotTextConfig.SPEC, "astralbot-text.toml") - FORGE_BUS.addListener(::onServerStart) - FORGE_BUS.addListener(::onServerStop) - FORGE_BUS.addListener(::onChatMessage) - FORGE_BUS.addListener(::onSystemMessage) - FORGE_BUS.addListener(::onCommandRegistration) - - FORGE_BUS.addListener(::onPlayerJoin) - FORGE_BUS.addListener(::onPlayerLeave) - } - - private fun onServerStart(event: ServerStartedEvent) { - LOGGER.info("AstralBot starting on Forge") - startAstralbot(event.server) - } - - private fun onServerStop(event: ServerStoppingEvent) { - stopAstralbot() - } - - private fun onChatMessage(event: ServerChatEvent) { - minecraftHandler?.sendChatToDiscord(event.player, event.message) - } - - private fun onSystemMessage(event: SystemMessageEvent) { - if (event.message !is DiscordMessageComponent) { - minecraftHandler?.sendChatToDiscord(null as ServerPlayer?, event.message) - } - } - - private fun onPlayerJoin(event: PlayerEvent.PlayerLoggedInEvent) { - minecraftHandler?.onPlayerJoin(event.entity.name.string) - } - - private fun onPlayerLeave(event: PlayerEvent.PlayerLoggedOutEvent) { - minecraftHandler?.onPlayerLeave(event.entity.name.string) - } - - private fun onCommandRegistration(event: RegisterCommandsEvent) { - registerMinecraftCommands(event.dispatcher) - } -} \ No newline at end of file diff --git a/forge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt b/forge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt deleted file mode 100644 index d1b2362..0000000 --- a/forge/src/main/kotlin/dev/erdragh/astralbot/forge/event/SystemMessageEvent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.erdragh.astralbot.forge.event - -import net.minecraft.network.chat.Component -import net.minecraftforge.eventbus.api.Cancelable -import net.minecraftforge.eventbus.api.Event - -@Cancelable -class SystemMessageEvent(var message: Component) : Event() \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 9d9328b..0000000 --- a/forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,34 +0,0 @@ -modLoader = "kotlinforforge" -loaderVersion = "${kff_loader_range}" -license = "${license}" -issueTrackerURL = "https://github.com/Erdragh/AstralBot/issues" - -[[mods]] -modId = "${mod_id}" -version = "${version}" -displayName = "${mod_name}" -displayURL = "https://modrinth.com/mod/astralbot" -logoFile = "icon.png" -authors = "${mod_author}" -description = "${description}" - -[[dependencies.${mod_id}]] -modId = "forge" -mandatory = true -versionRange = "${forge_version_range}" -ordering = "NONE" -side = "BOTH" - -[[dependencies.${mod_id}]] -modId = "minecraft" -mandatory = true -versionRange = "${minecraft_version_range}" -ordering = "NONE" -side = "BOTH" - -[[dependencies.${mod_id}]] -modId = "forgeconfigapiport" -mandatory = true -versionRange = "[20,)" -ordering = "NONE" -side = "BOTH" \ No newline at end of file diff --git a/forge/src/main/resources/astralbot.mixins.json b/forge/src/main/resources/astralbot.mixins.json deleted file mode 100644 index 81bac46..0000000 --- a/forge/src/main/resources/astralbot.mixins.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "dev.erdragh.astralbot.mixins.forge", - "compatibilityLevel": "JAVA_17", - "refmap": "${mod_id}.refmap.json", - "server": [ - "PlayerListMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta deleted file mode 100644 index 9ac0090..0000000 --- a/forge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "pack_format": 18, - "description": "Dummy resource pack for AstralBot" - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 50a1d02..1a457ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ kotlin.code.style=official org.gradle.jvmargs=-Xmx3G # Minecraft things -enabledPlatforms=fabric,forge,neoforge +enabledPlatforms=fabric,neoforge # Fabric fabricLoaderVersion=0.15.10 @@ -11,7 +11,7 @@ fabricKotlinVersion=1.10.19+kotlin.1.9.23 # Neo neoVersion=20.4.233 -neoVersionRange=[20.4.233,) +neoVersionRange=[20.4,20.5) # Forge forgeVersion=49.0.49 @@ -41,7 +41,7 @@ jdaVersion=5.0.0-beta.23 # Database Interactions exposedVersion=0.50.0 -sqliteJDBCVersion=3.44.1.0 +sqliteJDBCVersion=3.45.3.0 # Message parsing commonmarkVersion=0.22.0 \ No newline at end of file diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index a054958..be157bd 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -5,13 +5,16 @@ plugins { idea `maven-publish` java - id("net.neoforged.gradle.userdev") version "7.0.109" + id("net.neoforged.gradle.userdev") version "7.0.120" id("com.github.johnrengelman.shadow") } val modId: String by project -val botDep: Configuration by configurations.getting +jarJar.enable() + +val includeBotDep: Configuration by configurations.getting +val shadowBotDep: Configuration by configurations.getting val runtimeLib: Configuration by configurations.getting // Automatically enable neoforge AccessTransformers if the file exists @@ -28,8 +31,7 @@ runs { systemProperty("neoforge.enabledGameTestNamespaces", modId) dependencies { - botDep.dependencies.forEach { runtime(it) } - runtimeLib.dependencies.forEach { runtime(it) } + runtime(runtimeLib) } } @@ -37,16 +39,14 @@ runs { systemProperty("neoforge.enabledGameTestNamespaces", modId) programArgument("--nogui") dependencies { - botDep.dependencies.forEach { runtime(it) } - runtimeLib.dependencies.forEach { runtime(it) } + runtime(runtimeLib) } } create("gameTestServer") { systemProperty("neoforge.enabledGameTestNamespaces", modId) dependencies { - botDep.dependencies.forEach { runtime(it) } - runtimeLib.dependencies.forEach { runtime(it) } + runtime(runtimeLib) } } @@ -58,8 +58,7 @@ runs { "--existing", file("src/main/resources/").absolutePath ) dependencies { - botDep.dependencies.forEach { runtime(it) } - runtimeLib.dependencies.forEach { runtime(it) } + runtime(runtimeLib) } } } @@ -74,6 +73,8 @@ dependencies { implementation(group = "net.neoforged", name = "neoforge", version = neoVersion) // Adds KFF as dependency and Kotlin libs implementation("thedarkcolour:kotlinforforge-neoforge:$kotlinForgeVersion") + + includeBotDep.dependencies.forEach { jarJar(it) } } // NeoGradle compiles the game, but we don't want to add our common code to the game's code @@ -87,14 +88,9 @@ tasks { withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allJava) } - jar { - archiveClassifier.set("slim") - } - shadowJar { - archiveClassifier.set(null as String?) - - configurations = listOf(botDep) + archiveClassifier = null + configurations = listOf(shadowBotDep) // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) mergeServiceFiles() @@ -119,8 +115,8 @@ tasks { exclude("**/org/intellij/**") } - build { - dependsOn("shadowJar") + jarJar.configure { + dependsOn(shadowJar) } named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 3360226..11ac206 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,12 +7,6 @@ pluginManagement { mavenCentral() maven("https://maven.fabricmc.net/") { name = "Fabric" } maven("https://maven.neoforged.net/releases/") { name = "NeoForge" } - maven("https://maven.minecraftforge.net/") { - name = "Forge" - content { - includeGroup("net.minecraftforge") - } - } maven("https://repo.spongepowered.org/repository/maven-public/") { name = "Sponge Snapshots" } gradlePluginPortal() } @@ -22,4 +16,4 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } -include("common", "fabric", "forge", "neoforge") \ No newline at end of file +include("common", "fabric", "neoforge") \ No newline at end of file From cca6f67fb4ed8488182c2cac0c7585fd139e3e68 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Mon, 13 May 2024 14:19:51 +0200 Subject: [PATCH 14/19] Finalize nuking Forge --- .github/workflows/build.yml | 6 +----- Changelog.md | 5 +++++ README.md | 3 +-- gradle.properties | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 10ebf27..6177ae8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -151,11 +151,7 @@ jobs: fabric-api(required) fabric-language-kotlin(required) forge-config-api-port-fabric(required) - sqlite-jdbc(optional) - ledger(optional) modrinth-dependencies: | fabric-api(required) fabric-language-kotlin(required) - forge-config-api-port(required) - sqlite-jdbc(optional) - ledger(optional) \ No newline at end of file + forge-config-api-port(required) \ No newline at end of file diff --git a/Changelog.md b/Changelog.md index a0c2f6c..e9a7112 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,8 @@ +# 1.4.0 +- Port to 1.20.4 and NeoForge +- Removed Forge as a supported Platform for Minecraft > 1.20.1 +- JiJ SQLite and Commonmark dependencies, allowing better compatibility and removing the SQLite JDBC dependency + # 1.3.0 - Message Embeds to better represent Minecraft messages on Discord - Fix `/link` Minecraft command not being registered on Forge diff --git a/README.md b/README.md index 94b7c7d..17cf69f 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,7 @@ to see how much is already implemented. This mod has a few dependencies, some of which are not specified directly as they're technically optional: - The Kotlin Implementation for the platform you're running. (e.g. [Kotlin For Forge](https://modrinth.com/mod/kotlin-for-forge) or [Fabric Language Kotlin](https://modrinth.com/mod/fabric-language-kotlin)) -- The Forge Config API (Included in Forge, [extra mod for Fabric](https://modrinth.com/mod/forge-config-api-port)) -- The SQLite Database Driver. (This is included in [Ledger](https://modrinth.com/mod/ledger) but also [available separately](https://modrinth.com/plugin/sqlite-jdbc)) +- The (Neo-)Forge Config API (Included in NeoForge, [extra mod for Fabric](https://modrinth.com/mod/forge-config-api-port)) ## Implementation - [JDA](https://jda.wiki) library to communicate with the Discord API. diff --git a/gradle.properties b/gradle.properties index 1a457ec..70dd369 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,7 +21,7 @@ forgeVersionRange=[49,) kotlinForgeVersion=4.10.0 kffLoaderRange=[4,) -version=1.3.0 +version=1.4.0 group=dev.erdragh.astralbot modId=astralbot modAuthor=Erdragh From 9f0831675bd101518ff8faf24f90397a419be18b Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 14 May 2024 09:54:49 +0200 Subject: [PATCH 15/19] Update dependencies and try to get Neo Dev Server working --- build.gradle.kts | 27 +++++++++++---------------- gradle.properties | 10 ++-------- neoforge/build.gradle.kts | 2 +- 3 files changed, 14 insertions(+), 25 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 836764c..4ebe42b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -102,23 +102,22 @@ subprojects { "org.jetbrains.exposed:exposed-core:$exposedVersion", "org.jetbrains.exposed:exposed-dao:$exposedVersion", "org.jetbrains.exposed:exposed-jdbc:$exposedVersion", - "org.jetbrains.exposed:exposed-kotlin-datetime:$exposedVersion", ).forEach { runtimeLib(it) { + exclude(module = "opus-java") + exclude(group = "org.slf4j") + } + shadowBotDep(it) { // opus-java is for audio, which this bot doesn't need exclude(module = "opus-java") // Kotlin would be included as a transitive dependency // on JDA and Exposed, but is already provided by the // respective Kotlin implementation of the mod loaders exclude(group = "org.jetbrains.kotlin") + exclude(group = "kotlinx") // Minecraft already ships with a logging system exclude(group = "org.slf4j") } - shadowBotDep(it) { - exclude(module = "opus-java") - exclude(group = "org.jetbrains.kotlin") - exclude(group = "org.slf4j") - } } } @@ -151,37 +150,33 @@ subprojects { tasks.processResources { val version: String by project val group: String by project - val forgeVersion: String by project - val kffLoaderRange: String by project - val forgeVersionRange: String by project val minecraftVersionRange: String by project val fabricApiVersion: String by project val fabricLoaderVersion: String by project val fabricKotlinVersion: String by project - val license: String by project - val description: String by project val neoVersion: String by project val neoVersionRange: String by project + val kffLoaderRange: String by project + val license: String by project + val description: String by project val credits: String by project val expandProps = mapOf( "version" to version, "group" to group, //Else we target the task's group. "minecraft_version" to minecraftVersion, - "forge_version" to forgeVersion, - "kff_loader_range" to kffLoaderRange, - "forge_version_range" to forgeVersionRange, "minecraft_version_range" to minecraftVersionRange, "fabric_version" to fabricApiVersion, "fabric_loader_version" to fabricLoaderVersion, "fabric_kotlin_version" to fabricKotlinVersion, + "neoforge_version" to neoVersion, + "neoforge_loader_version_range" to neoVersionRange, + "kff_loader_range" to kffLoaderRange, "mod_name" to modName, "mod_author" to modAuthor, "mod_id" to modId, "license" to license, "description" to description, - "neoforge_version" to neoVersion, - "neoforge_loader_version_range" to neoVersionRange, "credits" to credits ) diff --git a/gradle.properties b/gradle.properties index 70dd369..59be9e6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,12 +12,6 @@ fabricKotlinVersion=1.10.19+kotlin.1.9.23 # Neo neoVersion=20.4.233 neoVersionRange=[20.4,20.5) - -# Forge -forgeVersion=49.0.49 -forgeVersionRange=[49,) - -# Neo and Forge kotlinForgeVersion=4.10.0 kffLoaderRange=[4,) @@ -37,10 +31,10 @@ parchmentVersion=2024.04.14 forgeConfigAPIVersion=20.4.3 # Discord Interactions -jdaVersion=5.0.0-beta.23 +jdaVersion=5.0.0-beta.24 # Database Interactions -exposedVersion=0.50.0 +exposedVersion=0.50.1 sqliteJDBCVersion=3.45.3.0 # Message parsing diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index be157bd..1c4b510 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -5,7 +5,7 @@ plugins { idea `maven-publish` java - id("net.neoforged.gradle.userdev") version "7.0.120" + id("net.neoforged.gradle.userdev") version "7.0.126" id("com.github.johnrengelman.shadow") } From 8551bcc1486f7d0650b07c1bd4f1daac0cdb2e9f Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 14 May 2024 16:18:59 +0200 Subject: [PATCH 16/19] Fix build --- build.gradle.kts | 10 +++++++++- fabric/build.gradle.kts | 2 +- neoforge/build.gradle.kts | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4ebe42b..84ed1c0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,9 @@ import java.util.* plugins { // The shadow plugin is used by the fabric subproject to include dependencies - id("com.github.johnrengelman.shadow") version "8.1.1" apply false + // I'm temporarily using a fork of the original plugin to resolve "Unsupported java classfile major version 65" + // see: https://github.com/johnrengelman/shadow/issues/911 + id("io.github.goooler.shadow") version "8.1.7" apply false // Since this mod/bot is written in Kotlin and expected to run on Minecraft and as such // the JVM, the Kotlin plugin is needed kotlin("jvm") version "1.9.23" @@ -200,6 +202,12 @@ subprojects { tasks.withType { enabled = false } + + tasks.withType { + options.encoding = "UTF-8" + targetCompatibility = JavaVersion.VERSION_17.majorVersion + sourceCompatibility = JavaVersion.VERSION_17.majorVersion + } } kotlin { diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index fe8baf6..2af5516 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -6,7 +6,7 @@ plugins { idea `maven-publish` id("fabric-loom") version "1.6-SNAPSHOT" - id("com.github.johnrengelman.shadow") + id("io.github.goooler.shadow") } val modId: String by project diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 1c4b510..465ec8f 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -6,7 +6,7 @@ plugins { `maven-publish` java id("net.neoforged.gradle.userdev") version "7.0.126" - id("com.github.johnrengelman.shadow") + id("io.github.goooler.shadow") } val modId: String by project From 32a93ca7a0a8d03fcedce1eeec5e74f628193acd Mon Sep 17 00:00:00 2001 From: Erdragh Date: Wed, 15 May 2024 19:20:36 +0200 Subject: [PATCH 17/19] Bump NG Version --- common/.gitignore | 1 + neoforge/.gitignore | 3 ++- neoforge/build.gradle.kts | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 common/.gitignore diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 0000000..c585e19 --- /dev/null +++ b/common/.gitignore @@ -0,0 +1 @@ +out \ No newline at end of file diff --git a/neoforge/.gitignore b/neoforge/.gitignore index cb1d07b..d8aff51 100644 --- a/neoforge/.gitignore +++ b/neoforge/.gitignore @@ -1 +1,2 @@ -runs \ No newline at end of file +runs +out \ No newline at end of file diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 465ec8f..92c4749 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,11 +1,10 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.gradle.utils.extendsFrom plugins { idea `maven-publish` java - id("net.neoforged.gradle.userdev") version "7.0.126" + id("net.neoforged.gradle.userdev") version "7.0.127" id("io.github.goooler.shadow") } From 46f5882b8399123425ea75c56d3d838c40c691ad Mon Sep 17 00:00:00 2001 From: Erdragh Date: Mon, 27 May 2024 12:34:41 +0200 Subject: [PATCH 18/19] Update NG again --- neoforge/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 92c4749..1f77fe6 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -4,7 +4,7 @@ plugins { idea `maven-publish` java - id("net.neoforged.gradle.userdev") version "7.0.127" + id("net.neoforged.gradle.userdev") version "7.0.136" id("io.github.goooler.shadow") } From 51334cd5a4b0086af189d1b00bc000d3eb05c370 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Mon, 27 May 2024 12:46:41 +0200 Subject: [PATCH 19/19] Exclude kotlin and kotlinx from runtime deps --- build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 84ed1c0..474bfee 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -108,6 +108,8 @@ subprojects { runtimeLib(it) { exclude(module = "opus-java") exclude(group = "org.slf4j") + exclude(group = "org.jetbrains.kotlin") + exclude(group = "kotlinx") } shadowBotDep(it) { // opus-java is for audio, which this bot doesn't need