1.13之后的红石粒子颜色使用DustOption进行控制,但是只能指定一种颜色
对应到原版就是/particle dust 0~1 0~1 0~1这个区间
众所周知这个区间里面跳出来的白色粒子是淡灰色的
原版里头可以使用/particle dust -0.01 -0.01 -0.01 1 ~ ~ ~ 1 1 1 1 100调出接近于纯白的粒子
所以有大佬知道怎么弄吗?
我尝试过给玩家发包粒子效果,但是里头第十个数据是ParticleParam类型的,直接获取出来的是
net.minecraft.server.v1_16_R2.ParticleParamRedstone@123abc56一类的,不知道里面什么结构也不知道发包时怎么写
对应到原版就是/particle dust 0~1 0~1 0~1这个区间
众所周知这个区间里面跳出来的白色粒子是淡灰色的
原版里头可以使用/particle dust -0.01 -0.01 -0.01 1 ~ ~ ~ 1 1 1 1 100调出接近于纯白的粒子
所以有大佬知道怎么弄吗?
我尝试过给玩家发包粒子效果,但是里头第十个数据是ParticleParam类型的,直接获取出来的是
net.minecraft.server.v1_16_R2.ParticleParamRedstone@123abc56一类的,不知道里面什么结构也不知道发包时怎么写
首先解释ParticleParam的问题
这玩意是NMS里面的,经过CraftBukkit反混淆得到的类名,里面的结构我想你必须去自己看反混淆,更推荐Forge反混淆,但是考虑到Forge开发环境搭建可能略微有点复杂(其实直接下载离线包没什么复杂的)所以你也可以看看CraftBukkit反混淆。
获得ParticleParam的方法我推荐从OBC走
摘自CraftParticle类
复制代码
什么是OBC、NMS的问题,可以考虑看我的教程。bdn也有类似的教程,写得也非常好。
至于那个@加上一些十六进制数字的,那个叫做HashCode,估计你的Java基础没学好。
这玩意是NMS里面的,经过CraftBukkit反混淆得到的类名,里面的结构我想你必须去自己看反混淆,更推荐Forge反混淆,但是考虑到Forge开发环境搭建可能略微有点复杂(其实直接下载离线包没什么复杂的)所以你也可以看看CraftBukkit反混淆。
获得ParticleParam的方法我推荐从OBC走
摘自CraftParticle类
 
-   public static <T> ParticleParam toNMS(Particle particle, T obj) {
 
-     Particle canonical = particle;
 
-     if (aliases.containsKey(particle))
 
-       canonical = aliases.get(particle); 
 
-     Particle nms = (Particle)IRegistry.PARTICLE_TYPE.get((MinecraftKey)particles.get(canonical));
 
-     Preconditions.checkArgument((nms != null), "No NMS particle %s", particle);
 
-     if (particle.getDataType().equals(Void.class))
 
-       return (ParticleParam)nms; 
 
-     Preconditions.checkArgument((obj != null), "Particle %s requires data, null provided", particle);
 
-     if (particle.getDataType().equals(ItemStack.class)) {
 
-       ItemStack itemStack = (ItemStack)obj;
 
-       return (ParticleParam)new ParticleParamItem(nms, CraftItemStack.asNMSCopy(itemStack));
 
-     } 
 
-     if (particle.getDataType() == MaterialData.class) {
 
-       MaterialData data = (MaterialData)obj;
 
-       return (ParticleParam)new ParticleParamBlock(nms, CraftMagicNumbers.getBlock(data));
 
-     } 
 
-     if (particle.getDataType() == BlockData.class) {
 
-       BlockData data = (BlockData)obj;
 
-       return (ParticleParam)new ParticleParamBlock(nms, ((CraftBlockData)data).getState());
 
-     } 
 
-     if (particle.getDataType() == Particle.DustOptions.class) {
 
-       Particle.DustOptions data = (Particle.DustOptions)obj;
 
-       Color color = data.getColor();
 
-       return (ParticleParam)new ParticleParamRedstone(color.getRed() / 255.0F, color.getGreen() / 255.0F, color.getBlue() / 255.0F, data.getSize());
 
-     } 
 
-     throw new IllegalArgumentException(particle.getDataType().toString());
 
-   }
 
什么是OBC、NMS的问题,可以考虑看我的教程。bdn也有类似的教程,写得也非常好。
至于那个@加上一些十六进制数字的,那个叫做HashCode,估计你的Java基础没学好。
 本帖最后由 William_Shi 于 2020-10-24 22:12 编辑 
