Bukkit:我怎么称呼一个活动?

时间:2015-01-06 22:51:46

标签: java minecraft bukkit

我刚刚开始编写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;
        }
    }
}

2 个答案:

答案 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代码,所以初学者不应该关心它... 首先:玩得开心编码:)