Solved InventoryClickEvent Help

Discussion in 'Plugin Development' started by Jaaakee224, Apr 20, 2014.

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

    Jaaakee224

    I am trying to work on a GUI plugin with hats, but when I move a block in my inventory/put an item into the menu while the menu is open it throws an error.

    Here is the error I get
    Code:
    10:22:08 PM [javastacktrace]    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:320) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:486) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:471) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java:1361) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at net.minecraft.server.v1_7_R1.NetworkManager.a(NetworkManager.java:146) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:655) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace]    at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10:22:08 PM [javastacktrace] Caused by: java.lang.NullPointerException
    10:22:08 PM [javastacktrace]    at me.Jaaakee224.MenuInv.Menu.onInventoryClick(Menu.java:72) ~[?:?]
    10:22:08 PM [javastacktrace]    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_45]
    10:22:08 PM [javastacktrace]    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:318) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    

    This is where the error is happening. I want it so if a player moves/puts an item into the menu when it is open to cancel it.
    Code:java
    1. @EventHandler(priority = EventPriority.HIGHEST)
    2. public void onInventoryClick(InventoryClickEvent e) {
    3. Player p = (Player)e.getWhoClicked();
    4. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
    5. if (e.getCurrentItem().getItemMeta() == null) return;
    6. if (e.getCurrentItem() == null) return;
    7. e.setResult(org.bukkit.event.Event.Result.DENY);
    8. e.setCancelled(true);
    9.  
    10. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Horde Head")) {
    11. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.MOB_SPAWNER));
    12. p.closeInventory();
    13. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    14. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Horde Head Selected!");
    15. }
    16. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Time Travel Head")) {
    17. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.PORTAL));
    18. p.closeInventory();
    19. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    20. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Time Travel Head Selected!");
    21. }
    22. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Frozen Head")) {
    23. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.PACKED_ICE));
    24. p.closeInventory();
    25. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    26. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Frozen Head Selected!");
    27. }
    28. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Storage Head")) {
    29. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.CHEST));
    30. p.closeInventory();
    31. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    32. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Storage Head Selected!");
    33. }
    34. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Shooter Head")) {
    35. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.DISPENSER));
    36. p.closeInventory();
    37. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    38. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Shooter Head Selected!");
    39. }
    40. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Brainy Head")) {
    41. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.REDSTONE_BLOCK));
    42. p.closeInventory();
    43. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    44. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Brainy Head Selected!");
    45. }
    46. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Musical Head")) {
    47. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.JUKEBOX));
    48. p.closeInventory();
    49. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    50. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Musical Head Selected!");
    51. }
    52. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Clear your Head!")) {
    53. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.AIR));
    54. p.closeInventory();
    55. p.playSound(p.getLocation(), Sound.EXPLODE, 10, 1);
    56. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.RED + " Head Cleared!");
    57. }
    58. }
    59. }
     
  2. Offline

    CoderMusgrove

    Code:
    at me.Jaaakee224.MenuInv.Menu.onInventoryClick(Menu.java:72)
    What line is Menu.java:72 ?
     
  3. Offline

    agent6262

    What did you do to make the error occur?
     
  4. Offline

    TeeePeee

    Make sure e.getCurrentItem() is not null and has ItemMeta.
     
  5. Offline

    Wizehh

    Jaaakee224:
    I think you forgot to check if the display name was null. Also, on an unrelated note, you should adhere to the Java naming conventions - all your packages' names should be lowercase.
     
  6. Offline

    Jaaakee224

    CoderMusgrove
    Code:java
    1. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Horde Head")) {


    agent6262
    I would move an item into the menu or just move the item around while the menu is open. (All InventoryClickEvent's should be cancelled while the menu is open.)

    TeeePeee
    Would this be fine?
    Code:java
    1. if (!(e.getCurrentItem().getItemMeta() !=null)) return;


    Wizehh
    Would this be fine?
    Code:java
    1. if (e.getCurrentItem().getItemMeta().getDisplayName() == null) return;

    Also, all my packages have upper cases, including Bukkit projects and just regular Java projects.
     
  7. Offline

    agent6262

    You can just "return" but if you want to stop the event you have to use e.setCancled(true);
     
  8. Offline

    Jaaakee224

    agent6262 What do you mean just "return"?
     
  9. Offline

    beeselmane

    Jaaakee224
    he's talking about when you do return;

    also, you have to check if the item is not null as well:
    Code:
    if (e.getCurrentItem() == null) e.setCancelled(true);
    if (e.getCurrentItem().getItemMeta() == null) e.setCancelled(true);
    if (e.getCurrentItem().getItemMeta.getDisPlayerName == null) e.setCancelled(true);
    
     
  10. Offline

    Jaaakee224

    beeselmane I did what you said but it still is giving me errors, here is the latest code.

    Code:java
    1. @EventHandler(priority = EventPriority.HIGHEST)
    2. public void onInventoryClick(InventoryClickEvent e) {
    3. Player p = (Player)e.getWhoClicked();
    4. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) e.setCancelled(true);
    5. if (e.getCurrentItem().getItemMeta() == null) e.setCancelled(true);
    6. if (e.getCurrentItem() == null) e.setCancelled(true);
    7. if (e.getCurrentItem().getItemMeta() ==null) e.setCancelled(true);
    8. if (e.getCurrentItem().getItemMeta().getDisplayName() == null) e.setCancelled(true);
    9. e.setResult(org.bukkit.event.Event.Result.DENY);
    10. e.setCancelled(true);
    11.  
    12. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Horde Head")) {
    13. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.MOB_SPAWNER));
    14. p.closeInventory();
    15. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    16. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Horde Head Selected!");
    17. }
    18. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Time Travel Head")) {
    19. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.PORTAL));
    20. p.closeInventory();
    21. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    22. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Time Travel Head Selected!");
    23. }
    24. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Frozen Head")) {
    25. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.PACKED_ICE));
    26. p.closeInventory();
    27. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    28. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Frozen Head Selected!");
    29. }
    30. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Storage Head")) {
    31. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.CHEST));
    32. p.closeInventory();
    33. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    34. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Storage Head Selected!");
    35. }
    36. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Shooter Head")) {
    37. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.DISPENSER));
    38. p.closeInventory();
    39. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    40. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Shooter Head Selected!");
    41. }
    42. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Brainy Head")) {
    43. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.REDSTONE_BLOCK));
    44. p.closeInventory();
    45. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    46. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Brainy Head Selected!");
    47. }
    48. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Musical Head")) {
    49. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.JUKEBOX));
    50. p.closeInventory();
    51. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    52. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Musical Head Selected!");
    53. }
    54. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Clear your Head!")) {
    55. e.getWhoClicked().getInventory().setHelmet(new ItemStack(Material.AIR));
    56. p.closeInventory();
    57. p.playSound(p.getLocation(), Sound.EXPLODE, 10, 1);
    58. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.RED + " Head Cleared!");
    59. }
    60. }
    61. }
     
  11. Offline

    beeselmane

    Jaaakee224

    oh, sorry about that… after you setCancelled in the for loops, you need to return from the function as well:
    Code:java
    1.  
    2. if (e.getCurrentItem() == null)
    3. {
    4. e.setCancelled(true);
    5. return;
    6. }
    7. if (e.getCurrentItem().getItemMeta() ==null)
    8. {
    9. e.setCancelled(true);
    10. return;
    11. }
    12. if (e.getCurrentItem().getItemMeta().getDisplayName() == null)
    13. {
    14. e.setCancelled(true);
    15. return;
    16. }


    these if loops are a bit messy.. you could also do this:

    Code:java
    1. import net.minecraft.util.org.apache.commons.lang3.Validate;
    2.  
    3. try {
    4. Validate.notNull(e.getCurrentItem());
    5. Validate.notNull(e.getCurrentItem().getItemMeta());
    6. Validate.notNull(e.getCurrentItem().getItemMeta().getDisplayName());
    7. } catch (Exception ex) {
    8. e.setCancelled(true);
    9. return;
    10. }
     
    Jaaakee224 likes this.
  12. Offline

    Jaaakee224

    beeselmane
    This works perfectly, thank you so much! :)
     
    beeselmane likes this.
Thread Status:
Not open for further replies.

Share This Page