纯白剑姬
本帖最后由 纯白剑姬 于 2018-8-23 21:11 编辑
本想写一个类似于标记的功能(如:shift+左键能使视线上的生物发光)
问题在于我只想让自己或者朋友看见这个放光轮廓的效果
所以想到用protocolLib发包 让客户端显示指定的生物附上发光药水效果

请问这能实现吗?如果可以我应该调用NMS的哪个类呢?
实在是找不到对应类了,请各位大腿能指点一下,谢谢!

----------------------------------------------------------------------------------------
以上问题已解决  新的问题又出现啦!
当reload后 再尝试发包就会出现报错!
报错如下:


纯白剑姬
呜哇 一个人都没有回复诶....

耗子
本帖最后由 耗子 于 2018-8-19 20:36 编辑

楼主都用ProtocolLib了,就没有必要调用啥NMS类了。。。
我们需要发送一个实体药水效果包(Entity Effect),其数据结构在这里
ProtocolLib相关教程在这里。若需要详细代码请回复我。

如果我的答案有帮助的话,请给我最高的评分。

纯白剑姬
耗子 发表于 2018-8-19 20:35
楼主都用ProtocolLib了,就没有必要调用啥NMS类了。。。
我们需要发送一个实体药水效果包(Entity Effect) ...

你好大腿,再打扰一下
我在运行的时候报错了 想问一下哪里写错了吗?
代码如下

  1.         @EventHandler(ignoreCancelled=true)
  2.         public void onPlayerClickEntity(PlayerInteractEntityEvent e){
  3.                
  4.                 e.getPlayer().sendMessage("发光!");
  5.                 if(isEV){
  6.                         setEntityEffect(e.getPlayer(),e.getRightClicked());
  7.                 }
  8.         }
  9.        
  10.         public void setEntityEffect(Player p , Entity en){
  11.                 PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EFFECT);
  12.                
  13.                 packet.getIntegers().write(0, en.getEntityId());//Entity ID        VarInt
  14.                 packet.getBytes().write(0, (byte)24);                        //Effect ID        Byte
  15.                 packet.getBytes().write(1, (byte)0);                        //Amplifier        Byte
  16.                 packet.getIntegers().write(1, 100);                                //Duration        VarInt
  17.                 packet.getBytes().write(2,(byte)0x02);                        //Flags                Byte
  18.                
  19.                 try{
  20.                         pm.sendServerPacket(p, packet,false);
  21.                 } catch (InvocationTargetException ex) {
  22.                         ex.printStackTrace();
  23.                 }
  24.         }
复制代码

a8105
纯白剑姬 发表于 2018-8-20 00:00
你好大腿,再打扰一下
我在运行的时候报错了 想问一下哪里写错了吗?
代码如下

https://www.spigotmc.org/resources/protocollib.1997/

PacketWrapper

WrapperPlayServerEntityEffect.java

看下里面的实现内容就知道如何设置了
不需要用这个库,看他里面是如何write的就行了←_←
你没报错根本不知道错在哪里


纯白剑姬
810587921 发表于 2018-8-20 01:37
https://www.spigotmc.org/resources/protocollib.1997/

PacketWrapper

我看到了entity effect的实现和参数 都write进去了。
报错就是看到了我这个setEntityEffect用protocol发包报错了
明天我把报错贴上来吧  谢谢大腿的回复!

纯白剑姬
810587921 发表于 2018-8-20 01:37
https://www.spigotmc.org/resources/protocollib.1997/

PacketWrapper

大腿你好 我把你发的实现内容一个一个write进去了
结果是发包完全没反应....到底是为什么呢....
还有我发现报错是在reload之后才会出现,reload前就是没反应的(插件正常 发包没任何显示了...)
代码如下

  1. public void setEntityEffect(Player p , Entity en){
  2.                 PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EFFECT);
  3.                
  4.                 packet.getIntegers().write(0, (int)en.getEntityId());        //Entity ID        VarInt
  5.                 packet.getBytes().write(0, (byte)(24&255));                                //Effect ID        Byte
  6.                 packet.getBytes().write(1, (byte)(0&255));                                //Amplifier        Byte
  7.                 packet.getIntegers().write(1, (int)100);                                //Duration        VarInt
  8.                 packet.getBytes().write(2,(byte)1);                                                //Flags                Byte
  9.                
  10.                 try{
  11.                         pm.sendServerPacket(p, packet,false);
  12.                 } catch (InvocationTargetException ex) {
  13.                         ex.printStackTrace();
  14.                 }
  15.         }
复制代码

