Solved [ProtocolLib] PlayerConnection cannot be cast to PacketPlayOutListener

Discussion in 'Plugin Development' started by Dudemister1999, Sep 18, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    Dudemister1999

    Hello! I'm experimenting with ProtocolLib (Oh dear, here we go, you might say), and this kicks the player from the server every time he joins, and gives an error.

    Error:
    Show Spoiler

    [15:09:26] [Server thread/WARN]: Failed to handle packet for /127.0.0.1:51699
    java.lang.ClassCastException: net.minecraft.server.v1_7_R4.PlayerConnection cannot be cast to net.minecraft.server.v1_7_R4.PacketPlayOutListener
    at net.minecraft.server.v1_7_R4.PacketPlayOutPlayerInfo.handle(SourceFile:10) ~[bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:157) ~[bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    at net.minecraft.server.v1_7_R4.ServerConnection.c(SourceFile:134) [bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:667) [bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:258) [bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:558) [bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:469) [bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [bukkit-1.7.10.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks]
    [15:09:26] [Server thread/INFO]: Dudemister1999 lost connection: Internal server error


    As you can see, the error does not help much. However, I will post as much relevant code as I can:

    Show Spoiler

    Main plugin file (Might be the culprit) (Only posted relevant code, sorry):
    Show Spoiler

    Code:java
    1. public void experimentalFunctions()
    2. {
    3. ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(this, ListenerPriority.NORMAL,
    4. Arrays.asList(PacketType.Play.Server.PLAYER_INFO), ListenerOptions.ASYNC)
    5. {
    6. @Override
    7. public void onPacketSending(PacketEvent event)
    8. {
    9. List<String> doNotTouch = Arrays.asList(ChatColor.WHITE + "Your Stats", ChatColor.YELLOW + "==========", ChatColor.BLUE + "Sanity: ", ChatColor.RED + "RADS: ", ChatColor.GREEN + "Humanity: ");
    10. PlayerListItem item = getPlayerListInfo(event);
    11. for(Player pl : Bukkit.getOnlinePlayers())
    12. {
    13. if(!doNotTouch.contains(item.name))
    14. {
    15. event.getPacket().getSpecificModifier(boolean.class).write(0, false);
    16. event.getPacket().getSpecificModifier(String.class).write(0, "");
    17. }
    18. }
    19. }
    20. });
    21. }
    22.  
    23. public static void sendPacket(Player target, ProtocolManager pMan)
    24. {
    25. int sanity = DeadworksAPI.getAbilitiesManager().getSanity(target.getUniqueId());
    26. int rads = DeadworksAPI.getAbilitiesManager().getRADS(target.getUniqueId());
    27. int humanity = DeadworksAPI.getAbilitiesManager().getHumanity(target.getUniqueId());
    28.  
    29. PacketContainer pYS = pMan.createPacket(PacketType.Play.Server.PLAYER_INFO, false);
    30. pYS.getStrings().write(0, ChatColor.WHITE + "Your Stats");
    31. pYS.getBooleans().write(0, true);
    32. pYS.getIntegers().write(0, 9999);
    33.  
    34. PacketContainer pSP = pMan.createPacket(PacketType.Play.Server.PLAYER_INFO, false);
    35. pYS.getStrings().write(0, ChatColor.YELLOW + "==========");
    36. pYS.getBooleans().write(0, true);
    37. pYS.getIntegers().write(0, 9999);
    38.  
    39. PacketContainer pS = pMan.createPacket(PacketType.Play.Server.PLAYER_INFO, false);
    40. pYS.getStrings().write(0, ChatColor.BLUE + "Sanity: " + sanity);
    41. pYS.getBooleans().write(0, true);
    42. pYS.getIntegers().write(0, 9999);
    43.  
    44. PacketContainer pR = pMan.createPacket(PacketType.Play.Server.PLAYER_INFO, false);
    45. pYS.getStrings().write(0, ChatColor.RED + "RADS: " + rads);
    46. pYS.getBooleans().write(0, true);
    47. pYS.getIntegers().write(0, 9999);
    48.  
    49. PacketContainer pH = pMan.createPacket(PacketType.Play.Server.PLAYER_INFO, false);
    50. pYS.getStrings().write(0, ChatColor.GREEN + "Humanity: " + humanity);
    51. pYS.getBooleans().write(0, true);
    52. pYS.getIntegers().write(0, 9999);
    53.  
    54. try
    55. {
    56. pMan.recieveClientPacket(target, pYS, false);
    57. pMan.recieveClientPacket(target, pSP, false);
    58. pMan.recieveClientPacket(target, pS, false);
    59. pMan.recieveClientPacket(target, pR, false);
    60. pMan.recieveClientPacket(target, pH, false);
    61. }
    62. catch (Exception ex)
    63. {
    64. Logger.getLogger(DeadworksPlugin.class.getName()).log(Level.SEVERE, null, ex);
    65. }
    66. }
    67.  
    68. // Read the player list information
    69. private PlayerListItem getPlayerListInfo(PacketEvent event)
    70. {
    71. PacketContainer packet = event.getPacket();
    72. PlayerListItem result = new PlayerListItem();
    73.  
    74. result.name = packet.getSpecificModifier(String.class).read(0);
    75. result.online = packet.getSpecificModifier(boolean.class).read(0);
    76. return result;
    77. }



    PlayerJoin, the packet-sending part:
    Show Spoiler

    Code:java
    1. DeadworksPlugin.sendPacket(player, ProtocolLibrary.getProtocolManager());




    So yes, what am I doing wrong? :p
    Thanks,
    -Hydroxocobalamin (OCHbl)

    I figured out what is causing the error, I just do not know how to fix it:

    Code:java
    1. try
    2. {
    3. pMan.recieveClientPacket(target, pYS, false);
    4. pMan.recieveClientPacket(target, pSP, false);
    5. pMan.recieveClientPacket(target, pS, false);
    6. pMan.recieveClientPacket(target, pR, false);
    7. pMan.recieveClientPacket(target, pH, false);
    8. }
    9. {
    10. Logger.getLogger(DeadworksPlugin.class.getName()).log(Level.SEVERE, null, ex);
    11. }


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 14, 2016
  2. Offline

    Comphenix

    The terminology might be a bit confusing here, but a packet of type PacketType.Play.Server.PLAYER_INFO is a SERVER packet - a packet created by the server, and is supposed to be sent to the client.

    By calling recieveClientPacket(), you're pretending it is a client packet that has just been received by the server. Clearly, the server cannot receive packets only the server can send, so it crashes. Still, it should probably not disconnect the client - I guess I better add a simple check to ProtocolLib and throw an exception instead.

    In any case, switch out recieveClientPacket() with sendServerPacket(), and it should probably work.
     
  3. Offline

    Dudemister1999

    Comphenix I had done that previously, it returns an identical error. And I understand the terms, this isn't the first time I've used ProtocolLib (Great API, might I add). This is just the first time I've tried SENDING packets.
     
  4. Offline

    Comphenix

    Thanks. :)

    Really? This seems to work fine for me:
    Code:java
    1. Player p = (Player) sender;
    2.  
    3. PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
    4. packet.getStrings().write(0, ChatColor.BLUE + "Sanity.");
    5. packet.getBooleans().write(0, true);
    6. packet.getIntegers().write(0, 9999);
    7.  
    8. try {
    9. ProtocolLibrary.getProtocolManager().sendServerPacket(p, packet);
    10. e.printStackTrace();
    11. }
     
    Dudemister1999 likes this.
  5. Offline

    Dudemister1999

    Comphenix I found out the problem! It was a mix of clientPacket and a typo I had. It works now, thank you for both making the API (Part of my plugin depends entirely upon it) and helping me out with it.

    Comphenix So, I've got one more question. Instead of creating a new thread, I'll just put it here:

    So now that the Tablist has custom content, can I set the number of slots to display?

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 14, 2016
  6. Offline

    d3v1n302418

    Dudemister1999 Correct me if im wrong, but ServerListPingEvent handles player slot displaying. Unless of course, you mean in-game in which case my bad.
     
  7. Offline

    Dudemister1999

    d3v1n302418 It's the in-game packet amount. I already modify the server list amount via ProtocolLib.
     
Thread Status:
Not open for further replies.

Share This Page