If item has enchantments

Discussion in 'Plugin Development' started by javoris767, Jan 28, 2013.

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

    javoris767

    Hello, how do I tell if the item in a player's hand has an enchantment? I tried doing it, but it looks wrong XD
     
  2. Offline

    Drew1080

    Show us what your tried then.
     
  3. Offline

    javoris767

    Code:
            Enchantment e = null;
            Block block = event.getBlock();
           
            if(player.getItemInHand().getType() == Material.DIAMOND_PICKAXE &&
                    e == Enchantment.SILK_TOUCH &&
                    block.getType() == Material.MOB_SPAWNER) {
    o-o
     
  4. Offline

    Drew1080

    Does it compile/work on your sever because the code seem correct?

    You could always try this;

    Code:
    if(p.getItemInHand().getEnchantments() == Enchantment.SILK_TOUCH)
    Haven't tested that so it may not work.
     
  5. Offline

    javoris767

    Here's an error
    Code:
    00:23:57 [SEVERE] Could not pass event BlockBreakEvent to SilkSpawner v0.1
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:427)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:477)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:462)
            at net.minecraft.server.v1_4_6.PlayerInteractManager.breakBlock(PlayerIn
    teractManager.java:282)
            at net.minecraft.server.v1_4_6.PlayerInteractManager.a(PlayerInteractMan
    ager.java:209)
            at net.minecraft.server.v1_4_6.PlayerConnection.a(PlayerConnection.java:
    566)
            at net.minecraft.server.v1_4_6.Packet14BlockDig.handle(SourceFile:46)
            at net.minecraft.server.v1_4_6.NetworkManager.b(NetworkManager.java:290)
    
            at net.minecraft.server.v1_4_6.PlayerConnection.d(PlayerConnection.java:
    112)
            at net.minecraft.server.v1_4_6.ServerConnection.b(SourceFile:39)
            at net.minecraft.server.v1_4_6.DedicatedServerConnection.b(SourceFile:30
    )
            at net.minecraft.server.v1_4_6.MinecraftServer.r(MinecraftServer.java:59
    8)
            at net.minecraft.server.v1_4_6.DedicatedServer.r(DedicatedServer.java:22
    4)
            at net.minecraft.server.v1_4_6.MinecraftServer.q(MinecraftServer.java:49
    4)
            at net.minecraft.server.v1_4_6.MinecraftServer.run(MinecraftServer.java:
    427)
            at net.minecraft.server.v1_4_6.ThreadServerApplication.run(SourceFile:84
    9)
    Caused by: java.lang.NoClassDefFoundError: net/minecraft/server/v1_4_R1/Enchantm
    ent
            at me.javoris767.silkspawner.BreakListener.onBlockBreak(BreakListener.ja
    va:26)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:425)
            ... 16 more
    Caused by: java.lang.ClassNotFoundException: net.minecraft.server.v1_4_R1.Enchan
    tment
            at org.bukkit.plugin.java.PluginClassLoader.findClass0(PluginClassLoader
    .java:70)
            at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.
    java:53)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            ... 22 more
    >
     
  6. Offline

    Drew1080

  7. Offline

    javoris767

    That was mine, this is the one I'm getting now.

    Code:
    00:38:16 [SEVERE] Could not pass event BlockBreakEvent to SilkSpawner v0.1
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:427)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:477)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:462)
            at net.minecraft.server.v1_4_6.PlayerInteractManager.breakBlock(PlayerIn
    teractManager.java:282)
            at net.minecraft.server.v1_4_6.PlayerInteractManager.a(PlayerInteractMan
    ager.java:209)
            at net.minecraft.server.v1_4_6.PlayerConnection.a(PlayerConnection.java:
    566)
            at net.minecraft.server.v1_4_6.Packet14BlockDig.handle(SourceFile:46)
            at net.minecraft.server.v1_4_6.NetworkManager.b(NetworkManager.java:290)
     
            at net.minecraft.server.v1_4_6.PlayerConnection.d(PlayerConnection.java:
    112)
            at net.minecraft.server.v1_4_6.ServerConnection.b(SourceFile:39)
            at net.minecraft.server.v1_4_6.DedicatedServerConnection.b(SourceFile:30
    )
            at net.minecraft.server.v1_4_6.MinecraftServer.r(MinecraftServer.java:59
    8)
            at net.minecraft.server.v1_4_6.DedicatedServer.r(DedicatedServer.java:22
    4)
            at net.minecraft.server.v1_4_6.MinecraftServer.q(MinecraftServer.java:49
    4)
            at net.minecraft.server.v1_4_6.MinecraftServer.run(MinecraftServer.java:
    427)
            at net.minecraft.server.v1_4_6.ThreadServerApplication.run(SourceFile:84
    9)
    Caused by: java.lang.NoClassDefFoundError: net/minecraft/server/v1_4_R1/Enchantm
    ent
            at me.javoris767.silkspawner.BreakListener.onBlockBreak(BreakListener.ja
    va:23)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:425)
            ... 16 more
    Caused by: java.lang.ClassNotFoundException: net.minecraft.server.v1_4_R1.Enchan
    tment
            at org.bukkit.plugin.java.PluginClassLoader.findClass0(PluginClassLoader
    .java:70)
            at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.
    java:53)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            ... 22 more
    >
     
  8. Offline

    Drew1080

    Tested this myself:
    Code:
            ItemStack item = p.getItemInHand();
            if(item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)){
                p.sendMessage("The item has silktouch");
               
            }else{
                p.sendMessage("The item does not have silktouch");
               
            }
    The above code works as I tested it myself, you only need to check now if it is a diamond pickaxe.

    Turns out I was going about it the wrong way above as well :p
     
  9. Offline

    javoris767

    Drew1080
    Code:
        @EventHandler
        public void onBlockBreak(BlockBreakEvent event) {
            Player p = event.getPlayer();
            ItemStack item = p.getItemInHand();
            if(item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)){
                if(item.getType() == Material.DIAMOND_PICKAXE) {
                    p.sendMessage("The item has silktouch");
                }else{
                    p.sendMessage("The item does not have silktouch");
                }
            }
        }
    }
    
    This is weird D: I'm still getting the error.
     
  10. Offline

    Drew1080

    javoris767
    Check to see if the item is a Pickaxe first incase it doesnt have an enchantment.

    Code:
    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {
        Player p = event.getPlayer();
        ItemStack item = p.getItemInHand();
        if(item.getType() == Material.DIAMOND_PICKAXE){
            if(item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)) {
                p.sendMessage("The item has silktouch");
            }else{
                p.sendMessage("The item does not have silktouch");
            }
        }
    }
     
  11. Offline

    javoris767

  12. Offline

    Drew1080

    javoris767
    I just tested that against the latest beta build of craftbukkit and bukkit and it works.
    So I still don't know why it would be happening for you.
     
  13. Offline

    javoris767

    Oh the minecraft enchantment library was imported x-x
     
  14. Offline

    Drew1080

  15. Offline

    javoris767

    Drew1080
    Yep, thanks for the info :3
     
  16. Offline

    Drew1080

    javoris767
    Found another method while looking around the javadocs
    Code:
     if(p.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)){
    // code here
    }
     
Thread Status:
Not open for further replies.

Share This Page