您尚未登录,请登录后浏览更多内容! 登录 | 加入最MC

QQ登录

只需一步,快速开始

 找回密码
 加入最MC

QQ登录

只需一步,快速开始

查看: 4544|回复: 5
打印 上一主题 下一主题

[资源] [探讨向] 有关Protocollib插件的二次开发

[复制链接]
  • TA的每日心情
    擦汗
    2016-5-27 18:53
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    跳转到指定楼层
    楼主
    发表于 2016-5-26 22:51:26 | 只看该作者 |0人打赏回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 嘟嘟 于 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)
    之后就有些类似于反射了
    1. pc.getTitleActions().write(0, EnumWrappers.TitleAction.TITLE);
    复制代码
    其中getTitleActions获取到了包中所有的TitleAction
    write表示写入参数 0代表了第一个数据
    之后就是一个枚举 恩 就是这样 其他的也类似
    1.         pc.getChatComponents().write(0, WrappedChatComponent.fromText(text));
    2.         pc.getIntegers().write(0, FadeIn);
    3.         pc.getIntegers().write(1, Time);
    4.         pc.getIntegers().write(2, FadeOut);
    复制代码
    对 就是这样 那么我们已经伪造好了这个包
    此时可以使用全局变量pc的方法sendServerPacket给玩家发出伪造包
    参数有三: 玩家 包 一个布尔值
    布尔值就代表着会不会被监听器监听 false就是不会 一般用false
    好了 现在你可以在玩家登入的时候 调用这个方法 给玩家显现一个title



    不要看这里

    事实上 Player类有自带的方法sendTitle 有两个参数 第一个为title 第二个为subtitle 根本不用这么麻烦


    关于此贴欢迎踊跃提出疑问 我会一一解答的 (反正梨子大哥也在这里我不方)


    评分

    参与人数 2人气 +9 MC币 +17 收起 理由
    叫我赖天王 + 4 + 12 唉哟不错哟!
    ncbql + 5 + 5 山寨

    查看全部评分

    打赏

    0

    收藏

    0

    支持

    2

    反对

    0

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情

    2015-11-5 13:08
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    沙发
    发表于 2016-5-26 22:55:04 | 只看该作者
    然而那个sendTitle是弃用的,我怕在未来移除,没敢用

    点评

    梨子在zuimc居然比我等级高  详情 回复 发表于 2016-5-26 22:56
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    擦汗
    2016-5-27 18:53
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    板凳
     楼主| 发表于 2016-5-26 22:56:14 | 只看该作者
    zhouhaha 发表于 2016-5-26 22:55
    然而那个sendTitle是弃用的,我怕在未来移除,没敢用

    梨子在zuimc居然比我等级高

    事实上 到了1.9这个还没被移除
    期待1.10会移除把
    话说我为什么会期待这种东西
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    开心
    2016-5-31 20:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    地板
    发表于 2016-5-31 08:29:52 | 只看该作者
    你这个山寨的我给满分
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    奋斗
    2021-11-19 22:23
  • 签到天数: 368 天

    [LV.9]以坛为家II

    5#
    发表于 2016-6-1 03:00:35 | 只看该作者
    路过打个酱油。。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    奋斗
    2021-11-19 22:23
  • 签到天数: 368 天

    [LV.9]以坛为家II

    6#
    发表于 2016-6-1 03:00:53 | 只看该作者
    路过打个酱油。。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    您需要登录后才可以回帖 登录 | 加入最MC

    本版积分规则