User Tools

Site Tools


zh_cn:tutorial:extendedscreenhandler

This is an old revision of the document!


​使用扩展的 ScreenHandler 同步数据 ​

在本教程中,我们将使用 ExtendedScreenHandler ​在 ScreenHandler 打开时将任意数据从服务器传输到客户端 ScreenHandler。

在我们的示例中,我们将用方块的位置作为容器的标题。

方块实体

由于 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.1644498223.txt.gz · Last modified: 2022/02/10 13:03 by timothy_starman