Solved ItemMeta + Getting held item

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

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

    Captain Dory

    So I've started my first major plugin (nonconfigurable) for my friend's server, but have run into some issues. I've been working on this for about 2 hours and it's gotten so confusing that I just need some help. This is what I want it to do:
    On command "REXCRAFTSWAG" (Going to be something else soon :p), you get an arrow called "RexCraft Game Selector." When you right click air or a block it brings up an inventory menu (Which works). The only problem is that the plugin isn't detecting the arrow. When I remove the ! check if it is arrow return, any block can be used to bring up the menu, but if it's there, the arrow i got from command does not load up the inventory. This is my code:
    Code:
    public class Main extends JavaPlugin implements Listener {
       
        public void onEnable() {
           
            Bukkit.getServer().getPluginManager().registerEvents(this, this);
           
        }
       
        public static Inventory myInventory = Bukkit.createInventory(null, 54, "RexCraft Game Selector");
       
        static {
            myInventory.setItem(13, new ItemStack(Material.GRASS, 1));
            myInventory.setItem(12, new ItemStack(Material.ROTTEN_FLESH, 1));
            myInventory.setItem(44, new ItemStack(Material.BOW, 1));
            myInventory.setItem(35, new ItemStack(Material.WOOL, 1));
            myInventory.setItem(11, new ItemStack(Material.DRAGON_EGG, 1));
            myInventory.setItem(19, new ItemStack(Material.WORKBENCH, 1));
            myInventory.setItem(27, new ItemStack(Material.TNT, 1));
            myInventory.setItem(14, new ItemStack(Material.BONE, 1));
            myInventory.setItem(36, new ItemStack(Material.DIAMOND_SWORD, 1));
            myInventory.setItem(25, new ItemStack(Material.CHEST, 1));
            myInventory.setItem(15, new ItemStack(Material.DIAMOND_SPADE, 1));
            myInventory.setItem(31, new ItemStack(Material.PORTAL, 1));
            //The first parameter, is the slot that is assigned to. Starts counting at 0
            }
       
        @EventHandler
        public void onCompassClick (PlayerInteractEvent e) {
            ItemStack hubArrow = new ItemStack (Material.ARROW);
            ItemMeta meta = hubArrow.getItemMeta();
            meta.setDisplayName("RexCraft Game Selector");
            hubArrow.setItemMeta(meta);
            if (!(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
            if (!(e.getPlayer().getItemInHand().getType().equals(hubArrow))) return;
            e.getPlayer().openInventory(myInventory);
        }
       
        public boolean onCommand(CommandSender sender, Command cmd, String label, String [] args) {
            if (cmd.getName().equalsIgnoreCase("REXCRAFTSWAG")) {
                ItemStack hubArrow = new ItemStack (Material.ARROW);
                ItemMeta meta = hubArrow.getItemMeta();
                meta.setDisplayName("Helper");
                hubArrow.setItemMeta(meta);
                Player p = (Player) sender;
                p.getInventory().addItem(hubArrow);
            }
            return false;
        }
       
        @EventHandler
        public void onInventoryClick(InventoryClickEvent event) {
            Player player = (Player) event.getWhoClicked(); // The player that clicked the item
            ItemStack clicked = event.getCurrentItem(); // The item that was clicked
            Inventory inventory = event.getInventory(); // The inventory that was clicked in
            if (inventory.getName().equals(myInventory.getName())) {
               
               
               
                if (clicked.getType() == Material.GRASS) { // Skyblock
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to SkyBlock..."));
                }
               
                if (clicked.getType() == Material.ROTTEN_FLESH) { // Infection
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Infection..."));
                }
               
                if (clicked.getType() == Material.BOW) { // TF2
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to TF2..."));
                }
               
                if (clicked.getType() == Material.WOOL) { // CTF
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to CTF..."));
                }
               
                if (clicked.getType() == Material.DRAGON_EGG) { // Sky Wars
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Sky Wars..."));
                }
               
                if (clicked.getType() == Material.WORKBENCH) { // Survival
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Survival..."));
                }
               
                if (clicked.getType() == Material.TNT) { // Pirate Battles
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Pirate Battles..."));
                }
               
                if (clicked.getType() == Material.BONE) { // Mob Arena
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Mob Arena..."));
                }
               
                if (clicked.getType() == Material.DIAMOND_SWORD) { // Survival Games
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Survival Games..."));
                }
               
                if (clicked.getType() == Material.CHEST) { // Treasure Hunt
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Treasure Hunt..."));
                }
               
                if (clicked.getType() == Material.DIAMOND_SPADE) { // Spleef
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Spleef..."));
                }
               
                if (clicked.getType() == Material.PORTAL) { // Warps
                    event.setCancelled(true);
                    player.closeInventory();
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4RexCraft&8] &fTeleporting to Warps..."));
                }
               
            }
        }
       
    }
    There are no errors, just it's not working.
    Thanks heaps if you know how to fix this! If you need anything else from me about this just ask ;)
     
  2. Offline

    ItsLeoFTW

    Code:java
    1. if (e.getPlayer().getItemInHand().getType().equals(hubArrow()) return;
    2. e.getPlayer().openInventory(myInventory);

    NOT
    Code:java
    1. if (!(e.getPlayer().getItemInHand().getType().equals(hubArrow()) return;
    2. e.getPlayer().openInventory(myInventory);

    The "!" before "(e.getPlayer()" means "if the item the user is holding is NOT an arrow"
     
  3. Offline

    Captain Dory

    Which is exactly what i want the code to do. If the player is not holding an arrow, end the code.
     
  4. Offline

    FunnyGopher

    From what I see here
    Code:
    if (!(e.getPlayer().getItemInHand().getType().equals(hubArrow))) return;
    
    getType() returns a Material object. It seems as though you are trying to see if a Material object equals an ItemStack object. You want to be comparing Materials. Try this:
    Code:
    if (!(e.getPlayer().getItemInHand().getType().equals(hubArrow.getType()))) return;
    
     
  5. Offline

    Captain Dory

    FunnyGopher

    Thanks so much! This works :D
    I might need your help in a bit for another bit in this plugin though if you can c:
    EDIT: Won't need your help later, I didn't fail :D. Thanks :)

    FunnyGopher I've run into a problem i didn't think i'd have- How do i make an ItemMeta accessible by both an onCommand and a method? Is there like a method i can put it in that makes it accessible by other methods?

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

    FunnyGopher

    What are you trying to do exactly, in relation to your plugin?
     
  7. Offline

    Captain Dory

    Nevermind. I rewrote the plugin. What i did in this rewrite was change the ItemMeta, but when something requested that item, it checked for the material.
     
Thread Status:
Not open for further replies.

Share This Page