NMS · NMS 封包
NMS 封包發送器
產生封包發送工具類,透過 ServerPlayer.connection 將 Clientbound 封包推送至客戶端。
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,需先檢查