在bukkit上启用监听器

时间:2015-09-09 09:38:31

标签: java bukkit

package me.TimewalkerZ.Broadcastoncommand;

import java.util.List;
import java.util.logging.Logger;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
import net.minecraft.server.v1_8_R1.*;

public class Broadcastoncommand extends JavaPlugin implements Listener {
   public final Logger logger = Logger.getLogger("Minecraft");
   public static Broadcastoncommand plugin;

   @Override
   public void onDisable() {
           PluginDescriptionFile pdfFile = this.getDescription();
           this.logger.info(pdfFile.getName() +  " Has been Disabled!");
    }

   @Override
   public void onEnable() {
           PluginDescriptionFile pdfFile = this.getDescription();
           this.logger.info(pdfFile.getName() + " Version " + pdfFile.getVersion() +  " Has been Enabled!");
           getConfig().options().copyDefaults(true);
           saveConfig();
   }

   @EventHandler
   public void onPlayerCommandPreprocessEvent(PlayerCommandPreprocessEvent event) {
       Player p = event.getPlayer();
       if(!p.hasPermission("Broadcastoncommand.silent")) {
           List<String> cmds = plugin.getConfig().getStringList("CommandsBC");
           for (String command : cmds) {
               if(event.getMessage().toLowerCase().startsWith("/" + command)) {
               p.sendMessage("§6" + p + "§6 just did the command " + command + "§6 join them if you have the command unlocked.");
             }
           }
         }
       }

嗨,我尝试过这个,但它似乎根本不起作用。我的意思是它编译并运行没有错误,但它在游戏中没有做任何事情。顺便说一句,这个插件的目的是在有人在配置中使用命令时进行广播。

2 个答案:

答案 0 :(得分:2)

onEnable方法中添加此行:

getServer().getPluginManager().registerEvents(this, this);

第一个this参数是为其注册事件的插件,第二个this参数是插件的监听器。

除此之外,由于“插件”而抛出NullPointerException。这是返回null,因为plugin未设置为任何内容。相反,请使用此

List<String> cmds = this.getConfig().getStringList("CommandsBC");

实现此目的的另一种方法是保持单例模式,即在启动时将插件实例分配到plugin,方法是在onEnable中添加此行:

plugin = this;

答案 1 :(得分:0)

要注册您的活动,您需要添加:

Bukkit.getPluginManager().registerEvents(this, this);

this听众注册到this

由于以下原因,您还获得了NullPointerException

  • 1。)plugin为空,最终您可以删除plugin.,因为它是您的主类,而getConfig()是父类中的方法。
  • 2。)getConfig()返回null,因为fil不存在或未生成。您需要将config.yml添加到项目中的src文件夹中,之后,如果使用saveDefaultConfig()方法,则需要在插件启用时生成它该文件不存在。 e.g:

    try 
    {
        File config  = new File(getDataFolder(), "config.yml");
        if(!getDataFolder().exists())getDataFolder().mkdirs();
        if(!config.exists())saveDefaultConfig();
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
    
  • 3。)config中指定的路径不存在。记住路径区分大小写。由于列表为空,getConfig().getStringList("CommandsBC")可能返回null,或者路径不存在(请记住它区分大小写)。

    这些选项可能会导致您的NullPointerException,如果您需要更多信息,请发表评论。