getLine not working

Discussion in 'Plugin Development' started by Captain Dory, Jan 26, 2014.

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

    Captain Dory

    Hi,

    I'm making a new gamemode, and when you type 'inv' on a sign it comes up with different text.
    If the first line of the text on the sign is equal to the text wanted, open an inventory.
    But, the getLine() method isn't working for me- It worked for me in 1.6 with craftbukkit, don't know why it isn't working now.

    This is my Event:

    Code:java
    1.  
    2. @EventHandler
    3. public void onPlayerInteract(PlayerInteractEvent e) {
    4. if (!(e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
    5. if (e.getClickedBlock().getState() instanceof Sign) {
    6. Sign s = (Sign) e.getClickedBlock().getState();
    7. if (s.getLine(0).equalsIgnoreCase("inv")) {
    8. e.getPlayer().openInventory(classSelector);
    9. }
    10. }
    11.  
    12. }
    13.  
     
  2. Offline

    L33m4n123

    any stacktrace? You sure you are in Line 0 ? Event registered?
     
  3. Offline

    Captain Dory

    Yes, i'm using multiple classes, and have registered this class. Haven't tested this ingame because there is an error.
     
  4. Offline

    L33m4n123

    Why not telling us the error then? o.o
     
  5. Offline

    Niknea

    Captain Dory Try to export it with the error and copy & paste the stack trace here.
     
  6. Offline

    Captain Dory

    I meant the error in getLine() :p
    k brb
     
  7. Offline

    L33m4n123


    And that would be? o.o
     
  8. Offline

    Captain Dory

    Niknea the sign changing works ingame, but when I try and right click the sign, the console is spammed with:
    Code:java
    1. [11:51:12 ERROR]: Could not pass event PlayerInteractEvent to MCTF2 v1.0
    2. org.bukkit.event.EventException
    3. at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    4. at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    5. at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:481) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    6. at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:466) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    7. at org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:191) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    8. at net.minecraft.server.v1_7_R1.PlayerInteractManager.interact(PlayerInteractManager.java:374) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    9. at net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java:628) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    10. at net.minecraft.server.v1_7_R1.PacketPlayInBlockPlace.a(SourceFile:60) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    11. at net.minecraft.server.v1_7_R1.PacketPlayInBlockPlace.handle(SourceFile:9) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    12. at net.minecraft.server.v1_7_R1.NetworkManager.a(NetworkManager.java:146) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    13. at net.minecraft.server.v1_7_R1.ServerConnection.c(SourceFile:134) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    14. at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:655) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    15. at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    16. at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    17. at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    18. at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    19. Caused by: java.lang.Error: Unresolved compilation problem:
    20. The method getLine(int) is undefined for the type Sign
    21.  
    22. at me.Captain_Dory.ClassSelect.onPlayerInteract(ClassSelect.java:91) ~[?:?]
    23. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_45]
    24. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_45]
    25. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_45]
    26. at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_45]
    27. at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    28. ... 15 mor


    This is my full code, if you want it:

    Main:
    Code:java
    1. package me.Captain_Dory;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.event.Listener;
    5. import org.bukkit.plugin.Plugin;
    6. import org.bukkit.plugin.java.JavaPlugin;
    7.  
    8. public class Main extends JavaPlugin {
    9.  
    10. private static Plugin plugin;
    11.  
    12. public void onEnable() {
    13.  
    14. plugin = this;
    15. registerEvents(this, new ClassSelect());
    16.  
    17. }
    18.  
    19. public void onDisable() {
    20.  
    21. plugin = null;
    22.  
    23. }
    24.  
    25. public static void registerEvents(org.bukkit.plugin.Plugin plugin, Listener... listeners) {
    26.  
    27. for (Listener listener : listeners) {
    28.  
    29. Bukkit.getServer().getPluginManager().registerEvents(listener, plugin);
    30.  
    31. }
    32.  
    33. }
    34.  
    35.  
    36. public static Plugin getPlugin() {
    37.  
    38. return plugin;
    39.  
    40. }
    41.  
    42.  
    43.  
    44.  
    45. }


    ClassSelect:
    Code:java
    1. package me.Captain_Dory;
    2.  
    3. import java.util.ArrayList;
    4.  
    5. import org.bukkit.Bukkit;
    6. import org.bukkit.ChatColor;
    7. import org.bukkit.Material;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.block.Action;
    12. import org.bukkit.event.block.SignChangeEvent;
    13. import org.bukkit.event.inventory.InventoryClickEvent;
    14. import org.bukkit.event.player.PlayerInteractEvent;
    15. import org.bukkit.inventory.Inventory;
    16. import org.bukkit.inventory.ItemStack;
    17. import org.bukkit.material.Sign;
    18.  
    19. public class ClassSelect implements Listener {
    20.  
    21. ArrayList <String> Scout = new ArrayList <String>();
    22. ArrayList <String> Soldier = new ArrayList <String>();
    23.  
    24. public static Inventory classSelector = Bukkit.createInventory(null, 9, "Choose your class!");
    25.  
    26. static {
    27.  
    28. classSelector.setItem(0, new ItemStack(Material.SUGAR, 1));
    29. classSelector.setItem(1, new ItemStack(Material.SNOW_BALL, 1));
    30. classSelector.setItem(2, new ItemStack(Material.TNT, 1));
    31. classSelector.setItem(3, new ItemStack(Material.FIRE, 1));
    32. classSelector.setItem(4, new ItemStack(Material.DIAMOND_BARDING, 1));
    33. classSelector.setItem(5, new ItemStack(Material.DISPENSER, 1));
    34. classSelector.setItem(6, new ItemStack(Material.BOW, 1));
    35. classSelector.setItem(7, new ItemStack(Material.GOLD_SWORD, 1));
    36. classSelector.setItem(8, new ItemStack(Material.PAPER, 1));
    37.  
    38. }
    39.  
    40. @EventHandler
    41. public void onInventoryClick(InventoryClickEvent event) {
    42.  
    43. Player p = (Player) event.getWhoClicked(); // The player that clicked the item
    44. ItemStack clicked = event.getCurrentItem(); // The item that was clicked
    45. Inventory inventory = event.getInventory(); // The inventory that was clicked in
    46.  
    47. if (inventory.getName() == classSelector.getName()) {
    48.  
    49. if (clicked.getType() == Material.SUGAR) {
    50.  
    51. if (Scout.contains(p.getName())) {
    52.  
    53. event.setCancelled(true);
    54. p.closeInventory();
    55. p.sendMessage("Your class already is Heavy!");
    56.  
    57. }
    58.  
    59. if (!(Scout.contains(p.getName()))) {
    60.  
    61. event.setCancelled(true);
    62. p.closeInventory();
    63. Scout.add(p.getName());
    64. p.sendMessage("Class changed to Scout!");
    65.  
    66. }
    67.  
    68. }
    69.  
    70. }
    71.  
    72. }
    73.  
    74. @EventHandler
    75. public void signInventory (SignChangeEvent e) {
    76.  
    77. if (e.getLine(0).equalsIgnoreCase("inv")) {
    78. e.setLine(0, ChatColor.translateAlternateColorCodes('&', "&8[&4MCTF2&8]"));
    79. e.setLine(1, ChatColor.translateAlternateColorCodes('&', "&fClick to"));
    80. e.setLine(2, ChatColor.translateAlternateColorCodes('&', "&fChange your"));
    81. e.setLine(3, ChatColor.translateAlternateColorCodes('&', "&fClass!"));
    82. }
    83.  
    84. }
    85.  
    86. @EventHandler
    87. public void onPlayerInteract(PlayerInteractEvent e) {
    88. if (!(e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
    89. if (e.getClickedBlock().getState() instanceof Sign) {
    90. Sign s = (Sign) e.getClickedBlock().getState();
    91. if (s.getLine(0).equalsIgnoreCase(ChatColor.translateAlternateColorCodes('&', "&8[&4MCTF2&8]"))) {
    92. e.getPlayer().openInventory(classSelector);
    93. }
    94. }
    95.  
    96.  
    97. }
    98. }
     
  9. Offline

    L33m4n123

    D'oh. you have to getState() of the Sign before you can getLine()
     
  10. Offline

    Captain Dory


    Code:java
    1. Sign s = (Sign) e.getClickedBlock().getState();

    I've already gotten the state :p
     
  11. Offline

    L33m4n123

    if (e.getLine(0).equalsIgnoreCase("inv")) {


    you have to get the state of it.. not directly from the event
     
  12. Offline

    FunnyGopher

    I don't see any problem regarding that line. Weird. I do, however, see two other problems.

    Line 47 of ClassSelect above
    Code:
    if (inventory.getName() == classSelector.getName()) {
    
    should be
    Code:
    if (inventory.getName().equalsIgnoreCase(classSelector.getName())) {
    
    getName() returns a String object, and comparing String objects is accomplished by
    Code:
    string.equals(otherString)
    
    or
    Code:
    string.equalsIgnoreCase(otherString)
    
    Line 89 of ClassSelect above
    Code:
    if (e.getClickedBlock().getState() instanceof Sign) {
    
    This isn't really a problem, but I recently read that checking a block state like this wastes a lot of resources. Instead, check for the material of the item, then if it matches, get a sign using getState().
    Code:
    if(e.getClickedBlock().getType() == Material.SIGN_POST) {
        Sign s = (Sign) e.getClickedBlock().getState();
        ...
    }
    
     
Thread Status:
Not open for further replies.

Share This Page