blob: e0a25564096562740d791190ac33b4c423bc34ed [file] [log] [blame] [raw]
package mekanism.common.network;
import java.util.Collection;
import java.util.HashSet;
import mekanism.api.Coord4D;
import mekanism.common.base.EnergyAcceptorWrapper;
import mekanism.api.gas.Gas;
import mekanism.api.gas.GasNetwork;
import mekanism.api.gas.GasRegistry;
import mekanism.api.gas.GasStack;
import mekanism.api.gas.IGasHandler;
import mekanism.api.transmitters.DynamicNetwork;
import mekanism.api.transmitters.IGridTransmitter;
import mekanism.api.transmitters.ITransmitterTile;
import mekanism.api.transmitters.TransmissionType;
import mekanism.common.EnergyNetwork;
import mekanism.common.FluidNetwork;
import mekanism.common.PacketHandler;
import mekanism.common.network.PacketTransmitterUpdate.TransmitterUpdateMessage;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
public class PacketTransmitterUpdate implements IMessageHandler<TransmitterUpdateMessage, IMessage>
{
@Override
public IMessage onMessage(TransmitterUpdateMessage message, MessageContext context)
{
EntityPlayer player = PacketHandler.getPlayer(context);
if(message.packetType == PacketType.UPDATE)
{
TileEntity tileEntity = message.coord4D.getTileEntity(player.worldObj);
if(tileEntity instanceof ITransmitterTile)
{
IGridTransmitter transmitter = ((ITransmitterTile)tileEntity).getTransmitter();
DynamicNetwork network = transmitter.hasTransmitterNetwork() && !message.newNetwork ? transmitter.getTransmitterNetwork() : transmitter.createEmptyNetwork();
network.register();
transmitter.setTransmitterNetwork(network);
for(Coord4D coord : message.transmitterCoords)
{
TileEntity tile = coord.getTileEntity(player.worldObj);
if(tile instanceof ITransmitterTile)
{
((ITransmitterTile)tile).getTransmitter().setTransmitterNetwork(network);
}
}
network.updateCapacity();
}
}
else if(message.packetType == PacketType.ENERGY)
{
TileEntity tileEntity = message.coord4D.getTileEntity(player.worldObj);
if(tileEntity instanceof ITransmitterTile)
{
IGridTransmitter transmitter = ((ITransmitterTile)tileEntity).getTransmitter();
if(transmitter.hasTransmitterNetwork() && transmitter.getTransmissionType() == TransmissionType.ENERGY)
{
((IGridTransmitter<EnergyAcceptorWrapper, EnergyNetwork>)transmitter).getTransmitterNetwork().clientEnergyScale = message.power;
}
}
}
else if(message.packetType == PacketType.GAS)
{
TileEntity tileEntity = message.coord4D.getTileEntity(player.worldObj);
if(tileEntity instanceof ITransmitterTile)
{
IGridTransmitter transmitter = ((ITransmitterTile)tileEntity).getTransmitter();
if(transmitter.hasTransmitterNetwork() && transmitter.getTransmissionType() == TransmissionType.GAS)
{
GasNetwork net = ((IGridTransmitter<IGasHandler, GasNetwork>)transmitter).getTransmitterNetwork();
if(message.gasType != null)
{
net.refGas = message.gasType;
}
net.buffer = message.gasStack;
net.didTransfer = message.didGasTransfer;
}
}
}
else if(message.packetType == PacketType.FLUID)
{
TileEntity tileEntity = message.coord4D.getTileEntity(player.worldObj);
if(tileEntity instanceof ITransmitterTile)
{
IGridTransmitter transmitter = ((ITransmitterTile)tileEntity).getTransmitter();
if(transmitter.hasTransmitterNetwork() && ((ITransmitterTile)tileEntity).getTransmitter().getTransmissionType() == TransmissionType.FLUID)
{
FluidNetwork net = ((IGridTransmitter<IFluidHandler, FluidNetwork>)transmitter).getTransmitterNetwork();
if(message.fluidType != null)
{
net.refFluid = message.fluidType;
}
net.buffer = message.fluidStack;
net.didTransfer = message.didFluidTransfer;
}
}
}
return null;
}
public static class TransmitterUpdateMessage implements IMessage
{
public PacketType packetType;
public Coord4D coord4D;
public double power;
public GasStack gasStack;
public Gas gasType;
public boolean didGasTransfer;
public FluidStack fluidStack;
public Fluid fluidType;
public float fluidScale;
public boolean didFluidTransfer;
public int amount;
public boolean newNetwork;
public Collection<IGridTransmitter> transmittersAdded;
public Collection<Coord4D> transmitterCoords;
public TransmitterUpdateMessage() {}
public TransmitterUpdateMessage(PacketType type, Coord4D coord, Object... data)
{
packetType = type;
coord4D = coord;
switch(packetType)
{
case UPDATE:
newNetwork = (Boolean)data[0];
transmittersAdded = (Collection<IGridTransmitter>)data[1];
break;
case ENERGY:
power = (Double)data[0];
break;
case GAS:
gasStack = (GasStack)data[0];
didGasTransfer = (Boolean)data[1];
break;
case FLUID:
fluidStack = (FluidStack)data[0];
didFluidTransfer = (Boolean)data[1];
break;
default:
break;
}
}
@Override
public void toBytes(ByteBuf dataStream)
{
dataStream.writeInt(packetType.ordinal());
dataStream.writeInt(coord4D.xCoord);
dataStream.writeInt(coord4D.yCoord);
dataStream.writeInt(coord4D.zCoord);
dataStream.writeInt(coord4D.dimensionId);
PacketHandler.log("Sending '" + packetType + "' update message from coordinate " + coord4D);
switch(packetType)
{
case UPDATE:
dataStream.writeBoolean(newNetwork);
dataStream.writeInt(transmittersAdded.size());
for(IGridTransmitter transmitter : transmittersAdded)
{
transmitter.coord().write(dataStream);
}
break;
case ENERGY:
dataStream.writeDouble(power);
break;
case GAS:
dataStream.writeInt(gasStack != null ? gasStack.getGas().getID() : -1);
dataStream.writeInt(gasStack != null ? gasStack.amount : 0);
dataStream.writeBoolean(didGasTransfer);
break;
case FLUID:
dataStream.writeInt(fluidStack != null ? fluidStack.getFluid().getID() : -1);
dataStream.writeInt(fluidStack != null ? fluidStack.amount : 0);
dataStream.writeBoolean(didFluidTransfer);
break;
default:
break;
}
}
@Override
public void fromBytes(ByteBuf dataStream)
{
packetType = PacketType.values()[dataStream.readInt()];
coord4D = new Coord4D(dataStream.readInt(), dataStream.readInt(), dataStream.readInt(), dataStream.readInt());
if(packetType == PacketType.UPDATE)
{
newNetwork = dataStream.readBoolean();
transmitterCoords = new HashSet<>();
int numTransmitters = dataStream.readInt();
for(int i = 0; i < numTransmitters; i++)
{
transmitterCoords.add(Coord4D.read(dataStream));
}
}
else if(packetType == PacketType.ENERGY)
{
power = dataStream.readDouble();
}
else if(packetType == PacketType.GAS)
{
gasType = GasRegistry.getGas(dataStream.readInt());
amount = dataStream.readInt();
didGasTransfer = dataStream.readBoolean();
if(gasType != null)
{
gasStack = new GasStack(gasType, amount);
}
}
else if(packetType == PacketType.FLUID)
{
int type = dataStream.readInt();
fluidType = type != -1 ? FluidRegistry.getFluid(type) : null;
amount = dataStream.readInt();
didFluidTransfer = dataStream.readBoolean();
if(fluidType != null)
{
fluidStack = new FluidStack(fluidType, amount);
}
}
}
}
public static enum PacketType
{
UPDATE,
ENERGY,
GAS,
FLUID
}
}