如何解决不要重复检查事件方法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
,特别是priority
和ignoreCancelled
。
现在您拥有这个:
@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 举报,一经查实,本站将立刻删除。