Bukkit:我怎么称呼一个事件?
Bukkit: How would I call an event?
我刚开始编写 Bukkit,我一直在尝试编写一个插件,为特定玩家启用 pvp,并且可以禁用它,但仅限于他们自己。它工作正常,直到我发现我需要一个事件来完成这项工作,但我还没有了解到我需要的事件。在网上看了一些 videos/things 之后,我找不到任何可以帮助我的东西。如果你能告诉我我将如何做到这一点,那就太好了。另外,如果您能解释更多有关事件的信息,我们也将不胜感激:)
package me.impatheimpaler.test;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
public class togglepvp extends JavaPlugin implements Listener{
public void onEnable() {
}
public void onDisable() {
}
List<String> toggled = new ArrayList<String>();
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (cmd.getName().equalsIgnoreCase("togglepvp")) {
if (!(sender instanceof Player)) {
sender.sendMessage("Only a Player can run this command.");
return false;
}
Player player = (Player) sender;
if (toggled.contains(player.getName())) {
player.sendMessage(ChatColor.RED + "Outgoing PvP - ON");
toggled.add(player.getName());
return true;
}
player.sendMessage(ChatColor.GREEN + "Outgoing PvP - OFF");
toggled.remove(player.getName());
return true;
}
}
}
要调用事件,您可以使用:
Bukkit.getServer().getPluginManager().callEvent(myEvent)
但是,根据你的问题,我认为你的意思是你想监听一个事件,这样你就可以在事件发生时执行某些操作。为此,首先将您想收听的 class 设为 Listener
public class MyHandlerClass implements Listener{
//code
}
接下来,您必须在 Main
class 中注册事件,也就是 extends JavaPlugin
中的事件。为此,找到您的 onEnable()
方法,然后调用 this.getServer().getPluginManager().registerEvents(Listener, this)
,其中 Listener
是您的侦听器 class:
@Override
public void onEnable(){
this.getServer().getPluginManager().registerEvents(new MyHandlerClass(), this);
//other code
}
接下来,要实际处理事件,请在您的处理程序 class(implements Listener
的处理程序)中创建一个函数,其中一个参数为 extends Event
,并且具有 @EventHandler
上面的注释,为了检测一个实体损坏另一个实体,你可以使用事件 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)
Also if you could explain more about events that would also be
appreciated :)
好吧,正如其名称所暗示的那样,事件是代码运行期间的某些事件,它会中断代码的标准行为。一般来说,这意味着用户做了一些事情。
每当 Bukkit 注意到用户在做某事,事件系统就会触发一个事件:
以下不是 bukkit 和 minecraft 的正确形式,但我认为,它应该给你一个关于它的图像。
Bukkit 创建一个新事件(在你的事件函数中给出的东西,上面 post 称为变量 "event")然后它从它的列表中获取这个事件的每个注册监听器. (例如:如果用户打破了一个块,bukkit 将获得它自己的 BlockBreakListener 和每个由不同插件注册的 BlockBreakListener。)然后 EventHandler 将调用这些侦听器的每个方法,这些方法是在事件被触发时调用的。
因此,例如,它将首先处理它自己的 BlockBreakMethod,然后例如WorldGuard 之一(如果已安装)然后是您的插件之一,最后是 Authme 之一(如果已安装)。您无法准确判断听众以何种顺序获得有关事件的通知,因此您无法确定,您是 "have the last word" 还是第一个处理该事件的人。
这个顺序几乎是随机选择的(当然不是,但你应该想象得到),但是你可以通过设置事件优先级来对流程施加一点影响。这很重要,例如,如果您编写了一个迷你游戏,并且想要决定玩家是否可以破坏方块。具有相同选择的其他插件可能会像您一样决定另一种方式,因此如果您具有更高的优先级,您的监听器将在之后执行,因此您的决定对事件的结果有更深的影响(无论是被取消还是不是)。
希望我能帮助您更好地了解 Bukkit 事件和一般事件。不要关心它们是如何生成的,这是高度开发的 java 代码,所以初学者不应该关心它......
首先:祝您编码愉快 :)
我刚开始编写 Bukkit,我一直在尝试编写一个插件,为特定玩家启用 pvp,并且可以禁用它,但仅限于他们自己。它工作正常,直到我发现我需要一个事件来完成这项工作,但我还没有了解到我需要的事件。在网上看了一些 videos/things 之后,我找不到任何可以帮助我的东西。如果你能告诉我我将如何做到这一点,那就太好了。另外,如果您能解释更多有关事件的信息,我们也将不胜感激:)
package me.impatheimpaler.test;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
public class togglepvp extends JavaPlugin implements Listener{
public void onEnable() {
}
public void onDisable() {
}
List<String> toggled = new ArrayList<String>();
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (cmd.getName().equalsIgnoreCase("togglepvp")) {
if (!(sender instanceof Player)) {
sender.sendMessage("Only a Player can run this command.");
return false;
}
Player player = (Player) sender;
if (toggled.contains(player.getName())) {
player.sendMessage(ChatColor.RED + "Outgoing PvP - ON");
toggled.add(player.getName());
return true;
}
player.sendMessage(ChatColor.GREEN + "Outgoing PvP - OFF");
toggled.remove(player.getName());
return true;
}
}
}
要调用事件,您可以使用:
Bukkit.getServer().getPluginManager().callEvent(myEvent)
但是,根据你的问题,我认为你的意思是你想监听一个事件,这样你就可以在事件发生时执行某些操作。为此,首先将您想收听的 class 设为 Listener
public class MyHandlerClass implements Listener{
//code
}
接下来,您必须在 Main
class 中注册事件,也就是 extends JavaPlugin
中的事件。为此,找到您的 onEnable()
方法,然后调用 this.getServer().getPluginManager().registerEvents(Listener, this)
,其中 Listener
是您的侦听器 class:
@Override
public void onEnable(){
this.getServer().getPluginManager().registerEvents(new MyHandlerClass(), this);
//other code
}
接下来,要实际处理事件,请在您的处理程序 class(implements Listener
的处理程序)中创建一个函数,其中一个参数为 extends Event
,并且具有 @EventHandler
上面的注释,为了检测一个实体损坏另一个实体,你可以使用事件 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)
Also if you could explain more about events that would also be appreciated :)
好吧,正如其名称所暗示的那样,事件是代码运行期间的某些事件,它会中断代码的标准行为。一般来说,这意味着用户做了一些事情。
每当 Bukkit 注意到用户在做某事,事件系统就会触发一个事件:
以下不是 bukkit 和 minecraft 的正确形式,但我认为,它应该给你一个关于它的图像。
Bukkit 创建一个新事件(在你的事件函数中给出的东西,上面 post 称为变量 "event")然后它从它的列表中获取这个事件的每个注册监听器. (例如:如果用户打破了一个块,bukkit 将获得它自己的 BlockBreakListener 和每个由不同插件注册的 BlockBreakListener。)然后 EventHandler 将调用这些侦听器的每个方法,这些方法是在事件被触发时调用的。
因此,例如,它将首先处理它自己的 BlockBreakMethod,然后例如WorldGuard 之一(如果已安装)然后是您的插件之一,最后是 Authme 之一(如果已安装)。您无法准确判断听众以何种顺序获得有关事件的通知,因此您无法确定,您是 "have the last word" 还是第一个处理该事件的人。
这个顺序几乎是随机选择的(当然不是,但你应该想象得到),但是你可以通过设置事件优先级来对流程施加一点影响。这很重要,例如,如果您编写了一个迷你游戏,并且想要决定玩家是否可以破坏方块。具有相同选择的其他插件可能会像您一样决定另一种方式,因此如果您具有更高的优先级,您的监听器将在之后执行,因此您的决定对事件的结果有更深的影响(无论是被取消还是不是)。
希望我能帮助您更好地了解 Bukkit 事件和一般事件。不要关心它们是如何生成的,这是高度开发的 java 代码,所以初学者不应该关心它...... 首先:祝您编码愉快 :)