@EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) // override protection plugins
    public void onBlockBreak(final BlockBreakEvent broken) {
        if (broken instanceof KioskRemove) return;
        if (!Kiosk.SIGN_BLOCKS.contains(broken.getBlock().getTypeId())) return;

        final Sign state = (Sign) broken.getBlock().getState();
        if (!this.hasTitle(state)) return;

        final Function function = this.getFunction(state);
        if (function == null) {
            Main.courier.send(broken.getPlayer(), "unknownFunction", state.getLine(1));
            broken.setCancelled(true);
            state.update();
            return;
        }

        if (!function.canUse(broken.getPlayer())) {
            Main.courier.submit(new Sender(broken.getPlayer()), function.draftDenied());
            broken.setCancelled(true);
            state.update();
            return;
        }

        this.dispatch(broken.getPlayer(), state);

        // manually process block break to avoid other plugins responding to event
        broken.setCancelled(true);
        state.setType(Material.AIR);
        state.update(true);
        broken.getBlock().getWorld().dropItemNaturally(broken.getBlock().getLocation(), new ItemStack(Material.SIGN));

    }