为什么在执行此 Bukkit 插件代码时出现注册错误?
Why am i getting a register error when executing this Bukkit plugin code?
好的,所以当我尝试 运行 我的插件时,它只是抛出这个错误。
http://prntscr.com/8j3d4f
我试图通过注册 IconMenu class 来解决这个问题,但它似乎不起作用。
主要Class明星
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 Class
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());
行,您发布的代码应该会在编译期间导致错误。由于您为 IconMenu class 定义了自己的便捷构造函数,因此没有默认构造函数 new IconMenu()
,您必须为列出的参数提供所需的参数:IconMenu(String name, int size, OptionClickEventHandler handler, Plugin plugin)
。注册监听器的参数顺序也应该反过来:先是监听器,然后是插件。
我假设您已经修复了这个错误,看到您遇到了链接到的运行时错误。 IllegalPluginAccessException 被抛出是因为 IconMenu 构造函数中的最后一行:plugin.getServer().getPluginManager().registerEvents(this, plugin);
。如果您删除此行,并在您的 onEnable() 方法中保留 pm.registerEvents(new IconMenu(...), this);
部分,则插件应该加载并成功启用。但是,我不能保证这些修复将使您的 IconMenu 功能无缝运行,所有这些只是消除错误。
好的,所以当我尝试 运行 我的插件时,它只是抛出这个错误。 http://prntscr.com/8j3d4f 我试图通过注册 IconMenu class 来解决这个问题,但它似乎不起作用。
主要Class明星
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 Class
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());
行,您发布的代码应该会在编译期间导致错误。由于您为 IconMenu class 定义了自己的便捷构造函数,因此没有默认构造函数 new IconMenu()
,您必须为列出的参数提供所需的参数:IconMenu(String name, int size, OptionClickEventHandler handler, Plugin plugin)
。注册监听器的参数顺序也应该反过来:先是监听器,然后是插件。
我假设您已经修复了这个错误,看到您遇到了链接到的运行时错误。 IllegalPluginAccessException 被抛出是因为 IconMenu 构造函数中的最后一行:plugin.getServer().getPluginManager().registerEvents(this, plugin);
。如果您删除此行,并在您的 onEnable() 方法中保留 pm.registerEvents(new IconMenu(...), this);
部分,则插件应该加载并成功启用。但是,我不能保证这些修复将使您的 IconMenu 功能无缝运行,所有这些只是消除错误。