Java Bukkit:我怎么称呼一个事件?

Java Bukkit:我怎么称呼一个事件?,java,minecraft,bukkit,Java,Minecraft,Bukkit,我刚刚开始编写Bukkit,我一直在尝试编写一个插件,为某个玩家启用pvp,并且可以禁用它,但只能为他们自己禁用。它一直运作良好,直到我发现我需要一个活动来完成这项工作,但我还没有了解到我需要的活动。在网上看了一些视频/东西后,我找不到任何帮助。如果你能告诉我怎么做,那就太好了。另外,如果您能解释更多有关活动的信息,我们也将不胜感激:) package me.impatheimpaler.test; 导入java.util.ArrayList; 导入java.util.List; 导入org.b

我刚刚开始编写Bukkit,我一直在尝试编写一个插件,为某个玩家启用pvp,并且可以禁用它,但只能为他们自己禁用。它一直运作良好,直到我发现我需要一个活动来完成这项工作,但我还没有了解到我需要的活动。在网上看了一些视频/东西后,我找不到任何帮助。如果你能告诉我怎么做,那就太好了。另外,如果您能解释更多有关活动的信息,我们也将不胜感激:)

package me.impatheimpaler.test;
导入java.util.ArrayList;
导入java.util.List;
导入org.bukkit.ChatColor;
导入org.bukkit.command.command;
导入org.bukkit.command.CommandSender;
导入org.bukkit.entity.Player;
导入org.bukkit.event.Listener;
导入org.bukkit.plugin.java.JavaPlugin;
公共类togglepvp扩展了JavaPlugin实现了监听器{
public void onEnable(){
}
公共无效不可撤销(){
}
List toggled=new ArrayList();
公共布尔onCommand(CommandSender-sender、Command cmd、String commandLabel、String[]args){
if(cmd.getName().equalsIgnoreCase(“togglepvp”)){
如果(!(播放机的发送方实例)){
sendMessage(“只有玩家才能运行此命令”);
返回false;
}
玩家=(玩家)发送者;
if(toggled.contains(player.getName())){
player.sendMessage(ChatColor.RED+“传出PvP-ON”);
toggled.add(player.getName());
返回true;
}
player.sendMessage(ChatColor.GREEN+“传出PvP-关闭”);
toggled.remove(player.getName());
返回true;
}
}
}

要调用您可以使用的事件:

Bukkit.getServer().getPluginManager().callEvent(myEvent)
但是,根据你的问题,我认为你的意思是你想倾听一个事件,这样你就可以在事件发生时执行某些动作。为此,首先在implement
Listener

public class MyHandlerClass implements Listener{
  //code
}
接下来,您必须在
Main
类中注册事件,该类是
扩展JavaPlugin
的类。为此,请找到您的
onEnable()
方法,并调用
this.getServer().getPluginManager().registerEvents(Listener,this)
,其中
Listener
是您的侦听器类:

@Override
public void onEnable(){
  this.getServer().getPluginManager().registerEvents(new MyHandlerClass(), this);
  //other code
}
接下来,要实际处理事件,请在处理程序类中创建一个函数(实现侦听器的函数),其中一个参数
扩展了事件
,并且在其上方有
@EventHandler
注释,用于检测损坏另一个实体的实体,您可以使用event
EntityDamageByEntityEvent

@EventHandler
public void entityDamageByEntity(EntityDamageByEntityEvent event){
  //your code here
  //use event.getEntity() to get the entity damaged, and event.getDamager() to get the damager
}
每当一个实体被另一个实体损坏时,将自动调用
entityDamageByEntity()
,您所要做的就是处理该事件

如果要取消事件,可以使用
event.setCancelled(true)

另外,如果你能解释更多关于事件的信息,那么 感谢:)

正如它的名字已经暗示的那样,事件是代码运行时的某种东西,它会打断代码的标准行为。一般来说,这意味着用户做了一些事情

Bukkit每次注意到用户在做事件系统所涵盖的事情时,都会触发一个事件:

以下不是bukkit和minecraft的正确形式,但我认为,它应该给你一个关于它的图像

Bukkit创建一个新事件(事件函数中给出的东西,在post上称为变量“Event”),然后从列表中获取该事件的每个注册侦听器。(例如:如果用户断开一个块,bukkit将获得自己的BlockBreakListener和由不同插件注册的每个BlockBreakListener。)然后EventHandler将在触发事件时调用这些侦听器中的每个方法,即要调用的方法

例如,它将首先处理自己的BlockBreakMethod,然后处理WorldGuard(如果已安装)的方法,然后处理插件的方法,最后处理Authme(如果已安装)的方法。你不能确切地告诉听众,事件是以什么顺序通知的,因此你不能确定,是你“说了算”还是你是第一个处理事件的人

这个顺序几乎是随机选择的(当然不是,但您应该想象一下),但是您可以通过设置事件优先级对流程施加一点影响。这一点很重要,例如,如果你编写了一个小游戏,并且想要决定一个玩家是否可以打破一个区块。其他具有相同选择的插件可能会与您选择另一种方式,因此,如果您具有更高的优先级,您的侦听器将在之后执行,因此您的决定对事件的结果有更深刻的影响(无论它是否被取消)

我希望,我能帮助你更好地理解Bukkit事件和一般事件。不要在意它们是如何生成的,这是高度开发的java代码,所以初学者不应该在意它。。。
首先:有趣的编码:)

供事件API的未来参考,
@EventHandler
public void entityDamageByEntity(EntityDamageByEntityEvent event){
  //your code here
  //use event.getEntity() to get the entity damaged, and event.getDamager() to get the damager
}