Solved Need help with per player Inventories

Discussion in 'Plugin Development' started by paully104, Apr 28, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    paully104

    I've gone through the archives and I've read what tidbits of information I could find however I haven't found a viable solution. So my issue is that I am running a command /backpack and it will open an inventory that is only for that player. With my current code setup when Player A opens his backpack if Player B opens his he can see what Player A is doing. However if Player A closes the inventory and then Player B opens his inventory then everything is fine and dandy. So my questions is, is there a way to create an inventory per player, and how do you do it? My knowledge of java is all sorts of scattered so I could be missing something simplistic but I know java does not support dynamic variable names.

    tl;dr , need to make inventories per player and make sure they aren't shared.

    Here's my code:
    Code:
    package com.paulreitz.reitzrpg;
     
     
        import java.util.HashMap;
     
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event.Result;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryAction;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.event.inventory.InventoryCloseEvent;
    import org.bukkit.event.inventory.InventoryOpenEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
     
        public class PlayerBackPack implements Listener
    {       
            Reitzrpgmain plugin;
            Inventory backpackinstance;
       
            public PlayerBackPack(Reitzrpgmain instance) {
            plugin = instance;//tells us what the plugin is to use, in this case using the FileConfig!
            }
     
                public static Inventory PlayerBackPack = Bukkit.createInventory(null, 9, ChatColor.BOLD + "Your Backpack");
                // The first parameter, is the inventory owner. I make it null to let everyone use it.
                //The second parameter, is the slots in a inventory. Must be a multiple of 9. Can be up to 54.
                //The third parameter, is the inventory name. This will accept chat colors
                   
                static {
     
     
                      }
           
                @EventHandler(priority = EventPriority.LOWEST)
                public void onInventoryClick(InventoryClickEvent event)
                {
               
                    Player player = (Player) event.getWhoClicked(); // The player that clicked the item
                    ItemStack clicked = event.getCurrentItem(); // The item that was clicked
                    Inventory inventory = event.getInventory(); // The inventory that was clicked in
                    if (inventory.getName().equals(PlayerBackPack.getName()))
                    {
                   
                    }
                }
                @EventHandler(priority = EventPriority.LOWEST)
                public void onInventoryClose(InventoryCloseEvent event)
                {
                    String player = event.getPlayer().getName();
                    PlayerData pd = new PlayerData(player);
                    Inventory inventory = event.getInventory();
                    if (inventory.getName().equals(PlayerBackPack.getName()))
                            {
     
                           
                           
                           
                                String cheststuff = InventoryStringDeSerializer.InventoryToString(inventory);
                                pd.getData().set("BackPack", cheststuff);
                                pd.save();
                           
                           
                            }
               
               
                }
                @EventHandler(priority = EventPriority.LOWEST)
                public void onInventoryOpen(InventoryOpenEvent event)
                {
                    Inventory inventory = event.getInventory();
                    String player = event.getPlayer().getName();
                    PlayerData pd = new PlayerData(player);
                    if(inventory.getName().equals(PlayerBackPack.getName()))
     
     
     
                        if(pd.getData().getString("BackPack") != null)
                        {
                            //the player has successfully set their inventory once
                            Inventory i = InventoryStringDeSerializer.StringToInventory(pd.getData().getString("BackPack"));
                            //inventory.setContents(i.getContents());
                            inventory.setContents(i.getContents());
                       
                       
                        }
                        else //their first time setting their inventory or it is blank?
                        {
                            System.out.println("CLEAR INVENTORY IS RUNNING?");
                            System.out.println(pd.getData().getString("BackPack"));
                            inventory.clear();
                       
                        }
                       
                       
     
                   
     
                   
               
               
                }
       
           
    }   
    

    Thanks to nubebuster and peeps for helping heres the fixed code for those who see this in the future
    CLASS
    Code:
    package com.paulreitz.reitzrpg;
     
    import java.util.Arrays;
    import java.util.HashMap;
     
    import javax.xml.crypto.Data;
     
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.World;
    import org.bukkit.block.Block;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.enchantments.Enchantment;
    import org.bukkit.entity.Arrow;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.Item;
    import org.bukkit.entity.Monster;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityDeathEvent;
    import org.bukkit.event.entity.EntityShootBowEvent;
    import org.bukkit.event.entity.ProjectileHitEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerLoginEvent;
    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.Plugin;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scheduler.BukkitRunnable;
    import org.bukkit.util.Vector;
     
    public class Reitzrpgmain extends JavaPlugin implements Listener{
     
        public int player_experience, monster_experience;
        public int endtimer, timer = 0, startime, endtime, recasttime;
        HashMap<String, Integer> startofws = new HashMap<String, Integer>();
        HashMap<String, Integer> endofws = new HashMap<String, Integer>();
        HashMap<String, Integer> recastofws = new HashMap<String, Integer>();
        public static FileConfiguration config;
        private static Plugin plugin;
        public void onEnable()
        {
           
            plugin = this; //registers the plugin
            registerEvents(this, new PlayerJoinListener(),new EntityShootBowListener(),new OnProjectileHitListener(), new DistanceLevel(this),
            new OnPlayerUseListener(this),new InventoryClickEventListener(),new myCustomInventory(),new PlayerBackPack(this));
            getLogger().info("ReitzRPG is now enabled");
            PlayerData.setup(this);// calls to PlayerData and initializes the individual configurations
            getServer().getPluginManager().registerEvents(this, this);
            //startCountdown();
           
            config = getConfig();
            config.addDefault("World", "world");
            config.addDefault("Distance-To-MobDMG-Increase", 300);
            config.addDefault("Attack_Modifier", 10);
            config.addDefault("Defence_Modifier", 10);
            config.options().copyDefaults(true);
            saveConfig();
            CustomRecipes.CustomRecipes();
           
        }//end of onEnable
       
        public void onDisable()
        {
            plugin = null; //to stop memory leaks
            getLogger().info("ReitzRPG is now disabled");
        }   
        //listener stuff
        //Much eaisier then registering events in 10 diffirent methods
        public static void registerEvents(org.bukkit.plugin.Plugin plugin, Listener... listeners) {
        for (Listener listener : listeners) {
        Bukkit.getServer().getPluginManager().registerEvents(listener, plugin);
        }
        }
       
        //To access the plugin variable from other classes
        public static Plugin getPlugin() {
        return plugin;
        }       
       
        //start of command handler stuff
        public boolean onCommand(CommandSender sender, Command cmd, String label,
                String[] args)
        {//start of the command handler
            Player player = (Player) sender;
            String p = player.getDisplayName();
            PlayerData pd = new PlayerData(p);
            if(cmd.getName().equalsIgnoreCase("ReitzRPG"))
        {
                if(args.length == 0)
                {
                    player.sendMessage(ChatColor.BOLD +"Welcome to ReitzRPG!");
                    player.sendMessage(ChatColor.BOLD +"Please use /ReitzRPG Attack | /ReitzRPG Defence");
                    player.sendMessage(ChatColor.BOLD +"/ReitzRPG Range or /ReitzRPG EXP");
                    player.sendMessage(ChatColor.BOLD + "/ReitzRPG Purchase [Stat] to upgrade level");
                }   
                else if(args.length == 1)
                {
                    if(args[0].equalsIgnoreCase("Attack"))
                    {
                        //Where the /ReitzRPG Attack stuff happens
                        player.sendMessage(ChatColor.BOLD + "Your attack is level " +pd.getData().getInt("Attack"));
                        int attackupgradecost;
                        int currentlevel;
                        currentlevel = pd.getData().getInt("Attack");
                        attackupgradecost = 25 * currentlevel * 2;
                        player.sendMessage(ChatColor.BOLD + "Cost to upgrade your attack is: " + attackupgradecost);
                       
                    }   
                    else if(args[0].equalsIgnoreCase("Defence"))
                    {
                        //Where the /ReitzRPG Defence stuff happens
                        player.sendMessage(ChatColor.BOLD + "Your defence is level " +pd.getData().getInt("Defence"));
                        int attackupgradecost;
                        int currentlevel;
                        currentlevel = pd.getData().getInt("Defence");
                        attackupgradecost = 25 * currentlevel * 2;
                        player.sendMessage(ChatColor.BOLD + "Cost to upgrade your defence is: " + attackupgradecost);
                    }   
                    else if(args[0].equalsIgnoreCase("Range"))
                    {
                        player.sendMessage(ChatColor.BOLD + "Your range is level " +pd.getData().getInt("Archery"));
                        int attackupgradecost;
                        int currentlevel;
                        currentlevel = pd.getData().getInt("Archery");
                        attackupgradecost = 25 * currentlevel * 2;
                        player.sendMessage(ChatColor.BOLD + "Cost to upgrade your range is: " + attackupgradecost);
                       
                    }
                    else if(args[0].equalsIgnoreCase("EXP"))
                    {
                        player.sendMessage(ChatColor.BOLD + "Your EXP is at " +pd.getData().getInt("EXP"));
                       
                    }
                    else if(args[0].equalsIgnoreCase("Health"))
                    {
                        player.sendMessage(ChatColor.BOLD + "Your Health is " +pd.getData().getInt("Health"));
                       
                    }   
                    else if(args[0].equalsIgnoreCase("Magic"))
                    {
                        player.sendMessage(ChatColor.BOLD + "Your Magic is level " +pd.getData().getInt("Magic"));
                    }   
                    else if(args[0].equalsIgnoreCase("Tornado"))
                    {
                        if ( pd.getData().getInt("Magic") >= 5 )
                                {
                        Location location;
                        Vector vec = new Vector(2, 2, 2);
                        Block target = player.getTargetBlock(null, 100);
                        location = target.getLocation();
                        //Tornado.spawnTornado(plugin, location, material, data, direction, speed, amount_of_blocks, time, spew, explode);
                        Tornado.spawnTornado(this, location, Material.WEB, (byte) 0, new Vector(10,10,10), 0.1, 100, (long) 20*20 , false, false);
                                }
                        else
                        {
                            player.sendMessage("Your magic isnt powerful enough!");
                        }   
                    }
                    else if(args[0].equalsIgnoreCase("Setspawn"))
                    {
                        World world = player.getWorld();
                        Location loc = player.getLocation();
                        world.setSpawnLocation(loc.getBlockX(), loc.getBlockY() + 1, loc.getBlockZ());
                        player.sendMessage("You have successfully changed the world spawn!");
                       
                    }   
                    else if(args[0].equalsIgnoreCase("menu"))
                            {
                                player.openInventory(myCustomInventory.myInventory);
                       
                            }
                    else if(args[0].equalsIgnoreCase("backpack"))
                    {           
                       
                        Inventory PlayerBackPack = Bukkit.createInventory(player, 9,"Your Backpack");
                        System.out.println(PlayerBackPack.getName());
                        player.openInventory(PlayerBackPack);
               
                    }
                    else
                    {
                        //If they put in something that doesn't exist!
                        player.sendMessage(ChatColor.RED + "INVALID COMMAND");
                    }
                   
                   
                }   
                else if(args.length ==2)
                {
                    if(args[0].equalsIgnoreCase("Purchase"))
                    {   
                        if(args[1].equalsIgnoreCase("Attack"))
                        {
                            //they are purchasing attack power
                            int attackupgradecost;
                            int currentlevel;
                            int currentexp;
                            currentlevel = pd.getData().getInt("Attack");
                            currentexp = pd.getData().getInt("EXP");
                            attackupgradecost = 25 * currentlevel * 2;
                            if ( currentexp >= attackupgradecost)
                            {
                                player.sendMessage(ChatColor.BOLD + "You have succesfully upgraded your Attack skill");
                                pd.getData().set("Attack", pd.getData().getInt("Attack")+1);
                                pd.save();
                                currentlevel = pd.getData().getInt("Attack");
                                player.sendMessage(ChatColor.BOLD + "Your attack is level " +pd.getData().getInt("Attack"));
                                ScoreboardStuff.manageScoreboard(player, pd.getData().getString("Name"));//if they buy attack update scoreboard?
                                pd.getData().set("EXP", pd.getData().getInt("EXP")-currentexp);
                               
                            }
                            else
                            {
                               
                            }
                           
                        }   
                        else if(args[1].equalsIgnoreCase("Defence"))
                        {
                            //they are purchasing defence power
                            //they are purchasing attack power
                            int attackupgradecost;
                            int currentlevel;
                            int currentexp;
                            currentlevel = pd.getData().getInt("Defence");
                            currentexp = pd.getData().getInt("EXP");
                            attackupgradecost = 25 * currentlevel * 2;
                            if ( currentexp >= attackupgradecost)
                            {
                                player.sendMessage(ChatColor.BOLD + "You have succesfully upgraded your Defence skill");
                                pd.getData().set("Defence", pd.getData().getInt("Defence")+1);
                                pd.save();
                                currentlevel = pd.getData().getInt("Attack");
                                player.sendMessage(ChatColor.BOLD + "Your defence is level " +pd.getData().getInt("Defence"));
                                ScoreboardStuff.manageScoreboard(player, pd.getData().getString("Name"));
                                pd.getData().set("EXP", pd.getData().getInt("EXP")-currentexp);
                            }
                            else
                            {
                               
                            }   
                           
                           
                        }
                        else if(args[1].equalsIgnoreCase("Range"))
                        {
                            //they are purchasing range power
                            //they are purchasing attack power
                            int attackupgradecost;
                            int currentlevel;
                            int currentexp;
                            currentlevel = pd.getData().getInt("Archery");
                            currentexp = pd.getData().getInt("EXP");
                            attackupgradecost = 25 * currentlevel * 2;
                            if ( currentexp >= attackupgradecost)
                            {
                                player.sendMessage(ChatColor.BOLD + "You have succesfully upgraded your Range skill");
                                pd.getData().set("Archery", pd.getData().getInt("Archery")+1);
                                pd.save();
                                currentlevel = pd.getData().getInt("Arhery");
                                player.sendMessage(ChatColor.BOLD + "Your range is level " +pd.getData().getInt("Archery"));
                                ScoreboardStuff.manageScoreboard(player, pd.getData().getString("Name"));
                                pd.getData().set("EXP", pd.getData().getInt("EXP")-currentexp);
                            }   
                           
                        }
                        else if(args[1].equalsIgnoreCase("Health"))
                        {    int currentlevel;
                            int currentexp;
                            currentexp = pd.getData().getInt("EXP");
                            if (currentexp >= player.getMaxHealth() * 20)
                            {
                                player.sendMessage(ChatColor.BOLD + "You have succesfully upgraded Health");
                                pd.getData().set("Health", pd.getData().getDouble("Health")+.5);
                                pd.save();
                                currentlevel = pd.getData().getInt("Health");
                                player.sendMessage(ChatColor.BOLD + "Your Health is level " +pd.getData().getInt("Health"));
                                ScoreboardStuff.manageScoreboard(player, pd.getData().getString("Name"));
                                pd.getData().set("EXP", pd.getData().getInt("EXP")-currentexp);
                           
                            }
                            else
                            {
                                player.sendMessage(ChatColor.BOLD + "Not enough EXP to upgrade your health!");
                            }   
     
                           
                        }
                        else
                        {
                            player.sendMessage(ChatColor.RED + "INVALID COMMAND");
                        }   
                       
                       
                    }   
                   
                   
                   
                }   
               
               
        }//end of 1st command
            return false;
        }//end of onCommand handler   
       
    }//end of the program
    
    COMMAND HANDER:
    Code:
                    else if(args[0].equalsIgnoreCase("backpack"))
                    {           
                       
                        Inventory PlayerBackPack = Bukkit.createInventory(player, 9,"Your Backpack");
                        System.out.println(PlayerBackPack.getName());
                        player.openInventory(PlayerBackPack);
               
                    }
     
  2. Offline

    nubebuster

    try moving
    public static Inventory PlayerBackPack = Bukkit.createInventory(null, 9, ChatColor.BOLD + "Your Backpack");
    Inside onInventoryClick

    Where exactly are you opening the inventory?

    Try hitting ctrl + shift + f inside eclipse

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 7, 2016
    paully104 likes this.
  3. Offline

    xTigerRebornx

    paully104 How, and to whom is the inventory opened to? From what you've given, I only ever see one Inventory being used, which is:
    Code:
    public static Inventory PlayerBackPack = Bukkit.createInventory(null, 9, ChatColor.BOLD + "Your Backpack");
    Since you are only ever using one Inventory (from what we can see w/ the code provided), all the Players will only use one Inventory. You'd have to find some way of storing different Inventories per-player, such as a HashMap that is saved/loaded from a file, then it stores who owns it (by UUID) and its contents (Probably in an ItemStack[] or something similar)
     
  4. Offline

    paully104

    I'm opening their inventory from a command in my main, the issue is i'm having a logical error of how to create multiple inventories, one per each player.
     
  5. Offline

    nubebuster

    paully104 Move the inventory to the method witht the command, this will make a new inventory every time
     
    paully104 likes this.
  6. Offline

    paully104

    I deleted all my tinkering so how it stands now I do only have one inventory being created. I currently have the players inventories saved to my per player file config and I can retrieve it on command. I'm just brain dead trying to figure out on the bukkit.createInventory , how to make a inventory for each player. It will all come into place once I figure out how to make each inventory its own instance.


    Kk, still tinkering around a bit with what you said and I hit a snag. On my main I have
    Code:
                            }
                    else if(args[0].equalsIgnoreCase("backpack"))
                    {           
                       
                       
                        player.openInventory(PlayerBackPack);
               
                    }
    If i move the create inventory inside the EventHandler then i can't use that.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 7, 2016
  7. Offline

    xTigerRebornx

    paully104 Make a new Inventory for each Player, find a way of storing it (Metadata, HashMaps, etc), save every so often, load on startup/reload, persist the inventory through server stops.
     
  8. Offline

    BillyBobJoe168

    paully104
    Then just put all the items from the config into this inventory.
     
  9. Offline

    paully104

    Just a heads up I fixed it, thanks alot guys will post an update!
     
Thread Status:
Not open for further replies.

Share This Page