mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
150 lines
4.2 KiB
Java
150 lines
4.2 KiB
Java
package com.hbm.items.tool;
|
|
|
|
import com.hbm.inventory.container.ContainerAmmoBag;
|
|
import com.hbm.inventory.gui.GUIAmmoBag;
|
|
import com.hbm.items.ModItems;
|
|
import com.hbm.main.MainRegistry;
|
|
import com.hbm.tileentity.IGUIProvider;
|
|
import com.hbm.util.ItemStackUtil;
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.inventory.Container;
|
|
import net.minecraft.inventory.IInventory;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.world.World;
|
|
|
|
public class ItemAmmoBag extends Item implements IGUIProvider {
|
|
|
|
public ItemAmmoBag() {
|
|
this.setMaxStackSize(1);
|
|
}
|
|
|
|
@Override
|
|
public int getMaxItemUseDuration(ItemStack stack) {
|
|
return 1;
|
|
}
|
|
|
|
@Override
|
|
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
|
|
if(!world.isRemote) player.openGui(MainRegistry.instance, 0, world, 0, 0, 0);
|
|
return stack;
|
|
}
|
|
|
|
@Override
|
|
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
return new ContainerAmmoBag(player.inventory, new InventoryAmmoBag(player.getHeldItem()));
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
return new GUIAmmoBag(player.inventory, new InventoryAmmoBag(player.getHeldItem()));
|
|
}
|
|
|
|
@Override
|
|
public boolean showDurabilityBar(ItemStack stack) {
|
|
if(this == ModItems.ammo_bag_infinite) return false;
|
|
return !stack.hasTagCompound() || getDurabilityForDisplay(stack) != 0;
|
|
}
|
|
|
|
@Override
|
|
public double getDurabilityForDisplay(ItemStack stack) {
|
|
if(!stack.hasTagCompound()) return 1D;
|
|
|
|
InventoryAmmoBag inv = new InventoryAmmoBag(stack);
|
|
int capacity = 0;
|
|
int bullets = 0;
|
|
for(int i = 0; i < inv.getSizeInventory(); i++) {
|
|
ItemStack slot = inv.getStackInSlot(i);
|
|
if(slot == null) {
|
|
capacity += 64;
|
|
} else {
|
|
capacity += slot.getMaxStackSize();
|
|
bullets += slot.stackSize;
|
|
}
|
|
}
|
|
return 1D - (double) bullets / (double) capacity;
|
|
}
|
|
|
|
public static class InventoryAmmoBag implements IInventory {
|
|
|
|
public final ItemStack box;
|
|
public ItemStack[] slots;
|
|
|
|
public InventoryAmmoBag(ItemStack bag) {
|
|
this.box = bag;
|
|
slots = new ItemStack[this.getSizeInventory()];
|
|
|
|
if(!bag.hasTagCompound())
|
|
bag.setTagCompound(new NBTTagCompound());
|
|
|
|
ItemStack[] fromNBT = ItemStackUtil.readStacksFromNBT(bag, slots.length);
|
|
|
|
if(fromNBT != null) {
|
|
for(int i = 0; i < slots.length; i++) {
|
|
slots[i] = fromNBT[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override public int getSizeInventory() { return 8; }
|
|
@Override public ItemStack getStackInSlot(int slot) { return slots[slot]; }
|
|
|
|
@Override
|
|
public ItemStack decrStackSize(int slot, int amount) {
|
|
ItemStack stack = getStackInSlot(slot);
|
|
if (stack != null) {
|
|
if (stack.stackSize > amount) {
|
|
stack = stack.splitStack(amount);
|
|
markDirty();
|
|
} else {
|
|
setInventorySlotContents(slot, null);
|
|
}
|
|
}
|
|
return stack;
|
|
}
|
|
|
|
@Override
|
|
public ItemStack getStackInSlotOnClosing(int slot) {
|
|
ItemStack stack = getStackInSlot(slot);
|
|
setInventorySlotContents(slot, null);
|
|
return stack;
|
|
}
|
|
|
|
@Override
|
|
public void setInventorySlotContents(int slot, ItemStack stack) {
|
|
|
|
if(stack != null) {
|
|
stack.stackSize = Math.min(stack.stackSize, this.getInventoryStackLimit());
|
|
}
|
|
|
|
slots[slot] = stack;
|
|
markDirty();
|
|
}
|
|
|
|
@Override public String getInventoryName() { return "container.ammoBag"; }
|
|
@Override public boolean hasCustomInventoryName() { return box.hasDisplayName(); }
|
|
@Override public int getInventoryStackLimit() { return 64; }
|
|
|
|
@Override
|
|
public void markDirty() {
|
|
for(int i = 0; i < getSizeInventory(); ++i) {
|
|
if(getStackInSlot(i) != null && getStackInSlot(i).stackSize == 0) {
|
|
slots[i] = null;
|
|
}
|
|
}
|
|
|
|
ItemStackUtil.addStacksToNBT(box, slots);
|
|
}
|
|
|
|
@Override public boolean isUseableByPlayer(EntityPlayer player) { return true; }
|
|
@Override public void openInventory() { }
|
|
@Override public void closeInventory() { }
|
|
@Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return !stack.hasTagCompound(); }
|
|
}
|
|
}
|