我正在开发一个插件,以防止玩家开采矿石,除非他们获得许可。然而,我遇到了一个问题,用户在我的旁边使用另一个插件,允许他们一次挖掘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;
}
}
}
答案 0 :(得分:1)
其他答案和评论实际上并不正确,我想补充一些细节,并提供一些有关如何清理代码的建议。
当一个块被破坏时,Bukkit将按照优先级顺序将BlockBreakEvent
发送给所有已注册的侦听器。默认情况下,优先级始终为EventPriority.NORMAL
。侦听器接收事件的顺序按以下顺序发生:
LOWEST
LOW
NORMAL
HIGH
HIGHEST
MONITOR
HIGHEST
优先级倒数第二次被触发的原因是因为它意味着&#34;此事件是最重要的,因此获得操纵事件的最终决定权。&#34; < / p>
在这种情况下,您不想成为处理事件的最后一个插件,您希望成为第一个。但是,将优先级设置为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)
将您的活动优先级设置为HIGH
或HIGHEST
,以便稍后 按时间顺序执行您的代码。这为您提供了处理事件处理方式的“最终决定权”。
@EventHandler(priority=EventPriority.HIGH)
public void onPlayerBreakBlock(BlockBreakEvent e){
...
}
不要因为你可以自动选择HIGHEST
。通常更喜欢仍然实现目标的最不重要的优先级。然后,如果说另一个插件与你的插件冲突,他们可以提高优先级。有关更具体的详细信息,请参阅此链接:https://bukkit.gamepedia.com/Event_API_Reference#Event_Priorities
仅使用您不想更改事件的MONITOR
优先级。它旨在表明事件的最终状态。比如它是否被取消。