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

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

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

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

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

    Баллы:
    76
    Добрый день.
    Как можно разрешить игроку с пермишеном ставить какой-то блок в чужом привате?
     
  2. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Как я понимаю, приваты - WorldGuard.

    Код:
       @EventHandler(priority = EventPriority.LOWEST)
       public void on(BreakBlockEvent e) {
           if(условие) {
               e.setResult(Result.ALLOW);
               или
               e.setCanceled(false);
               точно не помню
            }
       }
     
    Последнее редактирование: 18 сен 2019
  3. Автор темы
    Kurumi

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

    Баллы:
    76
    Лол
    Я и спрашиваю в соответствующем разделе)

    Я как бы выполнил свою задачу, но мне кажется, это жутко костыльно.
    Просто слушаю break event, проверяю регион и пермишен, после чего отменяю event, ставлю блок через и удаляю его из рук игрока
     
  4. alexandrage

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

    Баллы:
    173
    У wg есть свои ивенты не?
     
  5. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Провтыкал с разделом, прости.
    В общем, у ивентов можно выставить приоритет, сделай onBlockPlaceEvent, который будет выполнятся после проверки WorldGuard.
    Проверь все необходимые условия и если это так, то event.setCanceled(false);
    Должно помочь.
     
  6. MurlikMurlik

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

    Баллы:
    96
    Дак можно иначе же.
    Делаешь максимальный приоритет ивента.
    Проверяешь, кто поставил блок и где. Если это было в привате и ивент был отменен, убираешь отмену ивента и все.
     
  7. alexandrage

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

    Баллы:
    173
    У wg есть свои ивенты не?
    Код:
        @EventHandler(priority = EventPriority.LOWEST)
        public void on(BreakBlockEvent e) {
            TODO e.setResult(Result.ALLOW);
     
  8. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    3 человека в 1 время написали один и тот же ответ, ПОНИМАЮ.
     
  9. MurlikMurlik

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

    Баллы:
    96
    У всех на тот момент были видимо одни и те же мысли)
     
  10. Автор темы
    Kurumi

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

    Баллы:
    76
    Не робит.
    делаю event.setCancelled(false) и ничего.
    Метода event.setResult у меня нет, скорее всего потому, что пишу под 1.11.2
     
  11. Автор темы
    Kurumi

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

    Баллы:
    76
    Поставил приоритет MONITOR и заработало.
    Но мне отсылается это сообщение от wg upload_2019-9-18_22-51-41.png
    Как можно поправить?
     
  12. alexandrage

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

    Баллы:
    173
    Тебе же скинул ивент от wg и не только я. Капец ты тормоз. И приоритет уже правильный.
    Код:
    @EventHandler(priority = EventPriority.LOWEST)
        public void on(BreakBlockEvent e) {
            TODO e.setResult(Result.ALLOW);
     
  13. Автор темы
    Kurumi

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

    Баллы:
    76
    Точно, тупанул, сорян =(

    Можно ли как-то получить в этом ивенте игрока? Не вижу метода
     
  14. alexandrage

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

    Баллы:
    173
    Cause cause = e.getCause();
    Player player = cause.getFirstPlayer();
     
  15. Автор темы
    Kurumi

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

    Баллы:
    76
    Хм.. Как-то странно..

    Код:
    Block block = cause.getFirstBlock();
    Location location = block.getLocation();
    
    Достаю локацию блока, а он мне null кидает. В чем прикол?
     
    Последнее редактирование: 18 сен 2019
  16. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Код:
    List<Block> blocks = event.getBlocks();
    if(blocks == null || blocks.isEmpty()) return;
    for(Block block : event.getBlocks()) {
        //todo
    }
    или сравнивать через Material (не уверен что будет работать)
    Код:
    if(event.getEffectiveMaterial() == Material.asd) {
        //todo
    }
     
    Последнее редактирование: 18 сен 2019
  17. Автор темы
    Kurumi

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

    Баллы:
    76
    Отлично! Все работает, но...

    Совершенно случайно я решил поставить динамит, на него уже это не сработало.. upload_2019-9-18_23-50-48.png
    Как можно разрешить его установку?
     
  18. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Какой из двух вариантов ты попробовал?
     
  19. Автор темы
    Kurumi

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

    Баллы:
    76
    первый, через цикл
     
  20. BDMan

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

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Для TNT используй то же самое, только UseBlockEvent.
     
Статус темы:
Закрыта.

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