Bukkit 命令重复自身?

Bukkit command repeats itself?

我编写了一个 Bukkit 插件没有错误,但在游戏中它有问题。

无论何时使用该命令,它都不会执行它应该执行的操作。相反,它会向我发送一条粗体消息,说明我输入的内容 /leaving.

这是我的代码:

public class SeeYouSoon extends JavaPlugin{

// Start
@Override
public void onEnable(){
}

@Override 
public void onDisable() {
}

//Commands



public boolean onCommand(CommandSender sender, Command cmd, String[] args){
    if(cmd.getName().equalsIgnoreCase("leaving")){
        Player player = (Player) sender;
        Bukkit.broadcastMessage(ChatColor.RED + player.getName() + ChatColor.LIGHT_PURPLE + ChatColor.ITALIC + " is about to leave the server. Please say your goodbyes!");
        Bukkit.getScheduler().runTaskLater(this, new Runnable() {
            public void run() {
                //Run your function or change stuff here.
               player.kickPlayer(ChatColor.RED + "Kicked:" + ChatColor.WHITE + " You requested to leave.");
            }
        }, 20 * 30);// There are 20 ticks in one second so we can just multiply seconds by 20.
    }
    return false;

}
}

plugin.yml 是我预料的问题。这是 plugin.yml:

name: SeeYouSoon
main: me.mark.SeeYouSoon
version: 1.0
commands:
   leaving:
      description: Announce your leave

首先,JavaPlugin中的onCommand()方法格式为:

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

关于发生这种情况的下一个原因是因为您在执行命令后没有 return true。例如,您应该使用:

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
    if(cmd.getName().equalsIgnoreCase("leaving")){
        //your code
        return true;
    }
}

因此,您的最终代码应如下所示:

public boolean onCommand(CommandSender sender, Command cmd, String[] args){
    if(cmd.getName().equalsIgnoreCase("leaving")){
        Player player = (Player) sender;
        Bukkit.broadcastMessage(ChatColor.RED + player.getName() + ChatColor.LIGHT_PURPLE + ChatColor.ITALIC + " is about to leave the server. Please say your goodbyes!");
        Bukkit.getScheduler().runTaskLater(this, new Runnable() {
            public void run() {
               player.kickPlayer(ChatColor.RED + "Kicked:" + ChatColor.WHITE + " You requested to leave.");
            }
        }, 20 * 30);
        return true;
    }
    return false;   
}

你没有安全地向玩家投射:

Player player = (Player)sender;

虽然这是正确的 java,但这可能会导致错误。投射前确保发件人确实是玩家。

if (!sender instanceof Player)
{
    sender.sendMessage("Some error message");
    return true;
}
// Now you can cast to a player and continue with your code.