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

Помогите Авто отключение гейммода,флая,god на определенном заприваченом участке

Тема в разделе "Помощь", создана пользователем Darth Udko, 22 июл 2015.

  1. Автор темы
    Darth Udko

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

    Баллы:
    103
    Нужно чтобы на определенном заприваченом участке отключался флай,гейммод,неуязвимость если они включены.Как можно сделать с помощью флагов World Guard ? Командные блоки не рекомендовать
     
  2. DragonEX

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

    Баллы:
    66
    Флаг: /rg flag [name] game-mode deny|allow :good:
     
  3. Alexgrist

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

    Баллы:
    173
  4. InterVi

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

    Баллы:
    173
    game-mode survival
    invincible deny


    Насчет последнего не уверен, нужно тестировать, т.к. плагины могут отменять сам ивент урона. Для отключения флая придется ставить что-то вроде этого, там есть флаг для него.
     
  5. LORD_09_RUS

    LORD_09_RUS Активный участник Пользователь Заблокирован

    Баллы:
    76
    Имя в Minecraft:
    Edward007
    По моему это флаг на бессмертие, только /rg flag [rg] invincible allow
     
  6. InterVi

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

    Баллы:
    173
    Да. Как на deny он себя ведет не тестировал, потому не уверен.
     
  7. Lyosha12

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

    Баллы:
    98
    Skype:
    alexey_zyuz
    Имя в Minecraft:
    Lyosha12
    С ReActions - легко. Фиксируешь переменной любые изменения с игроком и, если переменная равна ненужному значению - устанавливаешь его в нужное с помощью RG_ENTER, попутно выключая креатив, god и что угодно соответствующими командами.
     
  8. alexandrage

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

    Баллы:
    173
    Юзать мове ивент в wg = убивание tps. Вариант говно.
     
  9. InterVi

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

    Баллы:
    173
    Смотря при каком онлайне, на маленьких серверах не заметно.
     
  10. alexandrage

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

    Баллы:
    173
    Будет заметно на безвайповых серверах и очень даже. Ибо там прогоняется регион лист при движение игроков.
    Спринти в чате лузвер мове ивент и сам все поймешь.
    flud(PlayerMoveEvent e) {
    e.getPlayer.sendMessage("flud");
    }
     
    Последнее редактирование: 24 июл 2015
  11. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Ну конечно же можно быть категоричным и делать при этом так:

    А можно немного подумать и понять, что каждое вызываемое PlayerMoveEvent, в подобной ситуации, не нужно.

    Смена региона происходит тогда когда игрок переступает с блока на блок. Т.е. сравниваешь коориданты getBlockX(), getBlockY, getBlockZ у координат полученных в getTo() и getFrom() если они не изменились - у игрока ничего не произошло, игрок в тех же регионах, мучать события не нужно.

    Попробуй выполнить такой код:
    Код:
        @EventHandler(priority=EventPriority.NORMAL)
        public void onraged (PlayerMoveEvent event){
            Player player = event.getPlayer();
            int moveCount = player.hasMetadata("playermove") ? player.getMetadata("playermove").get(0).asInt() : 0;
            int blockCount = player.hasMetadata("playerblock") ? player.getMetadata("playerblock").get(0).asInt() : 0;
            moveCount++;
            player.setMetadata("playermove", new FixedMetadataValue (getPlugin(),moveCount));
            if (event.getFrom().getBlockX()==event.getTo().getBlockX()&&
                    event.getFrom().getBlockY()==event.getTo().getBlockY()&&
                    event.getFrom().getBlockZ()==event.getTo().getBlockZ()) return;
            blockCount++;
            player.setMetadata("playerblock", new FixedMetadataValue (getPlugin(),blockCount));
            Bukkit.broadcastMessage(ChatColor.DARK_PURPLE+"blocks: "+blockCount+" moves: "+moveCount);
        }
    Даже по частоте выводимых сообщений - увидишь, что не всё так страшно как ты пугаешь.
    Вот что получилось у меня:
    playermoveevent.png

    Смотри - больше 70% событий не были учтены и обработаны.

    Кстати, как думаешь проверят сам WG куда игрок выходит? Он использует... PlayerMoveEvent. И кстати, тоже учитывает переход из блока в блок.

    Теперь если говорить о переборе всех регионов. Это не так долго. Нужно только просчитать разок. Если есть свободное время - добавь в PlayerMoveEvent этот "перебор" - получение регионов в одной точке и замерь время выполнения. Только считай в наносекундах, миллисекунды тут не подойдут.

    Кстати, в ReAcitons не происходит перебора всех регионов, а только тех, которые задействованы в активаторах. Т.е. если на сервере 1000 регионов, а в ReActions используется 20, то проверка происходит по 20 регионам. Думаю это дает дополнительный эффект (который в общем-то не нужен).

    Проблемы с PlayerMoveEvent как правило проистекают из того что в этом событии делается (да и в любом другом, просто в PlayerMoveEvent - это особенно заметно).
    К примеру, если происходит то, что нужно автору - то это фигня и никак себя не проявит.
    А вот если тебе нужно в каждом PlayerMoveEvent производить какие-то действия, которые требуют время на свое выполнение, то тут можно положить сервер однозначно.
     
    Последнее редактирование: 24 июл 2015
  12. alexandrage

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

    Баллы:
    173
    Лойс. А вот сам вг когда переберает свой километровый список регионов тпс отваливается просто.
     

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