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

Darth Udko

Старожил
Пользователь
Баллы
103
Нужно чтобы на определенном заприваченом участке отключался флай,гейммод,неуязвимость если они включены.Как можно сделать с помощью флагов World Guard ? Командные блоки не рекомендовать
 
Нужно чтобы на определенном заприваченом участке отключался флай,гейммод,неуязвимость если они включены.Как можно сделать с помощью флагов World Guard ? Командные блоки не рекомендовать
Флаг: /rg flag [name] game-mode deny|allow 👍
 
game-mode survival
invincible deny


Насчет последнего не уверен, нужно тестировать, т.к. плагины могут отменять сам ивент урона. Для отключения флая придется ставить что-то вроде этого, там есть флаг для него.
 
С ReActions - легко. Фиксируешь переменной любые изменения с игроком и, если переменная равна ненужному значению - устанавливаешь его в нужное с помощью RG_ENTER, попутно выключая креатив, god и что угодно соответствующими командами.
 
С ReActions - легко. Фиксируешь переменной любые изменения с игроком и, если переменная равна ненужному значению - устанавливаешь его в нужное с помощью RG_ENTER, попутно выключая креатив, god и что угодно соответствующими командами.
Юзать мове ивент в wg = убивание tps. Вариант говно.
 
Смотря при каком онлайне, на маленьких серверах не заметно.
Будет заметно на безвайповых серверах и очень даже. Ибо там прогоняется регион лист при движение игроков.
Спринти в чате лузвер мове ивент и сам все поймешь.
flud(PlayerMoveEvent e) {
e.getPlayer.sendMessage("flud");
}
 
Последнее редактирование:
Юзать мове ивент в wg = убивание tps. Вариант говно.

Ну конечно же можно быть категоричным и делать при этом так:

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

А можно немного подумать и понять, что каждое вызываемое 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 производить какие-то действия, которые требуют время на свое выполнение, то тут можно положить сервер однозначно.
 
Последнее редактирование:
Ну конечно же можно быть категоричным и делать при этом так:



А можно немного подумать и понять, что каждое вызываемое 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);
    }

Даже по частоте выводимых сообщений - увидишь, что не всё так страшно как ты пугаешь.
Вот что получилось у меня:
Посмотреть вложение 34539

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

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

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

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

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