diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 517a36e2..d376f37b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,14 @@ jobs: verify: needs: wrapper-validation + strategy: + fail-fast: false + matrix: + paper-api-version: + - 26.2.build.111-stable + - 26.3.build.157-beta runs-on: ubuntu-latest + name: Verify ${{ matrix.paper-api-version }} steps: - uses: actions/checkout@v7 - name: Set up Java 25 @@ -41,12 +48,37 @@ jobs: shell: bash run: | bash .github/scripts/gradle-with-transient-retry.sh gradle-verify.log -- \ - ./gradlew clean check :mahjong-plugin:jar :mahjong-plugin:verifyThinJar --no-daemon --stacktrace + ./gradlew clean check :mahjong-plugin:jar :mahjong-plugin:verifyThinJar \ + -PpaperApiVersion="${{ matrix.paper-api-version }}" --no-daemon --stacktrace + - name: Verify portable and Paper adapter bytecode + shell: bash + run: | + python3 - <<'PY' + from pathlib import Path + import struct + portable = ["mahjong-rule-spi", "mahjong-domain", "mahjong-application", + "mahjong-rule-runtime", "mahjong-presentation"] + adapters = ["mahjong-platform-paper", "mahjong-craftengine", "mahjong-plugin"] + def majors(module): + root = Path("modules") / module / "build/classes/java/main" + return {struct.unpack(">H", p.read_bytes()[6:8])[0] + for p in root.rglob("*.class")} + for module in portable: + got = majors(module) + if got != {65}: + raise SystemExit(f"{module} must remain Java 21 major 65, got {sorted(got)}") + for module in adapters: + got = majors(module) + if got != {69}: + raise SystemExit(f"{module} must remain Java 25 major 69, got {sorted(got)}") + print("portable modules=Java21/65; Paper adapters=Java25/69") + PY + - name: Upload test reports if: always() uses: actions/upload-artifact@v7 with: - name: module-test-reports-linux + name: module-test-reports-linux-${{ matrix.paper-api-version }} path: | modules/*/build/reports/tests/** gradle-verify.log diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 45a5fdab..5029fde6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -MahjongPaper's portable core and rule SDK use Java 21. The Paper/CraftEngine adapters and final plugin use Java 25 for Paper 26.2. Gradle Kotlin DSL and the CraftEngine bundle generator are the only Kotlin build-time code. +MahjongPaper's portable core and rule SDK use Java 21. The Paper/CraftEngine adapters and final plugin use Java 25 for Paper 26.3. Gradle Kotlin DSL and the CraftEngine bundle generator are the only Kotlin build-time code. Dependency direction: diff --git a/README.md b/README.md index e9ed579f..dc818b67 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Player clicks CraftEngine furniture or runs a command | Component | Required version | |---|---| | Java | **25** | -| Server | Paper/Folia **26.2** | +| Server | Paper/Folia **26.3** | | CraftEngine | **26.8 API line**: major/minor must be 26.8; 26.8.x/build suffixes are accepted, 26.9 is not | | Client | Must accept the CraftEngine-generated server resource pack | | First boot network | Maven Central mirror and `repo.momirealms.net` | diff --git a/README.zh-CN.md b/README.zh-CN.md index 3022715f..f688bc72 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -43,7 +43,7 @@ MahjongPaper 是一个面向 Paper/Folia 的 CraftEngine 麻将核心。核心 | 项目 | 要求 | |---|---| | Java | **25** | -| 服务端 | Paper/Folia **26.2** | +| 服务端 | Paper/Folia **26.3** | | CraftEngine | **26.8 API 线**:major/minor 必须是 26.8;允许 26.8.x 或构建后缀,不接受 26.9 | | 客户端 | 必须接受 CraftEngine 生成的服务器资源包 | | 网络 | 首次启动需访问 Maven Central 镜像与 `repo.momirealms.net` | diff --git a/docs/installation.zh-CN.md b/docs/installation.zh-CN.md index 8bdff42a..ec978397 100644 --- a/docs/installation.zh-CN.md +++ b/docs/installation.zh-CN.md @@ -5,7 +5,7 @@ 要求: - Java 25; -- Paper 或 Folia 26.2; +- Paper 或 Folia 26.3; - CraftEngine 26.8 API 线(major/minor 必须为 26.8,允许 patch/build 后缀,不接受 26.9;升级 CE API 线前必须先升级 MahjongPaper); - CraftEngine 保持默认的 `misc.delay-configuration-load: true`,以便依赖插件在资源解析前注册行为与条件; - 至少一个已安装、已验证并在重启后激活的官方规则包。 diff --git a/modules/mahjong-craftengine/build.gradle.kts b/modules/mahjong-craftengine/build.gradle.kts index eb56a416..96cc7712 100644 --- a/modules/mahjong-craftengine/build.gradle.kts +++ b/modules/mahjong-craftengine/build.gradle.kts @@ -2,6 +2,10 @@ plugins { `java-library` } +val paperApiVersion = providers.gradleProperty("paperApiVersion") + .orElse("26.3.build.157-beta") + .get() + java { sourceCompatibility = JavaVersion.VERSION_25 targetCompatibility = JavaVersion.VERSION_25 @@ -21,11 +25,11 @@ dependencies { compileOnly("net.momirealms:craft-engine-core:26.8") compileOnly("net.momirealms:craft-engine-bukkit:26.8") compileOnly("net.momirealms:craft-engine-bukkit-proxy:26.8") - compileOnly("io.papermc.paper:paper-api:26.2.build.111-stable") + compileOnly("io.papermc.paper:paper-api:$paperApiVersion") compileOnly("net.momirealms:sparrow-reflection:0.34") testImplementation("net.momirealms:craft-engine-core:26.8") testImplementation("net.momirealms:craft-engine-bukkit:26.8") testImplementation("net.momirealms:craft-engine-bukkit-proxy:26.8") - testImplementation("io.papermc.paper:paper-api:26.2.build.111-stable") + testImplementation("io.papermc.paper:paper-api:$paperApiVersion") testImplementation("net.momirealms:sparrow-reflection:0.34") } diff --git a/modules/mahjong-craftengine/src/main/java/top/ellan/mahjong/craftengine/interaction/CraftEngineInteractionListener.java b/modules/mahjong-craftengine/src/main/java/top/ellan/mahjong/craftengine/interaction/CraftEngineInteractionListener.java index cd9a0149..7600d2d1 100644 --- a/modules/mahjong-craftengine/src/main/java/top/ellan/mahjong/craftengine/interaction/CraftEngineInteractionListener.java +++ b/modules/mahjong-craftengine/src/main/java/top/ellan/mahjong/craftengine/interaction/CraftEngineInteractionListener.java @@ -13,8 +13,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerAnimationEvent; -import org.bukkit.event.player.PlayerAnimationType; +import io.papermc.paper.event.player.PlayerArmSwingEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -132,9 +131,8 @@ public void onInteract(PlayerInteractEvent event) { } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onArmSwing(PlayerAnimationEvent event) { - if (event.getAnimationType() == PlayerAnimationType.ARM_SWING - && dispatchRay(event.getPlayer(), event.getPlayer().isSneaking(), null)) { + public void onArmSwing(PlayerArmSwingEvent event) { + if (dispatchRay(event.getPlayer(), event.getPlayer().isSneaking(), null)) { event.setCancelled(true); } } diff --git a/modules/mahjong-platform-paper/build.gradle.kts b/modules/mahjong-platform-paper/build.gradle.kts index 172c2549..630ac0d4 100644 --- a/modules/mahjong-platform-paper/build.gradle.kts +++ b/modules/mahjong-platform-paper/build.gradle.kts @@ -2,6 +2,10 @@ plugins { `java-library` } +val paperApiVersion = providers.gradleProperty("paperApiVersion") + .orElse("26.3.build.157-beta") + .get() + java { sourceCompatibility = JavaVersion.VERSION_25 targetCompatibility = JavaVersion.VERSION_25 @@ -15,5 +19,5 @@ tasks.withType().configureEach { dependencies { implementation(project(":mahjong-application")) implementation(project(":mahjong-domain")) - compileOnly("io.papermc.paper:paper-api:26.2.build.111-stable") + compileOnly("io.papermc.paper:paper-api:$paperApiVersion") } diff --git a/modules/mahjong-plugin/build.gradle.kts b/modules/mahjong-plugin/build.gradle.kts index 7c5387fa..269fcbca 100644 --- a/modules/mahjong-plugin/build.gradle.kts +++ b/modules/mahjong-plugin/build.gradle.kts @@ -1,4 +1,5 @@ import java.util.zip.ZipFile + import org.gradle.jvm.tasks.Jar import top.ellan.mahjong.build.CraftEngineBundleGenerator @@ -6,6 +7,10 @@ plugins { java } +val paperApiVersion = providers.gradleProperty("paperApiVersion") + .orElse("26.3.build.157-beta") + .get() + java { sourceCompatibility = JavaVersion.VERSION_25 targetCompatibility = JavaVersion.VERSION_25 @@ -96,8 +101,8 @@ val generateRuntimeLibraryCatalog = dependencies { internalProjectPaths.forEach { implementation(project(it)) } - compileOnly("io.papermc.paper:paper-api:26.2.build.111-stable") - testImplementation("io.papermc.paper:paper-api:26.2.build.111-stable") + compileOnly("io.papermc.paper:paper-api:$paperApiVersion") + testImplementation("io.papermc.paper:paper-api:$paperApiVersion") compileOnly("net.momirealms:craft-engine-core:26.8") compileOnly("net.momirealms:craft-engine-bukkit:26.8")