Minecraft: отправка нескольких сообщений - PullRequest
0 голосов
/ 15 мая 2018

Я разрабатываю плагин, чтобы запретить игрокам добывать руды, если у них нет разрешения. Однако я сталкиваюсь с проблемой, когда пользователи используют другой плагин рядом с моим, где он позволяет им добывать 9 блоков одновременно. Ну, это спамит игрока со словами "У вас нет прав на мой!" Может кто-нибудь посоветовать мне обходной путь для системы обмена сообщениями? (В основном не спам плеер).

        switch (type) {
    case COAL_ORE: {
        if (!player.hasPermission("PluginName.coal") && (!player.isOp())) {
            event.setCancelled(true);
            player.getPlayer().sendMessage(ChatColor.DARK_RED + "You do not have permission to mine Coal Ore!");
        }
        break;
    }
    case IRON_ORE: {
        if (!player.hasPermission("PluginName.iron") && (!player.isOp())) {
            event.setCancelled(true);
            player.getPlayer().sendMessage(ChatColor.DARK_RED + "You do not have permission to mine Iron Ore!");
        }
        break;
    }
    case GOLD_ORE: {
        if (!player.hasPermission("PluginName.gold") && (!player.isOp())) {
            event.setCancelled(true);
            player.getPlayer().sendMessage(ChatColor.DARK_RED + "You do not have permission to mine Gold Ore!");
        }
        break;
    }
    case DIAMOND_ORE: {
        if (!player.hasPermission("PluginName.diamond") && (!player.isOp())) {
            event.setCancelled(true);
            player.getPlayer().sendMessage(ChatColor.DARK_RED + "You do not have permission to mine Diamond Ore!");
        break;
    }
    }
    case EMERALD_ORE: {
        if (!player.hasPermission("PluginName.emerald") && (!player.isOp())) {
            event.setCancelled(true);
            player.getPlayer().sendMessage(ChatColor.DARK_RED + "You do not have permission to mine Emerald Ore!");
        }
        break;
    }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Другие ответы и комментарии на самом деле не верны, и я хотел бы добавить еще несколько деталей и, возможно, предложить несколько рекомендаций по очистке вашего кода.

Когда блок сломан, Bukkit отправит BlockBreakEvent всем зарегистрированным слушателям в порядке их приоритета. По умолчанию приоритет всегда будет EventPriority.NORMAL. Порядок, в котором слушатели получают событие, происходит в следующем порядке:

  1. LOWEST
  2. LOW
  3. NORMAL
  4. HIGH
  5. HIGHEST
  6. MONITOR

Причина, по которой приоритет HIGHEST срабатывает в последнюю очередь, заключается в том, что это означает, что «это событие является наиболее важным, и, следовательно, получает последнее слово для управления событием».

В этом случае вы не хотите быть последним плагином для обработки события, вы хотите быть первым. Однако рискованно устанавливать приоритеты на LOWEST или HIGHEST, так как могут быть случаи, когда другие плагины должны обрабатывать информацию до или после вас (например, WorldEdit). Таким образом, вы должны установить приоритет вашего события на LOW.

Последнее, что я хочу упомянуть, это то, что у вас много повторяющегося кода. Это не обязательно проблема, когда речь заходит о скорости, но это делает вещи намного труднее читать. Ниже приведено решение как для очистки кода, так и для устранения проблем с приоритетом событий.

@EventHandler(priority = EventPriority.LOW)
public void onPlayerBreakBlock(BlockBreakEvent event) {
    List<Material> materialList = Arrays.asList(Material.COAL_ORE, Material.IRON_ORE, Material.GOLD_ORE, Material.DIAMOND_ORE, Material.EMERALD_ORE);
    Material type = event.getBlock().getType();
    Player player = event.getPlayer();

    if (materialList.contains(type) && !player.hasPermission("PluginName." + type.name().toLowerCase().replace("_ore", "")) && !player.isOp()) {
        event.setCancelled(true);
        player.sendMessage(ChatColor.DARK_RED + "You do not have permission to mine " + StringUtils.capitalizeFully(type.name()));
    }
}

Редактировать : Я просто хочу добавить немного больше пояснений. Существует множество предложений, в которых говорится, что вы должны установить приоритет на HIGH или HIGHEST, но причина, по которой игрок получает спам, именно потому, что ваше событие срабатывает после другого события. Это означает, что даже если вы успешно отмените событие, оно отменяет все девять событий и будет спамить в чате игрока 9 сообщениями каждый раз, когда они пытаются разбить блок, а не только 1 сообщение.

0 голосов
/ 04 июня 2018

Установите приоритет вашего события на HIGH или HIGHEST, чтобы ваш код выполнялся позже в хронологическом порядке .Это дает вам «последнее слово» в том, как обрабатывается событие.

@EventHandler(priority=EventPriority.HIGH)
public void onPlayerBreakBlock(BlockBreakEvent e){
   ...
}

Не выбирайте автоматически HIGHEST только потому, что вы можете.Как правило, предпочитайте наименее экстремальный приоритет, который все еще выполняет вашу цель.Тогда, если, скажем, другой плагин конфликтует с вашим, они могут иметь еще более высокий приоритет.См. Эту ссылку для более подробной информации: https://bukkit.gamepedia.com/Event_API_Reference#Event_Priorities

Используйте только приоритет MONITOR, если вы не собираетесь изменять событие вообще.Он предназначен для указания окончательного состояния события.Например, был ли он отменен или нет.

...