Другие ответы и комментарии на самом деле не верны, и я хотел бы добавить еще несколько деталей и, возможно, предложить несколько рекомендаций по очистке вашего кода.
Когда блок сломан, Bukkit отправит BlockBreakEvent
всем зарегистрированным слушателям в порядке их приоритета. По умолчанию приоритет всегда будет EventPriority.NORMAL
. Порядок, в котором слушатели получают событие, происходит в следующем порядке:
LOWEST
LOW
NORMAL
HIGH
HIGHEST
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 сообщение.