NMS Bridgev1.0.0已發布

NMS 多版本適配器

NMS Version Adapter

抽象 Adapter 介面搭配版本特定實作與 runtime dispatch,讓同一 plugin 支援多個 Paper 1.21.x 版本。

nmsadaptermulti-versionstrategy-patternpaperweight
更新:2026年4月19日GitHub

NMS Version Adapter

目的

建立抽象 Adapter 介面定義共通 NMS 操作,為每個支援的 MC 版本提供具體實作,runtime 時根據伺服器版本自動選擇。


平台需求

  • Paper 1.21 – 1.21.3
  • 建議搭配 multi-module Gradle build(每個版本各自 module 使用 Paperweight 編譯)

產生的代碼

NmsAdapter.java(介面)

public interface NmsAdapter {
    NmsVersion version();
    void sendActionBar(Player player, Component message);
    int getLatency(Player player);
    void spawnParticleClient(Location loc, String particleKey, int count);
}

AdapterRegistry.java

// 啟動時注冊各版本 adapter
AdapterRegistry.register(new V1_21_Adapter());
AdapterRegistry.register(new V1_21_3_Adapter());
AdapterRegistry.initialize(); // 自動偵測版本並選擇

// 使用(版本無關)
AdapterRegistry.get().sendActionBar(player, Component.text("歡迎!"));

NmsVersion.java

public enum NmsVersion {
    V1_21, V1_21_1, V1_21_3, UNSUPPORTED;

    public static NmsVersion detect() {
        return switch (Bukkit.getMinecraftVersion()) {
            case "1.21" -> V1_21;
            case "1.21.1" -> V1_21_1;
            case "1.21.3" -> V1_21_3;
            default -> UNSUPPORTED;
        };
    }
}

Multi-module Gradle 結構

my-plugin/
├── core/           # NmsAdapter 介面(只依賴 paper-api)
├── adapter-v1_21/  # Paperweight 1.21.1 編譯
├── adapter-v1_21_3/# Paperweight 1.21.3 編譯
└── plugin/         # shadowJar 整合打包