diff --git a/.gitignore b/.gitignore index 0a6c406..bf0371d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ build/ +run/ +.architectury-transformer .gradle .idea/ \ No newline at end of file diff --git a/README.md b/README.md index 3930f07..39163a6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A battery packed, multi-platform plugin template for Minecraft servers to get yo - [Cloud](https://github.com/Incendo/cloud) for platform-agnostic command registration and handling. - [Configurate](https://github.com/SpongePowered/Configurate) for cross-platform configuration. -Currently supporting Bukkit, Bungeecord, Paper and Velocity. +Currently supporting Bukkit, Bungeecord, Fabric, NeoForge, Paper and Velocity. ## License This project is licensed under the [CC0 1.0 Universal](https://github.com/RealTriassic/plugin-template/blob/main/LICENSE) license, meaning you are free to use this project however you like, including changing the license for your own projects. diff --git a/bootstrap/mod/build.gradle.kts b/bootstrap/mod/build.gradle.kts new file mode 100644 index 0000000..0017b36 --- /dev/null +++ b/bootstrap/mod/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id("architectury-plugin") + id("dev.architectury.loom") version "1.11-SNAPSHOT" +} + +architectury { + minecraft = "1.21.8" + common("fabric", "neoforge") +} + +loom { + silentMojangMappingsLicense() +} + +dependencies { + minecraft("net.minecraft:minecraft:1.21.8") + mappings(loom.officialMojangMappings()) +} \ No newline at end of file diff --git a/bootstrap/mod/fabric/build.gradle.kts b/bootstrap/mod/fabric/build.gradle.kts new file mode 100644 index 0000000..5e236a3 --- /dev/null +++ b/bootstrap/mod/fabric/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + id("dev.architectury.loom") version "1.11-SNAPSHOT" + id("architectury-plugin") + id("conventions.modded") +} + +architectury { + platformSetupLoomIde() + fabric() +} + +dependencies { + minecraft("net.minecraft:minecraft:1.21.8") + mappings(loom.officialMojangMappings()) + modImplementation("net.fabricmc:fabric-loader:0.17.2") + modImplementation(libs.adventure.api) + include(libs.adventure.api) + modImplementation(libs.adventure.minimessage) + include(libs.adventure.minimessage) + include(libs.adventure.fabric) + modImplementation(libs.adventure.fabric) + include(libs.cloud.fabric) + modImplementation(libs.cloud.fabric) + shade(project(mapOf("path" to ":core", "configuration" to "shadow"))) +} + +relocate("org.spongepowered") + +tasks.named("shadowJar") { + exclude("org/incendo/cloud/**") + exclude("META-INF/services/org.incendo.cloud.*") + exclude("org/slf4j/**") + relocate("io.leangen.geantyref", "dev.triassic.template.lib.geantyref") +} \ No newline at end of file diff --git a/bootstrap/mod/fabric/gradle.properties b/bootstrap/mod/fabric/gradle.properties new file mode 100644 index 0000000..90ee7a2 --- /dev/null +++ b/bootstrap/mod/fabric/gradle.properties @@ -0,0 +1 @@ +loom.platform=fabric \ No newline at end of file diff --git a/bootstrap/mod/fabric/src/main/java/dev/triassic/template/mod/fabric/FabricTemplateMod.java b/bootstrap/mod/fabric/src/main/java/dev/triassic/template/mod/fabric/FabricTemplateMod.java new file mode 100644 index 0000000..629ebb1 --- /dev/null +++ b/bootstrap/mod/fabric/src/main/java/dev/triassic/template/mod/fabric/FabricTemplateMod.java @@ -0,0 +1,71 @@ +/* + * SPDX-License-Identifier: CC0-1.0 + * + * Dedicated to the public domain under CC0 1.0 Universal. + * + * You can obtain a full copy of the license at: + * https://creativecommons.org/publicdomain/zero/1.0/ + */ + +package dev.triassic.template.mod.fabric; + +import dev.triassic.template.TemplateImpl; +import dev.triassic.template.TemplatePlugin; +import dev.triassic.template.command.Commander; +import dev.triassic.template.mod.fabric.command.FabricCommander; +import dev.triassic.template.util.PlatformType; +import java.nio.file.Path; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.FabricLoader; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.fabric.FabricServerCommandManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * hey!!!. + */ +public final class FabricTemplateMod implements ModInitializer, TemplatePlugin { + + private Logger logger; + private FabricServerCommandManager commandManager; + private TemplateImpl impl; + + @Override + public void onInitialize() { + this.logger = LoggerFactory.getLogger(FabricTemplateMod.class); + this.commandManager = new FabricServerCommandManager<>( + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.create( + FabricCommander::from, + commander -> ((FabricCommander) commander).source() + ) + ); + + this.impl = new TemplateImpl(this); + impl.initialize(); + } + + @Override + public @NonNull Logger logger() { + return logger; + } + + @Override + public @NonNull Path dataDirectory() { + return FabricLoader.getInstance().getConfigDir(); + } + + @Override + public @NonNull PlatformType platformType() { + return PlatformType.FABRIC; + } + + @Override + public @NonNull CommandManager commandManager() { + return this.commandManager; + } +} diff --git a/bootstrap/mod/fabric/src/main/java/dev/triassic/template/mod/fabric/command/FabricCommander.java b/bootstrap/mod/fabric/src/main/java/dev/triassic/template/mod/fabric/command/FabricCommander.java new file mode 100644 index 0000000..fdecf97 --- /dev/null +++ b/bootstrap/mod/fabric/src/main/java/dev/triassic/template/mod/fabric/command/FabricCommander.java @@ -0,0 +1,59 @@ +/* + * SPDX-License-Identifier: CC0-1.0 + * + * Dedicated to the public domain under CC0 1.0 Universal. + * + * You can obtain a full copy of the license at: + * https://creativecommons.org/publicdomain/zero/1.0/ + */ + +package dev.triassic.template.mod.fabric.command; + +import dev.triassic.template.command.Commander; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.ForwardingAudience; +import net.minecraft.commands.CommandSourceStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.framework.qual.DefaultQualifier; + +/** + * Represents a Fabric-specific {@link Commander}. + * + *

Slightly borrowed from Carbon's implementation.

+ */ +@DefaultQualifier(NonNull.class) +public interface FabricCommander extends Commander, ForwardingAudience.Single { + + /** + * Create a new {@link FabricCommander} from a {@link CommandSourceStack}. + * + * @param source the {@link CommandSourceStack} + * @return a new {@link FabricCommander} + */ + static FabricCommander from(final CommandSourceStack source) { + return new FabricCommanderImpl(source); + } + + /** + * Gets the underlying {@link CommandSourceStack}. + * + * @return the {@link CommandSourceStack} + */ + CommandSourceStack source(); + + /** + * A record implementation of {@link FabricCommander}. + */ + record FabricCommanderImpl(CommandSourceStack source) implements FabricCommander { + + @Override + public Audience audience() { + return source.audience(); + } + + @Override + public boolean hasPermission(final String permission) { + return true; // TODO: Check for permission in Fabric. + } + } +} diff --git a/bootstrap/mod/fabric/src/main/resources/fabric.mod.json b/bootstrap/mod/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..1e86fc9 --- /dev/null +++ b/bootstrap/mod/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,28 @@ +{ + "schemaVersion": 1, + "id": "example_mod", + "version": "${version}", + "name": "${name}", + "description": "${description}", + "authors": [ + "${author}" + ], + "contact": { + "homepage": "${url}" + }, + "license": "UNLICENSED", + "environment": "*", + "entrypoints": { + "main": [ + "dev.triassic.template.mod.fabric.FabricTemplateMod" + ], + "client": [] + }, + "mixins": [], + "depends": { + "fabricloader": ">=0.16.14", + "minecraft": "~1.21.8", + "java": ">=21", + "cloud": "*" + } +} diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts new file mode 100644 index 0000000..5b98249 --- /dev/null +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + id("dev.architectury.loom") version "1.11-SNAPSHOT" + id("architectury-plugin") + id("conventions.modded") +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +dependencies { + modImplementation(libs.adventure.api) + include(libs.adventure.api) + modImplementation(libs.adventure.minimessage) + include(libs.adventure.minimessage) + minecraft("net.minecraft:minecraft:1.21.8") + mappings(loom.officialMojangMappings()) + neoForge("net.neoforged:neoforge:21.8.46") + include(libs.adventure.neoforge) + modImplementation(libs.adventure.neoforge) + include(libs.cloud.neoforge) + modImplementation(libs.cloud.neoforge) + shade(project(mapOf("path" to ":core", "configuration" to "shadow"))) +} + +relocate("org.spongepowered") + +tasks.named("shadowJar") { + exclude("org/incendo/cloud/**") + exclude("META-INF/services/org.incendo.cloud.*") + exclude("org/slf4j/**") + relocate("io.leangen.geantyref", "dev.triassic.template.lib.geantyref") +} \ No newline at end of file diff --git a/bootstrap/mod/neoforge/gradle.properties b/bootstrap/mod/neoforge/gradle.properties new file mode 100644 index 0000000..2914393 --- /dev/null +++ b/bootstrap/mod/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge \ No newline at end of file diff --git a/bootstrap/mod/neoforge/src/main/java/dev/triassic/template/mod/neoforge/NeoForgeTemplateMod.java b/bootstrap/mod/neoforge/src/main/java/dev/triassic/template/mod/neoforge/NeoForgeTemplateMod.java new file mode 100644 index 0000000..8136b8a --- /dev/null +++ b/bootstrap/mod/neoforge/src/main/java/dev/triassic/template/mod/neoforge/NeoForgeTemplateMod.java @@ -0,0 +1,107 @@ +/* + * SPDX-License-Identifier: CC0-1.0 + * + * Dedicated to the public domain under CC0 1.0 Universal. + * + * You can obtain a full copy of the license at: + * https://creativecommons.org/publicdomain/zero/1.0/ + */ + +package dev.triassic.template.mod.neoforge; + +import dev.triassic.template.TemplateImpl; +import dev.triassic.template.TemplatePlugin; +import dev.triassic.template.command.Commander; +import dev.triassic.template.mod.neoforge.command.NeoForgeCommander; +import dev.triassic.template.util.PlatformType; +import java.nio.file.Path; +import net.kyori.adventure.platform.modcommon.MinecraftServerAudiences; +import net.kyori.adventure.text.Component; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.server.ServerStartingEvent; +import net.neoforged.neoforge.event.server.ServerStoppedEvent; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.neoforge.NeoForgeServerCommandManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Hey!!!. + */ +@Mod("example_mod") +public final class NeoForgeTemplateMod implements TemplatePlugin { + + private static MinecraftServerAudiences adventure; + + private final Logger logger; + private final NeoForgeServerCommandManager commandManager; + private TemplateImpl impl; + + /** + * adventure. + * + * @return adventure instance lol.0 + */ + public static MinecraftServerAudiences adventure() { + MinecraftServerAudiences ret = adventure; + if (ret == null) { + throw new IllegalStateException("Tried to access Adventure without a running server!"); + } + return ret; + } + + /** + * hi!. + */ + public NeoForgeTemplateMod() { + NeoForge.EVENT_BUS.addListener((ServerStartingEvent e) -> { + adventure = MinecraftServerAudiences.of(e.getServer()); + + adventure.console().sendMessage(Component.text("Adventure is ready!")); + }); + + NeoForge.EVENT_BUS.addListener((ServerStoppedEvent e) -> { + impl.shutdown(); + adventure = null; + }); + + this.logger = LoggerFactory.getLogger(NeoForgeTemplateMod.class); + System.out.println(logger); + logger.info("hihihihihihihihihihihihihihihihihihihihihihihihi"); + this.commandManager = new NeoForgeServerCommandManager<>( + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.create( + NeoForgeCommander::from, + commander -> ((NeoForgeCommander) commander).source() + ) + ); + + this.impl = new TemplateImpl(this); + impl.initialize(); + } + + @Override + public @NonNull Logger logger() { + return logger; + } + + @Override + public @NonNull Path dataDirectory() { + return FMLPaths.CONFIGDIR.get(); + } + + @Override + public @NonNull PlatformType platformType() { + return PlatformType.NEOFORGE; + } + + @Override + public @NonNull CommandManager commandManager() { + return this.commandManager; + } +} diff --git a/bootstrap/mod/neoforge/src/main/java/dev/triassic/template/mod/neoforge/command/NeoForgeCommander.java b/bootstrap/mod/neoforge/src/main/java/dev/triassic/template/mod/neoforge/command/NeoForgeCommander.java new file mode 100644 index 0000000..dd19b57 --- /dev/null +++ b/bootstrap/mod/neoforge/src/main/java/dev/triassic/template/mod/neoforge/command/NeoForgeCommander.java @@ -0,0 +1,60 @@ +/* + * SPDX-License-Identifier: CC0-1.0 + * + * Dedicated to the public domain under CC0 1.0 Universal. + * + * You can obtain a full copy of the license at: + * https://creativecommons.org/publicdomain/zero/1.0/ + */ + +package dev.triassic.template.mod.neoforge.command; + +import dev.triassic.template.command.Commander; +import dev.triassic.template.mod.neoforge.NeoForgeTemplateMod; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.ForwardingAudience; +import net.minecraft.commands.CommandSourceStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.framework.qual.DefaultQualifier; + +/** + * Represents a NeoForge-specific {@link Commander}. + * + *

Slightly borrowed from Carbon's implementation.

+ */ +@DefaultQualifier(NonNull.class) +public interface NeoForgeCommander extends Commander, ForwardingAudience.Single { + + /** + * Create a new {@link NeoForgeCommander} from a {@link CommandSourceStack}. + * + * @param source the {@link CommandSourceStack} + * @return a new {@link NeoForgeCommander} + */ + static NeoForgeCommander from(final CommandSourceStack source) { + return new NeoForgeCommanderImpl(source); + } + + /** + * Gets the underlying {@link CommandSourceStack}. + * + * @return the {@link CommandSourceStack} + */ + CommandSourceStack source(); + + /** + * A record implementation of {@link NeoForgeCommander}. + */ + record NeoForgeCommanderImpl(CommandSourceStack source) implements NeoForgeCommander { + + @Override + public Audience audience() { + return NeoForgeTemplateMod.adventure().audience(source); + } + + @Override + public boolean hasPermission(final String permission) { + return true; // TODO: Check for permission in NeoForge. + } + } +} diff --git a/bootstrap/mod/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/bootstrap/mod/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..cf5b6f4 --- /dev/null +++ b/bootstrap/mod/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,33 @@ +modLoader = "javafml" +loaderVersion = "[2,)" +#issueTrackerURL = "" +license = "UNLICENSED" + +[[mods]] +modId = "example_mod" +version = "${version}" +displayName = "${name}" +authors = "${author}" +description = "${description}" +#logoFile = "" + +[[dependencies.example_mod]] +modId = "neoforge" +type = "required" +versionRange = "[21.8,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.example_mod]] +modId = "minecraft" +type = "required" +versionRange = "[1.21.8,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.example_mod]] +modId = "cloud" +type = "required" +versionRange = "[1.0,)" +ordering = "NONE" +side = "BOTH" diff --git a/bootstrap/mod/src/main/java/dev/triassic/template/mod/TemplateMod.java b/bootstrap/mod/src/main/java/dev/triassic/template/mod/TemplateMod.java new file mode 100644 index 0000000..471769a --- /dev/null +++ b/bootstrap/mod/src/main/java/dev/triassic/template/mod/TemplateMod.java @@ -0,0 +1,7 @@ +package dev.triassic.template.mod; + +/** + * Hey!!. + */ +public final class TemplateMod { +} diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 1d6e617..3f2df7b 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -8,6 +8,8 @@ dependencies { // See https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) + implementation(libs.architectury.loom) + implementation(libs.architectury.plugin) implementation(libs.lombok.plugin) implementation(libs.shadow.plugin) implementation(libs.spotless.plugin) diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index c5c50cb..72656d7 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -2,7 +2,11 @@ dependencyResolutionManagement { repositories { + mavenLocal() gradlePluginPortal() + maven("https://maven.architectury.dev/") + maven("https://maven.fabricmc.net/") + maven("https://files.minecraftforge.net/maven/") } versionCatalogs { diff --git a/build-logic/src/main/kotlin/conventions.base.gradle.kts b/build-logic/src/main/kotlin/conventions.base.gradle.kts index d320777..117f587 100644 --- a/build-logic/src/main/kotlin/conventions.base.gradle.kts +++ b/build-logic/src/main/kotlin/conventions.base.gradle.kts @@ -19,7 +19,13 @@ tasks { val author = project.findProperty("author") as String? val url = project.findProperty("url") as String? - filesMatching(listOf("plugin.yml", "paper-plugin.yml", "bungee.yml")) { + filesMatching(listOf( + "plugin.yml", + "bungee.yml", + "fabric.mod.json", + "neoforge.mods.toml", + "paper-plugin.yml") + ) { expand( mapOf( "name" to name, diff --git a/build-logic/src/main/kotlin/conventions.modded.gradle.kts b/build-logic/src/main/kotlin/conventions.modded.gradle.kts new file mode 100644 index 0000000..a3e71d7 --- /dev/null +++ b/build-logic/src/main/kotlin/conventions.modded.gradle.kts @@ -0,0 +1,45 @@ +plugins { + id("conventions.base") + id("dev.architectury.loom") + id("architectury-plugin") + id("com.gradleup.shadow") +} + +architectury { + minecraft = "1.21.8" +} + +loom { + silentMojangMappingsLicense() +} + +configurations { + create("shade") + implementation { + extendsFrom(configurations.getByName("shade")) + } +} + + +tasks { + shadowJar { + configurations = listOf( + project.configurations["shade"], + ) + archiveVersion.set(project.version.toString()) + archiveClassifier.set("shaded") + mergeServiceFiles() + } + + remapJar { + dependsOn(shadowJar) + inputFile.set(shadowJar.get().archiveFile) + archiveClassifier.set("") + archiveVersion.set("") + } +} + +dependencies { + minecraft("net.minecraft:minecraft:1.21.8") + mappings(loom.officialMojangMappings()) +} \ No newline at end of file diff --git a/build-logic/src/main/kotlin/conventions.shadow.gradle.kts b/build-logic/src/main/kotlin/conventions.shadow.gradle.kts index 75f84fb..a6530c8 100644 --- a/build-logic/src/main/kotlin/conventions.shadow.gradle.kts +++ b/build-logic/src/main/kotlin/conventions.shadow.gradle.kts @@ -11,6 +11,7 @@ tasks { val shadowJar by existing(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) { archiveBaseName.set("${rootProject.name}-${project.name}") archiveClassifier.set(null as String?) + isZip64 = true } register("copyShadowJar") { @@ -19,7 +20,7 @@ tasks { into(rootProject.layout.buildDirectory) } - named("build") { + named("jar") { dependsOn("copyShadowJar") } } \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts index ba0b3d5..73ad2d7 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -27,4 +27,8 @@ sourceSets { } } } +} + +artifacts { + add("shadow", tasks.named("shadowJar")) } \ No newline at end of file diff --git a/core/src/main/java/dev/triassic/template/util/PlatformType.java b/core/src/main/java/dev/triassic/template/util/PlatformType.java index 41966da..a29ea25 100644 --- a/core/src/main/java/dev/triassic/template/util/PlatformType.java +++ b/core/src/main/java/dev/triassic/template/util/PlatformType.java @@ -21,6 +21,8 @@ public enum PlatformType { BUKKIT("Bukkit", false), BUNGEECORD("Bungeecord", true), + FABRIC("Fabric", false), + NEOFORGE("NeoForge", false), PAPER("Paper", false), VELOCITY("Velocity", true); diff --git a/gradle.properties b/gradle.properties index dd3f8f3..6a31461 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,8 @@ url=https://github.com/RealTriassic/plugin-template org.gradle.caching=true org.gradle.parallel=true org.gradle.configureondemand=true -org.gradle.configuration-cache=true +org.gradle.configuration-cache=false org.gradle.configuration-cache.parallel=true +org.gradle.jvmargs=-Xmx2G org.gradle.warning.mode=all diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 472646c..99026db 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,7 @@ [versions] -adventure = "4.25.0" +adventure = "4.24.0" adventure-platform = "4.4.1" +adventure-mod-platform = "6.6.0" cloud-minecraft = "2.0.0-beta.13" slf4j = "2.0.17" @@ -13,12 +14,16 @@ indra-git = { id = "net.kyori.indra.git", version = "4.0.0-SNAPSHOT" } adventure-api = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" } adventure-bukkit = { group = "net.kyori", name = "adventure-platform-bukkit", version.ref = "adventure-platform" } adventure-bungeecord = { group = "net.kyori", name = "adventure-platform-bungeecord", version.ref = "adventure-platform" } +adventure-fabric = { group = "net.kyori", name = "adventure-platform-fabric", version.ref = "adventure-mod-platform" } adventure-minimessage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure" } +adventure-neoforge = { group = "net.kyori", name = "adventure-platform-neoforge", version.ref = "adventure-mod-platform" } # Cloud Libraries cloud-bungeecord = { group = "org.incendo", name = "cloud-bungee", version.ref = "cloud-minecraft" } cloud-core = { group = "org.incendo", name = "cloud-core", version = "2.0.0" } cloud-minecraft-extras = { group = "org.incendo", name = "cloud-minecraft-extras", version.ref = "cloud-minecraft" } +cloud-fabric = { group = "org.incendo", name = "cloud-fabric", version.ref = "cloud-minecraft" } +cloud-neoforge = { group = "org.incendo", name = "cloud-neoforge", version.ref = "cloud-minecraft" } cloud-paper = { group = "org.incendo", name = "cloud-paper", version.ref = "cloud-minecraft" } cloud-velocity = { group = "org.incendo", name = "cloud-velocity", version.ref = "cloud-minecraft" } @@ -36,6 +41,8 @@ paper-api = { group = "io.papermc.paper", name = "paper-api", version = "1.20.6- velocity-api = { group = "com.velocitypowered", name = "velocity-api", version = "3.4.0-SNAPSHOT" } # Gradle Plugins +architectury-loom = { group = "dev.architectury.loom", name = "dev.architectury.loom.gradle.plugin", version = "1.11-SNAPSHOT" } +architectury-plugin = { group = "architectury-plugin", name = "architectury-plugin.gradle.plugin", version = "3.5-SNAPSHOT" } checkstyle = { group = "com.puppycrawl.tools", name = "checkstyle", version = "12.0.1" } lombok-plugin = { group = "io.freefair.gradle", name = "lombok-plugin", version = "9.0.0" } shadow-plugin = { group = "com.gradleup.shadow", name = "shadow-gradle-plugin", version = "9.2.2" } diff --git a/settings.gradle.kts b/settings.gradle.kts index d1fac95..47225d2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,7 +20,11 @@ pluginManagement { includeBuild("build-logic") repositories { + mavenLocal() gradlePluginPortal() + maven("https://maven.fabricmc.net/") + maven("https://maven.architectury.dev/") + maven("https://files.minecraftforge.net/maven/") maven("https://repo.papermc.io/repository/maven-snapshots/") { mavenContent { snapshotsOnly() @@ -30,6 +34,7 @@ pluginManagement { } plugins { + id("dev.architectury.loom") version "1.11-SNAPSHOT" id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } @@ -40,5 +45,11 @@ include(":core") file("bootstrap").listFiles()?.forEach { file -> if (file.isDirectory) { include(":bootstrap:${file.name}") + + if (file.name == "mod") { + listOf("fabric", "neoforge").forEach { submodule -> + include(":bootstrap:mod:$submodule") + } + } } } \ No newline at end of file