What is wrong with my SilkTouch Spawner code?

Discussion in 'Plugin Development' started by Sev0863, Jan 3, 2023.

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

    Sev0863

    Hi,

    I followed a tutorial online about a silktouch Spawner plugin and it works on the older versions of bukkit(its on 1.12 or something like that in the video) but when on newer versions it doesnt seem to work as I will describe now:

    1 - It successfully picks up the spawner using a SilkTouch Pickaxe but it resets it to the blank mob spawner and not the one that I was initially trying to pick up for example a Spider Spawner.

    The Listener Code is as follows:

    Code:
    public class CortexListeners implements Listener {
    
    @EventHandler
    public void spawnerBreak(SpawnerBreakEvent e){
    
    //find the type of spawnerCreatureSpawner cs = (CreatureSpawner) e.getSpawner().getState();
    
    //create a new spawner and set its entity type for the player to haveItemStack
    spawner_to_give = new ItemStack(Material.SPAWNER);
    BlockStateMeta meta = (BlockStateMeta) spawner_to_give.getItemMeta();
    CreatureSpawner css = (CreatureSpawner) meta.getBlockState();
    
    css.setSpawnedType(cs.getSpawnedType());
    meta.setBlockState(css);
    spawner_to_give.setItemMeta(meta);
    
    e.getBreaker().sendMessage(ChatColor.GRAY + "You have silk touched a spawner");
    e.getBreaker().getInventory().addItem(spawner_to_give);
    }
    
    }
    Listener Code for the BlockBreakEvent is as follows:

    Code:
    public class BlockBreakListener implements Listener {
    
        @EventHandler
        public void onSpawnerBreak(org.bukkit.event.block.BlockBreakEvent e){
            //we need to figure out if they broke a spawner or not
            Block blockBroken = e.getBlock();
            if (blockBroken.getType().equals(Material.SPAWNER) && e.getPlayer().getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH) && e.getPlayer().hasPermission("cortexspawner.silk")) {
                Bukkit.getServer().getPluginManager().callEvent(new SpawnerBreakEvent(e.getPlayer(), blockBroken));
            }else if(blockBroken.getType().equals(Material.SPAWNER) && e.getPlayer().getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH )&& !(e.getPlayer().hasPermission("cortexspawner.silk"))){
                //dont have perms to silk break
                e.getPlayer().sendMessage(ChatColor.GRAY + "You are unable to obtain spawners from silk-mining.");
            }
        }
    
    }
    And finally in my main class on the OnEnable trigger is the following code:

    Code:
    getServer().getPluginManager().registerEvents(new BlockBreakListener(), this);
    getServer().getPluginManager().registerEvents(new CortexListeners(), this);
    Please any advice would be helpful.


    Apologies for the weird formatting of the text
     
    Last edited: Jan 3, 2023
  2. Offline

    DopeBrot

    This code works for me:
    Code (open)
    Code:
        @EventHandler
        public void onBlockBreak(BlockBreakEvent event) {
            if (event.getBlock().getType().equals(Material.SPAWNER)) {
                event.getPlayer().getInventory().getItemInMainHand();
                if (event.getPlayer().getInventory().getItemInMainHand().getEnchantments().containsKey(Enchantment.SILK_TOUCH)) {
                    if (event.getBlock().getState() instanceof CreatureSpawner spawnerBlock) {
                        ItemStack itemStack = new ItemStack(Material.SPAWNER);
                        BlockStateMeta meta = (BlockStateMeta) itemStack.getItemMeta();
                        meta.setBlockState(spawnerBlock.getBlock().getState());
                        itemStack.setItemMeta(meta);
                        event.getPlayer().getInventory().addItem(itemStack);
                    }
                }
            }
        }
     
  3. Offline

    Sev0863

    Hi,

    Thank you for the code.

    I am still having an issue with it as it is still doing the same as before where to gets picked up as a blank spawner, I placed your code as follows in my old Listener code was.

    Is this the correct placement?

    Also this is how I had adjusted your code to my references in my code:
    Code:
    @EventHandler
        public void onSpawnerBreak(SpawnerBreakEvent event) {
            if (event.getSpawner().getType().equals(Material.SPAWNER)) {
                event.getBreaker().getInventory().getItemInMainHand();
                if (event.getBreaker().getInventory().getItemInMainHand().getEnchantments().containsKey(Enchantment.SILK_TOUCH)) {
                    if (event.getSpawner().getState() instanceof CreatureSpawner spawnerBlock) {
                        ItemStack itemStack = new ItemStack(Material.SPAWNER);
                        BlockStateMeta meta = (BlockStateMeta) itemStack.getItemMeta();
                        meta.setBlockState(spawnerBlock.getBlock().getState());
                        itemStack.setItemMeta(meta);
                        event.getBreaker().getInventory().addItem(itemStack);
                    }
                }
            }
        }
    Also here is the SpawnerBreakEvent Code:
    Code:
    
    import org.bukkit.block.Block;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event;
    import org.bukkit.event.HandlerList;
    
    public class SpawnerBreakEvent extends Event {
    
        private static final HandlerList handlers = new HandlerList();
    
        Player breaker;
        Block spawner;
    
        public SpawnerBreakEvent(Player breaker, Block spawner){
            this.breaker = breaker;
            this.spawner = spawner;
        }
    
        public Player getBreaker() {
            return breaker;
        }
    
        public Block getSpawner() {
            return spawner;
        }
    
        public HandlerList getHandlers() {
            return handlers;
        }
    
        public static HandlerList getHandlerList() {
            return handlers;
        }
    
    }
    
    
     
  4. Offline

    DopeBrot

    i wrote the code for 1.18.2 in paper, and i tested it in both bukkit and paper, and it worked.

    do you have any plugin installed that controls item nbt's ? like "Creative Item Control"
    check if the event gets fired by adding logs in the console like:
    Code:
    Bukkit.getLogger().log(Level.WARNING,"ITEMSTACK");
    check if the item you got has an nbt tag. by pressing "F3 + H" and hover over the item in your inventory, it should say something like "NBT: 1 bla bla"

    and check if you updated the plugin.
    test it with the BlockBreakEvent instead.
     
  5. Offline

    Sev0863

    Hi,

    Thank you for the reply, I will give what you suggested a try and get back to you.

    I have a few other plugins installed but none that would control NBTs as far as I know but will try it with only the silktouch plugin too

    If all else fails I will try rewrite it from scratch and see what happens.
     
  6. Offline

    DopeBrot

    If you want to use the whole code here you go, you can use it like a template or something idk.
    Code (open)
    Code:
    public class Main extends JavaPlugin implements Listener {
      
        @Override
        public void onEnable() {
            Bukkit.getPluginManager().registerEvents(this,this);
        }
    
        @EventHandler
        public void onBlockBreak(BlockBreakEvent event) {
            if (event.getBlock().getType().equals(Material.SPAWNER)) {
                event.getPlayer().getInventory().getItemInMainHand();
                if (event.getPlayer().getInventory().getItemInMainHand().getEnchantments().containsKey(Enchantment.SILK_TOUCH)) {
                    if (event.getBlock().getState() instanceof CreatureSpawner spawnerBlock) {
                        ItemStack itemStack = new ItemStack(Material.SPAWNER);
                        BlockStateMeta meta = (BlockStateMeta) itemStack.getItemMeta();
                        meta.setBlockState(spawnerBlock.getBlock().getState());
                        itemStack.setItemMeta(meta);
                        event.getPlayer().getInventory().addItem(itemStack);
                    }
                }
            }
        }
      
    }
     
Thread Status:
Not open for further replies.

Share This Page