超神的冰凉
本帖最后由 超神的冰凉 于 2020-2-18 11:45 编辑

我尝试新建一个自定义的实体,并且展示给玩家,但是却发生了以下的报错,不知为什么会空指针?
  1. Throwing
  2. java.lang.NullPointerException: null
  3.         at cn.nukkit.utils.BinaryStream.putString(BinaryStream.java:533) ~[nukkit.jar:?]
  4.         at cn.nukkit.network.protocol.AddEntityPacket.encode(AddEntityPacket.java:166) ~[nukkit.jar:?]
  5.         at cn.nukkit.Server.batchPackets(Server.java:680) ~[nukkit.jar:?]
  6.         at cn.nukkit.network.RakNetInterface.putPacket(RakNetInterface.java:254) ~[nukkit.jar:?]
  7.         at cn.nukkit.Player.dataPacket(Player.java:1082) ~[nukkit.jar:?]
  8.         at cn.nukkit.Player.dataPacket(Player.java:1063) ~[nukkit.jar:?]
  9.         at cn.nukkit.entity.Entity.spawnTo(Entity.java:908) ~[nukkit.jar:?]
  10.         at cn.nukkit.Player.doFirstSpawn(Player.java:909) ~[nukkit.jar:?]
  11.         at cn.nukkit.Player.sendNextChunk(Player.java:839) ~[nukkit.jar:?]
  12.         at cn.nukkit.Player.checkNetwork(Player.java:1851) ~[nukkit.jar:?]
  13.         at cn.nukkit.Server.tick(Server.java:1140) ~[nukkit.jar:?]
  14.         at cn.nukkit.Server.tickProcessor(Server.java:905) [nukkit.jar:?]
  15.         at cn.nukkit.Server.start(Server.java:882) [nukkit.jar:?]
  16.         at cn.nukkit.Server.<init>(Server.java:567) [nukkit.jar:?]
  17.         at cn.nukkit.Nukkit.main(Nukkit.java:112) [nukkit.jar:?]
复制代码
这是我的实体floatingtext:(已经正确的在插件启动时注册)
  1. import cn.nukkit.entity.Entity;
  2. import cn.nukkit.level.format.FullChunk;
  3. import cn.nukkit.nbt.tag.CompoundTag;

  4. public class floatingtext extends Entity {
  5.     public floatingtext(FullChunk chunk, CompoundTag nbt){
  6.         super(chunk, nbt);
  7.     }
  8.     @Override
  9.     public int getNetworkId() {
  10.         return -1;
  11.     }

  12. }
复制代码
这是我创建并显示这个实体的代码:
  1. import cn.nukkit.Server;
  2. import cn.nukkit.entity.Entity;
  3. import cn.nukkit.level.Level;
  4. import cn.nukkit.math.Vector3;

  5. import java.time.LocalDateTime;
  6. import java.util.*;

  7. public class displayer {
  8. Entity entity = createTextEntity("try",128,87,150,Server.getInstance().getLevelByName("world"));
  9. level.addEntity(entity);
  10. entity.spawnToAll();
  11. }
  12. public Entity createTextEntity(String name,int x,int y,int z,Level level){
  13.         Entity tmp = Entity.createEntity("floatingtextentity", level.getChunk(x>>4,z>>4),Entity.getDefaultNBT(new Vector3(x,y,z)));
  14.         tmp.setNameTagVisible(true);
  15.         tmp.setNameTag(name);
  16.         tmp.setNameTagAlwaysVisible(true);
  17.         tmp.setMaxHealth(9999);
  18.         tmp.setHealth(9999);
  19.         tmp.setPosition(new Vector3(x,y,z));
  20.         tmp.setScale(1.0f);
  21.         tmp.setLevel(level);
  22.         return tmp;
  23.     }
复制代码

我现在不知道错nbt误为何发生,为何会在写入nbt(如报错所言)时候出错?
请问如何修改呢,解决方案是什么?



Kenneth_z
Network Id 不能-1 因为添加一个实体现在版本需要一个identifier 比如说僵尸就是minecraft:zombie -1找不到对应的identifier 所以报错了 浮空字你可以试试继承EntityHuman 然后让这个实体的scale为0 如果觉得好请给个最佳

超神的冰凉
Kenneth_z 发表于 2020-2-18 11:41
Network Id 不能-1 因为添加一个实体现在版本需要一个identifier 比如说僵尸就是minecraft:zombie -1找不到 ...

十分感谢

ruo_shui
你也可以将 NetWorkId 设置为64 也可以达到一样的效果 不用继承 EntityHuman

ruo_shui
继承 Entity 类生成的实体有重力效果
所以只需执行 setImmobile() 即可
注意要重写 getWidth() 与 getHeight() 生物碰撞箱
不然显示内容会很低