繁体   English   中英

为什么在执行此 Bukkit 插件代码时会出现注册错误?

[英]Why am i getting a register error when executing this Bukkit plugin code?

好的,所以当我尝试运行我的插件时,它只会抛出这个错误。 http://prntscr.com/8j3d4f我试图通过注册 IconMenu 类来解决这个问题,但它似乎不起作用。

主班明星

package me.JukeBoxSensei.RulesStar;

import java.util.logging.Logger;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
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.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

public class Star extends JavaPlugin implements Listener
{


    Logger log = Bukkit.getLogger();
    MyConfigManager manager;
    MyConfig rulesConfig;

    @Override
    public void onEnable()
    {
        log.info("[RuleStar]Loaded successfully!");
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
        PluginManager pm = getServer().getPluginManager();
        pm.registerEvents(this, new IconMenu());
        rulesConfig = manager.getNewConfig("RuleStar.yml", new String[] {"RuleStar Config File", "Plugin by JukeBoxSensei"});
    }

    @Override
    public void onDisable()
    {
        log.severe("[RuleStar]Something broke or we restarted!");

    }


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





        if(sender instanceof Player)
        {
            Player p = (Player) sender;

            if (cmd.getName().equalsIgnoreCase("rs") &&  Double.parseDouble(args[0]) <= 5) 
            {

                StringBuilder r = new StringBuilder();
                for(int i = 2; i < args.length; i++)
                {
                    r.append(' ').append(args[i]);

                }
                rulesConfig.set("Rule." + args[0] , r.toString());
                rulesConfig.saveConfig();
            }
            else
            {
                p.sendMessage("Either you did note specify an indencie or it was not in range 0 to 5");
                p.sendMessage("Or your indencie was a string!");

            }
        }
        return false;
    }

    IconMenu menu = new IconMenu("My Fancy Menu", 9, new IconMenu.OptionClickEventHandler() {
        @Override
        public void onOptionClick(IconMenu.OptionClickEvent event) {
            event.getPlayer().sendMessage("You have chosen " + event.getName());
            event.setWillClose(true);
        }
    }, this)
    .setOption(3, new ItemStack(Material.APPLE, 1), "Food", "The food is delicious")
    .setOption(4, new ItemStack(Material.IRON_SWORD, 1), "Weapon", "Weapons are for awesome people")
    .setOption(5, new ItemStack(Material.EMERALD, 1), "Money", "Money brings happiness");

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent e)
    {
        Player p = e.getPlayer();
        if(p.getItemInHand().getItemMeta().getLore().contains(ChatColor.GREEN + "Rule Star"));
        {
            menu.open(p);

        }

    }

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent j)
    {
        Player player = j.getPlayer();
        if(rulesConfig.contains("Players." + player.getUniqueId()) == false)
        {
            rulesConfig.set("Players." + player.getUniqueId(), player.getUniqueId());
            rulesConfig.saveConfig();

        }

    }

}

IconMenu 类

package me.JukeBoxSensei.RulesStar;

import java.util.Arrays;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;

public class IconMenu implements Listener {

    private String name;
    private int size;
    private OptionClickEventHandler handler;
    private Plugin plugin;

    private String[] optionNames;
    private ItemStack[] optionIcons;

    public IconMenu(String name, int size, OptionClickEventHandler handler, Plugin plugin) {
        this.name = name;
        this.size = size;
        this.handler = handler;
        this.plugin = plugin;
        this.optionNames = new String[size];
        this.optionIcons = new ItemStack[size];
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
    }


    public IconMenu setOption(int position, ItemStack icon, String name, String... info) {
        optionNames[position] = name;
        optionIcons[position] = setItemNameAndLore(icon, name, info);
        return this;
    }

    public void open(Player player) {
        Inventory inventory = Bukkit.createInventory(player, size, name);
        for (int i = 0; i < optionIcons.length; i++) {
            if (optionIcons != null) {
                inventory.setItem(i, optionIcons[i]);
            }
        }
        player.openInventory(inventory);
    }

    public void destroy() {
        HandlerList.unregisterAll(this);
        handler = null;
        plugin = null;
        optionNames = null;
        optionIcons = null;
    }

    @EventHandler(priority = EventPriority.MONITOR)
    void onInventoryClose(InventoryCloseEvent event) {
        if (event.getInventory().getTitle().equals(name)) {
            destroy();
        }
    }

    @EventHandler(priority = EventPriority.MONITOR)
    void onInventoryClick(InventoryClickEvent event) {
        if (event.getInventory().getTitle().equals(name)) {
            event.setCancelled(true);
            int slot = event.getRawSlot();
            if (slot >= 0 && slot < size && optionNames[slot] != null) {
                Plugin plugin = this.plugin;
                OptionClickEvent e = new OptionClickEvent((Player) event.getWhoClicked(), slot, optionNames[slot]);
                handler.onOptionClick(e);
                if (e.willClose()) {
                    final Player p = (Player) event.getWhoClicked();
                    Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                        public void run() {
                            p.closeInventory();
                        }
                    }, 1);
                }
                if (e.willDestroy()) {
                    destroy();
                }
            }
        }
    }

    public interface OptionClickEventHandler {
        public void onOptionClick(OptionClickEvent event);
    }

    public class OptionClickEvent {
        private Player player;
        private int position;
        private String name;
        private boolean close;
        private boolean destroy;

        public OptionClickEvent(Player player, int position, String name) {
            this.player = player;
            this.position = position;
            this.name = name;
            this.close = true;
            this.destroy = false;
        }

        public Player getPlayer() {
            return player;
        }

        public int getPosition() {
            return position;
        }

        public String getName() {
            return name;
        }

        public boolean willClose() {
            return close;
        }

        public boolean willDestroy() {
            return destroy;
        }

        public void setWillClose(boolean close) {
            this.close = close;
        }

        public void setWillDestroy(boolean destroy) {
            this.destroy = destroy;
        }
    }

    private ItemStack setItemNameAndLore(ItemStack item, String name, String[] lore) {
        ItemMeta im = item.getItemMeta();
        im.setDisplayName(name);
        im.setLore(Arrays.asList(lore));
        item.setItemMeta(im);
        return item;
    }

}

我对编码很陌生,所以这真的很令人费解。 我确定我遗漏了一些明显的东西,但是,我真的可以使用一些帮助。 我的 Mc 版本是 1.8.8 和 Bukkit 服务器 (1.8.8) 相同。 任何将不胜感激!

由于pm.registerEvents(this, new IconMenu());行,您发布的代码应该会在编译期间导致错误pm.registerEvents(this, new IconMenu()); . 由于您为 IconMenu 类定义了自己的便捷构造函数,因此没有默认构造函数new IconMenu()并且您必须为您列出的参数提供所需的参数: IconMenu(String name, int size, OptionClickEventHandler handler, Plugin plugin) . 注册监听器的参数顺序也应该相反:首先是监听器,然后是插件。

我假设您已经修复了这个错误,看到您遇到了链接到的运行时错误。 由于 IconMenu 构造函数中的最后一行,IllegalPluginAccessException 被抛出: plugin.getServer().getPluginManager().registerEvents(this, plugin); . 如果删除此行,并保留pm.registerEvents(new IconMenu(...), this); 在 onEnable() 方法的一部分,插件应该加载并成功启用。 然而,我不能保证这些修复将使您的 IconMenu 功能无缝运行,所有这些只是消除错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM