命令不起作用

时间:2017-12-15 20:12:03

标签: java minecraft bukkit

今天我开始了我的第一个大项目,这是我的服务器名为Pixel Network的Minecraft Spigot插件。创建/help命令时遇到问题。每当我调用命令时它就会自动返回。我知道这是一个经常被问到的问题,但我无法让它发挥作用。这是我的代码:

主类

package gq.pixelnetwork.main;

import gq.pixelnetwork.listeners.CommandListener;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {
    public void onEnable() {
        System.out.println("If you see this, the Pixel Network plugin is loaded!");
        Bukkit.getServer().getPluginManager().registerEvents(new CommandListener(), this);
    }

    public void onDisable() { System.out.println("If you see this, the Pixel Network plugin is unloaded!"); }
}

我的命令监听器类

package gq.pixelnetwork.listeners;

import gq.pixelnetwork.modules.Colors;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;

public class CommandListener implements Listener{
    Colors c = new Colors();

    // Returning false will return the command to the sender!
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        if (cmd.getName().equalsIgnoreCase("help")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(c.red + "This is a Player-only command!");

                return true;
            } else{
                openHelp();

                return true;
            }
        }

        return true;
    }

    private void openHelp() {
        Inventory helpGUI = Bukkit.createInventory(null, 27, "§a§lHelp Menu");
        createDisplay(Material.BOOK, helpGUI, 11, "§7/spawn", "§fUse it to get to Spawn.");
        createDisplay(Material.BOOK, helpGUI, 13, "§7/hub", "§fUse it to get to HUB.");
        createDisplay(Material.BOOK, helpGUI, 15, "§7/help", "§fUse it to see this menu.");
    }

    private static void createDisplay(Material material, Inventory inv, int Slot, String name, String lore) {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(name);
        ArrayList<String> Lore = new ArrayList<String>();
        Lore.add(lore);
        meta.setLore(Lore);
        item.setItemMeta(meta);

        inv.setItem(Slot, item);

    }
}

对Colors类的引用不是问题,因为这只是我使用颜色制作的一个小“模块”。

我希望有人能帮助我。

提前致谢,
- Xaaf

1 个答案:

答案 0 :(得分:1)

除非Spigot API在我使用它之后发生了重大变化,否则您的问题是您在事件处理程序中使用onCommand,而不是在JavaPlugin类中。

例如,你可以有这样的东西

public class Whatever extends JavaPlugin {
  @Override
  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if(command.getName().equalsIgnoreCase("hello")){
        sender.sendMessage("Hello!");
        return true;
    }
    return false;
  } 
}

哪个会正常工作,但您将CommandListener注册为事件侦听器,这意味着当bukkit解析该类时,它会查找带有@EventHandler注释的任何方法,并将它们作为事件处理,当它们为&#39时被解雇了。

你也可以使用Command Executor,它看起来像这样:

public class Whatever extends JavaPlugin {

    @Override
    public void onEnable(){
        this.getCommand("test").setExecutor(new MyCommandExecutor(this));
        // register the class MyCommandExecutor as the executor for the "test" command
    }

    @Override 
    public void onDisable(){

    }

}

然后有另一个类似的那样:

public class MyCommandExecutor implements CommandExecutor {
    private final Whatever plugin;

    public MyPluginCommandExecutor(Whatever plugin) {
        this.plugin = plugin; // Store the plugin in situations where you need it.
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(command.getName().equalsIgnoreCase("test")){
            sender.sendMessage("Hello World!");
            return true;
        }
        return false;
    }
}

基本上,你是在尝试在EventListener中实现一个CommandExecutor,据我所知,它不应该工作。

如果命令不是你的插件处理的那个,那么你默认也返回true,这是错误的,如果它不是你的命令,你应该返回false。