@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
	private void onBlockPlace(BlockPlaceEvent event) {
		Player player = event.getPlayer();

		if (event.getBlock().getType() == Material.MOB_SPAWNER) {

			// get spawner block
			CreatureSpawner csBlock = (CreatureSpawner) event.getBlock().getState();
			SpawnerType spawnerTypeBlock = SpawnerType.fromEntityType(csBlock.getSpawnedType());
			String spawnerName = spawnerTypeBlock.getName();

			SpawnerType spawnerTypeHand = null;
			PlayerInventory playerInv = player.getInventory();
			if (playerInv.getItemInMainHand().getType().equals(Material.MOB_SPAWNER)) {
				spawnerTypeHand = SpawnerFunctions.getSpawnerType(playerInv.getItemInMainHand());
			} else if (playerInv.getItemInOffHand().getType().equals(Material.MOB_SPAWNER)) {
				spawnerTypeHand = SpawnerFunctions.getSpawnerType(playerInv.getItemInOffHand());
			}

			String name;
			if (spawnerTypeHand == null) {
				name = "Pig";
				try {
					throw new Pigception();
				} catch (Pigception p) {
					p.printStackTrace();
				}
			} else {
				name = spawnerTypeHand.getName();
			}

			// if they can't place it cancel event
			if (!player.hasPermission("spawner.place.all") && !player.hasPermission("spawner.place." + spawnerName.toLowerCase())) {
				event.setCancelled(true);
				String spawnerText = SpawnerType.getTextFromType(spawnerTypeBlock);
				Main.language.sendMessage(event.getPlayer(), Main.language.getText(Keys.NoPermission, spawnerText));
				return;
			}

			Bukkit.getScheduler().scheduleSyncDelayedTask(Main.instance, new SpawnerTask(name, event.getBlock(), player), 0);
		}
	}