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

QQ登录

只需一步,快速开始

 找回密码
 加入最MC

QQ登录

只需一步,快速开始

查看: 3577|回复: 0

[教程]使用PacketListenerAPI更方便地处理数据包

[复制链接]
  • TA的每日心情
    慵懒
    2019-2-10 10:44
  • 签到天数: 56 天

    [LV.5]常住居民I

    发表于 2017-3-17 19:46:29 | 显示全部楼层 |0人打赏|阅读模式
    本帖最后由 lss233 于 2017-3-26 10:43 编辑

    PacketListenerAPI
    PacketListenerAPI是一个简便的数据包处理API,它提供了接受和发送数据包的功能,同时也包含了对一些数据包内容的修改,比较适用于改变游戏特性。

    添加依赖

    A.通过Maven

    如果你是通过Maven来构建自己插件的,那么把Vault添加到依赖中十分简单。
    打开pom.xml,在<repositories>....</repositories>代码段中加入以下内容:
    1. <repository>
    2.                 <id>inventive-repo</id>
    3.                 <url>https://repo.inventivetalent.org/content/groups/public/</url>
    4.         </repository>
    复制代码

    然后,在<dependencies>....</dependencies>代码段中加入以下内容:
    1. <dependency>
    2.                 <groupId>org.inventivetalent.packetlistener</groupId>
    3.                 <artifactId>api</artifactId>
    4.                 <version>3.5.2-SNAPSHOT</version>
    5.         </dependency>
    复制代码

    保存文件,你的Eclipse会在后台自动为你下载依赖。
    你问我代码缩进?被论坛吃了,用你的IDE自动进行代码格式化吧。
    B.通过常规方法

    这里的常规方法指的是通过直接创建默认的Java项目来开发插件的,我认为这是一种很不好的开发习惯。

    • 下载插件,链接:点我
    • 右键项目,点击属性。
    • Java构建路径中,点击添加外部Jar
    • 选中刚刚下载好的插件,点击确定
    其实这些步骤就和你当初导入服务端核心是一样的。
    在plugin.yml中声明依赖

    打开plugin.yml,在里面添加下面这行代码:
    1. depend: [PacketListenerAPI]
    复制代码


    使用API

    在你的插件中加入下面这样的代码,即可通过API管理数据包。
    1. PacketListenerAPI.addPacketHandler(new PacketHandler() {

    2.                         @Override
    3.                         public void onSend(SentPacket packet) {
    4.                               //发送数据时触发
    5.                         }

    6.                         @Override
    7.                         public void onReceive(ReceivedPacket packet) {
    8.                               //接收数据时触发
    9.                         }

    10.         });
    复制代码

    然后,我们只需要在相应方法内进行判断即可:
    1.                 if (packet.getPacketName().equals("PacketPlayOutSpawnEntity")) {
    2.                   // 实体生成
    3.                 }
    复制代码

    以及修改内容..
    1.                 if(packet.getPacketName().equals("PacketPlayOutSpawnEntity")) {
    2.                   packet.setPacketValue("f", <EntityID>);//f 在这个数据包中的定义为实体类型,数据类型是整数。
    3.                 }
    复制代码
    这就是最简单的使用方法,以至于你如何使用,就看你的创造能力了。

    后话

    如果你在使用过程中遇到了问题,下面这些链接说不定能帮助到你:
    如果你还有什么疑问,也可以在这个帖子下提出。
    如果本帖有什么错误,还请各位批评指正!
    最后,向API作者@inventivetalent致敬,一位了不起的人。

    评分

    参与人数 1人气 +3 收起 理由
    Dream_Black + 3 我爱你

    查看全部评分

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    您需要登录后才可以回帖 登录 | 加入最MC

    本版积分规则