@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { if (event.isCancelled()) { return; } Block block = event.getBlock(); Player player = event.getPlayer(); // We just want the mob spawner events if (block.getType() != Material.MOB_SPAWNER) { return; } // We can't build here? Return then if (!su.canBuildHere(player, block.getLocation())) { return; } // Get the entityID from the spawner short entityID = su.getSpawnerEntityID(block); // Message the player about the broken spawner plugin.informPlayer( player, ChatColor.translateAlternateColorCodes( '\u0026', plugin.localization.getString("spawnerBroken")) .replace("%creature%", su.getCreatureName(entityID))); // If using silk touch, drop spawner itself ItemStack tool = player.getItemInHand(); // Check for SilkTocuh level boolean validToolAndSilkTouch = su.isValidItemAndHasSilkTouch(tool); // Get the world to drop in World world = player.getWorld(); // Mob String mobName = su.getCreatureName(entityID).toLowerCase().replace(" ", ""); // No drops in creative if (plugin.config.getBoolean("noDropsCreative", true) && player.getGameMode() == GameMode.CREATIVE) { return; } // Prevent XP farming/duping event.setExpToDrop(0); // assume not mined boolean mined = false; // drop XP only when destroyed and not silk picked boolean dropXPOnlyOnDestroy = plugin.config.getBoolean("dropXPOnlyOnDestroy", false); if (plugin.config.getBoolean("preventXPFarming", true) && block.hasMetadata("mined")) { mined = block.getMetadata("mined").get(0).asBoolean(); } // Drop maybe some XP if (player.hasPermission("silkspawners.silkdrop." + mobName) || player.hasPermission("silkspawners.destroydrop." + mobName)) { int addXP = plugin.config.getInt("destroyDropXP"); // If we have more than 0 XP, drop them // either we drop XP for destroy and silktouch or only when // destroyed and we have no silktouch if (!mined && addXP != 0 && (!dropXPOnlyOnDestroy || !validToolAndSilkTouch && dropXPOnlyOnDestroy)) { event.setExpToDrop(addXP); // check if we should flag spawners if (plugin.config.getBoolean("preventXPFarming", true)) { block.setMetadata("mined", new FixedMetadataValue(plugin, true)); } } } // random drop chance String mobID = su.eid2MobID.get(entityID); int randomNumber = rnd.nextInt(100); int dropChance = 0; // silk touch if (validToolAndSilkTouch && player.hasPermission("silkspawners.silkdrop." + mobName)) { // Calculate drop chance if (plugin.mobs.contains("creatures." + mobID + ".silkDropChance")) { dropChance = plugin.mobs.getInt("creatures." + mobID + ".silkDropChance", 100); } else { dropChance = plugin.config.getInt("silkDropChance", 100); } if (randomNumber < dropChance) { // Drop spawner world.dropItemNaturally( block.getLocation(), su.newSpawnerItem( entityID, su.getCustomSpawnerName(su.eid2MobID.get(entityID)), 1, false)); } return; } // no silk touch if (player.hasPermission("silkspawners.destroydrop." + mobName)) { if (plugin.config.getBoolean("destroyDropEgg", false)) { // Calculate drop chance randomNumber = rnd.nextInt(100); if (plugin.mobs.contains("creatures." + mobID + ".eggDropChance")) { dropChance = plugin.mobs.getInt("creatures." + mobID + ".eggDropChance", 100); } else { dropChance = plugin.config.getInt("eggDropChance", 100); } if (randomNumber < dropChance) { // Drop egg world.dropItemNaturally(block.getLocation(), su.newEggItem(entityID)); } } // Drop iron bars (or not) int dropBars = plugin.config.getInt("destroyDropBars", 0); if (dropBars != 0) { // Calculate drop chance randomNumber = rnd.nextInt(100); if (plugin.mobs.contains("creatures." + mobID + ".destroyDropChance")) { dropChance = plugin.mobs.getInt("creatures." + mobID + ".destroyDropChance", 100); } else { dropChance = plugin.config.getInt("destroyDropChance", 100); } if (randomNumber < dropChance) { world.dropItem(block.getLocation(), new ItemStack(Material.IRON_FENCE, dropBars)); } } } }
private void handleGiveSpawner(CommandSender sender, Player receiver, String mob, int amount) { if (su.isUnkown(mob)) { su.sendMessage( sender, ChatColor.translateAlternateColorCodes( '\u0026', plugin.localization.getString("unknownCreature")) .replace("%creature%", mob)); return; } short entityID = su.name2Eid.get(mob); String creature = su.getCreatureName(entityID); // Filter spaces (like Zombie Pigman) String mobName = creature.toLowerCase().replace(" ", ""); // Add spawner if (sender.hasPermission("silkspawners.freeitem." + mobName)) { // Have space in inventory if (receiver.getInventory().firstEmpty() == -1) { su.sendMessage( sender, ChatColor.translateAlternateColorCodes( '\u0026', plugin.localization.getString("noFreeSlot"))); return; } receiver .getInventory() .addItem( su.newSpawnerItem( entityID, su.getCustomSpawnerName(su.eid2MobID.get(entityID)), amount, false)); if (sender instanceof Player) { Player pSender = (Player) sender; if (pSender.getUniqueId() == receiver.getUniqueId()) { su.sendMessage( sender, ChatColor.translateAlternateColorCodes( '\u0026', plugin.localization.getString("addedSpawner")) .replace("%creature%", creature) .replace("%amount%", Integer.toString(amount))); } else { su.sendMessage( sender, ChatColor.translateAlternateColorCodes( '\u0026', plugin .localization .getString("addedSpawnerOtherPlayer") .replace("%player%", receiver.getName())) .replace("%creature%", creature) .replace("%amount%", Integer.toString(amount))); } } else { su.sendMessage( sender, ChatColor.translateAlternateColorCodes( '\u0026', plugin .localization .getString("addedSpawnerOtherPlayer") .replace("%player%", receiver.getName())) .replace("%creature%", creature) .replace("%amount%", Integer.toString(amount))); } return; } su.sendMessage( sender, ChatColor.translateAlternateColorCodes( '\u0026', plugin.localization.getString("noPermissionFreeSpawner"))); }