Random Items In Chests - HELP!

Discussion in 'Plugin Development' started by DeFlavLemon, Sep 11, 2016.

Thread Status:
Not open for further replies.
  1. Hello! :)

    I'm making this thread because I need help on generating random items in chests. Here's the code for the generation:

    Code:
    public void onPlayerInteract(PlayerInteractEvent event) {
       
            Block block = someLocation.getBlock();
        
            Chest chest = (Chest) block.getState();
            Inventory inv = chest.getInventory();
            inv.setContents(getRandomItem(new ItemStack(items[random.nextInt(items.length)])));
        }
    
        public ItemStack getRandomItem(ItemStack[] itemstack){
            int random = new Random().nextInt(itemstack.length);
            return itemstack[random];
        }
    and config:

    Code:
    items:
        stone: 20
        chest: 50
        diamond: 10
        gravel: 20
    I am getting an error on:
    Code:
    Block block = someLocation.getBlock();
    and
    Code:
     inv.setContents(getRandomItem(new ItemStack(items[random.nextInt(items.length)])));
    I am not sure what the problems are, so don't ask me that. That's the reason I'm making this, so people can solve the problem with me. Any help appreciated!

    Bye! :D

    EDIT: I found out why the someLocation isn't working. But I don't know how to fix the problem. And also how would I make it so items could only generate in a chest with a specific ItemMeta, thanks again!
     
    Last edited: Sep 11, 2016
  2. Offline

    Blockhead7360

    You should post this in the plugin development section instead. But about the problem:

    getRandomItem returns an ItemStack and not an ItemStack[]. The setContents method needs an ItemStack[]. And then when you are supplying the argument for the getRandomItem, which what you did was "new ItemStack", that won't work because your getRandomItem method needs an ItemStack[] instead of an ItemStack
     
  3. Offline

    timtower Administrator Administrator Moderator

    @Blockhead7360 Report button is there for a reason.
    Moved to plugin development.
     
  4. Okay, I have done what you said (at least I did what I think you meant) However I have an error on setContents. I'm sorry if I'm annoying you as I'm not the best coder. I'll give you all of the code in my class just to check if there is anything wrong outside of those 2 methods.
    Code:
    package me.deflavlemonyt.sg;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map.Entry;
    import java.util.Random;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.Chest;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.ShapedRecipe;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class SurvivalGames extends JavaPlugin implements Listener {
    
        private Material[] items;
        private Random random;
        private Inventory inventory;
    
        @Override
        public void onEnable() {
    
            getServer().getPluginManager().registerEvents(this, this);
    
            ItemStack item = new ItemStack(Material.CHEST);
            ItemMeta im = item.getItemMeta();
            im.setDisplayName(ChatColor.RED + "" + ChatColor.BOLD + "SG Chest");
            List<String> lore = new ArrayList<String>();
            lore.add(ChatColor.DARK_AQUA + "Strictly Admin Only!");
            im.setLore(lore);
            item.setItemMeta(im);
            ShapedRecipe disk = new ShapedRecipe(item);
            disk.shape(new String[] { " C ", " T ", "   " }).setIngredient('C', Material.CHEST)
                    .setIngredient('T', Material.TRIPWIRE_HOOK);
            Bukkit.getServer().addRecipe(disk);
    
            this.random = new Random();
            this.items = new Material[100];
    
            int index = 0;
            for (Entry<String, Object> entry : getConfig().getConfigurationSection("items").getValues(false).entrySet()) {
                for (int i = 0; i < Integer.valueOf(entry.getValue().toString()); i++) {
                    items[index++] = Material.valueOf(entry.getKey().toUpperCase());
                }
            }
          
            Bukkit.getServer().getPluginManager().registerEvents(new SignListeners(), this);
            System.out.println(Arrays.toString(items));
        }
    
        public void onPlayerInteract(PlayerInteractEvent event, Location someLocation) {
          
            Block block = someLocation.getBlock();
           
            Chest chest = (Chest) block.getState();
            Inventory inv = chest.getInventory();
            inv.setContents(getRandomItem(items[random.nextInt(items.length)]));
        }
    
        public ItemStack[] setContents(ItemStack[] itemstack) {
             
            int random = new Random().nextInt(itemstack.length);
            return itemstack;
        }
    
        public ItemStack getRandomItem(Material itemstack){
                  
            return null;
        }
    
        public boolean onCommand(CommandSender sender, Player player, Command cmd, Block block, Material material,
                String label, String[] args) {
    
            if (cmd.getName().equalsIgnoreCase("sg")) {
    
                player.setHealth(20);
                player.setFoodLevel(20);
                player.getPlayer()
                        .sendMessage(ChatColor.GREEN + "You have succesfully teleported to the survival games arena!");
            }
    
            return true;
        }
    }
    Thanks man! :)
     
    Last edited: Sep 12, 2016
  5. Offline

    TheFl4me

    post the error.
     
  6. The method setContents(ItemStack[]) in the type Inventory is not applicable for the arguments (ItemStack). That's what it says
     
  7. Offline

    I Al Istannen

    @DeFlavLemon
    Then pass an array:
    "new ItemStack[] {<item stack>}"
     
  8. Okay, no errors. But the chest generation itself will not work. Will I have to put 'onEnable();' In the sg command method? As I want everything to happen after that command has been entered.

    New code:
    Code:
    package me.deflavlemonyt.sg;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map.Entry;
    import java.util.Random;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.Chest;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.ShapedRecipe;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class SurvivalGames extends JavaPlugin implements Listener {
    
        private Material[] items;
        private Random random;
        private Inventory inventory;
    
        @Override
        public void onEnable() {
    
            getServer().getPluginManager().registerEvents(this, this);
    
            ItemStack item = new ItemStack(Material.CHEST);
            ItemMeta im = item.getItemMeta();
            im.setDisplayName(ChatColor.RED + "" + ChatColor.BOLD + "SG Chest");
            List<String> lore = new ArrayList<String>();
            lore.add(ChatColor.DARK_AQUA + "Strictly Admin Only!");
            im.setLore(lore);
            item.setItemMeta(im);
            ShapedRecipe disk = new ShapedRecipe(item);
            disk.shape(new String[] { " C ", " T ", "   " }).setIngredient('C', Material.CHEST)
                    .setIngredient('T', Material.TRIPWIRE_HOOK);
            Bukkit.getServer().addRecipe(disk);
    
            this.random = new Random();
            this.items = new Material[100];
    
            int index = 0;
            for (Entry<String, Object> entry : getConfig().getConfigurationSection("items").getValues(false).entrySet()) {
                for (int i = 0; i < Integer.valueOf(entry.getValue().toString()); i++) {
                    items[index++] = Material.valueOf(entry.getKey().toUpperCase());
                }
            }
           
            Bukkit.getServer().getPluginManager().registerEvents(new SignListeners(), this);
            System.out.println(Arrays.toString(items));
        }
    
        public void onPlayerInteract(PlayerInteractEvent event, Location someLocation) {
           
            Block block = someLocation.getBlock();
            
            Chest chest = (Chest) block.getState();
            Inventory inv = chest.getInventory();
            inv.setContents(getRandomItem(new ItemStack[random.nextInt(items.length)]));
        }
    
        public ItemStack[] setContents(ItemStack[] itemstack) {
              
            return itemstack;
        }
    
        public ItemStack[] getRandomItem(ItemStack[] itemstack){
           
            return itemstack;
        }
    
        public boolean onCommand(CommandSender sender, Player player, Command cmd, Block block, Material material,
                String label, String[] args) {
    
            if (cmd.getName().equalsIgnoreCase("sg")) {
    
                onEnable();
                player.setHealth(20);
                player.setFoodLevel(20);
                player.getPlayer()
                        .sendMessage(ChatColor.GREEN + "You have succesfully teleported to the survival games arena!");
            }
    
            return true;
        }
    }
     
Thread Status:
Not open for further replies.

Share This Page