User Tools

Site Tools


zh_cn:tutorial:extendedscreenhandler

This is an old revision of the document!


方块实体

由于 Block 类根本不需要更改,我们将其留在这里。

我们的方块实体现在实现了 “ExtendedScreenHandlerFactory”,这个接口为我们提供了 “writeScreenOpeningData” 方法,当它请求客户端(client)打开一个 “ScreenHandler” 时,将在服务器(server)上调用该方法。 您写入 “PacketByteBuf” 的数据将通过网络传输到客户端(client)。

BoxBlockEntity.java
  1. public class BoxBlockEntity extends BlockEntity implements ExtendedScreenHandlerFactory, ImplementedInventory {
  2. private final DefaultedList<ItemStack> inventory = DefaultedList.ofSize(9, ItemStack.EMPTY);
  3.  
  4. public BoxBlockEntity() {
  5. super(Test.BOX_BLOCK_ENTITY);
  6. }
  7.  
  8.  
  9. //来自 ImplementedInventory 接口
  10.  
  11. @Override
  12. public DefaultedList<ItemStack> getItems() {
  13. return inventory;
  14.  
  15. }
  16.  
  17. //这些方法来自 NamedScreenHandlerFactory 接口
  18.  
  19. @Override
  20. public @Nullable ScreenHandler createMenu(int syncId, PlayerInventory playerInventory, PlayerEntity player) {
  21. //我们将它提供给 screenHandler 作为我们的类实现 Inventory
  22. //一开始只有服务器(Server)有 Inventory ,这将在 ScreenHandler 中同步到客户端(Cilent)
  23. return new BoxScreenHandler(syncId, playerInventory, this);
  24. }
  25.  
  26. @Override
  27. public Text getDisplayName() {
  28. return new TranslatableText(getCachedState().getBlock().getTranslationKey());
  29. }
  30.  
  31. //此方法来自 ExtendedScreenHandlerFactory
  32.  
  33. //当它请求客户端(client)打开 screenHandler 时,在服务器(server)上调用此方法
  34. //您写入 packetByteBuf 的内容将自动以(数据)包的形式传输到客户端
  35. //并在客户端(client)调用带有 packetByteBuf 参数的 ScreenHandler 构造函数
  36. //
  37. //您在此处插入内容的顺序与您需要提取它们的顺序相同。您不需要颠倒顺序!
  38. @Override
  39. public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf) {
  40. //pos 字段是 BlockEntity 的公共字段
  41. packetByteBuf.writeBlockPos(pos);
  42. }
  43. }
zh_cn/tutorial/extendedscreenhandler.1644498137.txt.gz · Last modified: 2022/02/10 13:02 by timothy_starman