package gr8pefish.ironbackpacks.capabilities.player; import gr8pefish.ironbackpacks.api.Constants; import gr8pefish.ironbackpacks.capabilities.IronBackpacksCapabilities; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import java.util.ArrayList; import java.util.concurrent.Callable; public class PlayerDeathBackpackCapabilities implements ICapabilitySerializable<NBTTagCompound> { public static final String CAP_DEATH_PACK_TAG = Constants.MODID + ".death"; private ArrayList<ItemStack> eternityPacks; private ItemStack equippedBackpack; public PlayerDeathBackpackCapabilities() { this.eternityPacks = new ArrayList<>(); this.equippedBackpack = null; } @Override public boolean hasCapability(Capability<?> capability, EnumFacing facing) { return IronBackpacksCapabilities.DEATH_BACKPACK_CAPABILITY != null && capability == IronBackpacksCapabilities.DEATH_BACKPACK_CAPABILITY; } @Override public <T> T getCapability(Capability<T> capability, EnumFacing facing) { return IronBackpacksCapabilities.DEATH_BACKPACK_CAPABILITY != null && capability == IronBackpacksCapabilities.DEATH_BACKPACK_CAPABILITY ? (T) this : null; } @Override public NBTTagCompound serializeNBT() { //make new list NBTTagList tagList = new NBTTagList(); //save the equipped pack NBTTagCompound equipped = new NBTTagCompound(); if (equippedBackpack != null) equippedBackpack.writeToNBT(equipped); else equipped.setBoolean("noEquipped", false); tagList.appendTag(equipped); //save all the eternity packs if (eternityPacks != null && eternityPacks.size() > 0) { for (ItemStack pack : eternityPacks) { NBTTagCompound saved = new NBTTagCompound(); pack.writeToNBT(saved); tagList.appendTag(saved); } } //save all to the tag NBTTagCompound compound = new NBTTagCompound(); compound.setTag(CAP_DEATH_PACK_TAG, tagList); //return compound return compound; } @Override public void deserializeNBT(NBTTagCompound compound) { NBTTagList tagList = compound.getTagList(CAP_DEATH_PACK_TAG, net.minecraftforge.common.util.Constants.NBT.TAG_COMPOUND); //get the equipped pack without crashing if (!tagList.getCompoundTagAt(0).hasKey("noEquipped")) { //if the key doesn't exist try { equippedBackpack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(0)); } catch (NullPointerException e) { //might as well keep this catch statement equippedBackpack = null; } } else { equippedBackpack = null; } //get all the eternity packs if (tagList.tagCount() >= 1) { for (int i = 1; i < tagList.tagCount(); i++) { if (tagList.getCompoundTagAt(i) != null) eternityPacks.add(ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i))); } } } // Not sure what this does honestly public static class Storage implements Capability.IStorage<PlayerDeathBackpackCapabilities> { @Override public NBTBase writeNBT(Capability<PlayerDeathBackpackCapabilities> capability, PlayerDeathBackpackCapabilities instance, EnumFacing side) { return null; //unused? } @Override public void readNBT(Capability<PlayerDeathBackpackCapabilities> capability, PlayerDeathBackpackCapabilities instance, EnumFacing side, NBTBase nbt) { //empty } } // Empty factory, just implemented here for ease of future expansion public static class Factory implements Callable<PlayerDeathBackpackCapabilities> { @Override public PlayerDeathBackpackCapabilities call() throws Exception { return null; } } //Getters and setters public ItemStack getEquippedBackpack() { return equippedBackpack; } public void setEquippedBackpack(ItemStack stack) { this.equippedBackpack = stack; } public ArrayList<ItemStack> getEternityBackpacks() { return eternityPacks; } public void setEternityBackpacks(ArrayList<ItemStack> packs) { this.eternityPacks = packs; } //Other helper methods public static void register() { CapabilityManager.INSTANCE.register(PlayerDeathBackpackCapabilities.class, new PlayerDeathBackpackCapabilities.Storage(), new PlayerDeathBackpackCapabilities.Factory()); } //Static methods public static ItemStack getEquippedBackpack(EntityLivingBase livingBase) { PlayerDeathBackpackCapabilities cap = IronBackpacksCapabilities.getDeathBackpackCapability((EntityPlayer) livingBase); if (cap != null) //can this ever be null? return cap.getEquippedBackpack(); else return null; } public static void setEquippedBackpack(EntityLivingBase livingBase, ItemStack stack) { PlayerDeathBackpackCapabilities cap = IronBackpacksCapabilities.getDeathBackpackCapability((EntityPlayer) livingBase); if (cap != null) cap.setEquippedBackpack(stack); } public static ArrayList<ItemStack> getEternityBackpacks(EntityLivingBase livingBase) { PlayerDeathBackpackCapabilities cap = IronBackpacksCapabilities.getDeathBackpackCapability((EntityPlayer) livingBase); if (cap != null) return cap.getEternityBackpacks(); else return null; } public static void setEternityBackpacks(EntityLivingBase livingBase, ArrayList<ItemStack> stacks) { PlayerDeathBackpackCapabilities cap = IronBackpacksCapabilities.getDeathBackpackCapability((EntityPlayer) livingBase); if (cap != null) cap.setEternityBackpacks(stacks); } public static void reset(EntityLivingBase livingBase) { setEquippedBackpack(livingBase, null); setEternityBackpacks(livingBase, new ArrayList<>()); //empty list } }