Uploaded image for project: 'Spigot'
  1. Spigot
  2. SPIGOT-6796

NPCs created via packet not getting removed using ClientboundRemoveEntitiesPacket



    • Bug
    • Resolution: Invalid
    • Minor
    • None
    • None
    • Windows 10 64bit


      IDE configured to use Java 16

    • This server is running Paper version git-Paper-384 (MC: 1.17.1) (Implementing API version 1.17.1-R0.1-SNAPSHOT) (Git: 51b7b60)
    • N/A
    • Yes


      Note that I do use a paper server for testing but the same bug occurs on a spigot server.


      This does require an IDE for java development, a server you can test on, and a new java project with spigot and craftbukkit as dependencies to use nms.


      Main class

      public class Main extends JavaPlugin
          public void onEnable()
              //Registers commands
              getCommand("npc-create").setExecuter(new NPCCreateCommand());
              getCommand("npc-remove").setExecuter(new NPCRemoveCommand());

      NPCCreateCommand class

      public class NPCCreateCommand implements CommandExecuter
          public boolean onCommand(CommandSender sender, Command command, String label, String[] args) 
      		if(sender instanceof Player p)
      			CraftPlayer a = (CraftPlayer) p;
      			EntityPlayer b = a.getHandle();
      			MinecraftServer server = b.getMinecraftServer();
      			WorldServer world = b.getWorldServer();
      			GameProfile profile = new GameProfile(UUID.nameUUIDFromBytes(("NPC: test").getBytes(Charsets.UTF_8)), "test");
      			EntityPlayer npc = new EntityPlayer(server, world, profile);
      			NPCCommand.handlePlayerInfo(b, npc);
      			PlayerConnection connection = player.b;
      			connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc));
      			npc.setPosition(player.getBukkitEntity().getLocation().getX(), player.getBukkitEntity().getLocation().getY(), player.getBukkitEntity().getLocation().getZ());
      		DataWatcher data = npc.getDataWatcher();
      		data.set(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 0xFF);
      		connection.sendPacket(new PacketPlayOutNamedEntitySpawn(npc));
      		connection.sendPacket(new PacketPlayOutEntityMetadata(npc.getId(), data, true));

      NPCRemoveCommand class

      public class NPCRemoveCommand implements CommandExecuter
          public void run(CommandSender sender, Command command, String label, String[] args) {
          		CraftPlayer a = (CraftPlayer) p;
      		EntityPlayer b = a.getHandle();
      		MinecraftServer server = b.getMinecraftServer();
      		WorldServer world = b.getWorldServer();
      		EntityPlayer npc = new EntityPlayer(server, world, new GameProfile(UUID.nameUUIDFromBytes(("NPC: test").getBytes(Charsets.UTF_8)), "test"));
      		Player p = player.getBukkitEntity();
      		//Debug message
      		p.sendMessage("Deleted npc " + npc.getName().toString());
      		connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc));
      		connection.sendPacket(new PacketPlayOutEntityDestroy(npc.getId()));


      name: test
      version: 1
      author: whoever
      main: (whatever_package_main.class_is_in).Main
      api-version: 1.17
      description: test
      commands:     npc-create:         description: creates test npc
              usage: /npc-create
          npc-remove:         description: removes test npc
              usage: /npc-destroy

      Once this is done compile the jar and put it your server's plugin folder reload/start the server then run /npc-create. It will create an npc with a steve or alex skin and put a name into tab. Then run /npc-remove and it should remove the npc from tab and not remove the npc itself.

      If you have any problems with the code please contact me.





            Unassigned Unassigned
            YeetManLord maximus widmiaer
            0 Vote for this issue
            2 Start watching this issue