Setting a Player's Helmet

Discussion in 'Plugin Development' started by Jaaakee224, May 3, 2014.

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

    Jaaakee224

    So I am creating a GUI allowing players to select a block to put as their helmet. All of them seem to work except one, which is the Redstone Block Head (Brainy Head), which is in the 6th slot. When I click the redstone block in the GUI, it goes in my inventory, not the helmet slot.

    Code
    Code:java
    1. package me.Jaaakee224.MenuInv;
    2.  
    3. import net.minecraft.util.org.apache.commons.lang3.Validate;
    4.  
    5. import org.bukkit.Bukkit;
    6. import org.bukkit.ChatColor;
    7. import org.bukkit.Material;
    8. import org.bukkit.Sound;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.event.EventHandler;
    11. import org.bukkit.event.EventPriority;
    12. import org.bukkit.event.Listener;
    13. import org.bukkit.event.inventory.InventoryClickEvent;
    14. import org.bukkit.inventory.Inventory;
    15. import org.bukkit.inventory.ItemStack;
    16. import org.bukkit.inventory.meta.ItemMeta;
    17. import org.bukkit.material.Wool;
    18. import org.bukkit.plugin.Plugin;
    19.  
    20. public class Menu implements Listener {
    21.  
    22. private Inventory inv;
    23. private ItemStack c, s, a, b, d, r, j, n;
    24.  
    25. public Menu(Plugin p) {
    26. inv = Bukkit.getServer().createInventory(null, 9, ChatColor.BOLD + "MineCube Head Selector");
    27.  
    28. c = createItem(Material.MOB_SPAWNER, ChatColor.BLUE + "Horde Head");
    29. s = createItem(Material.PORTAL, ChatColor.BLUE + "Time Travel Head");
    30. a = createItem(Material.ICE, ChatColor.BLUE + "Frozen Head");
    31. b = createItem(Material.CHEST, ChatColor.BLUE + "Storage Head");
    32. d = createItem(Material.DISPENSER, ChatColor.BLUE + "Shooter Head");
    33. r = createItem(Material.REDSTONE_BLOCK, ChatColor.BLUE + "Brainy Head");
    34. j = createItem(Material.JUKEBOX, ChatColor.BLUE + "Musical Head");
    35. n = createItem(Material.TNT, ChatColor.RED + "Clear your Head!");
    36.  
    37. inv.setItem(0, c);
    38. inv.setItem(1, s);
    39. inv.setItem(2, a);
    40. inv.setItem(3, b);
    41. inv.setItem(4, d);
    42. inv.setItem(5, r);
    43. inv.setItem(6, j);
    44. inv.setItem(8, n);
    45.  
    46.  
    47. Bukkit.getServer().getPluginManager().registerEvents(this, p);
    48. }
    49.  
    50. private ItemStack createItem(Material head, String name) {
    51. ItemStack i = new Wool(head).toItemStack(1);
    52. ItemMeta im = i.getItemMeta();
    53. im.setDisplayName(name);
    54. i.setItemMeta(im);
    55. return i;
    56. }
    57.  
    58. public void show(Player p) {
    59. p.openInventory(inv);
    60. }
    61.  
    62. @EventHandler(priority = EventPriority.HIGHEST)
    63. public void onInventoryClick(InventoryClickEvent e) {
    64. Player p = (Player)e.getWhoClicked();
    65. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
    66. try {
    67. Validate.notNull(e.getCurrentItem());
    68. Validate.notNull(e.getCurrentItem().getItemMeta());
    69. Validate.notNull(e.getCurrentItem().getItemMeta().getDisplayName());
    70. } catch (Exception ex) {
    71. e.setCancelled(true);
    72. return;
    73. }
    74.  
    75. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Horde Head")) {
    76. p.getInventory().setHelmet(new ItemStack(Material.MOB_SPAWNER));
    77. p.closeInventory();
    78. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    79. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Horde Head Selected!");
    80. }
    81. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Time Travel Head")) {
    82. p.getInventory().setHelmet(new ItemStack(Material.PORTAL));
    83. p.closeInventory();
    84. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    85. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Time Travel Head Selected!");
    86. }
    87. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Frozen Head")) {
    88. p.getInventory().setHelmet(new ItemStack(Material.PACKED_ICE));
    89. p.closeInventory();
    90. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    91. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Frozen Head Selected!");
    92. }
    93. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Storage Head")) {
    94. p.getInventory().setHelmet(new ItemStack(Material.CHEST));
    95. p.closeInventory();
    96. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    97. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Storage Head Selected!");
    98. }
    99. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Shooter Head")) {
    100. p.getInventory().setHelmet(new ItemStack(Material.DISPENSER));
    101. p.closeInventory();
    102. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    103. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Shooter Head Selected!");
    104. }
    105. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Brainy Head")) {
    106. p.getInventory().setHelmet(new ItemStack(Material.REDSTONE_BLOCK));
    107. p.closeInventory();
    108. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    109. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Brainy Head Selected!");
    110. }
    111. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Musical Head")) {
    112. p.getInventory().setHelmet(new ItemStack(Material.JUKEBOX));
    113. p.closeInventory();
    114. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    115. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Musical Head Selected!");
    116. }
    117. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Clear your Head!")) {
    118. if(!(p.getInventory().getHelmet() != null)) {
    119. p.closeInventory();
    120. p.playSound(p.getLocation(), Sound.EXPLODE, 10, 1);
    121. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.RED + " You currently don't have a head on!");
    122.  
    123. } else {
    124.  
    125. p.getInventory().setHelmet(new ItemStack(Material.AIR));
    126. p.closeInventory();
    127. p.playSound(p.getLocation(), Sound.EXPLODE, 10, 1);
    128. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.RED + " Head Cleared!");
    129. }
    130. }
    131. }
    132. }


    All help is appreciated :D
     
  2. Offline

    Funergy

    why not p.getInventory().setHelmet();
     
  3. Offline

    Arfie99

    So why not something like
    Code:java
    1. p.getInventory().setHelmet(e.getCurrentItem().clone());
    2. p.closeInventory();
    3. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    4. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    instead of individually checking for every item? It is significantly shorter.

    By the way, I am not sure if this will actually work with the redstone block. But I think it is definitely an improvement to your code :)
     
  4. Offline

    Jaaakee224

    Arfie99 I used what you said, however it still won't work.

    Funergy Only Redstone Block won't work, so I don't think it is that.
     
  5. Offline

    Arfie99

    Does it work if you try changing the redstone block to another block?
     
  6. Offline

    Jaaakee224

    Arfie99 No, whatever is in that 6th slot of the inventory won't work, if I switch the redstone block to a jukebox the jukebox won't work.

    Updated Code
    Code:java
    1. package me.Jaaakee224.MenuInv;
    2.  
    3. import net.minecraft.util.org.apache.commons.lang3.Validate;
    4.  
    5. import org.bukkit.Bukkit;
    6. import org.bukkit.ChatColor;
    7. import org.bukkit.Material;
    8. import org.bukkit.Sound;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.event.EventHandler;
    11. import org.bukkit.event.EventPriority;
    12. import org.bukkit.event.Listener;
    13. import org.bukkit.event.inventory.InventoryClickEvent;
    14. import org.bukkit.inventory.Inventory;
    15. import org.bukkit.inventory.ItemStack;
    16. import org.bukkit.inventory.meta.ItemMeta;
    17. import org.bukkit.material.Wool;
    18. import org.bukkit.plugin.Plugin;
    19.  
    20. public class Menu implements Listener {
    21.  
    22. private Inventory inv;
    23. private ItemStack c, s, a, b, d, r, j, n;
    24.  
    25. public Menu(Plugin p) {
    26. inv = Bukkit.getServer().createInventory(null, 9, ChatColor.BOLD + "MineCube Head Selector");
    27.  
    28. c = createItem(Material.MOB_SPAWNER, ChatColor.BLUE + "Horde Head");
    29. s = createItem(Material.PORTAL, ChatColor.BLUE + "Time Travel Head");
    30. a = createItem(Material.ICE, ChatColor.BLUE + "Frozen Head");
    31. b = createItem(Material.CHEST, ChatColor.BLUE + "Storage Head");
    32. d = createItem(Material.DISPENSER, ChatColor.BLUE + "Shooter Head");
    33. r = createItem(Material.REDSTONE_BLOCK, ChatColor.BLUE + "Brainy Head");
    34. j = createItem(Material.JUKEBOX, ChatColor.BLUE + "Musical Head");
    35. n = createItem(Material.TNT, ChatColor.RED + "Clear your Head!");
    36.  
    37. inv.setItem(0, c);
    38. inv.setItem(1, s);
    39. inv.setItem(2, a);
    40. inv.setItem(3, b);
    41. inv.setItem(4, d);
    42. inv.setItem(5, r);
    43. inv.setItem(6, j);
    44. inv.setItem(8, n);
    45.  
    46.  
    47. Bukkit.getServer().getPluginManager().registerEvents(this, p);
    48. }
    49.  
    50. private ItemStack createItem(Material head, String name) {
    51. ItemStack i = new Wool(head).toItemStack(1);
    52. ItemMeta im = i.getItemMeta();
    53. im.setDisplayName(name);
    54. i.setItemMeta(im);
    55. return i;
    56. }
    57.  
    58. public void show(Player p) {
    59. p.openInventory(inv);
    60. }
    61.  
    62. @EventHandler(priority = EventPriority.HIGHEST)
    63. public void onInventoryClick(InventoryClickEvent e) {
    64. Player p = (Player)e.getWhoClicked();
    65. if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())) return;
    66. try {
    67. Validate.notNull(e.getCurrentItem());
    68. Validate.notNull(e.getCurrentItem().getItemMeta());
    69. Validate.notNull(e.getCurrentItem().getItemMeta().getDisplayName());
    70. } catch (Exception ex) {
    71. e.setCancelled(true);
    72. return;
    73. }
    74.  
    75. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Horde Head")) {
    76. p.getInventory().setHelmet(e.getCurrentItem().clone());
    77. p.closeInventory();
    78. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    79.  
    80. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    81. }
    82. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Time Travel Head")) {
    83. p.getInventory().setHelmet(e.getCurrentItem().clone());
    84. p.closeInventory();
    85. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    86.  
    87. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    88. }
    89. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Frozen Head")) {
    90. p.getInventory().setHelmet(e.getCurrentItem().clone());
    91. p.closeInventory();
    92. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    93.  
    94. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    95. }
    96. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Storage Head")) {
    97. p.getInventory().setHelmet(e.getCurrentItem().clone());
    98. p.closeInventory();
    99. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    100.  
    101. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    102. }
    103. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Shooter Head")) {
    104. p.getInventory().setHelmet(e.getCurrentItem().clone());
    105. p.closeInventory();
    106. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    107.  
    108. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    109. }
    110. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Brainy Head")) {
    111. p.getInventory().setHelmet(e.getCurrentItem().clone());
    112. p.closeInventory();
    113. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    114.  
    115. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    116. }
    117. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Musical Head")) {
    118. p.getInventory().setHelmet(e.getCurrentItem().clone());
    119. p.closeInventory();
    120. p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
    121.  
    122. p.sendMessage(ChatColor.GRAY+"["+ ChatColor.YELLOW+"MineCube"+ ChatColor.GRAY+"]"+ ChatColor.GREEN+ " " + ChatColor.stripColor(e.getCurrentItem().getItemMeta().getDisplayName()) + " Selected!");
    123. }
    124. if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Clear your Head!")) {
    125. if(!(p.getInventory().getHelmet() != null)) {
    126. p.closeInventory();
    127. p.playSound(p.getLocation(), Sound.EXPLODE, 10, 1);
    128. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.RED + " You currently don't have a head on!");
    129.  
    130. } else {
    131.  
    132. p.getInventory().setHelmet(new ItemStack(Material.AIR));
    133. p.closeInventory();
    134. p.playSound(p.getLocation(), Sound.EXPLODE, 10, 1);
    135. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.YELLOW + "MineCube" + ChatColor.GRAY + "]" + ChatColor.RED + " Head Cleared!");
    136. }
    137. }
    138. }
    139. }


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

    mibac138

    1. Do you have any errors ?
    2. Does registering events in not onEnable method actually works ?
     
  8. Offline

    Jaaakee224

    mibac138
    1. None
    2. I don't understand your question
     
  9. Offline

    mibac138

    I'm not sure, does registering events not in onEnable method (in main class) works

    BTW. add some debug messages for example after if statement that checks is the menu name the same as "yours" menu name, do e.getPlayer().sendMessage("1, or menu name is good");
     
  10. Offline

    Jaaakee224

    mibac138 I have the message that says it was selected, would that work?

    Here is my main class by the way
    Code:java
    1. package me.Jaaakee224.MenuInv;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.Sound;
    5. import org.bukkit.command.Command;
    6. import org.bukkit.command.CommandSender;
    7. import org.bukkit.entity.Player;
    8. import org.bukkit.event.Listener;
    9. import org.bukkit.plugin.java.JavaPlugin;
    10.  
    11. public class MenuInv extends JavaPlugin implements Listener {
    12.  
    13. private Menu menu;
    14.  
    15. public void onEnable() {
    16. menu = new Menu(this);
    17. Bukkit.getServer().getPluginManager().registerEvents(this, this);
    18. }
    19.  
    20. @Override
    21. public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    22. if (!(sender instanceof Player)) {
    23. Bukkit.getLogger().info("[MineCube]" + " Only players can run this command!");
    24. return false;
    25. }
    26.  
    27. Player p = (Player)sender;
    28.  
    29. if(cmd.getName().equalsIgnoreCase("head")) {
    30. p.playSound(p.getLocation(), Sound.CHEST_OPEN, 10, 1);
    31. menu.show(p);
    32. }
    33. return false;
    34. }
    35. }
     
  11. Offline

    mibac138

    Try removing registerEvents method in class Menu and add it to MenuInv:
    Code:java
    1. public void onEnable() {
    2. menu = new Menu(this);
    3. getServer().getPluginManager().registerEvents(this, this);
    4. getServer().getPluginManager().registerEvents(new Menu( this ), this);
    5. }


    BTW. When i was saying to add debug messages all if statements were on my mind :p And then, say us which didn't display
     
  12. Offline

    Jaaakee224

    mibac138 But the others work, so it can't be a registering events problem.
     
  13. Offline

    mibac138

    Don't know why it doesn't work
     
  14. I need something like this too :D
     
  15. Offline

    Jaaakee224

    Anybody? Bump.
     
  16. Offline

    AoH_Ruthless

    mibac138
    You don't have to register events in any specific method, so long as it eventually gets called on startup. That's kind of Java sense.

    Jaaakee224
    Have you tried updating the inventory at the end? Typically there is ghost items involved with setting helmet and a p.updateInventory() should solve the issue.
     
  17. Offline

    Jaaakee224

    AoH_Ruthless
    I did that and it says "The method updateInventory() from the type Player is deprecated."
     
  18. Offline

    AoH_Ruthless

    Jaaakee224
    Then suppress deprecation warnings ...
     
  19. Offline

    Jaaakee224

    AoH_Ruthless
    Okay that helps a bit, I get the block being set to the helmet now, but it also adds another block to my inventory as well.
     
  20. Offline

    AoH_Ruthless

    Jaaakee224
    It's too tedious for me to look through that entire code for you. Obviously, you are giving the player the item somewhere, or not removing it so you should figure out where that is coming from.
     
  21. Offline

    Jaaakee224

    AoH_Ruthless
    The weird thing is though, if I switch the code up, whatever is in that slot will give a block to the players inventory. All the other slots work perfectly though.
     
Thread Status:
Not open for further replies.

Share This Page