报错如下:
  1. [16:42:45] [Server thread/ERROR]: Could not pass event PlayerInteractEntityEvent to EagleVision v1.0
  2. org.bukkit.event.EventException
  3.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  4.         at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  5.         at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  6.         at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  7.         at net.minecraft.server.v1_11_R1.PlayerConnection.a(PlayerConnection.java:1537) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  8.         at net.minecraft.server.v1_11_R1.PacketPlayInUseEntity.a(SourceFile:69) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  9.         at net.minecraft.server.v1_11_R1.PacketPlayInUseEntity.a(SourceFile:13) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  10.         at net.minecraft.server.v1_11_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  11.         at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_144]
  12.         at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_144]
  13.         at net.minecraft.server.v1_11_R1.SystemUtils.a(SourceFile:46) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  14.         at net.minecraft.server.v1_11_R1.MinecraftServer.D(MinecraftServer.java:747) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  15.         at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:399) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  16.         at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  17.         at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  18.         at java.lang.Thread.run(Unknown Source) [?:1.8.0_144]
  19. Caused by: java.lang.ExceptionInInitializerError
  20.         at com.comphenix.protocol.injector.netty.InjectionFactory.fromPlayer(InjectionFactory.java:93) ~[?:?]
  21.         at com.comphenix.protocol.injector.netty.ProtocolInjector$4.injectPlayer(ProtocolInjector.java:373) ~[?:?]
  22.         at com.comphenix.protocol.injector.PacketFilterManager.initializePlayers(PacketFilterManager.java:946) ~[?:?]
  23.         at com.comphenix.protocol.injector.PacketFilterManager.incrementPhases(PacketFilterManager.java:462) ~[?:?]
  24.         at com.comphenix.protocol.injector.PacketFilterManager.sendServerPacket(PacketFilterManager.java:759) ~[?:?]
  25.         at com.comphenix.protocol.injector.PacketFilterManager.sendServerPacket(PacketFilterManager.java:745) ~[?:?]
  26.         at com.Dolo.EagleVision.Main.setEntityEffect(Main.java:99) ~[?:?]
  27.         at com.Dolo.EagleVision.Main.onPlayerClickEntity(Main.java:79) ~[?:?]
  28.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_144]
  29.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_144]
  30.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_144]
  31.         at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_144]
  32.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  33.         ... 15 more
  34. Caused by: java.lang.IllegalArgumentException: 'PROTOCOL-0' is already in use
  35.         at io.netty.util.UniqueName.<init>(UniqueName.java:53) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  36.         at io.netty.util.AttributeKey.<init>(AttributeKey.java:47) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  37.         at io.netty.util.AttributeKey.valueOf(AttributeKey.java:39) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  38.         at com.comphenix.protocol.injector.netty.ChannelInjector.<clinit>(ChannelInjector.java:88) ~[?:?]
  39.         at com.comphenix.protocol.injector.netty.InjectionFactory.fromPlayer(InjectionFactory.java:93) ~[?:?]
  40.         at com.comphenix.protocol.injector.netty.ProtocolInjector$4.injectPlayer(ProtocolInjector.java:373) ~[?:?]
  41.         at com.comphenix.protocol.injector.PacketFilterManager.initializePlayers(PacketFilterManager.java:946) ~[?:?]
  42.         at com.comphenix.protocol.injector.PacketFilterManager.incrementPhases(PacketFilterManager.java:462) ~[?:?]
  43.         at com.comphenix.protocol.injector.PacketFilterManager.sendServerPacket(PacketFilterManager.java:759) ~[?:?]
  44.         at com.comphenix.protocol.injector.PacketFilterManager.sendServerPacket(PacketFilterManager.java:745) ~[?:?]
  45.         at com.Dolo.EagleVision.Main.setEntityEffect(Main.java:99) ~[?:?]
  46.         at com.Dolo.EagleVision.Main.onPlayerClickEntity(Main.java:79) ~[?:?]
  47.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_144]
  48.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_144]
  49.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_144]
  50.         at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_144]
  51.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  52.         ... 15 more
  53. [16:42:45] [Server thread/ERROR]: Could not pass event PlayerInteractEntityEvent to EagleVision v1.0
  54. org.bukkit.event.EventException
  55.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  56.         at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  57.         at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  58.         at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  59.         at net.minecraft.server.v1_11_R1.PlayerConnection.a(PlayerConnection.java:1537) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  60.         at net.minecraft.server.v1_11_R1.PacketPlayInUseEntity.a(SourceFile:69) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  61.         at net.minecraft.server.v1_11_R1.PacketPlayInUseEntity.a(SourceFile:13) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  62.         at net.minecraft.server.v1_11_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  63.         at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_144]
  64.         at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_144]
  65.         at net.minecraft.server.v1_11_R1.SystemUtils.a(SourceFile:46) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  66.         at net.minecraft.server.v1_11_R1.MinecraftServer.D(MinecraftServer.java:747) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  67.         at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:399) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  68.         at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  69.         at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  70.         at java.lang.Thread.run(Unknown Source) [?:1.8.0_144]
  71. Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.comphenix.protocol.injector.netty.ChannelInjector
  72.         at com.comphenix.protocol.injector.netty.InjectionFactory.fromPlayer(InjectionFactory.java:93) ~[?:?]
  73.         at com.comphenix.protocol.injector.netty.ProtocolInjector$4.sendServerPacket(ProtocolInjector.java:403) ~[?:?]
  74.         at com.comphenix.protocol.injector.PacketFilterManager.sendServerPacket(PacketFilterManager.java:786) ~[?:?]
  75.         at com.comphenix.protocol.injector.PacketFilterManager.sendServerPacket(PacketFilterManager.java:745) ~[?:?]
  76.         at com.Dolo.EagleVision.Main.setEntityEffect(Main.java:99) ~[?:?]
  77.         at com.Dolo.EagleVision.Main.onPlayerClickEntity(Main.java:79) ~[?:?]
  78.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_144]
  79.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_144]
  80.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_144]
  81.         at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_144]
  82.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.11.2-R0.1-SNAPSHOT.jar:git-Spigot-3fb9445-2b6c9f4]
  83.         ... 15 more
