| 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 |
| } |
| } |