NMS Worldv1.0.0已發布

NMS 自定義方塊實體

NMS Block Entity

繼承 NMS BlockEntity 實作自定義方塊實體,支援 NBT 讀寫、伺服器端 Tick、封包同步(Paper NMS + Mojang mappings)。

nmsblock-entitytile-entitynbttickermojang-mapped
更新:2026年4月30日GitHub

NMS Block Entity

目的

繼承 NMS BlockEntity 實作自定義方塊實體,實現 NBT 讀寫、伺服器端 Tick 邏輯(BlockEntityTicker)、以及透過封包同步狀態至客戶端。


平台需求

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

產生的代碼

CustomBlockEntity.java

public class CustomBlockEntity extends BlockEntity {

    private int storedEnergy = 0;

    @Override
    protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) {
        super.saveAdditional(tag, registries);
        tag.putInt("storedEnergy", storedEnergy);
    }

    @Override
    public void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) {
        super.loadAdditional(tag, registries);
        storedEnergy = tag.getInt("storedEnergy");
    }

    @Override
    public ClientboundBlockEntityDataPacket getUpdatePacket() {
        return ClientboundBlockEntityDataPacket.create(this);
    }
}

BlockEntityHelper.java(工具類)

// 在指定位置取得自定義 BlockEntity
Optional<CustomBlockEntity> be = BlockEntityHelper.get(world, pos, CustomBlockEntity.class);

// 標記已修改(觸發 NBT 儲存與客戶端同步)
BlockEntityHelper.markDirtyAndSync(level, blockEntity);

執行緒安全

  • 所有 BlockEntity 操作必須在主執行緒呼叫
  • getUpdatePacket() 封包在 Netty IO 執行緒傳送,建構資料須在主執行緒完成