复制代码


gooding300
纯白剑姬 发表于 2018-8-20 16:45
大腿你好 我把你发的实现内容一个一个write进去了
结果是发包完全没反应....到底是为什么呢....
还有我发 ...
Caused by: java.lang.ExceptionInInitializerError

可以参考一下这一篇 https://blog.csdn.net/fykhlp/article/details/6236316

纯白剑姬
gooding300 发表于 2018-8-20 16:53
可以参考一下这一篇 https://blog.csdn.net/fykhlp/article/details/6236316

看了您的链接的变量初始化问题
我也有onEnable()重新获取api

  1. ProtocolManager pm;
  2.         @Override
  3.         public void onEnable()
  4.         {
  5.                 Bukkit.getServer().getPluginManager().registerEvents(this, this);
  6.                 pm = ProtocolLibrary.getProtocolManager();
  7.                 getLogger().info("插件已加载");
  8.         }
复制代码

为什么就是pm.sendServerPacket时会初始化出错.....
难道还是我write的参数有问题吗?

耗子
纯白剑姬 发表于 2018-8-20 16:45
大腿你好 我把你发的实现内容一个一个write进去了
结果是发包完全没反应....到底是为什么呢....
还有我发 ...

先获取一个ProtocolManager
  1. ProtocolManager manager = ProtocolLibrary.getProtocolManager();
复制代码

然后创建包
  1. PacketContainer packet = manager.createPacket(PacketType.Play.Server.ENTITY_EFFECT);
复制代码

纯白剑姬
耗子 发表于 2018-8-20 17:43
先获取一个ProtocolManager

然后创建包

和直接new的 packetContainer有什么区别吗?
试了一下 情况还是一样呢.....

纯白剑姬
耗子 发表于 2018-8-20 17:43
先获取一个ProtocolManager

然后创建包

我测试服务器版本是spigot-1.11.2-R0.1-SNAPSHOT
这是protocol的下载地址版本好像是4.0.3吧
http://ci.dmulloy2.net/job/ProtocolLib/403/

纯白剑姬
刚刚找到了一个发光api 可惜貌似只支持1.9与1.10(非常残念
[API] GlowAPI [1.9 | 1.10] 1.4.6-SNAPSHOT

纯白剑姬

这里的第二行下载的!
If you're running 1.8, 1.9, 1.10, 1.11, or 1.12, use the dev build 403.

耗子
纯白剑姬 发表于 2018-8-20 18:26
这里的第二行下载的!
If you're running 1.8, 1.9, 1.10, 1.11, or 1.12, use the dev build 403. ...

原因不明,需要更多信息以供测试。。。如源代码,运行环境等等

纯白剑姬
耗子 发表于 2018-8-20 20:55
原因不明,需要更多信息以供测试。。。如源代码,运行环境等等

谢谢大佬的回复 问题暂时解决了
具体问题在于发Entity Effect的包是没有效果的
附上发光需要用Entity Metadata
Spigot赛高!(虽然英文苦手...