- UID
- 61371
- 阅读权限
- 20
- 注册时间
- 2016-2-5
- 最后登录
- 1970-1-1
- 在线时间
- 小时
- 人气
- 点
- MC币
- 个
- 贡献
- 点
TA的每日心情 | 擦汗 2016-5-27 18:53 |
---|
签到天数: 9 天 [LV.3]偶尔看看II
|
本帖最后由 嘟嘟 于 2016-5-26 22:58 编辑
嘟嘟保留此文章所有权利 版权所有 严禁抄袭
关于此贴的发布首先要感谢McBBS的梨子大兄弟
他所写的一篇关于PL的教程对我的pl开发做了很大的帮助
其次也要感谢上古之石技术部众人 我在pl开发中的
疑问 大部分也是他们解决的
至此 献上真诚的感谢
---------------------------------------------------------普通的分割线--------------------------------------------------------------
本篇适合有一定bukkit插件开发基础的读者
站内有几篇不错的主题 值得一阅
一般来讲 有关pl的插件基本都稍简洁
为何如此可以参考以下解析
首先去Bukkit下载到Protocollib的最新版本
或者也可以到站内或mcbbs下载到此插件
按照一般bukkit插件的开发流程导入此插件为库
声明全局变量 ProtocolManager pm并在OnEnable中赋值为ProtocolLibrary.getProtocolManager()
-------------------------------------------准备工作至此完成 开始伪造包发给客户端------------------------------------------
到现在为止 整个开发过程进入了最艰难的步骤之一
首先确认我们需要给客户端发什么包 例如梨子效果包(PacketPlayOutTitle)
引用梨子的模板:
Packet = 这是一个数据包
Play = 玩家在服务器中玩耍
Out = 客户端收到的包 即服务端发出的包
title = 不解释
其他包都类似于此
那么伪造数据包也同时需要伪造所有的参数
使用反编译工具(必须保证可以看见源码)打开服务端文件
反编译如下类:net.minecraft.server.XXX.Packetxxxx
由于nms(net.Minecraft.server的简称)中全局变量的都定义在了最开头
虽然有一些混淆但是很清晰 在title包中我们看到了有如下数据:
private EnumTitleAction a;
private IChatBaseComponent b;
private int c;
private int d;
private int e;
根据翻译我们得出
a = title种类(title subtitle之类)
b = title消息
c d e 淡入 持续 淡出
如果不能确定的话 也可以上这里查 (但是这里面可能有些数据不相应)
新建一个方法title 参数如下:「String text, int FadeIn, int FadeOut ,int Time」
定义一个变量 PacketContainer pc 赋值为new PacketContainer(PacketType.Play.Server.title)
之后就有些类似于反射了- pc.getTitleActions().write(0, EnumWrappers.TitleAction.TITLE);
复制代码 其中getTitleActions获取到了包中所有的TitleAction
write表示写入参数 0代表了第一个数据
之后就是一个枚举 恩 就是这样 其他的也类似- pc.getChatComponents().write(0, WrappedChatComponent.fromText(text));
- pc.getIntegers().write(0, FadeIn);
- pc.getIntegers().write(1, Time);
- pc.getIntegers().write(2, FadeOut);
复制代码 对 就是这样 那么我们已经伪造好了这个包
此时可以使用全局变量pc的方法sendServerPacket给玩家发出伪造包
参数有三: 玩家 包 一个布尔值
布尔值就代表着会不会被监听器监听 false就是不会 一般用false
好了 现在你可以在玩家登入的时候 调用这个方法 给玩家显现一个title
不要看这里
关于此贴欢迎踊跃提出疑问 我会一一解答的 (反正梨子大哥也在这里我不方)
|
评分
-
查看全部评分
|