微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不要重复检查事件方法Bukkit / Spigot

如何解决不要重复检查事件方法Bukkit / Spigot

我正在检查我的一个主要项目的代码库,并且我注意到有150多个事件处理程序基本上都执行相同的检查:

        if (!(event.getdamager() instanceof Player))
            return;
        if (!(event.getEntity() instanceof Player))
            return;

        Player player = (Player) event.getdamager();

        Player victim = (Player) event.getEntity();

        if(!AntigriefManager.canInjure(player,victim)) return;

        if (!EnchantChecks.mainhand(player,this)) return;

我的问题是,有没有一种好的方法可以将其抽象化?

是否可以将这些玩家和受害人值传递给多个EntitydamageByEntityEvent处理程序,而不是在每个处理程序上方编写这些值?

谢谢!

解决方法

使用EventHandler,特别是priorityignoreCancelled

现在您拥有这个:

@EventHandler
public void onMyEvent(SomeEvent event) {
    //a) A bunch of precheck code
    //b) The actual code you want to run,in several different code bodies
}

您最终将要做的就是将这些任务分成两个不同的侦听器;一个将处理检查,另一个将运行其负责的一切。为此,我们的检查将在EventPriority.LOWEST上运行,因为这些检查在任何其他优先级之前运行。最重要的是,如果事件被取消,我们将使用EventHandler#ignoreCancelled来指示不应运行我们的代码:

@EventHandler(priority = EventPriority.LOWEST)
public void onMyPrechecks(SomeEvent event) {
    //a) A bunch of precheck code,for example:
    if (!AntigriefManager.canInjure(player,victim)) {
        //notice we cancel,instead of returning from a method
        event.setCancelled(true);
    }
}

//Elsewheres,in another class probably:
//priority should never go lower than LOW
@EventHandler(priority = EventPriority.LOW,ignoreCancelled = true)
public void onMyEvent(SomeEvent event) {
    //b) The actual code you want to run,e.g.:
    event.getPlayer().sendMessage("running event!");
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。