首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我的世界:发送多条消息

我的世界:发送多条消息
EN

Stack Overflow用户
提问于 2018-05-15 07:25:38
回答 2查看 328关注 0票数 1

我正在开发一个插件,防止玩家在没有许可的情况下开采矿石。然而,我遇到了一个问题,用户在我的插件旁边使用另一个插件,它允许他们一次挖掘9个区块。这会给玩家发送垃圾邮件:“你没有挖掘这个的权限!”有人能给我一个消息系统的变通方法吗?(基本上不会给玩家发垃圾邮件)。

代码语言:javascript
复制
        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;
    }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-06-04 22:03:20

将您的事件优先级设置为HIGHHIGHEST,以便在以后的中按时间顺序执行代码。这给了你如何处理事件的“最终决定权”。

代码语言:javascript
复制
@EventHandler(priority=EventPriority.HIGH)
public void onPlayerBreakBlock(BlockBreakEvent e){
   ...
}

不过,不要仅仅因为你能做到这一点就自动选择HIGHEST。通常倾向于最不极端的优先级,仍然可以实现你的目标。然后,如果另一个插件与您的插件冲突,他们可以设置更高的优先级。有关更多详细信息,请参阅此链接:https://bukkit.gamepedia.com/Event_API_Reference#Event_Priorities

仅使用您根本不打算更改事件的MONITOR优先级。它旨在指示事件的最终状态。比如它是不是取消了。

票数 0
EN

Stack Overflow用户

发布于 2018-06-07 04:22:47

其他的答案和评论实际上是不正确的,我想添加更多的细节,并可能提供一些关于如何清理您的代码的建议。

当一个块被破坏时,Bukkit会按照它们的优先级将BlockBreakEvent发送给所有注册的监听器。默认情况下,优先级始终为EventPriority.NORMAL。侦听器接收事件的顺序如下所示:

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

HIGHEST优先级被倒数第二激发的原因是因为它意味着“这个事件是最重要的,因此拥有操纵该事件的最终决定权”。

在这种情况下,你不想成为最后一个处理事件的插件,你想成为第一个。然而,将优先级设置为LOWESTHIGHEST是有风险的,因为在某些情况下,其他插件可能需要在您之前或之后处理信息(例如WorldEdit)。因此,您应该将事件优先级设置为LOW

我想提的最后一件事是你有很多重复的代码。当涉及到速度时,这不一定是一个问题,但它确实使阅读变得更加困难。下面是一个解决方案,既可以清理代码,也可以修复事件优先级问题。

代码语言:javascript
复制
@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()));
    }
}

编辑:我只想多加一点说明。有很多建议将你的优先级设置为HIGHHIGHEST,但玩家被垃圾邮件的原因正是因为你的事件在另一个事件之后触发。这意味着即使你成功地取消了活动,它也会取消所有9个活动,并在玩家每次试图打破一个区块时向他们的聊天发送9条垃圾消息,而不仅仅是1条消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50340353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档