Keep Items on death?

Discussion in 'Plugin Development' started by Mathias Eklund, Jul 14, 2013.

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

    Mathias Eklund

    Hey, I've been trying to make it so that if a player has a certain permission he wont loose his items when he dies, but everything i try fails.

    Anyone knows how to do this? Will be greatly appreciated

    Code i last tried with did not work. V
    Code:
    package me.dojmgubben.hammerfall;
     
    import java.util.HashMap;
     
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerRespawnEvent;
    import org.bukkit.inventory.ItemStack;
     
    public class DeathListener implements Listener {
       
        public HashMap<Player , ItemStack[]> items = new HashMap<Player , ItemStack[]>();
         
        @EventHandler()
        public void onRespawn(PlayerRespawnEvent event){
            if(items.containsKey(event.getPlayer())){
                event.getPlayer().getInventory().clear();
                for(ItemStack stack : items.get(event.getPlayer())){
                    event.getPlayer().getInventory().addItem(stack);
                }
             
                items.remove(event.getPlayer());
            }
        }
     
        @EventHandler()
        public void onDeath(PlayerDeathEvent event){
            ItemStack[] content = event.getEntity().getInventory().getContents();
            items.put(event.getEntity(), content);
            event.getEntity().getInventory().clear();
        }
    }
    
     
  2. Offline

    pope_on_dope

    you need to save the armor contents too if i'm not mistaken

    also don't store a player object when using hash maps, use event.getEntity().getName() to save them for strings.
     
  3. Offline

    Mathias Eklund

    Well, this i have now is not working... so I'm not gonna add more, But if you can type up a working way to save inventorys, please do :)
     
  4. Offline

    pope_on_dope

    your saving inventories seems pretty spot on other than storing the player object, but to load inventories, here's an easier way:
    Code:
    event.getEntity().getInventory().setContents(content.get(p.getName()));
            p.getInventory().setArmorContents(armour.get(p.getName()));
            inventories.remove(p.getName());
            armor.remove(p.getName());
    notice my armor hash map as well because that needs to be stored like I said before

    and here's the correct way to be using hash maps in this instance;
    Code:
        public HashMap <String, ItemStack[]> inventories = new HashMap <String, ItemStack[]>();
        public HashMap <String, ItemStack[]> armour = new HashMap <String, ItemStack[]>();
    edit: you'll also need to add a check since not all players will have your granted permission to keep items
     
  5. Offline

    Mathias Eklund

    Can you post the whole code you got? My brain is on fire, it's 5 am and i can't think properly xd
     
  6. Offline

    BuckitWorker

    in each world do /gamerule keepInventory true- it will let u keep yr inventory! Hope that helped!
     
  7. Offline

    Mathias Eklund

    I need it permission based, read everything please!
     
  8. Offline

    shmkane

    PHP:
     public static HashMap<StringItemStack[]> inventoryContents = new HashMap<StringItemStack[]>();
        public static 
    HashMap<StringItemStack[]> inventoryArmorContents = new HashMap<StringItemStack[]>();
     
     
     
     
        public static 
    void saveInventory(Player player){
            
    System.out.println(player.getName() +" has attempted to save his Inventory.");
            
    inventoryContents.put(player.getName(), player.getInventory().getContents());
            
    inventoryArmorContents.put(player.getName(), player.getInventory().getArmorContents());
            
    player.getInventory().clear();
            
    player.getInventory().setHelmet(null);
            
    player.getInventory().setChestplate(null);
            
    player.getInventory().setLeggings(null);
            
    player.getInventory().setBoots(null);
            
    player.sendMessage(config.getString("Server.Name").replace("&""§") +"§aYour inventory was sucessfully Saved!");
            
    System.out.println(player.getName() +"'s Inventory was saved!");
        }
     
        public static 
    void restoreInventory(Player player){
            
    System.out.println(player.getName() +" has attempted to restore his Inventory.");
            if(
    inventoryContents.containsKey(player.getName())){
                
    player.sendMessage("§aYour inventory was sucessfully Restored!");
                
    player.getInventory().clear();
                
    player.getInventory().setContents(inventoryContents.get(player.getName()));
                
    player.getInventory().setArmorContents(inventoryArmorContents.get(player.getName()));
                
    System.out.println(player.getName() +"'s Inventory was Restored!");
            }else{
                
    player.sendMessage("You don't have saved items!");
                
    System.out.println(player.getName() +"Didn't have a saved Inventory!");
            }
        }
    Before they die, add saveInventory()
    when they respawn, add restoreInventory

    For permission based, when they respawn, simply check if they have a permission[if(p.hasPermission("Perm"))]
     
  9. Offline

    Mathias Eklund

    Thanks, i will try this :)

    Ok, i believe this will work, but in the event. I can't figure out what to type before saveInventory() and restoreInventory() nothing i think of works. Help me with this please?

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 3, 2016
Thread Status:
Not open for further replies.

Share This Page