Java 我的bukkitplugin中的命令不起作用

Java 我的bukkitplugin中的命令不起作用,java,plugins,bukkit,Java,Plugins,Bukkit,现在我已经将plugin.yml中的“Commands”改为“Commands”,在运行服务器时,我的cmd中又出现了一个错误。错误显示“.Jar文件不包含plugin.yml” 这是我现在的plugin.yml: name: Wand version: 1.0 main: me.Pixel.Main commands: wand: 这是我目前的主要文件: package me.Pixel; import java.util.ArrayList; import java.util.List

现在我已经将plugin.yml中的“Commands”改为“Commands”,在运行服务器时,我的cmd中又出现了一个错误。错误显示“.Jar文件不包含plugin.yml”

这是我现在的plugin.yml:

name: Wand
version: 1.0
main: me.Pixel.Main
commands:
 wand:
这是我目前的主要文件:

package me.Pixel;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.ChatColor;
import org.bukkit.Effect;
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.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener {
    public Main plugin;
    public List<String> spells = new ArrayList<String>();
    public getTargets getTargets = new getTargets();
    public Spark spark = new Spark(this);
    public PoisonWave poisonwave = new PoisonWave(this);
    public DarkSpark darkSpark = new DarkSpark(this);

    @Override
    public void onEnable() {
        plugin = this;
        getServer().getPluginManager().registerEvents(this, this);
        spells.add("Spark");
        spells.add("PoisonWave");
        spells.add("DarkSpark");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command,
            String label, String[] args) {
        if(label.equalsIgnoreCase("wand")) {
            if(!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + "You need to be an in-game player to perform this action!");
            } else {
                Player p = (Player) sender;
                if(sender.hasPermission("wand.wand")) {
                    ItemStack stack = new ItemStack(Material.BLAZE_ROD);
                    ItemMeta stackMeta = stack.getItemMeta();
                    stackMeta.setDisplayName(ChatColor.RED + "Empire Wand");
                    stack.setItemMeta(stackMeta);
                    p.getInventory().addItem(stack);
                    ChatUtilities.sendMessage(p, "You have got yourself a powerful Empire Wand!");
                } else {
                    ChatUtilities.sendMessage(p, ChatColor.RED + "ERROR: No Permission!");
                }
            }
        }
        return false;
    }

    @EventHandler
    public void onClick(PlayerInteractEvent e) {
        if((e.getAction() == Action.RIGHT_CLICK_AIR) || e.getAction() == Action.RIGHT_CLICK_BLOCK) {
            Player p = e.getPlayer();
            ItemStack stack = p.getItemInHand();
            if(stack != null && stack.getType() == Material.BLAZE_ROD && stack.hasItemMeta() && stack.getItemMeta().getDisplayName().equals(ChatColor.RED + "Empire Wand")) {
                int SpellSelected = stack.getDurability();
                if(SpellSelected < 2) {
                    stack.setDurability((short) (SpellSelected + 1));
                    p.getWorld().playEffect(p.getLocation(), Effect.STEP_SOUND, 119, 30);
                } else {
                    stack.setDurability((short) 0);
                }
                ChatUtilities.sendMessage(p, "Selected: " + spells.get(SpellSelected));
            }
        }
        if(e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK) {
            Player p = e.getPlayer();
            ItemStack stack = p.getItemInHand();
            if(stack != null && stack.getType() == Material.BLAZE_ROD && stack.hasItemMeta() && stack.getItemMeta().getDisplayName().equals(ChatColor.RED + "Empire Wand")) {
                int SpellSelected = stack.getDurability();
                if(SpellSelected == 1) {
                    this.spark.onCast(p);  
                } else if (SpellSelected == 0) {
                   this.poisonwave.onCast(p);
                }
            }
        }
    }
}

在使用p.updateInventory添加项目后,您可能需要更新播放器的库存。在您的情况下,可能是这样的:

p.getInventory().addItem(stack);
p.updateInventory();
plugin.yml文件区分大小写,命令列表的名称必须是所有小写命令,而不是命令。由于您当前已将其大写,因此Bukkit/spiget不会注册任何命令,从而导致出现未知命令。键入/help以获取帮助。消息如果您测试/wand命令,我假设这是您得到的错误,您没有,但这是我测试代码时发生的情况,更正命令列表的名称使命令执行

name: Wand
version: 1.0
main: me.Pixel.Main
commands:
  wand:
您的plugin.yml文件无效。'“命令”必须全部小写,并且在魔杖前必须有2个空格

此外,您不应该以这种方式发出命令。您应该使外部类实现CommandExecutor接口

我想,如果你这样做,我想你必须注册这个命令。 像这样:

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

Bukkit在删除或添加ItemStack后会自动更新播放器的资源清册,在这种情况下,该命令不起作用,因为plugin.yml文件中的命令列表是大写的,因此没有注册任何命令。根据,缩进可以是单个空格字符,因此只有命令列表需要取消大写。Bukkit/spiget只使用单个空格缩进注册命令。通过重写onCommand方法注册命令是完全有效的,并且在中使用。哦,奇怪的是,我的命令总是使用两个空格,我学到了一些东西:P哦,我也学到了,因为我从来没有这样做过,我不确定。谢谢你的信息;所以“getCommandwand.setExecutorthis;”放在哪里在我的档案里?我需要为它删除一些东西吗?你不需要使用它。只需将命令设置为plugin.yml中的命令