1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Zemf4you, 28 мар 2021.

Метки:
Статус темы:
Закрыта.
  1. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
    Необходимо разрешить игроку ломать только определённые блоки в определённом регионе при соблюдении определённых условий. Думаю, решается кастомным флагом, только разбираться с этим нужно очень долго.
    Спрашивал в официальном дискорд-сервере enginehub - ответ получил такой: upload_2021-3-28_18-35-59.png
    Нашёл только BlockBreakBlacklistEvent, но он не наследуется от Event, отчего его нельзя ловить стандартными способами. Кто-нибудь может подсказать, что с ним делать?
    https://github.com/EngineHub/WorldGuard/search?q=BlockBreakBlacklistEvent
     
  2. HauserGrim

    HauserGrim Активный участник Пользователь

    Баллы:
    96
    Пробовал просто BlockBreakEvent с приоритетом LOWEST поставить setCancelled(false) ?
     
  3. _MRDen3000YT_

    _MRDen3000YT_ Активный участник Пользователь

    Баллы:
    76
  4. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
    конечно. Если смотреть в исходники worldguard, там стоит ignoreCancelled = true на ловлю события BlockBreakEvent
     
  5. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
  6. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну как то так.
    Код:
        @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);
                }
            }
        }
     
    Последнее редактирование: 28 мар 2021
  7. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
    Так вот как называется этот эвент. Они просто слова местами поменяли, гениально. Спасибо большое
     
    Последнее редактирование: 28 мар 2021
  8. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
    прошу прощения, вопрос всё же не закрыт. Через раз событие просто не приходит (по неизвестно какой причине). Вроде как если попытаться ломать блок любым инструментом, даже не обязательно подходящим.
    определил по выводу в консоль.
    upload_2021-3-28_20-56-20.png
     
    Последнее редактирование: 28 мар 2021
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Без понятия я на чистой java пишу не на котлине и таких проблем нет.
     
  10. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
    котлин - та же джава, только в профиль. Могу сказать точно, что проблема не в языке.
    Проверил - в действительности, такое происходит только при попытке сломать блок инструментами.
     
  11. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну проблема мне неизвестна, или проставлен не верный приоритет на ивенте.
     
  12. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
    Я проверил буквально каждый приоритет - картина одинакова. Событие приходит только для Low и Lowest, но всё равно через раз, если ломать инструментами.
     
  13. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если поведение WorldGuard должно игнорироваться - достаточно создать обработчик bukkit-эвента BlockBreakEvent с приоритетом, который позволит этом обработчику отработать уже после WorldGuard, чтобы "отменить отмену".

    Обработчики вызываются в следующем порядке приоритетов:
    (первый) LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR (последний)
    Какой приоритет в WG - я не знаю, но, скорее всего, HIGHEST спасёт ситуацию. Можно и MONITOR, но его не рекомендуется использовать для отмены событий
     
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Тогда будет игроку писать что запрещено, ивент от самого wg не просто так используется.
     
  15. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну да, об этом я не подумал
     
  16. _MRDen3000YT_

    _MRDen3000YT_ Активный участник Пользователь

    Баллы:
    76
  17. Автор темы
    Zemf4you

    Zemf4you Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    zemf4you
    Потыкал, узнал. Оказывается, это событие заранее отменяет флаг interuct. Чтобы все события проходили, нужен флаг interact=allow
     
Статус темы:
Закрыта.

Поделиться этой страницей