Помогите Разрешить игроку ломать блок в привате WorldGuard

Статус
Закрыто для дальнейших ответов.

Zemf4you

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
zemf4you
Необходимо разрешить игроку ломать только определённые блоки в определённом регионе при соблюдении определённых условий. Думаю, решается кастомным флагом, только разбираться с этим нужно очень долго.
Спрашивал в официальном дискорд-сервере enginehub - ответ получил такой:upload_2021-3-28_18-35-59.png
Нашёл только BlockBreakBlacklistEvent, но он не наследуется от Event, отчего его нельзя ловить стандартными способами. Кто-нибудь может подсказать, что с ним делать?
https://github.com/EngineHub/WorldGuard/search?q=BlockBreakBlacklistEvent
 
Пробовал просто BlockBreakEvent с приоритетом LOWEST поставить setCancelled(false) ?
 
Ну как то так.
Код:
    @EventHandler(priority = EventPriority.LOWEST)
    public void on(BreakBlockEvent e) {
        List<Block> blocks = e.getBlocks();
        Player player = e.getCause().getFirstPlayer();
        for (Block block : blocks) {
            Set<String> set;
            //тут проверка кастомного флага
            if (player == null || (set = WGRegionUtils.getSetFlags(player, block.getLocation(),
                    BlockBreakFlag.getInstance())) == null) {
                continue;
            }
            for (String string : set) {
                if (!block.getType().toString().equalsIgnoreCase(string)) {
                    continue;
                }
                e.setResult(Event.Result.ALLOW);
            }
        }
    }
 
Последнее редактирование:
Ну как то так.
Код:
    @EventHandler(priority = EventPriority.LOWEST)
    public void on(BreakBlockEvent e) {
        List<Block> blocks = e.getBlocks();
        Player player = e.getCause().getFirstPlayer();
        for (Block block : blocks) {
            Set<String> set;
            //тут проверка кастомного флага
            if (player == null || (set = WGRegionUtils.getSetFlags(player, block.getLocation(),
                    BlockBreakFlag.getInstance())) == null) {
                continue;
            }
            for (String string : set) {
                if (!block.getType().toString().equalsIgnoreCase(string)) {
                    continue;
                }
                e.setResult(Event.Result.ALLOW);
            }
        }
    }
Так вот как называется этот эвент. Они просто слова местами поменяли, гениально. Спасибо большое
 
Последнее редактирование:
Ну как то так.
Код:
    @EventHandler(priority = EventPriority.LOWEST)
    public void on(BreakBlockEvent e) {
        List<Block> blocks = e.getBlocks();
        Player player = e.getCause().getFirstPlayer();
        for (Block block : blocks) {
            Set<String> set;
            //тут проверка кастомного флага
            if (player == null || (set = WGRegionUtils.getSetFlags(player, block.getLocation(),
                    BlockBreakFlag.getInstance())) == null) {
                continue;
            }
            for (String string : set) {
                if (!block.getType().toString().equalsIgnoreCase(string)) {
                    continue;
                }
                e.setResult(Event.Result.ALLOW);
            }
        }
    }
прошу прощения, вопрос всё же не закрыт. Через раз событие просто не приходит (по неизвестно какой причине). Вроде как если попытаться ломать блок любым инструментом, даже не обязательно подходящим.
определил по выводу в консоль.
upload_2021-3-28_20-56-20.png
 
Последнее редактирование:
Без понятия я на чистой java пишу не на котлине и таких проблем нет.
котлин - та же джава, только в профиль. Могу сказать точно, что проблема не в языке.
Проверил - в действительности, такое происходит только при попытке сломать блок инструментами.
 
котлин - та же джава, только в профиль. Могу сказать точно, что проблема не в языке.
Проверил - в действительности, такое происходит только при попытке сломать блок инструментами.
Ну проблема мне неизвестна, или проставлен не верный приоритет на ивенте.
 
Ну проблема мне неизвестна, или проставлен не верный приоритет на ивенте.
Я проверил буквально каждый приоритет - картина одинакова. Событие приходит только для Low и Lowest, но всё равно через раз, если ломать инструментами.
 
Если поведение WorldGuard должно игнорироваться - достаточно создать обработчик bukkit-эвента BlockBreakEvent с приоритетом, который позволит этом обработчику отработать уже после WorldGuard, чтобы "отменить отмену".

Обработчики вызываются в следующем порядке приоритетов:
(первый) LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR (последний)
Какой приоритет в WG - я не знаю, но, скорее всего, HIGHEST спасёт ситуацию. Можно и MONITOR, но его не рекомендуется использовать для отмены событий
 
Потыкал, узнал. Оказывается, это событие заранее отменяет флаг interuct. Чтобы все события проходили, нужен флаг interact=allow
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх