package crazypants.enderio.machine.tank;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import com.enderio.core.api.client.gui.IAdvancedTooltipProvider;
import com.enderio.core.client.handlers.SpecialTooltipHandler;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.ClientProxy;
import crazypants.enderio.EnderIO;
import crazypants.enderio.GuiHandler;
import crazypants.enderio.ModObject;
import crazypants.enderio.machine.AbstractMachineBlock;
import crazypants.enderio.machine.AbstractMachineEntity;
import crazypants.enderio.machine.power.PowerDisplayUtil;
import crazypants.enderio.network.PacketHandler;
public class BlockTank extends AbstractMachineBlock<TileTank> implements IAdvancedTooltipProvider {
public static BlockTank create() {
PacketHandler.INSTANCE.registerMessage(PacketTankFluid.class, PacketTankFluid.class, PacketHandler.nextID(), Side.CLIENT);
PacketHandler.INSTANCE.registerMessage(PacketTankVoidMode.class, PacketTankVoidMode.class, PacketHandler.nextID(), Side.SERVER);
BlockTank res = new BlockTank();
res.init();
return res;
}
protected BlockTank() {
super(ModObject.blockTank, TileTank.class);
setStepSound(Block.soundTypeGlass);
setLightOpacity(0);
}
@Override
protected void init() {
GameRegistry.registerBlock(this, BlockItemTank.class, modObject.unlocalisedName);
GameRegistry.registerTileEntity(teClass, modObject.unlocalisedName + "TileEntity");
EnderIO.guiHandler.registerGuiHandler(getGuiId(), this);
}
@Override
public int damageDropped(int par1) {
return par1;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs p_149666_2_, List list) {
list.add(new ItemStack(this, 1, 0));
list.add(new ItemStack(this, 1, 1));
}
@Override
public TileEntity createTileEntity(World world, int metadata) {
return new TileTank(metadata);
}
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileTank)) {
return null;
}
return new ContainerTank(player.inventory, (TileTank) te);
}
@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if(!(te instanceof TileTank)) {
return null;
}
return new GuiTank(player.inventory, (TileTank) te);
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
protected int getGuiId() {
return GuiHandler.GUI_ID_TANK;
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int blockSide) {
// used to render the block in the world
TileEntity te = world.getTileEntity(x, y, z);
int facing = 0;
if(te instanceof AbstractMachineEntity) {
AbstractMachineEntity me = (AbstractMachineEntity) te;
facing = me.facing;
}
int meta = world.getBlockMetadata(x, y, z);
meta = MathHelper.clamp_int(meta, 0, 1);
if(meta == 1) {
return iconBuffer[0][ClientProxy.sideAndFacingToSpriteOffset[blockSide][facing] + 6];
} else {
return iconBuffer[0][ClientProxy.sideAndFacingToSpriteOffset[blockSide][facing]];
}
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int blockSide, int blockMeta) {
int offset = MathHelper.clamp_int(blockMeta, 0, 1) == 0 ? 0 : 6;
return iconBuffer[0][blockSide + offset];
}
@Override
public int getLightValue(IBlockAccess world, int x, int y, int z) {
TileEntity tank = world.getTileEntity(x, y, z);
if(tank instanceof TileTank) {
FluidStack stack = ((TileTank) tank).tank.getFluid();
return stack == null || stack.amount <= 0 ? 0 : stack.getFluid().getLuminosity(stack);
}
return super.getLightValue(world, x, y, z);
}
@Override
protected String getMachineFrontIconKey(boolean pressurized) {
if(pressurized) {
return "enderio:blockTankAdvanced";
}
return "enderio:blockTank";
}
@Override
protected String getSideIconKey(boolean active) {
return getMachineFrontIconKey(active);
}
@Override
protected String getBackIconKey(boolean active) {
return getMachineFrontIconKey(active);
}
@Override
protected String getTopIconKey(boolean pressurized) {
if(pressurized) {
return "enderio:blockTankTopAdvanced";
}
return "enderio:machineTop";
}
@Override
@SideOnly(Side.CLIENT)
public void addCommonEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) {
}
@Override
public float getExplosionResistance(Entity par1Entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ) {
int meta = world.getBlockMetadata(x, y, z);
meta = MathHelper.clamp_int(meta, 0, 1);
if(meta == 1) {
return 2000;
} else {
return super.getExplosionResistance(par1Entity);
}
}
@Override
public boolean hasComparatorInputOverride() {
return true;
}
@Override
public int getComparatorInputOverride(World w, int x, int y, int z, int side) {
TileEntity te = w.getTileEntity(x, y, z);
if (te instanceof TileTank) {
return ((TileTank) te).getComparatorOutput();
}
return 0;
}
@Override
@SideOnly(Side.CLIENT)
public void addBasicEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) {
if(itemstack.stackTagCompound != null && itemstack.stackTagCompound.hasKey("tankContents")) {
FluidStack fl = FluidStack.loadFluidStackFromNBT((NBTTagCompound) itemstack.stackTagCompound.getTag("tankContents"));
if(fl != null && fl.getFluid() != null) {
String str = fl.amount + " " + EnderIO.lang.localize("fluid.millibucket.abr") + " " + PowerDisplayUtil.ofStr() + " " + fl.getFluid().getLocalizedName();
list.add(str);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public void addDetailedEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) {
SpecialTooltipHandler.addDetailedTooltipFromResources(list, itemstack);
if(itemstack.getItemDamage() == 1) {
list.add(EnumChatFormatting.ITALIC + EnderIO.lang.localize("blastResistant"));
}
}
@Override
public String getUnlocalizedNameForTooltip(ItemStack stack) {
System.out.println("BlockTank.getUnlocalizedNameForTooltip: ");
return stack.getUnlocalizedName();
}
@Override
public void getWailaInfo(List<String> tooltip, EntityPlayer player, World world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if (te instanceof TileTank) {
TileTank tank = (TileTank) te;
FluidStack stored = tank.tank.getFluid();
String fluid = stored == null ? EnderIO.lang.localize("tooltip.none") : stored.getFluid().getLocalizedName(stored);
int amount = stored == null ? 0 : stored.amount;
tooltip.add(String.format("%s%s : %s (%d %s)", EnumChatFormatting.WHITE, EnderIO.lang.localize("tooltip.fluidStored"), fluid, amount, EnderIO.lang.localize("fluid.millibucket.abr")));
}
}
}