Skip to content
MJP
/ NMS 封包發送器

NMS · NMS 封包

NMS 封包發送器

產生封包發送工具類,透過 ServerPlayer.connection 將 Clientbound 封包推送至客戶端。

NMS已發布v1.0.0nms-packet-sender更新於 2026年4月19日

觸發關鍵字

封包發送packet sender自定義封包custom packetClientbound推送封包send packet

NMS Packet Sender

目的

產生標準的 NMS 封包發送工具類,涵蓋單人、多人、廣播、延遲發送等情境。所有發送點透過 ServerPlayer.connection.send(Packet<?>) 進入 Netty write queue。


替代方案

先確認 Paper API 能否做到:單一玩家的世界邊界/時間/天氣/隱藏玩家見 paper-client-side-effects;action bar、title、boss bar 用 Adventure;改寫伺服器原本會送的封包見 paper-packetevents-filter。


平台需求

  • Paper 1.21.11 / 26.2(兩版皆經編譯驗證;版本差異以行尾 // @1.21.11: 標註)
  • Paperweight userdev 2.0.0-beta.24+
  • Mojang 官方名稱(Minecraft 26.1 起不再混淆)
  • Java 21(1.21.11)/25(26.2)

產生的代碼

PacketSender.java

@SuppressWarnings("UnstableApiUsage")
public final class PacketSender {

    public static void send(Player player, Packet<?> packet) {
        ServerPlayer nms = ((CraftPlayer) player).getHandle();
        if (nms.connection == null) return;
        nms.connection.send(packet);
    }

    public static void broadcast(Packet<?> packet) {
        Bukkit.getOnlinePlayers().forEach(p -> send(p, packet));
    }

    public static void sendLater(Plugin plugin, Player player, Packet<?> packet, long delayTicks) {
        Bukkit.getScheduler().runTaskLater(plugin, () -> send(player, packet), delayTicks);
    }
}

PacketBuilder.java(Action Bar / Title / CustomPayload)

// Action Bar
ClientboundSetActionBarTextPacket actionBar(Component message)

// Title
ClientboundSetTitleTextPacket title(Component title)

// Plugin Message
ClientboundCustomPayloadPacket customPayload(Identifier channel, byte[] data)

執行緒安全

  • send() 可在任意執行緒呼叫(Netty 排入 write queue)
  • 封包內容建構若依賴世界狀態,必須在主執行緒完成
  • connection 欄位在玩家離線時為 null,需先檢查