package openblocks.common.item;
import com.google.common.base.Strings;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.IFluidContainerItem;
import openblocks.OpenBlocks;
import openblocks.common.tileentity.TileEntityTank;
import openmods.item.ItemOpenBlock;
import openmods.utils.ItemUtils;
public class ItemTankBlock extends ItemOpenBlock implements IFluidContainerItem {
public static final String TANK_TAG = "tank";
public ItemTankBlock(Block block) {
super(block);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) {
FluidTank fakeTank = readTank(stack);
FluidStack fluidStack = fakeTank.getFluid();
if (fluidStack != null && fluidStack.amount > 0) {
float percent = Math.max(100.0f / fakeTank.getCapacity() * fluidStack.amount, 1);
list.add(String.format("%d mB (%.0f%%)", fluidStack.amount, percent));
}
}
@Override
public String getItemStackDisplayName(ItemStack stack) {
final FluidTank fakeTank = readTank(stack);
final FluidStack fluidStack = fakeTank.getFluid();
final String unlocalizedName = getUnlocalizedName();
if (fluidStack != null && fluidStack.amount > 0) {
final String fluidName = getFluidName(fluidStack);
return StatCollector.translateToLocalFormatted(unlocalizedName + ".filled.name", fluidName);
}
return super.getItemStackDisplayName(stack);
}
private static String getFluidName(FluidStack fluidStack) {
final Fluid fluid = fluidStack.getFluid();
String localizedName = fluid.getLocalizedName(fluidStack);
if (!Strings.isNullOrEmpty(localizedName) && !localizedName.equals(fluid.getUnlocalizedName())) {
return fluid.getRarity(fluidStack).rarityColor.toString() + localizedName;
} else {
return EnumChatFormatting.OBFUSCATED + "LOLNOPE" + EnumChatFormatting.RESET;
}
}
public static ItemStack createFilledTank(Fluid fluid) {
final int tankCapacity = TileEntityTank.getTankCapacity();
FluidStack stack = FluidRegistry.getFluidStack(fluid.getName(), tankCapacity);
if (stack == null) return null;
FluidTank tank = new FluidTank(tankCapacity);
tank.setFluid(stack);
ItemStack item = new ItemStack(OpenBlocks.Blocks.tank);
saveTank(item, tank);
return item;
}
private static FluidTank readTank(ItemStack stack) {
FluidTank tank = new FluidTank(TileEntityTank.getTankCapacity());
final NBTTagCompound itemTag = stack.getTagCompound();
if (itemTag != null && itemTag.hasKey(TANK_TAG)) {
tank.readFromNBT(itemTag.getCompoundTag(TANK_TAG));
return tank;
}
return tank;
}
private static void saveTank(ItemStack container, FluidTank tank) {
if (tank.getFluidAmount() > 0) {
NBTTagCompound itemTag = ItemUtils.getItemTag(container);
NBTTagCompound tankTag = new NBTTagCompound();
tank.writeToNBT(tankTag);
itemTag.setTag(TANK_TAG, tankTag);
} else {
container.stackTagCompound = null;
}
}
@Override
public FluidStack getFluid(ItemStack container) {
FluidTank tank = readTank(container);
if (tank == null) return null;
FluidStack result = tank.getFluid();
if (result != null) result.amount *= container.stackSize;
return result;
}
@Override
public int getCapacity(ItemStack container) {
FluidTank tank = readTank(container);
return tank != null? tank.getCapacity() * container.stackSize : 0;
}
@Override
public int fill(ItemStack container, FluidStack resource, boolean doFill) {
if (resource == null) return 0;
FluidTank tank = readTank(container);
if (tank == null) return 0;
final int count = container.stackSize;
if (count == 0) return 0;
final int amountPerTank = resource.amount / count;
if (amountPerTank == 0) return 0;
FluidStack resourcePerTank = resource.copy();
resourcePerTank.amount = amountPerTank;
int filledPerTank = tank.fill(resourcePerTank, doFill);
if (doFill) saveTank(container, tank);
return filledPerTank * count;
}
@Override
public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) {
if (maxDrain <= 0) return null;
FluidTank tank = readTank(container);
if (tank == null) return null;
final int count = container.stackSize;
if (count == 0) return null;
final int amountPerTank = maxDrain / count;
if (amountPerTank == 0) return null;
FluidStack drained = tank.drain(amountPerTank, doDrain);
if (doDrain) saveTank(container, tank);
if (drained != null) drained.amount *= count;
return drained;
}
}