package shedar.mods.ic2.nuclearcontrol.network.message;
import cpw.mods.fml.common.network.ByteBufUtils;
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 cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl;
import shedar.mods.ic2.nuclearcontrol.InventoryItem;
import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource;
import shedar.mods.ic2.nuclearcontrol.panel.CardWrapperImpl;
import shedar.mods.ic2.nuclearcontrol.utils.NCLog;
import shedar.mods.ic2.nuclearcontrol.utils.NuclearNetworkHelper;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class PacketClientRemoteMonitor implements IMessage {
private Map<String, Object> fields;
public static final int FIELD_DOUBLE = 1;
public static final int FIELD_INT = 2;
public static final int FIELD_STRING = 3;
public static final int FIELD_BOOLEAN = 4;
public static final int FIELD_TAG = 5;
public static final int FIELD_NULL = 6;
public static final int FIELD_LONG = 7;
public PacketClientRemoteMonitor() {
}
public PacketClientRemoteMonitor(Map<String, Object> updateSet) {
this.fields = updateSet;
}
@Override
public void fromBytes(ByteBuf buf) {
int fieldCount = buf.readShort();
fields = new HashMap<String, Object>();
for (int i = 0; i < fieldCount; i++) {
String name = ByteBufUtils.readUTF8String(buf);
byte type = buf.readByte();
switch (type) {
case NuclearNetworkHelper.FIELD_INT:
fields.put(name, buf.readInt());
break;
case NuclearNetworkHelper.FIELD_BOOLEAN:
fields.put(name, buf.readBoolean());
break;
case NuclearNetworkHelper.FIELD_LONG:
fields.put(name, buf.readLong());
break;
case NuclearNetworkHelper.FIELD_DOUBLE:
fields.put(name, buf.readDouble());
break;
case NuclearNetworkHelper.FIELD_STRING:
fields.put(name, ByteBufUtils.readUTF8String(buf));
break;
case NuclearNetworkHelper.FIELD_TAG:
NBTTagCompound tag;
try {
int size = buf.readInt();
DataInputStream dat = new DataInputStream(
new ByteArrayInputStream(Arrays.copyOfRange(
buf.array(), buf.readerIndex() + 1,
buf.readerIndex() + 1 + size)));
tag = CompressedStreamTools.readCompressed(dat);
fields.put(name, tag);
} catch (IOException e) {
e.printStackTrace();
}
break;
case NuclearNetworkHelper.FIELD_NULL:
fields.put(name, null);
break;
default:
IC2NuclearControl.logger.warn("Invalid field type: %d", type);
break;
}
}
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeShort(fields.size());
for (Map.Entry<String, Object> entry : fields.entrySet()) {
ByteBufUtils.writeUTF8String(buf, entry.getKey());
Object value = entry.getValue();
if (value instanceof Long) {
buf.writeByte(FIELD_LONG);
buf.writeLong((Long) value);
} else if (value instanceof Double) {
buf.writeByte(FIELD_DOUBLE);
buf.writeDouble((Double) value);
} else if (value instanceof Integer) {
buf.writeByte(FIELD_INT);
buf.writeInt((Integer) value);
} else if (value instanceof String) {
buf.writeByte(FIELD_STRING);
ByteBufUtils.writeUTF8String(buf, (String) value);
} else if (value instanceof Boolean) {
buf.writeByte(FIELD_BOOLEAN);
buf.writeBoolean((Boolean) value);
} else if (value instanceof NBTTagCompound) {
buf.writeByte(FIELD_TAG);
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
DataOutputStream output = new DataOutputStream(stream);
CompressedStreamTools.writeCompressed(
(NBTTagCompound) value, output);
buf.writeInt(stream.size());
buf.writeBytes(stream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
} else if (value == null) {
buf.writeByte(FIELD_NULL);
}
}
}
public static class Handler implements IMessageHandler<PacketClientRemoteMonitor, IMessage> {
@Override
@SideOnly(Side.CLIENT)
public IMessage onMessage(PacketClientRemoteMonitor message, MessageContext ctx) {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
if(player.getHeldItem() != null) {
if (player.getHeldItem().getItem() == IC2NuclearControl.itemRemoteMonitor) {
//ItemRemoteMonitor remote = (ItemRemoteMonitor) player.getHeldItem().getItem();
InventoryItem itemInv = new InventoryItem(player.getHeldItem());
//NCLog.fatal(itemInv.getStackInSlot(0));
if (itemInv.getStackInSlot(0) == null || !(itemInv.getStackInSlot(0).getItem() instanceof IPanelDataSource)) {
return null;
}
CardWrapperImpl helper = new CardWrapperImpl(itemInv.getStackInSlot(0), -1);
//NCLog.fatal("PACKET SIDE:" + message.fields.entrySet());
for (Map.Entry<String, Object> entry : message.fields.entrySet()) {
String name = entry.getKey();
Object value = entry.getValue();
if (value instanceof Long) {
helper.setLong(name, (Long) value);
} else if (value instanceof Double) {
//NCLog.fatal(name + " " + value);
helper.setDouble(name, (Double) value);
} else if (value instanceof Integer) {
helper.setInt(name, (Integer) value);
} else if (value instanceof String) {
helper.setString(name, (String) value);
} else if (value instanceof Boolean) {
helper.setBoolean(name, (Boolean) value);
} else if (value instanceof NBTTagCompound) {
helper.setTag(name, (NBTTagCompound) value);
} else if (value == null) {
helper.clearField(name);
}
}
//NCLog.fatal("CLIENT RECIEVE: " + ItemStackUtils.getTagCompound(itemInv.getStackInSlot(0)).getInteger("energyL"));
}
}
return null;
}
}
}