Right click action isn't working

Discussion in 'Plugin Development' started by minnowed, Apr 9, 2020.

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

    minnowed

    I'm trying to code a custom item so that when you right click it (either on a block or in the air) it will give you a predetermined item based on chance. However, I cant seem to get it to work. The main problem is I don't know what's going wrong, so I don't know what to focus on fixing. Here is the code for the item and the interact event (they're in the same class):

    Code:
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.enchantments.Enchantment;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    
    import java.util.ArrayList;
    import java.util.Random;
    
    public class Meteorite implements Listener {
        private Object meteorite;
        private ItemMeta meta;
    
        public static void giveItems(Player player){
            ItemStack meteorite = new ItemStack(Material.FIREWORK_STAR, 1);
            ItemMeta meta = meteorite.getItemMeta();
            meta.addEnchant(Enchantment.DURABILITY, 10, true);
            meta.setDisplayName(ChatColor.RED + "Meteorite");
            ArrayList<String> lore = new ArrayList<>();
            lore.add("It's oddly light, wait is it hollow?");
            lore.add("Right click to break open!");
            meta.setLore(lore);
            meteorite.setItemMeta(meta);
            player.getInventory().addItem(meteorite);
        }
        @EventHandler
        public void onRightClick(PlayerInteractEvent event){
            Player player = event.getPlayer();
            if(player.getInventory().getItemInMainHand().getType().equals(meteorite)){
                if(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK){
                    Random ran = new Random();
                    int choice = ran.nextInt(100) + 1;
    
                    ItemStack item1 = new ItemStack(Material.BEE_SPAWN_EGG, 1);
                    ItemStack item2 = new ItemStack(Material.GRASS_BLOCK, 32);
                    ItemStack item3 = new ItemStack(Material.DIAMOND, 8);
    
                    if(choice < 60){
                        player.getInventory().addItem(item2);
                        player.getInventory().removeItem((ItemStack) meteorite);
                    } else if (choice < 70){
                        player.getInventory().addItem(item3);
                        player.getInventory().removeItem((ItemStack) meteorite);
                    } else {
                        player.getInventory().addItem(item1);
                        player.getInventory().removeItem((ItemStack) meteorite);
                    }
                }
            }
        }
    }
    I would really appreciate help, thank you for your time.
     
    Last edited: Apr 9, 2020
  2. Offline

    bowlerguy66

    'meteorite' shouldn't be an Object in its declaration; if you want to see what type of item it is, use the Material enum, and test it like this:
    Code:
    player.getInventory().getItemInMainHand().getType() == meteorite
     
  3. Offline

    Strahan

    Well, it would be better done with an ItemStack#isSimilar check.

    Also OP, you don't need to specify , 1 when making a new ItemStack. 1 item is the default. Also your ArrayList should be declared
    Code:
    List<String> lore = new ArrayList<>();
    instead per SOLID design principles. You shouldn't be making a new Random each time either, use ThreadLocalRandom.
     
Thread Status:
Not open for further replies.

Share This Page