Bukkit使用多个类

时间:2016-05-31 14:57:53

标签: java class minecraft bukkit

我正在努力学习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.");   
    }
}

这是我的2ND CLASS

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);
    }

}

我怎么做才能让第二课真正阅读&#39; ?

非常感谢!

3 个答案:

答案 0 :(得分:1)

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

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

onCommand课程中的MainGUI方法无论如何都无法做到。当您在 main 类中声明返回类型为onCommand的{​​{1}}方法时,您将从主类扩展的boolean类中重写该方法(然后从其他地方调用方法),而JavaPlugin类中的onCommand方法将不会被使用,除非您自己在某处调用它。如果要在主类之外实现命令行为,可以使用显示hereMainGUI类。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你需要做两件事。 onCommand不会检查非插件类(并且你的第二个类不应该扩展插件)。所以只需在主类中添加onCommand方法,除了在第二个类中调用onCommand方法之外什么都不做。其次,确保你的第二个类正在调用Bukkit.getPluginManager()。registerEvents();.为此,我建议添加一个名为&#34; plugin&#34;的静态变量。这是您主类中的JavaPlugin。你应该让主插件做&#34; plugin = this;&#34;何时启用。然后,您可以将该变量用于registerEvents()中的参数。这应该可以解决你的问题。