onCommand()设置正确,但根本无法执行

时间:2019-08-02 10:55:46

标签: java minecraft bukkit

我的问题是我有一个简单的Minecraft插件,我只希望它执行一个命令。我之前已经完成了命令,所以这些步骤对我来说很清楚。我的plugin.yml设置正确(服务器检测到我添加的命令并显示帮助页面等),并且onCommand()函数的设置也与我在所有其他插件中所做的相同。插件本身可以正常工作(主要是我测试过的onEnable()函数),但是不会调用onCommand()。

我已经尝试使用不同的plugin.yml格式,以及将@Override注释添加到onCommand()上,而Eclipse并不是我真正想要的。我也知道我使用的API(com.PluginBase)是在其他项目中使用它的。执行命令时不会产生异常,在聊天中它仅显示我输入的命令。

这是Main.java:

package org.Professions;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.material.Command;
import org.bukkit.plugin.java.JavaPlugin;

import com.PluginBase.Chat;

public class Main extends JavaPlugin {

    public void onEnable() {
        Chat.getInstance().sendErrorMessageToConsole("Professions enabled");
        Bukkit.getPluginCommand("profession").setExecutor((CommandExecutor) this);
    }

    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

        Chat.getInstance().sendErrorMessageToConsole("Got the command: " + label);

        /*
         * Check if command sender is a player
         * and if the command is for this plugin
         */
        if
        (
                sender instanceof Player == false
                || !label.toLowerCase().equals("profession")
        ) {
            return true;
        }

        // Get the player who send the command
        Player player = (Player) sender;

        // Check if the player has given the right amount of arguments
        if (args.length != 1) {

            // Notify the player of invalid argument use
            Chat.getInstance().sendMessageToPlayer(player, ChatColor.RED + "Invalid arguments. Usage: /profession <name>");

            // Stop executing code after we've determined an incorrect amount of arguments
            return true;
        }

        // Get the players new profession from the first argument he gave for the command
        String profession = args[1];

        // Set the players name in the playerlist to feature his professions
        player.setPlayerListName
        (
                ChatColor.GREEN + "[" + profession + "] "   // the players' profession
                + ChatColor.WHITE + player.getName()        // the actual player name
        );

        // Always return true since if the command wasn't for this plugin we return false earlier
        return true;
    }
}

这是我的plugin.yml:

name: Professions
main: org.Professions.Main
version: 1.0
api-version: 1.13
depend: [PluginBase]
commands:
    profession:
        description: Change your profession
        usage: /<command>
        aliases: [p]

3 个答案:

答案 0 :(得分:1)

您忘记实现CommandExecutor并注册了命令。

您的代码应如下所示:

   S1 S2
A  12 15
B  13 11

此外,我想向您提供有关我的世界插件编码的一些建议。您不应在主类中执行命令,它们应属于自己的类。例如,您的public class Main extends JavaPlugin implements CommandExecutor{ @Override public void onEnable(){ //... getCommand("profession").setExecutor(this); } @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { //... } } 命令将与所有参数一起进入profession类(例如,ProfessionCmd也将存在)。

答案 1 :(得分:0)

这是引起您问题的原因吗?

// Get the players new profession from the first argument he gave for the command
String profession = args[1];    // <-- [0] ?

答案 2 :(得分:0)

您错过了onEnable和onCommand方法中的@Override。我不确定是否有必要,但是通常某些插件会使用此模式。

代替此命令注册:

Bukkit.getPluginCommand("profession").setExecutor((CommandExecutor) this);

使用:

getCommand("profession").setExecutor(this);

getCommand()包含在JavaPlugin扩展器中,因此不必从Bukkit.getPluginCommand()开始,这就是问题所在。

...也可以将onCommand方法签入播放器键入的命令,以防止发生其他错误。 示例:

@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    if (cmd.getName().equalsIgnoreCase("profession")) {
        // code here
    }
}