public class BoxBlockEntity extends BlockEntity implements NamedScreenHandlerFactory, ImplementedInventory, Tickable { private final DefaultedList inventory = DefaultedList.ofSize(9, ItemStack.EMPTY); // 这是我们希望同步的整型,每刻会增加 1。 private int syncedInt; // PropertyDelegate 是一个接口,我们将在这里使用内联实现。 // 它通常可以包含多个整型作为索引标志的数据,但是在本例中只有一个整型 private final PropertyDelegate propertyDelegate = new PropertyDelegate() { @Override public int get(int index) { return syncedInt; } @Override public void set(int index, int value) { syncedInt = value; } // 这里应该返回你的 delegate 中整型的数量,在本例中只有一个 @Override public int size() { return 1; } }; public BoxBlockEntity() { super(Test.BOX_BLOCK_ENTITY); } // 来自 ImplementedInventory @Override public DefaultedList getItems() { return inventory; } //这些方法来自 NamedScreenHandlerFactory 接口 @Override public @Nullable ScreenHandler createMenu(int syncId, PlayerInventory playerInventory, PlayerEntity player) { // 当我们的类执行完物品栏时,我们将此提供给 screenHandler // 只有服务器在开始时拥有物品栏,这将会在 ScreenHandler 中同步到客户端 // 类似于物品栏:服务器获得 PropertyDelegate 并将其直接给 screen handler 的服务器实例 return new BoxScreenHandler(syncId, playerInventory, this,propertyDelegate); } @Override public Text getDisplayName() { // 对于 1.18.2 或更低版本,请使用 return new TranslatableText(getCachedState().getBlock().getTranslationKey()); return Text.translatable(getCachedState().getBlock().getTranslationKey()); } // 每刻增加一个同步的整型,我们仅在服务器上这么做,从而用于演示。 @Override public void tick() { if(!world.isClient) syncedInt++; } }