diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a0bfe79e..ae11bfaf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,14 @@ jobs: steps: - uses: actions/checkout@v4 + # Set up JDK 17 for Fabric 1.20.x builds (Gradle toolchain will use this) + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: "temurin" + + # Set up JDK 21 as the primary JDK - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v4 with: @@ -46,6 +54,10 @@ jobs: STORAGE_TYPE: ${{ matrix.storageType }} run: ./gradlew build --build-cache --info + # Build all Fabric versions + - name: Build all Fabric versions + run: ./gradlew :fabric:1.20.1:remapJar :fabric:1.21.1:remapJar :fabric:1.21.4:remapJar --build-cache + - name: Publish to Maven Central # only publish once if: github.ref == 'refs/heads/master' && matrix.java == '21' && matrix.storageType == 'mariadb' diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 3b32d7b7..0172ac88 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -15,14 +15,35 @@ jobs: fail-fast: false matrix: include: + # Bukkit/Paper - platform: Bukkit task: testBukkit build_task: ":BanManagerBukkit:shadowJar" compose_dir: platforms/bukkit - - platform: Fabric - task: testFabric - build_task: ":BanManagerFabric:remapJar" + # Fabric 1.20.1 (legacy modded, Java 17) + - platform: Fabric-1.20.1 + task: testFabric_1_20_1 + build_task: ":fabric:1.20.1:remapJar" compose_dir: platforms/fabric + mc_version: "1.20.1" + java_image: "java17" + fabric_loader: "0.16.10" + # Fabric 1.21.1 (stable 1.21, Java 21) + - platform: Fabric-1.21.1 + task: testFabric_1_21_1 + build_task: ":fabric:1.21.1:remapJar" + compose_dir: platforms/fabric + mc_version: "1.21.1" + java_image: "java21" + fabric_loader: "0.16.9" + # Fabric 1.21.4 (current latest, Java 21) + - platform: Fabric-1.21.4 + task: testFabric_1_21_4 + build_task: ":fabric:1.21.4:remapJar" + compose_dir: platforms/fabric + mc_version: "1.21.4" + java_image: "java21" + fabric_loader: "0.16.9" steps: - uses: actions/checkout@v4 @@ -33,6 +54,17 @@ jobs: java-version: 21 distribution: "temurin" + # Also set up JDK 17 for Fabric 1.20.x builds + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: "temurin" + + # Ensure JDK 21 is the default + - name: Set JDK 21 as default + run: echo "JAVA_HOME=$JAVA_HOME_21_X64" >> $GITHUB_ENV + - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 with: @@ -82,12 +114,20 @@ jobs: - name: Run E2E tests run: ./gradlew :BanManagerE2E:${{ matrix.task }} timeout-minutes: 15 + env: + MC_VERSION: ${{ matrix.mc_version }} + JAVA_IMAGE: ${{ matrix.java_image }} + FABRIC_LOADER: ${{ matrix.fabric_loader }} - name: Collect logs on failure if: failure() working-directory: e2e/${{ matrix.compose_dir }} run: | docker compose logs > ../../e2e-logs-${{ matrix.platform }}.txt 2>&1 || true + env: + MC_VERSION: ${{ matrix.mc_version }} + JAVA_IMAGE: ${{ matrix.java_image }} + FABRIC_LOADER: ${{ matrix.fabric_loader }} - name: Upload logs on failure if: failure() @@ -101,3 +141,7 @@ jobs: if: always() working-directory: e2e/${{ matrix.compose_dir }} run: docker compose down -v || true + env: + MC_VERSION: ${{ matrix.mc_version }} + JAVA_IMAGE: ${{ matrix.java_image }} + FABRIC_LOADER: ${{ matrix.fabric_loader }} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index f0c9637f..5636e3f1 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -21,5 +21,5 @@ dependencies { implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:9.0.0-beta4") implementation("org.jfrog.buildinfo:build-info-extractor-gradle:5.2.5") implementation("org.spongepowered:spongegradle-plugin-development:2.3.0") - implementation("fabric-loom:fabric-loom.gradle.plugin:1.9-SNAPSHOT") + implementation("fabric-loom:fabric-loom.gradle.plugin:1.9.2") } diff --git a/buildSrc/src/main/kotlin/CommonConfig.kt b/buildSrc/src/main/kotlin/CommonConfig.kt index c30fb211..f0ce0390 100644 --- a/buildSrc/src/main/kotlin/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/CommonConfig.kt @@ -27,8 +27,12 @@ fun Project.applyCommonConfiguration() { } } + // Only set Java 1.8 for non-Fabric modules + // Fabric uses toolchain configuration in its build.gradle.kts plugins.withId("java") { - the().setSourceCompatibility("1.8") - the().setTargetCompatibility("1.8") + if (!plugins.hasPlugin("fabric-loom")) { + the().setSourceCompatibility("1.8") + the().setTargetCompatibility("1.8") + } } } diff --git a/e2e/build.gradle.kts b/e2e/build.gradle.kts index 2f048633..b49f7a2c 100644 --- a/e2e/build.gradle.kts +++ b/e2e/build.gradle.kts @@ -4,12 +4,22 @@ plugins { description = "E2E tests for BanManager using Docker and Mineflayer" +// Fabric version configurations +data class FabricVersion(val mcVersion: String, val javaImage: String, val fabricLoader: String) + +val fabricVersions = listOf( + FabricVersion("1.20.1", "java17", "0.16.10"), + FabricVersion("1.21.1", "java21", "0.16.9"), + FabricVersion("1.21.4", "java21", "0.16.9") +) + // Helper function to create platform test tasks fun createPlatformTestTask( taskName: String, platformDir: String, pluginTask: String, - description: String + description: String, + environment: Map = emptyMap() ) { tasks.register(taskName) { group = "verification" @@ -18,6 +28,12 @@ fun createPlatformTestTask( dependsOn(pluginTask) workingDir = file("platforms/$platformDir") + + // Set environment variables for docker-compose + environment.forEach { (key, value) -> + environment(key, value) + } + commandLine( "docker", "compose", "up", "--build", @@ -43,14 +59,47 @@ createPlatformTestTask( "Run Bukkit E2E tests in Docker" ) -// Fabric E2E tests +// Fabric version-specific E2E tests +fabricVersions.forEach { version -> + val versionSuffix = version.mcVersion.replace(".", "_") + + createPlatformTestTask( + "testFabric_${versionSuffix}", + "fabric", + ":fabric:${version.mcVersion}:remapJar", + "Run Fabric ${version.mcVersion} E2E tests in Docker", + mapOf( + "MC_VERSION" to version.mcVersion, + "JAVA_IMAGE" to version.javaImage, + "FABRIC_LOADER" to version.fabricLoader + ) + ) +} + +// Fabric E2E tests - runs latest version (1.21.4) createPlatformTestTask( "testFabric", "fabric", - ":BanManagerFabric:remapJar", - "Run Fabric E2E tests in Docker" + ":fabric:1.21.4:remapJar", + "Run Fabric E2E tests in Docker (latest: 1.21.4)", + mapOf( + "MC_VERSION" to "1.21.4", + "JAVA_IMAGE" to "java21", + "FABRIC_LOADER" to "0.16.9" + ) ) +// Test all Fabric versions +tasks.register("testFabricAll") { + group = "verification" + description = "Run Fabric E2E tests for all supported MC versions" + + fabricVersions.forEach { version -> + val versionSuffix = version.mcVersion.replace(".", "_") + dependsOn("testFabric_${versionSuffix}") + } +} + tasks.register("testAll") { group = "verification" description = "Run E2E tests for all platforms" @@ -93,14 +142,63 @@ tasks.register("logsBukkit") { commandLine("docker", "compose", "logs", "-f", "paper") } -// Helper tasks for Fabric debugging +// Helper tasks for Fabric debugging (version-aware) +// Helper function to create versioned Fabric debug tasks +fun createFabricDebugTasks(mcVersion: String, javaImage: String, fabricLoader: String) { + val versionSuffix = mcVersion.replace(".", "_") + val envVars = mapOf( + "MC_VERSION" to mcVersion, + "JAVA_IMAGE" to javaImage, + "FABRIC_LOADER" to fabricLoader + ) + + tasks.register("startFabric_${versionSuffix}") { + group = "verification" + description = "Start the Fabric $mcVersion test server without running tests (for debugging)" + + dependsOn(":fabric:${mcVersion}:remapJar") + + workingDir = file("platforms/fabric") + envVars.forEach { (key, value) -> environment(key, value) } + commandLine("docker", "compose", "up", "-d", "mariadb", "fabric") + } + + tasks.register("stopFabric_${versionSuffix}") { + group = "verification" + description = "Stop the Fabric $mcVersion test server" + + workingDir = file("platforms/fabric") + envVars.forEach { (key, value) -> environment(key, value) } + commandLine("docker", "compose", "down", "-v") + isIgnoreExitValue = true + } + + tasks.register("logsFabric_${versionSuffix}") { + group = "verification" + description = "Show Fabric $mcVersion server logs" + + workingDir = file("platforms/fabric") + envVars.forEach { (key, value) -> environment(key, value) } + commandLine("docker", "compose", "logs", "-f", "fabric") + } +} + +// Create debug tasks for each Fabric version +fabricVersions.forEach { version -> + createFabricDebugTasks(version.mcVersion, version.javaImage, version.fabricLoader) +} + +// Default Fabric debug tasks (latest version) tasks.register("startFabric") { group = "verification" - description = "Start the Fabric test server without running tests (for debugging)" + description = "Start the Fabric test server without running tests (for debugging) - latest: 1.21.4" - dependsOn(":BanManagerFabric:remapJar") + dependsOn(":fabric:1.21.4:remapJar") workingDir = file("platforms/fabric") + environment("MC_VERSION", "1.21.4") + environment("JAVA_IMAGE", "java21") + environment("FABRIC_LOADER", "0.16.9") commandLine("docker", "compose", "up", "-d", "mariadb", "fabric") } diff --git a/e2e/platforms/fabric/docker-compose.yml b/e2e/platforms/fabric/docker-compose.yml index aa623fea..2432f480 100644 --- a/e2e/platforms/fabric/docker-compose.yml +++ b/e2e/platforms/fabric/docker-compose.yml @@ -1,3 +1,9 @@ +# Parameterized Fabric E2E testing +# Environment variables: +# MC_VERSION: Minecraft version (default: 1.21.4) +# JAVA_IMAGE: Java image tag (default: java21, use java17 for 1.20.x) +# FABRIC_LOADER: Fabric loader version (default: 0.16.9) + services: mariadb: image: mariadb:10.11 @@ -15,12 +21,12 @@ services: - banmanager fabric: - image: itzg/minecraft-server:java21 + image: itzg/minecraft-server:${JAVA_IMAGE:-java21} environment: EULA: "TRUE" TYPE: "FABRIC" - VERSION: "1.21.4" - FABRIC_LOADER_VERSION: "0.16.9" + VERSION: "${MC_VERSION:-1.21.4}" + FABRIC_LOADER_VERSION: "${FABRIC_LOADER:-0.16.9}" ONLINE_MODE: "false" ENABLE_RCON: "true" RCON_PASSWORD: "testing" @@ -43,11 +49,12 @@ services: COPY_CONFIG_DEST: "/data/config/banmanager" volumes: # Mount the mod JAR to a source directory (will be copied on startup) - - ../../../fabric/build/libs/BanManagerFabric.jar:/mods-src/BanManager.jar:ro + # Uses versioned jar name from Stonecutter build + - ../../../fabric/versions/${MC_VERSION:-1.21.4}/build/libs/BanManagerFabric-mc${MC_VERSION:-1.21.4}.jar:/mods-src/BanManager.jar:ro # Mount the plugin config source (will be copied on startup) - ./configs:/config:ro # Cache server data between runs (Fabric JAR, world data) - - fabric-data:/data + - fabric-data-${MC_VERSION:-1.21.4}:/data ports: - "25565:25565" - "25575:25575" @@ -76,6 +83,7 @@ services: RCON_HOST: fabric RCON_PORT: 25575 RCON_PASSWORD: testing + MC_VERSION: "${MC_VERSION:-1.21.4}" networks: - banmanager @@ -84,4 +92,6 @@ networks: driver: bridge volumes: - fabric-data: + fabric-data-1.20.1: + fabric-data-1.21.1: + fabric-data-1.21.4: diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index e5f65468..fbe3e4a0 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,5 +1,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import net.fabricmc.loom.task.RemapJarTask +import org.gradle.jvm.toolchain.JavaLanguageVersion plugins { `java-library` @@ -8,17 +9,44 @@ plugins { `fabric-loom` } +// Read version-specific properties +val minecraftVersion: String by project.extra { property("minecraft_version") as String } +val yarnMappings: String by project.extra { property("yarn_mappings") as String } +val fabricLoaderVersion: String by project.extra { property("fabric_loader") as String } +val fabricApiVersion: String by project.extra { property("fabric_api") as String } +val javaVersion: String by project.extra { property("java_version") as String } + +// Stonecutter version check helper +val mcVersion = minecraftVersion.split(".").let { parts -> + val major = parts.getOrElse(0) { "1" }.toIntOrNull() ?: 1 + val minor = parts.getOrElse(1) { "0" }.toIntOrNull() ?: 0 + val patch = parts.getOrElse(2) { "0" }.toIntOrNull() ?: 0 + Triple(major, minor, patch) +} +val isPreV21 = mcVersion.second < 21 + applyPlatformAndCoreConfiguration() applyShadowConfiguration() +// Configure Java toolchain based on MC version +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(javaVersion.toInt())) + } +} + +// Stonecutter 0.7.11 handles source sets automatically with the "shared sources" fix +// No custom source set configuration needed + publishing { publications { create("mavenJava") { from(components["java"]) + artifactId = "BanManagerFabric-mc$minecraftVersion" pom { name.set("BanManagerFabric") - description.set("BanManager for Fabric") + description.set("BanManager for Fabric - Minecraft $minecraftVersion") url.set("https://github.com/BanManagement/BanManager/") licenses { license { @@ -63,13 +91,13 @@ configurations { } dependencies { - minecraft("com.mojang:minecraft:1.21.4") - mappings("net.fabricmc:yarn:1.21.4+build.1:v2") - modImplementation("net.fabricmc:fabric-loader:0.16.9") + minecraft("com.mojang:minecraft:$minecraftVersion") + mappings("net.fabricmc:yarn:$yarnMappings:v2") + modImplementation("net.fabricmc:fabric-loader:$fabricLoaderVersion") - val modules = listOf( + // Base modules available in all versions + val baseModules = listOf( "fabric-api-base", - "fabric-command-api-v2", "fabric-events-interaction-v0", "fabric-lifecycle-events-v1", "fabric-message-api-v1", @@ -77,8 +105,15 @@ dependencies { "fabric-entity-events-v1" ) - modules.forEach { - modImplementation(fabricApi.module(it, "0.111.0+1.21.4")) + baseModules.forEach { + modImplementation(fabricApi.module(it, fabricApiVersion)) + } + + // Command API: v1 for 1.20.1, v2 for 1.21+ + if (isPreV21) { + modImplementation(fabricApi.module("fabric-command-api-v1", fabricApiVersion)) + } else { + modImplementation(fabricApi.module("fabric-command-api-v2", fabricApiVersion)) } modImplementation("me.lucko:fabric-permissions-api:0.3.1") @@ -87,12 +122,28 @@ dependencies { } tasks.named("processResources") { + duplicatesStrategy = DuplicatesStrategy.INCLUDE + val internalVersion = project.ext["internalVersion"] + val mixinJavaVersion = "JAVA_$javaVersion" + val commandApiModule = if (isPreV21) "fabric-command-api-v1" else "fabric-command-api-v2" inputs.property("internalVersion", internalVersion) + inputs.property("minecraftVersion", minecraftVersion) + inputs.property("mixinJavaVersion", mixinJavaVersion) + inputs.property("commandApiModule", commandApiModule) filesMatching(listOf("plugin.yml", "fabric.mod.json")) { - expand("internalVersion" to internalVersion, "mainPath" to "me.confuser.banmanager.fabric.BMFabricPlugin") + expand( + "internalVersion" to internalVersion, + "mainPath" to "me.confuser.banmanager.fabric.BMFabricPlugin", + "minecraftVersion" to minecraftVersion, + "commandApiModule" to commandApiModule + ) + } + + filesMatching("banmanager.mixins.json") { + expand("mixinJavaVersion" to mixinJavaVersion) } } @@ -108,7 +159,7 @@ tasks.named("shadowJar") { configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"]) archiveBaseName.set("BanManagerFabric") - archiveClassifier.set("") + archiveClassifier.set("mc$minecraftVersion") archiveVersion.set("") dependencies { @@ -132,7 +183,7 @@ tasks.named("remapJar") { inputFile.set(tasks.named("shadowJar").get().archiveFile) archiveBaseName.set("BanManagerFabric") - archiveClassifier.set("") + archiveClassifier.set("mc$minecraftVersion") archiveVersion.set("") } diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricPlayer.java b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricPlayer.java index f1a15ec8..a0709264 100644 --- a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricPlayer.java +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricPlayer.java @@ -16,6 +16,7 @@ import me.confuser.banmanager.common.data.PlayerData; import me.confuser.banmanager.common.util.Message; import me.confuser.banmanager.common.util.UUIDUtils; +//? if >=1.21.1 import net.minecraft.network.packet.s2c.play.PositionFlag; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; @@ -90,7 +91,11 @@ public String getDisplayName() { } public String getName() { + //? if >=1.21 { return getPlayer().getNameForScoreboard(); + //?} else { + /*return getPlayer().getName().getString(); + *///?} } public InetAddress getAddress() { @@ -106,7 +111,14 @@ public boolean teleport(CommonWorld world, double x, double y, double z, float p for (ServerWorld world1 : this.server.getWorlds()) { if (world1.getRegistryKey().getValue().toString().equals(world.getName())) { + //? if >=1.21.4 { return player.teleport(world1, x, y, z, Collections.emptySet(), yaw, pitch, true); + //?} elif >=1.21.1 { + /*return player.teleport(world1, x, y, z, Collections.emptySet(), yaw, pitch); + *///?} else { + /*player.teleport(world1, x, y, z, yaw, pitch); + return true; + *///?} } } diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricServer.java b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricServer.java index 94ec75cf..2778e9be 100644 --- a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricServer.java +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricServer.java @@ -40,7 +40,9 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; +//? if >=1.21 { import net.minecraft.text.TextCodecs; +//?} import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; @@ -338,16 +340,24 @@ public static Text formatMessage(Message message) { } public static Text formatMessage(TextComponent message) { + //? if >=1.21 { return TextCodecs.CODEC .decode(JsonOps.INSTANCE, JsonParser.parseString(GsonComponentSerializer.gson().serialize(message))) .getOrThrow() .getFirst(); + //?} else { + /*return Text.Serializer.fromJson(GsonComponentSerializer.gson().serialize(message)); + *///?} } public static Text formatJsonMessage(String message) { + //? if >=1.21 { return TextCodecs.CODEC .decode(JsonOps.INSTANCE, JsonParser.parseString(message)) .getOrThrow() .getFirst(); + //?} else { + /*return Text.Serializer.fromJson(message); + *///?} } } diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/ServerPlayerNetworkHandlerMixin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/ServerPlayerNetworkHandlerMixin.java index 330ba8c6..6363ee54 100644 --- a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/ServerPlayerNetworkHandlerMixin.java +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/ServerPlayerNetworkHandlerMixin.java @@ -1,9 +1,11 @@ package me.confuser.banmanager.fabric.mixin; +//? if >=1.21 { import net.minecraft.network.message.LastSeenMessageList; import net.minecraft.network.packet.c2s.play.ChatCommandSignedC2SPacket; -import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket; -import net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket; +//?} else { +/*import net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket; +*///?} import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; @@ -23,6 +25,7 @@ public abstract class ServerPlayerNetworkHandlerMixin { @Shadow public abstract ServerPlayerEntity getPlayer(); + //? if >=1.21 { @Inject(method = "handleCommandExecution", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/message/SignedCommandArguments$Impl;(Ljava/util/Map;)V"), cancellable = true) private void banManager_checkCommand(ChatCommandSignedC2SPacket packet, LastSeenMessageList lastSeenMessages, CallbackInfo ci) { // Split the command @@ -34,5 +37,18 @@ private void banManager_checkCommand(ChatCommandSignedC2SPacket packet, LastSeen ci.cancel(); } } + //?} else { + /*@Inject(method = "onCommandExecution", at = @At("HEAD"), cancellable = true) + private void banManager_checkCommand(CommandExecutionC2SPacket packet, CallbackInfo ci) { + // Split the command + String[] args = packet.command().split(" ", 6); + // Get rid of the first / + String cmd = args[0].replace("/", "").toLowerCase(); + + if (new CommonCommandListener(BanManagerPlugin.getInstance()).onCommand(BanManagerPlugin.getInstance().getServer().getPlayer(player.getUuid()), cmd, args)) { + ci.cancel(); + } + } + *///?} } diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/SignUpdateMixin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/SignUpdateMixin.java index 4c1fb2f5..953c4f92 100644 --- a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/SignUpdateMixin.java +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/SignUpdateMixin.java @@ -23,6 +23,10 @@ public class SignUpdateMixin { @Inject(method = "onSignUpdate", at = @At("HEAD"), cancellable = true) private void banmanager$blockMutedSignEdit(UpdateSignC2SPacket packet, List signText, CallbackInfo ci) { + checkMutedSign(ci); + } + + private void checkMutedSign(CallbackInfo ci) { BanManagerPlugin plugin = BanManagerPlugin.getInstance(); if (plugin == null) return; diff --git a/fabric/src/main/resources/banmanager.mixins.json b/fabric/src/main/resources/banmanager.mixins.json index c58e080f..e414e419 100644 --- a/fabric/src/main/resources/banmanager.mixins.json +++ b/fabric/src/main/resources/banmanager.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "me.confuser.banmanager.fabric.mixin", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "${mixinJavaVersion}", "mixins": [ "BanCommandMixin", "BanIpCommandMixin", diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 0fb2312b..c58e1a35 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -3,7 +3,7 @@ "id": "banmanager", "version": "${internalVersion}", "name": "BanManager", - "description": "A database driven punishment system", + "description": "A database driven punishment system for Minecraft", "authors": [ { "name": "confuser", @@ -30,14 +30,14 @@ "banmanager.mixins.json" ], "depends": { - "fabricloader": ">=0.9.0", + "fabricloader": ">=0.14.0", "fabric-api-base": "*", - "fabric-command-api-v2": "*", + "${commandApiModule}": "*", "fabric-events-interaction-v0": "*", "fabric-lifecycle-events-v1": "*", "fabric-message-api-v1": "*", "fabric-networking-api-v1": "*", "fabric-permissions-api-v0": ">=0.3.1", - "minecraft": ">=1.21" + "minecraft": "${minecraftVersion}" } } diff --git a/fabric/stonecutter.gradle.kts b/fabric/stonecutter.gradle.kts new file mode 100644 index 00000000..2694cdfe --- /dev/null +++ b/fabric/stonecutter.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("dev.kikugie.stonecutter") +} + +stonecutter active "1.21.4" /* [SC] DO NOT EDIT */ + +// In Stonecutter 0.7+, chiseled tasks are removed. +// Stonecutter automatically processes code for each version when running build. +// Just run: ./gradlew :fabric:build to build all versions diff --git a/fabric/versions/1.20.1/gradle.properties b/fabric/versions/1.20.1/gradle.properties new file mode 100644 index 00000000..232a58b1 --- /dev/null +++ b/fabric/versions/1.20.1/gradle.properties @@ -0,0 +1,6 @@ +# Minecraft 1.20.1 - Legacy modded version (Java 17) +minecraft_version=1.20.1 +yarn_mappings=1.20.1+build.10 +fabric_loader=0.16.10 +fabric_api=0.92.2+1.20.1 +java_version=17 diff --git a/fabric/versions/1.21.1/gradle.properties b/fabric/versions/1.21.1/gradle.properties new file mode 100644 index 00000000..069995ee --- /dev/null +++ b/fabric/versions/1.21.1/gradle.properties @@ -0,0 +1,6 @@ +# Minecraft 1.21.1 - First stable 1.21 (Java 21) +minecraft_version=1.21.1 +yarn_mappings=1.21.1+build.3 +fabric_loader=0.16.9 +fabric_api=0.102.0+1.21.1 +java_version=21 diff --git a/fabric/versions/1.21.4/gradle.properties b/fabric/versions/1.21.4/gradle.properties new file mode 100644 index 00000000..1d117b35 --- /dev/null +++ b/fabric/versions/1.21.4/gradle.properties @@ -0,0 +1,6 @@ +# Minecraft 1.21.4 - Latest stable with Loom 1.9 support (Java 21) +minecraft_version=1.21.4 +yarn_mappings=1.21.4+build.1 +fabric_loader=0.16.9 +fabric_api=0.111.0+1.21.4 +java_version=21 diff --git a/settings.gradle.kts b/settings.gradle.kts index 32714187..26998dc3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,12 +1,25 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven("https://maven.fabricmc.net/") + maven("https://maven.kikugie.dev/releases") + } +} + +plugins { + id("dev.kikugie.stonecutter") version "0.7.11" + id("org.gradle.toolchains.foojay-resolver-convention") version "0.9.0" +} + rootProject.name = "BanManager" +// Non-Fabric modules (standard includes) include(":BanManagerCommon") include(":BanManagerBukkit") include(":BanManagerBungee") include(":BanManagerSponge") include(":BanManagerLibs") include(":BanManagerVelocity") -include(":BanManagerFabric") include(":BanManagerE2E") project(":BanManagerCommon").projectDir = file("common") @@ -15,5 +28,22 @@ project(":BanManagerBungee").projectDir = file("bungee") project(":BanManagerSponge").projectDir = file("sponge") project(":BanManagerLibs").projectDir = file("libs") project(":BanManagerVelocity").projectDir = file("velocity") -project(":BanManagerFabric").projectDir = file("fabric") project(":BanManagerE2E").projectDir = file("e2e") + +// Fabric module with Stonecutter multi-version support +stonecutter { + centralScript = "build.gradle.kts" + kotlinController = true + + shared { + // Define version mappings for Fabric + vers("1.20.1", "1.20.1") + vers("1.21.1", "1.21.1") + vers("1.21.4", "1.21.4") + } + + create(":fabric") +} + +// Set the fabric project directory +project(":fabric").projectDir = file("fabric")