我刚刚开始编写Bukkit编码,我一直在尝试编写一个为某个播放器启用pvp的插件,并且可以禁用它,但仅限于自己。它工作正常,直到我发现我需要一个事件来完成这项工作,但我还没有得知我需要的事件。在网上看了几个视频/东西后,找不到任何可以帮助我的东西。如果你能告诉我如何做到这一点,那就太好了。此外,如果您可以解释更多有关事件的信息,也可以表示赞赏:)
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;
}
}
}
答案 0 :(得分:7)
要调用可以使用的事件:
Bukkit.getServer().getPluginManager().callEvent(myEvent)
但是,根据你的问题,我认为你的意思是你想听一个事件,所以你可以在事件发生时预先形成某些行动。要做到这一点,首先在实现Listener
public class MyHandlerClass implements Listener{
//code
}
接下来,您必须在Main
班级注册活动,该班级是extends JavaPlugin
。要执行此操作,请找到您的onEnable()
方法,然后致电this.getServer().getPluginManager().registerEvents(Listener, this)
,其中Listener
是您的听众类:
@Override
public void onEnable(){
this.getServer().getPluginManager().registerEvents(new MyHandlerClass(), this);
//other code
}
接下来,要实际处理事件,请在处理程序类(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)
答案 1 :(得分:2)
此外,如果您可以解释更多有关事件的信息 赞赏:))
嗯,正如其名称已经暗示的那样,事件在代码的运行期间会出现,这会中断代码的标准行为。一般来说,这意味着用户做了一些事情。
每次,Bukkit注意到用户做某事,事件系统覆盖了它,它会触发一个事件:
以下不是bukkit和minecraft如何做到的正确形式,但我想,它应该会给你一个关于它的图像。
Bukkit创建一个新事件(事件,在事件函数中给出,在帖子上面称为变量&#34; event&#34;)然后它从列表中获取此事件的每个注册侦听器。 (例如:如果用户打破了一个块,bukkit将获得自己的BlockBreakListener,并且每个BlockBreakListener都会被不同的插件注册。)然后,当触发事件时,EventHandler将调用那些被调用的方法。
因此,例如,它将首先处理它自己的BlockBreakMethod,然后例如WorldGuard(如果已安装),然后是您的插件之一,最后一个是Authme(如果已安装)。你不能完全按照命令告诉听众有关事件的信息,所以你不能确定,你是否已经说完了最后一句话&#34;或者您是第一个处理此事件的人。
这个顺序几乎是随机选择的(当然不是,但你应该想象一下),但你可以通过设置事件优先级对这个过程施加一点影响。这很重要,例如,如果您编写一个小游戏,并且想要决定,玩家是否可以打破一个区块。其他具有相同选择的插件可能会以另一种方式决定您,因此如果您具有更高的优先级,您的听众将在之后执行,因此您的决定会对事件的结果产生更深的影响(它会被取消或不是)。
我希望,我可以帮助您更好地理解Bukkit事件和事件。不关心它们是如何生成的,这是高度开发的java代码,所以初学者不应该关心它... 首先:玩得开心编码:)