Solved Reading Text From A Sign

Discussion in 'Plugin Development' started by BajanAmerican, Jun 7, 2013.

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

    BajanAmerican

    Hello, I have a plugin I am developing and this code for retrieving text from a sign is not working. When I go to click the sign for [Class], nothing happens. And, when I go to click the sign for [cinfo], I get the messgae "<Classname> Class Not Found!". Anything I am doing wrong here? All the lines on the sign are lined up correctly and all events are registered on onEnable(). Thanks guys :)
    Code:java
    1. @EventHandler
    2. public void onPlayerInteract(PlayerInteractEvent event) {
    3. try {
    4. Player player = event.getPlayer();
    5. if ((event.getClickedBlock().getType() == Material.SIGN) ||
    6. (event.getClickedBlock().getType() == Material.SIGN_POST) ||
    7. (event.getClickedBlock().getType() == Material.WALL_SIGN)) {
    8. Sign s = (Sign) event.getClickedBlock().getState();
    9. if ((s.getLine(0).equalsIgnoreCase("[class]")) ||
    10. (s.getLine(0).equalsIgnoreCase("class"))) {
    11. String playerClass = s.getLine(2);
    12. if (!s.getLine(2).equalsIgnoreCase("ArcherMate") || !s.getLine(1).equalsIgnoreCase("Golem") || !s.getLine(1).equalsIgnoreCase("Mediotic") || !s.getLine(1).equalsIgnoreCase("Bandanit") || !s.getLine(1).equalsIgnoreCase("Pry0")) {
    13. event.getPlayer().sendMessage(
    14. ChatColor.RED + "Class " + playerClass +
    15. " Not Found!");
    16. return;
    17. }
    18. if(s.getLine(2).equalsIgnoreCase("ArcherMate")){
    19. Classes.ArcherMembers.add(player.getName());
    20. Classes.removeFromClass(player.getName());
    21. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_GRAY + "ARCHERMATE " + ChatColor.RED + "Class!");
    22. Classes.ArcherMembers.add(player.getName());
    23. }
    24. else if(s.getLine(2).equalsIgnoreCase("Golem")){
    25. Classes.removeFromClass(player.getName());
    26. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_PURPLE + "GOLEM " + ChatColor.RED + "Class!");
    27. Classes.TankMembers.add(player.getName());
    28. }
    29. else if(s.getLine(2).equalsIgnoreCase("Mediotic")){
    30. Classes.removeFromClass(player.getName());
    31. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_AQUA + "MEDIOTIC " + ChatColor.RED + "Class!");
    32. Classes.MedioticMembers.add(player.getName());
    33. } else if(s.getLine(2).equalsIgnoreCase("Pyr0")){
    34. Classes.removeFromClass(player.getName());
    35. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.GOLD + "PYR0 " + ChatColor.RED + "Class!");
    36. Classes.PyroMembers.add(player.getName());
    37. } else if(s.getLine(2).equalsIgnoreCase("Bandanit")){
    38. Classes.removeFromClass(player.getName());
    39. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_GREEN + "BANDANIT " + ChatColor.RED + "Class!");
    40. Classes.BanditMembers.add(player.getName());
    41. }
    42. } else if(s.getLine(2).equalsIgnoreCase("[cinfo]")){
    43. String playerClass = s.getLine(0);
    44. if ((!s.getLine(0).equalsIgnoreCase("ArcherMate!")) || (!s.getLine(0).contains("ArcherMate!")) || !(s.getLine(0).equalsIgnoreCase("Golem!")) || !(s.getLine(0).equalsIgnoreCase("Mediotic!")) || !(s.getLine(0).equalsIgnoreCase("Bandanit!")) || !(s.getLine(0).equalsIgnoreCase("Pry0!"))) {
    45. event.getPlayer().sendMessage(
    46. ChatColor.RED + "Class " + playerClass +
    47. " Not Found!");
    48. return;
    49. }
    50. if(s.getLine(0).equalsIgnoreCase("ArcherMate!") || (s.getLine(0).contains("ArcherMate!"))){
    51. player.sendMessage(ChatColor.DARK_GRAY + "" + ChatColor.BOLD + "ARCHERMATE\n");
    52. player.sendMessage(ChatColor.BLACK + "---------\n");
    53. player.sendMessage(ChatColor.BLUE + "A prize winning Archer!\n");
    54. player.sendMessage(ChatColor.RED + "Full Chain Mail armor. Stone Sword. Infinite 1 and Power 1 Bow.\n");
    55. player.sendMessage(ChatColor.GOLD + "“The best Marksman doesn’t just depend on his bow.”\n");
    56. player.sendMessage("");
    57. }
    58. else if(s.getLine(0).equalsIgnoreCase("Golem!") || (s.getLine(0).contains("Golem!"))){
    59. player.sendMessage(ChatColor.DARK_PURPLE + "" + ChatColor.BOLD + "GOLEM\n");
    60. player.sendMessage(ChatColor.BLACK + "---------\n");
    61. player.sendMessage(ChatColor.BLUE + "A Golem crafted by Science!\n");
    62. player.sendMessage(ChatColor.RED + "Diamond Pants and Chestplate. Iron Boots and Helmet. Diamond Sword.\n");
    63. player.sendMessage(ChatColor.GOLD + "“Fe isn’t just an Element to be made as material for tools and armor. It can also be brung to life and given intelligence!”\n");
    64. player.sendMessage("");
    65. }
    66. else if(s.getLine(0).equalsIgnoreCase("Mediotic!")){
    67. player.sendMessage(ChatColor.DARK_AQUA + "" + ChatColor.BOLD + "MEDIOTIC\n");
    68. player.sendMessage(ChatColor.BLACK + "---------\n");
    69. player.sendMessage(ChatColor.BLUE + "An Idiotic Medic.\n");
    70. player.sendMessage(ChatColor.RED + "Full Gold Armor. Gold Sword with Knockback 1. 2 Golden Apples.\n");
    71. player.sendMessage(ChatColor.GOLD + "“I might’ve failed Medic school, but I sure as hell haven’t failed you!”\n");
    72. player.sendMessage("");
    73. } else if(s.getLine(0).equalsIgnoreCase("Pyr0!")){
    74. player.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "PYR0\n");
    75. player.sendMessage(ChatColor.BLACK + "---------\n");
    76. player.sendMessage(ChatColor.BLUE + "A Robotic Fireman!\n");
    77. player.sendMessage(ChatColor.RED + "Full Protection 1 & Fire Protection 1 Leather Armor. Iron Axe with Fire Aspect 1.\n");
    78. player.sendMessage(ChatColor.GOLD + "“Insanity is just when Sanity cowers away.”\n");
    79. player.sendMessage("");
    80. } else if(s.getLine(0).equalsIgnoreCase("Bandanit!")){
    81. player.sendMessage(ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "BANDANIT\n");
    82. player.sendMessage(ChatColor.BLACK + "---------\n");
    83. player.sendMessage(ChatColor.BLUE + "A Ghostly Girl with swift movements.\n");
    84. player.sendMessage(ChatColor.RED + "Full Iron Armor. Sharpness 1 Iron Sword.\n");
    85. player.sendMessage(ChatColor.GOLD + "“I was the happiest as I could be in my last minute.”\n");
    86. player.sendMessage("");
    87. }
    88. }
    89. }
    90. } catch (Exception localException) {
    91. }
    92. }
     
  2. Offline

    Drkmaster83

    When doing a check for if a value is NOT equal to multiple values, you must use the && operon. NOT the || operon.

    Also, you have mismatched if statements and a mispelled "Pyr0" in your check.
    Code:
    else if (!s.getLine(2).equalsIgnoreCase("ArcherMate") # Line 3 of the sign, while the others are line 2.
                                && !s.getLine(1).equalsIgnoreCase("Golem")
                                && !s.getLine(1).equalsIgnoreCase("Mediotic")
                                && !s.getLine(1).equalsIgnoreCase("Bandanit")
                                && !s.getLine(1).equalsIgnoreCase("Pry0"))
    Also, might I ask why [CInfo] is to be checked on line 3 of the sign while [Class] is line 1?
    Code:
    s.getLine(0).equalsIgnoreCase("[class]"))
                            || (s.getLine(0).equalsIgnoreCase("class")
    else if (s.getLine(2).equalsIgnoreCase("[cinfo]"))
    Anyways, after redoing that stuff, here's the final product:
    Code:
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        try {
            Player player = event.getPlayer();
            if ((event.getClickedBlock().getType() == Material.SIGN) ||
                    (event.getClickedBlock().getType() == Material.SIGN_POST) ||
                    (event.getClickedBlock().getType() == Material.WALL_SIGN)) {
                Sign s = (Sign) event.getClickedBlock().getState();
                if ((s.getLine(0).equalsIgnoreCase("[class]")) ||
                        (s.getLine(0).equalsIgnoreCase("class"))) {
                    String playerClass = s.getLine(2);
                    if(playerClass.equalsIgnoreCase("ArcherMate")){
                        Classes.ArcherMembers.add(player.getName());
                        Classes.removeFromClass(player.getName());
                        player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_GRAY + "ARCHERMATE " + ChatColor.RED + "Class!");
                        Classes.ArcherMembers.add(player.getName());
                    }
                    else if(playerClass.equalsIgnoreCase("Golem")){
                        Classes.removeFromClass(player.getName());
                        player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_PURPLE + "GOLEM " + ChatColor.RED + "Class!");
                        Classes.TankMembers.add(player.getName());
                    }
                    else if(playerClass.equalsIgnoreCase("Mediotic")){
                        Classes.removeFromClass(player.getName());
                        player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_AQUA + "MEDIOTIC " + ChatColor.RED + "Class!");
                        Classes.MedioticMembers.add(player.getName());
                    } else if(playerClass.equalsIgnoreCase("Pyr0")){
                        Classes.removeFromClass(player.getName());
                        player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.GOLD + "PYR0 " + ChatColor.RED + "Class!");
                        Classes.PyroMembers.add(player.getName());
                    } else if(playerClass.equalsIgnoreCase("Bandanit")){
                        Classes.removeFromClass(player.getName());
                        player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_GREEN + "BANDANIT " + ChatColor.RED + "Class!");
                        Classes.BanditMembers.add(player.getName());
                    }
                    else if (!playerClass.equalsIgnoreCase("ArcherMate") && !playerClass.equalsIgnoreCase("Golem") && !playerClass.equalsIgnoreCase("Mediotic") && !playerClass.equalsIgnoreCase("Bandanit") && !playerClass.equalsIgnoreCase("Pyr0")) {
                        event.getPlayer().sendMessage(ChatColor.RED + "Class " + playerClass + " Not Found!");
                        return;
                    }
                } 
                else if(s.getLine(2).equalsIgnoreCase("[cinfo]")){
                    String playerClass = s.getLine(0);
                    if(playerClass.equalsIgnoreCase("ArcherMate!") || (playerClass.contains("ArcherMate!"))){ //Are the exclamation marks supposed to be there? Perhaps you should replace the equalsIgnoreCase with a .contains()?
                        player.sendMessage(ChatColor.DARK_GRAY + "" + ChatColor.BOLD + "ARCHERMATE\n");
                        player.sendMessage(ChatColor.BLACK + "---------\n");
                        player.sendMessage(ChatColor.BLUE + "A prize winning Archer!\n");
                        player.sendMessage(ChatColor.RED + "Full Chain Mail armor. Stone Sword. Infinite 1 and Power 1 Bow.\n");
                        player.sendMessage(ChatColor.GOLD + "“The best Marksman doesn’t just depend on his bow.”\n");
                        player.sendMessage("");
                    }
                    else if(playerClass.equalsIgnoreCase("Golem!") || (playerClass.contains("Golem!"))){ //Are the exclamation marks supposed to be there? Perhaps you should replace the equalsIgnoreCase with a .contains()?
                        player.sendMessage(ChatColor.DARK_PURPLE + "" + ChatColor.BOLD + "GOLEM\n");
                        player.sendMessage(ChatColor.BLACK + "---------\n");
                        player.sendMessage(ChatColor.BLUE + "A Golem crafted by Science!\n");
                        player.sendMessage(ChatColor.RED + "Diamond Pants and Chestplate. Iron Boots and Helmet. Diamond Sword.\n");
                        player.sendMessage(ChatColor.GOLD + "“Fe isn’t just an Element to be made as material for tools and armor. It can also be brung to life and given intelligence!”\n");
                        player.sendMessage("");
                    }
                    else if(playerClass.equalsIgnoreCase("Mediotic!")){ //Are the exclamation marks supposed to be there? Perhaps you should replace the equalsIgnoreCase with a .contains()?
                        player.sendMessage(ChatColor.DARK_AQUA + "" + ChatColor.BOLD + "MEDIOTIC\n");
                        player.sendMessage(ChatColor.BLACK + "---------\n");
                        player.sendMessage(ChatColor.BLUE + "An Idiotic Medic.\n");
                        player.sendMessage(ChatColor.RED + "Full Gold Armor. Gold Sword with Knockback 1. 2 Golden Apples.\n");
                        player.sendMessage(ChatColor.GOLD + "“I might’ve failed Medic school, but I sure as hell haven’t failed you!”\n");
                        player.sendMessage("");
                    } else if(playerClass.equalsIgnoreCase("Pyr0!")){ //Are the exclamation marks supposed to be there? Perhaps you should replace the equalsIgnoreCase with a .contains()?
                        player.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "PYR0\n");
                        player.sendMessage(ChatColor.BLACK + "---------\n");
                        player.sendMessage(ChatColor.BLUE + "A Robotic Fireman!\n");
                        player.sendMessage(ChatColor.RED + "Full Protection 1 & Fire Protection 1 Leather Armor. Iron Axe with Fire Aspect 1.\n");
                        player.sendMessage(ChatColor.GOLD + "“Insanity is just when Sanity cowers away.”\n");
                        player.sendMessage("");
                    } else if(playerClass.equalsIgnoreCase("Bandanit!")){
                        player.sendMessage(ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "BANDANIT\n");
                        player.sendMessage(ChatColor.BLACK + "---------\n");
                        player.sendMessage(ChatColor.BLUE + "A Ghostly Girl with swift movements.\n");
                        player.sendMessage(ChatColor.RED + "Full Iron Armor. Sharpness 1 Iron Sword.\n");
                        player.sendMessage(ChatColor.GOLD + "“I was the happiest as I could be in my last minute.”\n");
                        player.sendMessage("");
                    }
                    else if (!playerClass.equalsIgnoreCase("ArcherMate!") && !playerClass.equalsIgnoreCase("Golem!") && !playerClass.equalsIgnoreCase("Mediotic!") && !playerClass.equalsIgnoreCase("Bandanit!") && !playerClass.equalsIgnoreCase("Pyr0!")) { //Are the exclamation marks supposed to be there? Perhaps you should replace the equalsIgnoreCase with a .contains()?
                        event.getPlayer().sendMessage(ChatColor.RED + "Class " + playerClass + " Not Found!");
                        return;
                    }
                }
            }
        } catch (Exception localException) {
        }
    }
    
    However, I EXTREMELY recommend that you check all of your if statements for the correct .getLine() numbers.
     
  3. Offline

    BajanAmerican


    Thanks for the help! Yes, the lines are correct and the exclamation marks are suppose to be there. It's just the way we formatted the signs. After this, the code for [cinfo] works but the code for [class] does not. The [cinfo] is displaying perfect, but the [class] displays nothing. Simply nothing. Any suggestions? Thanks!

    Code:java
    1. if ((event.getClickedBlock().getType() == Material.SIGN) ||
    2. (event.getClickedBlock().getType() == Material.SIGN_POST) ||
    3. (event.getClickedBlock().getType() == Material.WALL_SIGN)) {
    4. Sign s = (Sign) event.getClickedBlock().getState();
    5. if (s.getLine(0).equalsIgnoreCase("[Class]")) {
    6. String playerClass = s.getLine(2);
    7. if(playerClass.equalsIgnoreCase("ArcherMate") || (playerClass.contains("ArcherMate"))){
    8. Classes.removeFromClass(player.getName());
    9. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_GRAY + "ARCHERMATE " + ChatColor.RED + "Class!");
    10. Classes.ArcherMembers.add(player.getName());
    11. }
    12. else if(playerClass.equalsIgnoreCase("Golem") || (playerClass.contains("Golem"))){
    13. Classes.removeFromClass(player.getName());
    14. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_PURPLE + "GOLEM " + ChatColor.RED + "Class!");
    15. Classes.TankMembers.add(player.getName());
    16. }
    17. else if(playerClass.equalsIgnoreCase("Mediotic") || (playerClass.contains("Mediotic"))){
    18. Classes.removeFromClass(player.getName());
    19. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_AQUA + "MEDIOTIC " + ChatColor.RED + "Class!");
    20. Classes.MedioticMembers.add(player.getName());
    21. }
    22. else if(playerClass.equalsIgnoreCase("Pyr0") || (playerClass.contains("Pyr0"))){
    23. Classes.removeFromClass(player.getName());
    24. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.GOLD + "PYR0 " + ChatColor.RED + "Class!");
    25. Classes.PyroMembers.add(player.getName());
    26. }
    27. else if(playerClass.equalsIgnoreCase("Bandanit") || (playerClass.contains("BanDanit"))){
    28. Classes.removeFromClass(player.getName());
    29. player.sendMessage(ChatColor.RED + "You Have Chosen The " + ChatColor.DARK_GREEN + "BANDANIT " + ChatColor.RED + "Class!");
    30. Classes.BanditMembers.add(player.getName());
    31. }
    32. else if (!playerClass.equalsIgnoreCase("ArcherMate") && !playerClass.equalsIgnoreCase("Golem") && !playerClass.equalsIgnoreCase("Mediotic") && !playerClass.equalsIgnoreCase("Bandanit") && !playerClass.equalsIgnoreCase("Pyr0")) {
    33. event.getPlayer().sendMessage(ChatColor.RED + "Class " + playerClass + " Not Found!");
    34. return;
    35. }
    36. }
     
  4. Offline

    Drkmaster83

    The above code, removing the references to the class "Classes," works fine for me. It sends me the message, however, when I jump and click it, it for some reason sends me a NPE.

    Are you sure that you want [Class] on line 1 of the sign, or line 3?
     
  5. Offline

    BajanAmerican

    Well, I found the problem. I used colors in my "[class]" signs. I had no idea that colors interfered with grabbing the next. I really appreciate this man, thanks!
     
  6. Offline

    Drkmaster83

    Ah, yes. Colors are represented by something called a "section symbol." The visual representation: §. These hold the unicode characters of "\u00A7" + another character, which can be a-f, 0-9, or k-o. When it was checking your sign for the text "[Class]," it was seeing the invisible §<character>. In Minecraft, the section symbol is used to change colors of strings. :)

    Sorry for this extra information, just wanted to let you know why that didn't happen correctly. That's also why I suggested using the contains() method.
     
  7. Offline

    chasechocolate

Thread Status:
Not open for further replies.

Share This Page