package choonster.testmod3.network.capability.fluidhandler; import choonster.testmod3.network.capability.MessageUpdateContainerCapability; import io.netty.buffer.ByteBuf; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.fml.common.network.ByteBufUtils; import javax.annotation.Nullable; /** * Updates the {@link FluidTank} for a single slot of a {@link Container}. * * @author Choonster */ public class MessageUpdateContainerFluidTank extends MessageUpdateContainerCapability<IFluidHandlerItem, FluidTankInfo> { @SuppressWarnings("unused") public MessageUpdateContainerFluidTank() { super(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); } public MessageUpdateContainerFluidTank(final int windowID, final int slotNumber, final IFluidHandlerItem fluidHandlerItem) { super(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null, windowID, slotNumber, fluidHandlerItem); } /** * Convert the capability handler instance to a data instance. * * @param fluidHandlerItem The handler * @return The data instance */ @Nullable @Override protected FluidTankInfo convertCapabilityToData(final IFluidHandlerItem fluidHandlerItem) { if (fluidHandlerItem instanceof FluidTank) { return ((FluidTank) fluidHandlerItem).getInfo(); } else { return null; } } /** * Read the capability data from the buffer. * * @param buf The buffer * @return The data instance */ @Override protected FluidTankInfo readCapabilityData(final ByteBuf buf) { return readFluidTankInfo(buf); } /** * Write the capability data to the buffer. * * @param buf The buffer * @param fluidTankInfo The data instance */ @Override protected void writeCapabilityData(final ByteBuf buf, final FluidTankInfo fluidTankInfo) { writeFluidTankInfo(buf, fluidTankInfo); } /** * Read a {@link FluidTankInfo} from the buffer * * @param buf The buffer * @return The FluidTankInfo */ static FluidTankInfo readFluidTankInfo(final ByteBuf buf) { final NBTTagCompound tagCompound = ByteBufUtils.readTag(buf); final FluidStack contents = FluidStack.loadFluidStackFromNBT(tagCompound); final int capacity = buf.readInt(); return new FluidTankInfo(contents, capacity); } /** * Write a {@link FluidTankInfo} to the buffer * * @param buf The buffer * @param fluidTankInfo The FluidTankInfo */ static void writeFluidTankInfo(final ByteBuf buf, final FluidTankInfo fluidTankInfo) { final FluidStack contents = fluidTankInfo.fluid; final NBTTagCompound tagCompound = new NBTTagCompound(); if (contents != null) { contents.writeToNBT(tagCompound); } ByteBufUtils.writeTag(buf, tagCompound); buf.writeInt(fluidTankInfo.capacity); } public static class Handler extends MessageUpdateContainerCapability.Handler<IFluidHandlerItem, FluidTankInfo, MessageUpdateContainerFluidTank> { /** * Apply the capability data from the data instance to the capability handler instance. * * @param fluidHandlerItem The capability handler instance * @param fluidTankInfo The data */ @Override protected void applyCapabilityData(final IFluidHandlerItem fluidHandlerItem, final FluidTankInfo fluidTankInfo) { if (fluidHandlerItem instanceof FluidTank) { ((FluidTank) fluidHandlerItem).setFluid(fluidTankInfo.fluid); } } } }