Package buildcraft.transport.network

Source Code of buildcraft.transport.network.PacketFluidUpdate

/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* 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 net.minecraftforge.fluids.FluidStack;
import buildcraft.core.network.PacketCoordinates;
import buildcraft.core.network.PacketIds;
import buildcraft.core.proxy.CoreProxy;
import buildcraft.core.utils.BitSetUtils;
import buildcraft.transport.PipeTransportFluids;
import buildcraft.transport.TileGenericPipe;

public class PacketFluidUpdate extends PacketCoordinates {

  public static int FLUID_ID_BIT = 0;
  public static int FLUID_AMOUNT_BIT = 1;
  public static int FLUID_DATA_NUM = 2;

  public FluidStack[] renderCache = new FluidStack[ForgeDirection.values().length];
  public int[] colorRenderCache = new int[ForgeDirection.values().length];
  public BitSet delta;

  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) {
    super(PacketIds.PIPE_LIQUID, xCoord, yCoord, zCoord);
    this.isChunkDataPacket = chunkPacket;
  }

  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 TileGenericPipe)) {
      return;
    }

    TileGenericPipe pipe = (TileGenericPipe) entity;
    if (pipe.pipe == null) {
      return;
    }

    if (!(pipe.pipe.transport instanceof PipeTransportFluids)) {
      return;
    }

    PipeTransportFluids transLiq = (PipeTransportFluids) pipe.pipe.transport;

    renderCache = transLiq.renderCache;
    colorRenderCache = transLiq.colorRenderCache;

    byte[] dBytes = new byte[2];
    data.readBytes(dBytes);
    delta = BitSetUtils.fromByteArray(dBytes);

    // System.out.printf("read %d, %d, %d = %s, %s%n", posX, posY, posZ, Arrays.toString(dBytes), delta);

    for (ForgeDirection dir : ForgeDirection.values()) {
      if (delta.get(dir.ordinal() * FLUID_DATA_NUM + FLUID_ID_BIT)) {
          int amt = renderCache[dir.ordinal()] != null ? renderCache[dir.ordinal()].amount : 0;
        renderCache[dir.ordinal()] = new FluidStack(data.readShort(), amt);
        colorRenderCache[dir.ordinal()] = data.readInt();
      }
      if (delta.get(dir.ordinal() * FLUID_DATA_NUM + FLUID_AMOUNT_BIT)) {
          if (renderCache[dir.ordinal()] == null) {
          renderCache[dir.ordinal()] = new FluidStack(0, 0);
          }
            renderCache[dir.ordinal()].amount = Math.min(transLiq.getCapacity(), data.readInt());
      }
    }
  }

  @Override
  public void writeData(ByteBuf data) {
    super.writeData(data);

    byte[] dBytes = BitSetUtils.toByteArray(delta, 2);
    // System.out.printf("write %d, %d, %d = %s, %s%n", posX, posY, posZ, Arrays.toString(dBytes), delta);
    data.writeBytes(dBytes);

    for (ForgeDirection dir : ForgeDirection.values()) {
      FluidStack liquid = renderCache[dir.ordinal()];

      if (delta.get(dir.ordinal() * FLUID_DATA_NUM + FLUID_ID_BIT)) {
        if (liquid != null) {
          data.writeShort(liquid.fluidID);
          data.writeInt(colorRenderCache[dir.ordinal()]);
        } else {
          data.writeShort(0);
          data.writeInt(0xFFFFFF);
        }
      }
      if (delta.get(dir.ordinal() * FLUID_DATA_NUM + FLUID_AMOUNT_BIT)) {
        if (liquid != null) {
          data.writeInt(liquid.amount);
        } else {
          data.writeInt(0);
        }
      }
    }
  }

  @Override
  public int getID() {
    return PacketIds.PIPE_LIQUID;
  }
}
TOP

Related Classes of buildcraft.transport.network.PacketFluidUpdate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.