使用多个类的布基特



我正在尝试同时学习Java和Bukkit(几个月前我学过一些基本的Java,并做了一个简单的文本游戏)。

我知道当我使用 1 个类时我在做什么,但是,您可能知道,一切都变得混乱,所以我正在重新编码所有内容,但试图让它更干净,但我遇到了一个问题,除了主类,没有其他类工作,这是我的代码。

主要类:

package me.Camaloony.RoyalCosmetics;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import net.md_5.bungee.api.ChatColor;
public class Core extends JavaPlugin implements Listener {
Logger myPluginLogger = Bukkit.getLogger();
@Override
public void onEnable()
{
    PluginManager manager = getServer().getPluginManager();
        manager.registerEvents(this, this);
    Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.RED + "=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
    Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.AQUA + "Royal Cosmetics has been enabled!");
    Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.RED + "=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
}
@Override
public void onDisable()
{
    myPluginLogger.info("Test 1 has been disabled!");
    myPluginLogger.severe("Test 1 has an error and has not loaded.");   
    }
}

这是我的第二堂课

package me.Camaloony.RoyalCosmetics;
import java.util.ArrayList;
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.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class MainGUI implements Listener {
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        Player player = (Player) sender;
        if (commandLabel.equalsIgnoreCase("Cosmetics")) {
            createMainMenu(player);
        }
        return false;
    }
    @EventHandler
    public void onInvClick(InventoryClickEvent event){
        if (event.getCurrentItem().getItemMeta().getDisplayName().contains("Particles GUI")) {
            event.setCancelled(true);
        }
    }
    public void createMainMenu(Player player) {
        Inventory inv = Bukkit.getServer().createInventory(null, 45, "Royal Cosmetics");
        ItemStack item1 = new ItemStack(Material.REDSTONE);
        ItemMeta item1Meta = item1.getItemMeta();
        ArrayList<String> item1Lore = new ArrayList<String>();
        item1Lore.add("Click here to go to the particles GUI");
        item1Meta.setDisplayName("Particles GUI");
        item1Meta.setLore(item1Lore);
        item1.setItemMeta(item1Meta);
        inv.setItem(0, item1);
        player.openInventory(inv);
    }
}

我该如何使第二类真正被"阅读"?

多谢!

由于您的第二个(非主)类是 Listener ,您也可以注册该类的实例来侦听事件,类似于您对主类所做的:

manager.registerEvents(new MainGUI(), this);

然而,据我所知,您MainGUI类中的onCommand方法不会做太多事情。当您在类中声明返回类型为 booleanonCommand 方法时,您将从主类扩展的 JavaPlugin 类中重写该方法(然后从其他地方调用该方法),而除非您自己在某处调用它,否则不会使用 MainGUI 类中的 onCommand 方法。如果要在主类之外实现命令行为,可以使用 CommandExecutor 类,如下所示。

只需添加manager.registerEvents(new MainGUI(), this); 到核心中的 onEnable()。

你需要做两件事。 onCommand 不会检查非插件类(并且您的第二个类不应扩展插件)。因此,只需在主类中添加 onCommand 方法,让它只在第二个类中调用 onCommand 方法。其次,确保你的第二个类调用Bukkit.getPluginManager().registerEvents();。为此,我建议在主类中添加一个名为"plugin"的静态变量,这是一个Java插件。启用后,您应该让主插件执行"plugin = this;"。然后,您可以将该变量用于 registerEvents() 中的参数。这应该可以解决您的问题。