Code:java package me.Darkpicasa.VotingTokens; 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.inventory.InventoryClickEvent;import org.bukkit.event.player.PlayerJoinEvent;import org.bukkit.inventory.Inventory;import org.bukkit.inventory.ItemStack;import org.bukkit.inventory.meta.ItemMeta;import org.bukkit.material.MaterialData;import org.bukkit.plugin.java.JavaPlugin; public class VotingTokens extends JavaPlugin implements Listener{public static VotingTokens plugin;CustomConfig Playerdata;public void onEnable() {plugin = this;Playerdata = new CustomConfig(plugin, "tokens.yml");getLogger().info("Plugin Enabled!");Playerdata.getConfig().options().copyDefaults(true);Playerdata.saveConfig();Bukkit.getServer().getPluginManager().registerEvents(this, this);} public void onDisable() {getLogger().info("Plugin Disabled!");}public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {if (!(sender instanceof Player)) {return false;}Player p = (Player) sender;if (cmd.getName().equalsIgnoreCase("redeem")){openInv(p); }else if (cmd.getName().equalsIgnoreCase("vt")){if (!(p.hasPermission("votingtokens.admin"))){return false;}if (!(args.length == 0)){if (args[0].equalsIgnoreCase("give")){Playerdata.getConfig().set(args[1], Playerdata.getConfig().getInt(args[1]) + Integer.parseInt(args[2])); }else if (args[0].equalsIgnoreCase("take")){Playerdata.getConfig().set(args[1], Playerdata.getConfig().getInt(args[1]) - Integer.parseInt(args[2]));}}}else if (cmd.getName().equalsIgnoreCase("tokens")){p.sendMessage(ChatColor.GOLD + "You have " + Playerdata.getConfig().getInt(p.getName()) + " tokens! Redeem them at /redeem!");}return false;} public void openInv(Player p){Inventory inv = Bukkit.createInventory(null, 9, ChatColor.DARK_GREEN + "Redeem");ItemStack noble = new ItemStack(Material.WOOD_SWORD);ItemStack priest = new ItemStack(Material.STONE_SWORD);ItemStack king = new ItemStack(Material.GOLD_SWORD);ItemStack emperor = new ItemStack(Material.IRON_SWORD);ItemStack god = new ItemStack(Material.DIAMOND_SWORD);ItemStack nt = new ItemStack(Material.SKULL_ITEM);ItemStack cp = new ItemStack(Material.SKULL_ITEM); ItemMeta nobleMeta = noble.getItemMeta();nobleMeta.setDisplayName(ChatColor.DARK_PURPLE + "Rank Noble - 200 Credits");noble.setItemMeta(nobleMeta); ItemMeta priestMeta = priest.getItemMeta();priestMeta.setDisplayName(ChatColor.WHITE + "Rank Priest - 400 Credits");noble.setItemMeta(priestMeta); ItemMeta kingMeta = king.getItemMeta();kingMeta.setDisplayName(ChatColor.GOLD + "Rank King - 600 Credits");king.setItemMeta(kingMeta); ItemMeta emperorMeta = emperor.getItemMeta();emperorMeta.setDisplayName(ChatColor.DARK_RED + "Rank Emperor - 800 Credits");emperor.setItemMeta(emperorMeta); ItemMeta godMeta = god.getItemMeta();godMeta.setDisplayName(ChatColor.RED + "Rank God - 1000 Credits");god.setItemMeta(godMeta); ItemMeta ntMeta = nt.getItemMeta();ntMeta.setDisplayName(ChatColor.BLUE + "5 Nickname Tokens - 100 Credits");MaterialData data = new MaterialData(2);nt.setData(data);nt.setItemMeta(ntMeta); ItemMeta cpMeta = cp.getItemMeta();cpMeta.setDisplayName(ChatColor.DARK_PURPLE + "Custom Prefixes - 200 Credits");cp.setItemMeta(cpMeta);MaterialData data2 = new MaterialData(4);nt.setData(data2); inv.setItem(1, noble);inv.setItem(2, noble);inv.setItem(3, noble);inv.setItem(4, noble);inv.setItem(5, noble);inv.setItem(8, noble);inv.setItem(9, noble);} @EventHandlerpublic void playerJoin(PlayerJoinEvent e){if (!(Playerdata.getConfig().contains(e.getPlayer().getName()))){Playerdata.getConfig().createSection(e.getPlayer().getName());Playerdata.getConfig().set(e.getPlayer().getName(), 0);Playerdata.saveConfig();}} }} The error is 'null', Unhandled exception when executing command /redeem. The error occurs when I execute the command /redeem Thanks for all help given!
Darkpicasa Do you have a stack trace? Please show it if you do. My guess is that the inventory is null.
Darkpicasa Is that your whole class? Derp, sorry, I see what's wrong. When you use the *setItem()* method, the inventory starts at 0. You were trying to go up to 9, which didn't exist. Subtract 1 from all of your *setItem()* methods. EDIT by Moderator: merged posts, please use the edit button instead of double posting.
Googlelover1234 I changed it like you said. Now, it doesn't have any error message, but no inventory opens up for a player. My new code is Code: package me.Darkpicasa.VotingTokens; 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.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.MaterialData; import org.bukkit.plugin.java.JavaPlugin; public class VotingTokens extends JavaPlugin implements Listener{ public static VotingTokens plugin; CustomConfig Playerdata; public void onEnable() { plugin = this; Playerdata = new CustomConfig(plugin, "tokens.yml"); getLogger().info("Plugin Enabled!"); Playerdata.getConfig().options().copyDefaults(true); Playerdata.saveConfig(); Bukkit.getServer().getPluginManager().registerEvents(this, this); } public void onDisable() { getLogger().info("Plugin Disabled!"); } public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (!(sender instanceof Player)) { return false; } Player p = (Player) sender; if (cmd.getName().equalsIgnoreCase("redeem")){ openInv(p); } else if (cmd.getName().equalsIgnoreCase("vt")){ if (!(p.hasPermission("votingtokens.admin"))){ return false; } if (!(args.length == 0)){ if (args[0].equalsIgnoreCase("give")){ Playerdata.getConfig().set(args[1], Playerdata.getConfig().getInt(args[1]) + Integer.parseInt(args[2])); } else if (args[0].equalsIgnoreCase("take")){ Playerdata.getConfig().set(args[1], Playerdata.getConfig().getInt(args[1]) - Integer.parseInt(args[2])); } } } else if (cmd.getName().equalsIgnoreCase("tokens")){ p.sendMessage(ChatColor.GOLD + "You have " + Playerdata.getConfig().getInt(p.getName()) + " tokens! Redeem them at /redeem!"); } return false; } public void openInv(Player p){ Inventory inv = Bukkit.createInventory(null, 9, ChatColor.DARK_GREEN + "Redeem"); ItemStack noble = new ItemStack(Material.WOOD_SWORD); ItemStack priest = new ItemStack(Material.STONE_SWORD); ItemStack king = new ItemStack(Material.GOLD_SWORD); ItemStack emperor = new ItemStack(Material.IRON_SWORD); ItemStack god = new ItemStack(Material.DIAMOND_SWORD); ItemStack nt = new ItemStack(Material.SKULL_ITEM); ItemStack cp = new ItemStack(Material.SKULL_ITEM); ItemMeta nobleMeta = noble.getItemMeta(); nobleMeta.setDisplayName(ChatColor.DARK_PURPLE + "Rank Noble - 200 Credits"); noble.setItemMeta(nobleMeta); ItemMeta priestMeta = priest.getItemMeta(); priestMeta.setDisplayName(ChatColor.WHITE + "Rank Priest - 400 Credits"); noble.setItemMeta(priestMeta); ItemMeta kingMeta = king.getItemMeta(); kingMeta.setDisplayName(ChatColor.GOLD + "Rank King - 600 Credits"); king.setItemMeta(kingMeta); ItemMeta emperorMeta = emperor.getItemMeta(); emperorMeta.setDisplayName(ChatColor.DARK_RED + "Rank Emperor - 800 Credits"); emperor.setItemMeta(emperorMeta); ItemMeta godMeta = god.getItemMeta(); godMeta.setDisplayName(ChatColor.RED + "Rank God - 1000 Credits"); god.setItemMeta(godMeta); ItemMeta ntMeta = nt.getItemMeta(); ntMeta.setDisplayName(ChatColor.BLUE + "5 Nickname Tokens - 100 Credits"); MaterialData data = new MaterialData(2); nt.setData(data); nt.setItemMeta(ntMeta); ItemMeta cpMeta = cp.getItemMeta(); cpMeta.setDisplayName(ChatColor.DARK_PURPLE + "Custom Prefixes - 200 Credits"); cp.setItemMeta(cpMeta); MaterialData data2 = new MaterialData(4); nt.setData(data2); inv.setItem(0, noble); inv.setItem(1, priest); inv.setItem(2, king); inv.setItem(3, emperor); inv.setItem(4, god); inv.setItem(7, nt); inv.setItem(8, cp); } @EventHandler public void playerJoin(PlayerJoinEvent e){ if (!(Playerdata.getConfig().contains(e.getPlayer().getName()))){ Playerdata.getConfig().createSection(e.getPlayer().getName()); Playerdata.getConfig().set(e.getPlayer().getName(), 0); Playerdata.saveConfig(); } } @EventHandler public void inventoryGUI(InventoryClickEvent e){ if (!(ChatColor.stripColor(e.getInventory().getName()).equalsIgnoreCase("Redeem"))){ return; } Player p = (Player) e.getWhoClicked(); e.setCancelled(true); if (e.getCurrentItem()==null || e.getCurrentItem().getType() == Material.AIR || !e.getCurrentItem().hasItemMeta()){ p.closeInventory(); return; } switch (e.getCurrentItem().getType()){ case GRASS: p.sendMessage("You clicked the grass"); p.closeInventory(); break; default: p.closeInventory(); break; } } } EDIT by Moderator: merged posts, please use the edit button instead of double posting.
Darkpicasa So... after you create the inventory, create the items, and put them in the inv, you forgot to do the Code: p.showInventory(inv);
Googlelover1234 Perfect, thanks so much! One last question. I want the skulls to be a zombie skull and a creeper skull. How would I change the data of the items to 2 or 4?
I haven't used the Bukkit API in a while, so forgive me if this is incorrect: you use the setData() method, and cast *byte* to the number. EDIT: Also, this may be helpful: http://jd.bukkit.org/rb/apidocs/org/bukkit/block/Skull.html
Googlelover1234 Didn't work. My code: Code: package me.Darkpicasa.VotingTokens; 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.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.MaterialData; import org.bukkit.plugin.java.JavaPlugin; public class VotingTokens extends JavaPlugin implements Listener{ public static VotingTokens plugin; CustomConfig Playerdata; public void onEnable() { plugin = this; Playerdata = new CustomConfig(plugin, "tokens.yml"); getLogger().info("Plugin Enabled!"); Playerdata.getConfig().options().copyDefaults(true); Playerdata.saveConfig(); Bukkit.getServer().getPluginManager().registerEvents(this, this); } public void onDisable() { getLogger().info("Plugin Disabled!"); } public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (!(sender instanceof Player)) { return false; } Player p = (Player) sender; if (cmd.getName().equalsIgnoreCase("redeem")){ openInv(p); } else if (cmd.getName().equalsIgnoreCase("vt")){ if (!(p.hasPermission("votingtokens.admin"))){ return false; } if (!(args.length == 0)){ if (args[0].equalsIgnoreCase("give")){ Playerdata.getConfig().set(args[1], Playerdata.getConfig().getInt(args[1]) + Integer.parseInt(args[2])); } else if (args[0].equalsIgnoreCase("take")){ Playerdata.getConfig().set(args[1], Playerdata.getConfig().getInt(args[1]) - Integer.parseInt(args[2])); } } } else if (cmd.getName().equalsIgnoreCase("tokens")){ p.sendMessage(ChatColor.GOLD + "You have " + Playerdata.getConfig().getInt(p.getName()) + " tokens! Redeem them at /redeem!"); } return false; } public void openInv(Player p){ Inventory inv = Bukkit.createInventory(null, 9, ChatColor.DARK_GREEN + "Redeem"); ItemStack noble = new ItemStack(Material.WOOD_SWORD); ItemStack priest = new ItemStack(Material.STONE_SWORD); ItemStack king = new ItemStack(Material.GOLD_SWORD); ItemStack emperor = new ItemStack(Material.IRON_SWORD); ItemStack god = new ItemStack(Material.DIAMOND_SWORD); ItemStack nt = new ItemStack(Material.SKULL_ITEM); ItemStack cp = new ItemStack(Material.SKULL_ITEM); ItemMeta nobleMeta = noble.getItemMeta(); nobleMeta.setDisplayName(ChatColor.DARK_PURPLE + "Rank Noble - 200 Credits"); noble.setItemMeta(nobleMeta); ItemMeta priestMeta = priest.getItemMeta(); priestMeta.setDisplayName(ChatColor.WHITE + "Rank Priest - 400 Credits"); priest.setItemMeta(priestMeta); ItemMeta kingMeta = king.getItemMeta(); kingMeta.setDisplayName(ChatColor.GOLD + "Rank King - 600 Credits"); king.setItemMeta(kingMeta); ItemMeta emperorMeta = emperor.getItemMeta(); emperorMeta.setDisplayName(ChatColor.DARK_RED + "Rank Emperor - 800 Credits"); emperor.setItemMeta(emperorMeta); ItemMeta godMeta = god.getItemMeta(); godMeta.setDisplayName(ChatColor.RED + "Rank God - 1000 Credits"); god.setItemMeta(godMeta); ItemMeta ntMeta = nt.getItemMeta(); ntMeta.setDisplayName(ChatColor.BLUE + "5 Nickname Tokens - 100 Credits"); MaterialData data = new MaterialData((byte) 2); nt.setData(data); nt.setItemMeta(ntMeta); ItemMeta cpMeta = cp.getItemMeta(); cpMeta.setDisplayName(ChatColor.DARK_PURPLE + "Custom Prefixes - 200 Credits"); cp.setItemMeta(cpMeta); MaterialData data2 = new MaterialData(4); nt.setData(data2); inv.setItem(0, noble); inv.setItem(1, priest); inv.setItem(2, king); inv.setItem(3, emperor); inv.setItem(4, god); inv.setItem(7, nt); inv.setItem(8, cp); p.openInventory(inv); } @EventHandler public void playerJoin(PlayerJoinEvent e){ if (!(Playerdata.getConfig().contains(e.getPlayer().getName()))){ Playerdata.getConfig().createSection(e.getPlayer().getName()); Playerdata.getConfig().set(e.getPlayer().getName(), 0); Playerdata.saveConfig(); } } @EventHandler public void inventoryGUI(InventoryClickEvent e){ if (!(ChatColor.stripColor(e.getInventory().getName()).equalsIgnoreCase("Redeem"))){ return; } Player p = (Player) e.getWhoClicked(); e.setCancelled(true); if (e.getCurrentItem()==null || e.getCurrentItem().getType() == Material.AIR || !e.getCurrentItem().hasItemMeta()){ p.closeInventory(); return; } switch (e.getCurrentItem().getType()){ case WOOD_SWORD: if (Playerdata.getConfig().getInt(p.getName()) > 200){ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "vt take " + p.getName() + " 200"); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "manuadd " + p.getName() + " Noble"); p.sendMessage(ChatColor.GREEN + "Bought rank Noble!"); } else { p.sendMessage(ChatColor.RED + "Not enough tokens!"); } p.closeInventory(); break; case STONE_SWORD: if (Playerdata.getConfig().getInt(p.getName()) > 400){ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "vt take " + p.getName() + " 400"); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "manuadd " + p.getName() + " Priest"); p.sendMessage(ChatColor.GREEN + "Bought rank Priest!"); } else { p.sendMessage(ChatColor.RED + "Not enough tokens!"); } p.closeInventory(); break; case GOLD_SWORD: if (Playerdata.getConfig().getInt(p.getName()) > 600){ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "vt take " + p.getName() + " 600"); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "manuadd " + p.getName() + " King"); p.sendMessage(ChatColor.GREEN + "Bought rank King!"); } else { p.sendMessage(ChatColor.RED + "Not enough tokens!"); } p.closeInventory(); break; case IRON_SWORD: if (Playerdata.getConfig().getInt(p.getName()) > 800){ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "vt take " + p.getName() + " 800"); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "manuadd " + p.getName() + " Emperor"); p.sendMessage(ChatColor.GREEN + "Bought rank Emperor!"); } else { p.sendMessage(ChatColor.RED + "Not enough tokens!"); } p.closeInventory(); break; case DIAMOND_SWORD: if (Playerdata.getConfig().getInt(p.getName()) > 1000){ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "vt take " + p.getName() + " 1000"); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "manuadd " + p.getName() + " God"); p.sendMessage(ChatColor.GREEN + "Bought rank God!"); } else { p.sendMessage(ChatColor.RED + "Not enough tokens!"); } p.closeInventory(); break; case SKULL_ITEM: p.sendMessage("You clicked the grass"); p.closeInventory(); break; default: p.closeInventory(); break; } } }
Darkpicasa Don't rename your thread "SOLVED" it doesn't help anyone. That is what the solved tag is for.
I'm not sure what you mean... Do you mean how I differenciated between the types of player skulls? If so, what I did was Code: ItemStack itemstack = new ItemStack(Material.SKULL_ITEM,1,(short) 2); The (short) 2 part at the end sets the data.