package choonster.testmod3.block; import choonster.testmod3.TestMod3; import choonster.testmod3.network.MessageFluidTankContents; import choonster.testmod3.tileentity.TileEntityFluidTank; import choonster.testmod3.util.CapabilityUtils; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidActionResult; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; /** * A Fluid Tank block. * * @author Choonster */ public class BlockFluidTank<TE extends TileEntityFluidTank> extends BlockTileEntity<TE> { public BlockFluidTank(final String blockName) { super(Material.GLASS, blockName, true); setSoundType(SoundType.GLASS); setHardness(0.3f); } @Override public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { final List<ItemStack> drops = new ArrayList<>(); final IFluidHandler fluidHandler = getFluidHandler(world, pos); if (fluidHandler != null) { final FluidActionResult fluidActionResult = FluidUtil.tryFillContainer(new ItemStack(this), fluidHandler, Integer.MAX_VALUE, null, true); if (fluidActionResult.isSuccess()) { drops.add(fluidActionResult.getResult()); } } return drops; } /** * Get the {@link IFluidHandler} from the {@link TileEntity} at the specified position. * * @param world The world * @param pos The position * @return The IFluidHandler */ @Nullable private IFluidHandler getFluidHandler(IBlockAccess world, BlockPos pos) { return CapabilityUtils.getCapability(getTileEntity(world, pos), CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null); } @Override public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) { final IFluidHandler fluidHandler = getFluidHandler(worldIn, pos); if (fluidHandler != null) { FluidUtil.tryEmptyContainer(stack, fluidHandler, Integer.MAX_VALUE, null, true); } } @Override public TileEntity createTileEntity(World world, IBlockState state) { return new TileEntityFluidTank(); } public static List<ITextComponent> getFluidDataForDisplay(IFluidTankProperties[] fluidTankProperties) { final List<ITextComponent> data = new ArrayList<>(); boolean hasFluid = false; for (final IFluidTankProperties properties : fluidTankProperties) { final FluidStack fluidStack = properties.getContents(); if (fluidStack != null && fluidStack.amount > 0) { hasFluid = true; data.add(new TextComponentTranslation("tile.testmod3:fluid_tank.fluid.desc", fluidStack.getLocalizedName(), fluidStack.amount, properties.getCapacity())); } } if (!hasFluid) { data.add(new TextComponentTranslation("tile.testmod3:fluid_tank.empty.desc")); } return data; } @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { final ItemStack heldItem = playerIn.getHeldItem(hand); final IFluidHandler fluidHandler = getFluidHandler(worldIn, pos); if (fluidHandler != null) { // Try fill/empty the held fluid container from the tank final boolean success = FluidUtil.interactWithFluidHandler(playerIn, hand, worldIn, pos, side); // If the contents changed or this is the off hand, send a chat message to the player if (!worldIn.isRemote && (success || hand == EnumHand.OFF_HAND)) { TestMod3.network.sendTo(new MessageFluidTankContents(fluidHandler.getTankProperties()), (EntityPlayerMP) playerIn); } // If the held item is a fluid container, stop processing here so it doesn't try to place its contents return heldItem.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); } return false; } @SuppressWarnings("deprecation") @Override public boolean isOpaqueCube(IBlockState state) { return false; } @SuppressWarnings("deprecation") @Override public boolean isFullCube(IBlockState state) { return false; } @SuppressWarnings("deprecation") @Override public boolean isFullyOpaque(IBlockState state) { return false; } @SuppressWarnings("deprecation") @SideOnly(Side.CLIENT) @Override public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { return true; } @SideOnly(Side.CLIENT) @Override public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT; } }