1850343382
如题,好像涉及到NMS。。求教

BobPlayer
ActionBarAPI会帮助你:https://www.spigotmc.org/resources/actionbarapi-1-8-1-12-1.1315/
如果你不想你的插件依赖于它,你可以参考它的源代码实现你自己的。
ActionBarAPI:https://github.com/ConnorLinfoot/ActionBarAPI

耗子
https://github.com/UnknownStudio ... util/ActionBar.java

1850343382
谢谢两位大佬=-=

🍓🔥灵域
楼上两位,一个没有戳中要点,一个乘机推广UDPL
你可以直接 Player.sendActionBar(String); 来发送
但是,你的IDE用需要使用1.9版本以上的服务端核心才会有这个API

602723113
本帖最后由 602723113 于 2017-10-30 23:16 编辑

5L的评论不知道如何评价...但sendActionbar()这个方法是Paper自己偷偷塞进核心的,你可以去查询最新的BukkitAPI,里面并无该方法

但是你要知道要使用nms的话就差不多找对方向了...

首先我们看 Minecraft协议里的Chat http://wiki.vg/Protocol#Chat_Message_.28clientbound.29
对应过来的就是nms下的PacketPlayOutChat这个封包

那么我们从协议里面得知  封包内的
private IChatBaseComponent a; ---> 就是 JSON Data
private byte b; ---> 就是Position [0: chat (chat box), 1: system message (chat box), 2: game info (above hotbar)]

所以我们就可以这么做,我们要用actionbar,那无非就是 Position 设置为2咯
所以我们可以写出以下代码


  1. PacketPlayOutChat packetPlayOutChat = new PacketPlayOutChat(IChatBaseComponent.ChatSerializer.a("test"), (byte) 2);
  2. EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
  3. entityPlayer.playerConnection.sendPacket(packetPlayOutChat);</p><p>
  4. // 注:以上的代码使用 spigot1.10.2 编写,不同版本代码会有所改变!
  5. // 比如以下为1.12的
  6. IChatBaseComponent iChatBaseComponent = IChatBaseComponent.ChatSerializer.a("test");
  7.         
  8. PacketPlayOutChat packetPlayOutChat = new PacketPlayOutChat(iChatBaseComponent, ChatMessageType.GAME_INFO);
  9. EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
  10. entityPlayer.playerConnection.sendPacket(packetPlayOutChat);
  11. // 可以看到不同的就是nms下把 byte 封装成了ChatMessageType
复制代码
以上便是我利用nms给玩家发送actionbar的研究过程

耗子
子然君 发表于 2017-10-30 18:47
楼上两位,一个没有戳中要点,一个乘机推广UDPL
你可以直接 Player.sendActionBar(String); 来发送
...

┐(‘~`;)┌大家使用统一的API又没什么不对,再说了如果要知道原理也可以看其中的源码