NMS Packetv1.0.0已發布

NMS 封包發送器

NMS Packet Sender

產生封包發送工具類,透過 ServerPlayer.connection 將 Clientbound 封包推送至客戶端(Paper NMS + Mojang mappings)。

nmspacketnettypaperweightclientboundmojang-mapped
更新:2026年4月19日GitHub

NMS Packet Sender

目的

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


平台需求

  • Paper 1.21 – 1.21.3
  • Paperweight userdev 1.7.2+
  • Mojang mappings(Paper 1.20.5+ 原生支援)
  • Java 21

產生的代碼

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(ResourceLocation channel, byte[] data)

執行緒安全

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