我正在开发一个插件,防止玩家在没有许可的情况下开采矿石。然而,我遇到了一个问题,用户在我的插件旁边使用另一个插件,它允许他们一次挖掘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;
}
}
}
发布于 2018-06-04 22:03:20
将您的事件优先级设置为HIGH
或HIGHEST
,以便在以后的中按时间顺序执行代码。这给了你如何处理事件的“最终决定权”。
@EventHandler(priority=EventPriority.HIGH)
public void onPlayerBreakBlock(BlockBreakEvent e){
...
}
不过,不要仅仅因为你能做到这一点就自动选择HIGHEST
。通常倾向于最不极端的优先级,仍然可以实现你的目标。然后,如果另一个插件与您的插件冲突,他们可以设置更高的优先级。有关更多详细信息,请参阅此链接:https://bukkit.gamepedia.com/Event_API_Reference#Event_Priorities
仅使用您根本不打算更改事件的MONITOR
优先级。它旨在指示事件的最终状态。比如它是不是取消了。
发布于 2018-06-07 04:22:47
其他的答案和评论实际上是不正确的,我想添加更多的细节,并可能提供一些关于如何清理您的代码的建议。
当一个块被破坏时,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个活动,并在玩家每次试图打破一个区块时向他们的聊天发送9条垃圾消息,而不仅仅是1条消息。
https://stackoverflow.com/questions/50340353
复制相似问题