package micdoodle8.mods.galacticraft.core.network;
import com.google.common.collect.Sets;
import io.netty.buffer.ByteBuf;
import micdoodle8.mods.galacticraft.api.transmission.tile.IBufferTransmitter;
import micdoodle8.mods.galacticraft.core.fluid.FluidNetwork;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import java.util.Collection;
public class PacketFluidNetworkUpdate extends PacketBase
{
private PacketType type;
private BlockPos pos;
private FluidStack stack;
private Fluid fluidType;
private boolean didTransfer;
private boolean newNetwork;
private Collection<IBufferTransmitter<FluidStack>> transmittersAdded;
private Collection<BlockPos> transmittersCoords;
public PacketFluidNetworkUpdate()
{
}
public static PacketFluidNetworkUpdate getFluidUpdate(int dimensionID, BlockPos pos, FluidStack stack, boolean didTransfer)
{
return new PacketFluidNetworkUpdate(PacketType.FLUID, dimensionID, pos, stack, didTransfer);
}
public static PacketFluidNetworkUpdate getAddTransmitterUpdate(int dimensionID, BlockPos pos, boolean newNetwork, Collection<IBufferTransmitter<FluidStack>> transmittersAdded)
{
return new PacketFluidNetworkUpdate(PacketType.ADD_TRANSMITTER, dimensionID, pos, newNetwork, transmittersAdded);
}
private PacketFluidNetworkUpdate(PacketType type, int dimensionID, BlockPos pos, FluidStack stack, boolean didTransfer)
{
super(dimensionID);
this.type = type;
this.pos = pos;
this.stack = stack;
this.didTransfer = didTransfer;
}
private PacketFluidNetworkUpdate(PacketType type, int dimensionID, BlockPos pos, boolean newNetwork, Collection<IBufferTransmitter<FluidStack>> transmittersAdded)
{
super(dimensionID);
this.type = type;
this.pos = pos;
this.newNetwork = newNetwork;
this.transmittersAdded = transmittersAdded;
}
@Override
public void encodeInto(ByteBuf buffer)
{
super.encodeInto(buffer);
buffer.writeInt(this.pos.getX());
buffer.writeInt(this.pos.getY());
buffer.writeInt(this.pos.getZ());
buffer.writeInt(this.type.ordinal());
switch (this.type)
{
case ADD_TRANSMITTER:
buffer.writeBoolean(this.newNetwork);
buffer.writeInt(this.transmittersAdded.size());
for (IBufferTransmitter transmitter : this.transmittersAdded)
{
TileEntity tile = (TileEntity) transmitter;
buffer.writeInt(tile.getPos().getX());
buffer.writeInt(tile.getPos().getY());
buffer.writeInt(tile.getPos().getZ());
}
break;
case FLUID:
if (this.stack != null)
{
buffer.writeBoolean(true);
ByteBufUtils.writeUTF8String(buffer, FluidRegistry.getFluidName(this.stack));
buffer.writeInt(this.stack.amount);
}
else
{
buffer.writeBoolean(false);
}
buffer.writeBoolean(this.didTransfer);
break;
}
}
@Override
public void decodeInto(ByteBuf buffer)
{
super.decodeInto(buffer);
this.pos = new BlockPos(buffer.readInt(), buffer.readInt(), buffer.readInt());
this.type = PacketType.values()[buffer.readInt()];
switch (this.type)
{
case ADD_TRANSMITTER:
this.newNetwork = buffer.readBoolean();
this.transmittersCoords = Sets.newHashSet();
int transmitterCount = buffer.readInt();
for (int i = 0; i < transmitterCount; ++i)
{
this.transmittersCoords.add(new BlockPos(buffer.readInt(), buffer.readInt(), buffer.readInt()));
}
break;
case FLUID:
if (buffer.readBoolean())
{
this.fluidType = FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buffer));
if (this.fluidType != null)
{
this.stack = new FluidStack(this.fluidType, buffer.readInt());
}
}
else
{
this.fluidType = null;
this.stack = null;
}
this.didTransfer = buffer.readBoolean();
break;
}
}
@Override
public void handleClientSide(EntityPlayer player)
{
TileEntity tile = player.worldObj.getTileEntity(this.pos);
if (tile instanceof IBufferTransmitter)
{
IBufferTransmitter<FluidStack> transmitter = (IBufferTransmitter<FluidStack>) tile;
switch (this.type)
{
case ADD_TRANSMITTER:
{
FluidNetwork network = transmitter.hasNetwork() && !this.newNetwork ? (FluidNetwork) transmitter.getNetwork() : new FluidNetwork();
network.register();
transmitter.setNetwork(network);
for (BlockPos pos : this.transmittersCoords)
{
TileEntity transmitterTile = player.worldObj.getTileEntity(pos);
if (transmitterTile instanceof IBufferTransmitter)
{
((IBufferTransmitter) transmitterTile).setNetwork(network);
}
}
network.updateCapacity();
}
break;
case FLUID:
if (transmitter.getNetwork() != null)
{
FluidNetwork network = (FluidNetwork) transmitter.getNetwork();
if (this.fluidType != null)
{
network.refFluid = this.fluidType;
}
network.buffer = this.stack;
network.didTransfer = this.didTransfer;
}
break;
}
}
}
@Override
public void handleServerSide(EntityPlayer player)
{
}
public enum PacketType
{
ADD_TRANSMITTER,
FLUID,
}
}