/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.transport.network; import java.util.BitSet; import io.netty.buffer.ByteBuf; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.api.transport.IPipeTile; import buildcraft.core.lib.network.PacketCoordinates; import buildcraft.core.lib.utils.BitSetUtils; import buildcraft.core.network.PacketIds; import buildcraft.core.proxy.CoreProxy; import buildcraft.transport.Pipe; import buildcraft.transport.PipeTransportFluids; import buildcraft.transport.utils.FluidRenderData; public class PacketFluidUpdate extends PacketCoordinates { public FluidRenderData renderCache = new FluidRenderData(); public BitSet delta; private boolean largeFluidCapacity; public PacketFluidUpdate(int xCoord, int yCoord, int zCoord) { super(PacketIds.PIPE_LIQUID, xCoord, yCoord, zCoord); } public PacketFluidUpdate(int xCoord, int yCoord, int zCoord, boolean chunkPacket, boolean largeFluidCapacity) { super(PacketIds.PIPE_LIQUID, xCoord, yCoord, zCoord); this.isChunkDataPacket = chunkPacket; this.largeFluidCapacity = largeFluidCapacity; } public PacketFluidUpdate() { } @Override public void readData(ByteBuf data) { super.readData(data); World world = CoreProxy.proxy.getClientWorld(); if (!world.blockExists(posX, posY, posZ)) { return; } TileEntity entity = world.getTileEntity(posX, posY, posZ); if (!(entity instanceof IPipeTile)) { return; } IPipeTile pipeTile = (IPipeTile) entity; if (!(pipeTile.getPipe() instanceof Pipe)) { return; } Pipe<?> pipe = (Pipe<?>) pipeTile.getPipe(); if (!(pipe.transport instanceof PipeTransportFluids)) { return; } PipeTransportFluids transLiq = (PipeTransportFluids) pipe.transport; this.largeFluidCapacity = transLiq.getCapacity() > 255; renderCache = transLiq.renderCache; byte[] dBytes = new byte[1]; data.readBytes(dBytes); delta = BitSetUtils.fromByteArray(dBytes); if (delta.get(0)) { renderCache.fluidID = data.readShort(); renderCache.color = renderCache.fluidID != 0 ? data.readInt() : 0xFFFFFF; renderCache.flags = renderCache.fluidID != 0 ? data.readUnsignedByte() : 0; } for (ForgeDirection dir : ForgeDirection.values()) { if (delta.get(dir.ordinal() + 1)) { renderCache.amount[dir.ordinal()] = Math.min(transLiq.getCapacity(), largeFluidCapacity ? data.readUnsignedShort() : data.readUnsignedByte()); } } } @Override public void writeData(ByteBuf data) { super.writeData(data); byte[] dBytes = BitSetUtils.toByteArray(delta, 1); data.writeBytes(dBytes); if (delta.get(0)) { data.writeShort(renderCache.fluidID); if (renderCache.fluidID != 0) { data.writeInt(renderCache.color); data.writeByte(renderCache.flags); } } for (ForgeDirection dir : ForgeDirection.values()) { if (delta.get(dir.ordinal() + 1)) { if (largeFluidCapacity) { data.writeShort(renderCache.amount[dir.ordinal()]); } else { data.writeByte(renderCache.amount[dir.ordinal()]); } } } } @Override public int getID() { return PacketIds.PIPE_LIQUID; } }