package mekanism.common.network; import io.netty.buffer.ByteBuf; import mekanism.api.Coord4D; import mekanism.common.Mekanism; import mekanism.common.PacketHandler; import mekanism.common.block.states.BlockStateMachine.MachineType; import mekanism.common.inventory.InventoryPersonalChest; import mekanism.common.network.PacketPersonalChest.PersonalChestMessage; import mekanism.common.tile.TileEntityPersonalChest; import mekanism.common.util.MekanismUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketPersonalChest implements IMessageHandler<PersonalChestMessage, IMessage> { @Override public IMessage onMessage(PersonalChestMessage message, MessageContext context) { EntityPlayer player = PacketHandler.getPlayer(context); PacketHandler.handlePacket(new Runnable() { @Override public void run() { if(message.packetType == PersonalChestPacketType.SERVER_OPEN) { try { if(message.isBlock) { TileEntityPersonalChest tileEntity = (TileEntityPersonalChest)message.coord4D.getTileEntity(player.worldObj); MekanismUtils.openPersonalChestGui((EntityPlayerMP)player, tileEntity, null, true); } else { ItemStack stack = player.getHeldItem(message.currentHand); if(MachineType.get(stack) == MachineType.PERSONAL_CHEST) { InventoryPersonalChest inventory = new InventoryPersonalChest(player, message.currentHand); MekanismUtils.openPersonalChestGui((EntityPlayerMP)player, null, inventory, false); } } } catch(Exception e) { Mekanism.logger.error("Error while handling electric chest open packet."); e.printStackTrace(); } } else if(message.packetType == PersonalChestPacketType.CLIENT_OPEN) { try { Mekanism.proxy.openPersonalChest(player, message.guiType, message.windowId, message.isBlock, message.coord4D == null ? BlockPos.ORIGIN : message.coord4D.getPos(), message.currentHand); } catch(Exception e) { Mekanism.logger.error("Error while handling electric chest open packet."); e.printStackTrace(); } } } }, player); return null; } public static class PersonalChestMessage implements IMessage { public PersonalChestPacketType packetType; public boolean isBlock; public int guiType; public int windowId; public Coord4D coord4D; public EnumHand currentHand; public PersonalChestMessage() {} //This is a really messy implementation... public PersonalChestMessage(PersonalChestPacketType type, boolean b1, int i1, int i2, Coord4D c1, EnumHand hand) { packetType = type; switch(packetType) { case CLIENT_OPEN: guiType = i1; windowId = i2; isBlock = b1; if(isBlock) { coord4D = c1; } else { currentHand = hand; } break; case SERVER_OPEN: isBlock = b1; if(isBlock) { coord4D = c1; } else { currentHand = hand; } break; } } @Override public void toBytes(ByteBuf dataStream) { dataStream.writeInt(packetType.ordinal()); switch(packetType) { case CLIENT_OPEN: dataStream.writeInt(guiType); dataStream.writeInt(windowId); dataStream.writeBoolean(isBlock); if(isBlock) { coord4D.write(dataStream); } else { dataStream.writeInt(currentHand.ordinal()); } break; case SERVER_OPEN: dataStream.writeBoolean(isBlock); if(isBlock) { coord4D.write(dataStream); } else { dataStream.writeInt(currentHand.ordinal()); } break; } } @Override public void fromBytes(ByteBuf dataStream) { packetType = PersonalChestPacketType.values()[dataStream.readInt()]; if(packetType == PersonalChestPacketType.SERVER_OPEN) { isBlock = dataStream.readBoolean(); if(isBlock) { coord4D = new Coord4D(dataStream.readInt(), dataStream.readInt(), dataStream.readInt(), dataStream.readInt()); } else { currentHand = EnumHand.values()[dataStream.readInt()]; } } else if(packetType == PersonalChestPacketType.CLIENT_OPEN) { guiType = dataStream.readInt(); windowId = dataStream.readInt(); isBlock = dataStream.readBoolean(); if(isBlock) { coord4D = new Coord4D(dataStream.readInt(), dataStream.readInt(), dataStream.readInt(), dataStream.readInt()); } else { currentHand = EnumHand.values()[dataStream.readInt()]; } } } } public static enum PersonalChestPacketType { CLIENT_OPEN, SERVER_OPEN } }