gpt4 book ai didi

java - 命令不起作用

转载 作者:行者123 更新时间:2023-12-02 11:51:42 30 4
gpt4 key购买 nike

今天我开始了我的第一个大项目,这是我的服务器的 Minecraft Spigot 插件,名为 Pixel Network。创建 /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 类的引用不是问题,因为这只是我为了使使用颜色更容易而制作的一个小“模块”。

我希望有人能帮助我解决这个问题。

提前致谢,
- 夏夫

最佳答案

除非 self 使用以来 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 注释的任何方法,并在触发它们时将它们作为事件处理。

您还可以使用命令执行器,它看起来像这样:

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。

关于java - 命令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47839259/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com