然后我再解释发包的问题
我推荐直接https://bukkit.windit.net/javado ... le-double-double-T-
那么
https://bukkit.windit.net/javado ... .html#getDataType--
这个是什么?
我们看看Particle
复制代码复制代码复制代码
注:Particle是枚举类。
所以这样,所谓的T data
在你生成红石粒子的情况下,就是
https://bukkit.windit.net/javado ... le.DustOptions.html
然后就是指定
https://bukkit.windit.net/javadoc/org/bukkit/Color.html
然后我再解释发包的问题
我推荐直接https://bukkit.windit.net/javado ... le-double-double-T-
那么
https://bukkit.windit.net/javado ... .html#getDataType--
这个是什么?
我们看看Particle
 
-   @NotNull
 
-   public Class<?> getDataType() {
 
-     return this.dataType;
 
-   }
 
 
-   Particle(Class<?> data) {
 
-     this.dataType = data;
 
-   }
 
 
- REDSTONE(DustOptions.class),
注:Particle是枚举类。
所以这样,所谓的T data
在你生成红石粒子的情况下,就是
https://bukkit.windit.net/javado ... le.DustOptions.html
然后就是指定
https://bukkit.windit.net/javadoc/org/bukkit/Color.html
 本帖最后由 renyunzhong 于 2020-10-26 23:15 编辑 
感谢大佬,去弄了一下NMS纯白粒子的确可以显示了,但是使用反射时在constructor那里遇到点问题:
复制代码
EDIT
2小时后,解决了NullPointer的问题,是由于Class采用static导致的,换掉所有Class变量就没问题了,目前发包一切正常
不过其他Class使用这个方法时需要引用static类型的,而static类型方法下面的变量也只能是static类型,有什么比较好的解决办法么
William_Shi 发表于 2020-10-24 22:11
然后我再解释发包的问题
我推荐直接https://bukkit.windit.net/javadoc/org/bukkit/entity/Player.html#spa ...
感谢大佬,去弄了一下NMS纯白粒子的确可以显示了,但是使用反射时在constructor那里遇到点问题:
-     public static Class packet;
 
-     public static Class particleParam;
 
-     public static Class particles;
 
 
-     static Class packetPlayOutWorldParticles;
 
 
-     //Register all class for NMS
 
-     public void setAllClass(){
 
-         try {
 
-             particleParam = ClassRegister.getNMSClass("ParticleParam");
 
-             particles = ClassRegister.getNMSClass("Particles");
 
-             packet = ClassRegister.getNMSClass("Packet");
 
-             packetPlayOutWorldParticles = ClassRegister.getNMSClass("PacketPlayOutWorldParticles");
 
-         } catch (ClassNotFoundException e) {
 
-             e.printStackTrace();
 
-         }
 
-     }
 
 
-     //Packet Register
 
-     //sendParticle
 
-     public static void sendParticle(Player p, Location loc, float ofx, float ofy, float ofz, float ex, int num, boolean isF, Object param) {
 
-         try {
 
 
-             Object PacketPlayOutWorldParticles = new net.minecraft.server.v1_16_R2.PacketPlayOutWorldParticles((ParticleParam) param, isF, loc.getX(), loc.getY(), loc.getZ(), ofx, ofy, ofz, ex, num);
 
-             //Object PacketPlayOutWorldParticles = ClassRegister.getNMSClass("PacketListener").cast(packetPlayOutWorldParticles.getConstructor(Object.class, boolean.class, double.class, double.class, double.class, float.class, float.class, float.class, float.class, int.class).newInstance(particleParam.cast(param), isF, loc.getX(), loc.getY(), loc.getZ(), ofx, ofy, ofz, ex, num));         这个不工作,检查了一下实在getConstructor那里报NullPointerException
 
 
-             Object craftPlayer = ClassRegister.getCBClass("entity.CraftPlayer").cast(p);
 
-             Object entityPlayer = craftPlayer.getClass().getMethod("getHandle").invoke(craftPlayer);
 
 
-             Object playerConnection = entityPlayer.getClass().getField("playerConnection").get(entityPlayer);
 
-             System.out.println("DEBUGEntity: "+entityPlayer+" - "+loc+" - "+ofx+" - "+ofy+" - "+ofz+" - "+ex+" - "+num+" - "+isF+" - "+param); //debug显示
 
 
 
-             ((CraftPlayer) craftPlayer).getHandle().playerConnection.sendPacket((Packet<?>) PacketPlayOutWorldParticles);
 
 
-             //playerConnection.getClass().getMethod("sendPacket",packet).invoke(playerConnection,PacketPlayOutWorldParticles);        这个换掉上面一行同样不工作,显示NoSuchMethodException: net.minecraft.server.v1_16_R2.PlayerConnection.sendPacket(null)
 
 
 
-         } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException | NoSuchFieldException | InstantiationException | NullPointerException e) {
 
-             e.printStackTrace();
 
-         }
 
- }
EDIT
2小时后,解决了NullPointer的问题,是由于Class采用static导致的,换掉所有Class变量就没问题了,目前发包一切正常
不过其他Class使用这个方法时需要引用static类型的,而static类型方法下面的变量也只能是static类型,有什么比较好的解决办法么