trychen
本帖最后由 trychen 于 2017-7-15 08:34 编辑

用处:
  • 通过 Sign 作为输入密码的方式
  • 作为高级的输入方式
  • 显示提示

知识前提:

基本实现原理:

准备工作:


初始化变量:
  1. ProtocolManager manager = ProtocolLibrary.getProtocolManager();
复制代码
组为了让大家看的更清晰,代码尽量拆分的更短!下面开始创建 BLOCK_CHANGE 包:
  1. PacketContainer blockChange = manager.createPacket(PacketType.Play.Server.BLOCK_CHANGE);
  2. blockChange.getBlockPositionModifier().write(0, blockPosition);
  3. blockChange.getBlockData().write(0, WrappedBlockData.createData(Material.SIGN_POST));
复制代码
这样,ProtocolLib 就会创建一个 BLOCK_CHANGE 包,并修改里面的 BlockPosition 等变量为我们需要的内容,达到伪造一个牌子的效果。接着我们要创建 UPDATE_SIGN 包来更新我们需要的内容:
  1. PacketContainer updateSign = manager.createPacket(UPDATE_SIGN);
  2. updateSign.getBlockPositionModifier().write(0, blockPosition);
  3. updateSign.getChatComponentArrays().write(0, new WrappedChatComponent[]{WrappedChatComponent.fromText(lines[0]), WrappedChatComponent.fromText(lines[1]), WrappedChatComponent.fromText(lines[2]), WrappedChatComponent.fromText(lines[3])});
  4.                     
复制代码
这个包需要注意的是,版本差异较大,旧版本(1.8 || Older)可能是通过NBT来修改,这就需要以下方法:
  1. PacketContainer updateSign = manager.createPacket(UPDATE_SIGN);
  2. updateSign.getBlockPositionModifier().write(0, blockPosition);
复制代码
然后我们发送一个打开Sign GUI的包即可完成创建包了:
  1. PacketContainer open = manager.createPacket(OPEN_SIGN_ENTITY);
  2. open.getBlockPositionModifier().write(0, blockPosition);
复制代码
最后我们就可以把上述包都发送给玩家:
  1. manager.sendServerPacket(player, blockChange);
复制代码
这样我们就完成了打开牌子的UI

监听关闭我们打开的牌子
如果你是想通过牌子来修改某些东西,那我们就需要读取牌子修改后的内容,这时我们就需要通过监听包。
一般的实现原理:

开始监听
  1. <blockquote>manager.addPacketListener(this.packetListener = new PacketAdapter(plugin, new PacketType[]{PacketType.Play.Client.UPDATE_SIGN}) {
复制代码
以上代码纯手撸(这编辑器还吞格式,恶心),可能有写错,欢迎提出。

总结
这样你就使用 ProtocolLib 打开了 Sign GUI,本教程更希望你能掌握 ProtocolLib 的基本使用。

本文未仔细校验


来自群组: Unknown Domain

支持 最近正好在研究这方面东西 遇到了一些小问题 ~

顺便来一顶 混乱帽

HanMaDaDa
支持 最近正好在研究这方面东西 遇到了一些小问题 ~

顺便来一顶 混乱帽

syn614211648
自从梨子的ProtocolLib的教程贴子开始就感受到了发包的神奇,直到现在发包也是我的一个心梗 [捂脸]

JackC92
打开牌子一定要有个Block牌子?我咋记得不用的啊

sky015121
感谢楼主分享,希望以后有多多此类教程,论坛上的教程真的太少了,国内的开发环境真的是艰难

RainIFunS
包...真是个可怕的东西 心塞....

第一页 上一页 下一页 最后一页