package mekanism.common.network; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import mekanism.api.Coord4D; import mekanism.client.gui.GuiDigitalMiner; import mekanism.client.gui.GuiDigitalMinerConfig; import mekanism.client.gui.GuiMFilterSelect; import mekanism.client.gui.GuiMItemStackFilter; import mekanism.client.gui.GuiMMaterialFilter; import mekanism.client.gui.GuiMModIDFilter; import mekanism.client.gui.GuiMOreDictFilter; import mekanism.common.Mekanism; import mekanism.common.PacketHandler; import mekanism.common.inventory.container.ContainerDigitalMiner; import mekanism.common.inventory.container.ContainerFilter; import mekanism.common.inventory.container.ContainerNull; import mekanism.common.network.PacketDigitalMinerGui.DigitalMinerGuiMessage; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.tile.TileEntityContainerBlock; import mekanism.common.tile.TileEntityDigitalMiner; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class PacketDigitalMinerGui implements IMessageHandler<DigitalMinerGuiMessage, IMessage> { @Override public IMessage onMessage(DigitalMinerGuiMessage message, MessageContext context) { EntityPlayer player = PacketHandler.getPlayer(context); PacketHandler.handlePacket(new Runnable() { @Override public void run() { if(!player.worldObj.isRemote) { World worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(message.coord4D.dimensionId); if(worldServer != null && message.coord4D.getTileEntity(worldServer) instanceof TileEntityDigitalMiner) { DigitalMinerGuiMessage.openServerGui(message.packetType, message.guiType, worldServer, (EntityPlayerMP)player, message.coord4D, message.index); } } else { if(message.coord4D.getTileEntity(player.worldObj) instanceof TileEntityDigitalMiner) { try { if(message.packetType == MinerGuiPacket.CLIENT) { FMLCommonHandler.instance().showGuiScreen(DigitalMinerGuiMessage.getGui(message.packetType, message.guiType, player, player.worldObj, message.coord4D.getPos(), -1)); } else if(message.packetType == MinerGuiPacket.CLIENT_INDEX) { FMLCommonHandler.instance().showGuiScreen(DigitalMinerGuiMessage.getGui(message.packetType, message.guiType, player, player.worldObj, message.coord4D.getPos(), message.index)); } player.openContainer.windowId = message.windowId; } catch(Exception e) { e.printStackTrace(); } } } } }, player); return null; } public static class DigitalMinerGuiMessage implements IMessage { public Coord4D coord4D; public MinerGuiPacket packetType; public int guiType; public int windowId = -1; public int index = -1; public DigitalMinerGuiMessage() {} public DigitalMinerGuiMessage(MinerGuiPacket type, Coord4D coord, int guiID, int extra, int extra2) { packetType = type; coord4D = coord; guiType = guiID; if(packetType == MinerGuiPacket.CLIENT) { windowId = extra; } else if(packetType == MinerGuiPacket.SERVER_INDEX) { index = extra; } else if(packetType == MinerGuiPacket.CLIENT_INDEX) { windowId = extra; index = extra2; } } public static void openServerGui(MinerGuiPacket t, int guiType, World world, EntityPlayerMP playerMP, Coord4D obj, int i) { Container container = null; playerMP.closeContainer(); switch(guiType) { case 0: container = new ContainerNull(playerMP, (TileEntityContainerBlock)obj.getTileEntity(world)); break; case 4: container = new ContainerDigitalMiner(playerMP.inventory, (TileEntityDigitalMiner)obj.getTileEntity(world)); break; case 5: container = new ContainerNull(playerMP, (TileEntityContainerBlock)obj.getTileEntity(world)); break; // case 1: // case 2: // case 3: // case 6: default: container = new ContainerFilter(playerMP.inventory, (TileEntityContainerBlock)obj.getTileEntity(world)); break; } playerMP.getNextWindowId(); int window = playerMP.currentWindowId; if(t == MinerGuiPacket.SERVER) { Mekanism.packetHandler.sendTo(new DigitalMinerGuiMessage(MinerGuiPacket.CLIENT, obj, guiType, window, 0), playerMP); } else if(t == MinerGuiPacket.SERVER_INDEX) { Mekanism.packetHandler.sendTo(new DigitalMinerGuiMessage(MinerGuiPacket.CLIENT_INDEX, obj, guiType, window, i), playerMP); } playerMP.openContainer = container; playerMP.openContainer.windowId = window; playerMP.openContainer.addListener(playerMP); if(guiType == 0) { TileEntityDigitalMiner tile = (TileEntityDigitalMiner)obj.getTileEntity(world); for(EntityPlayer player : tile.playersUsing) { Mekanism.packetHandler.sendTo(new TileEntityMessage(obj, tile.getFilterPacket(new ArrayList())), (EntityPlayerMP)player); } } } @SideOnly(Side.CLIENT) public static GuiScreen getGui(MinerGuiPacket packetType, int type, EntityPlayer player, World world, BlockPos pos, int index) { if(type == 0) { return new GuiDigitalMinerConfig(player, (TileEntityDigitalMiner)world.getTileEntity(pos)); } else if(type == 4) { return new GuiDigitalMiner(player.inventory, (TileEntityDigitalMiner)world.getTileEntity(pos)); } else if(type == 5) { return new GuiMFilterSelect(player, (TileEntityDigitalMiner)world.getTileEntity(pos)); } else { if(packetType == MinerGuiPacket.CLIENT) { if(type == 1) { return new GuiMItemStackFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos)); } else if(type == 2) { return new GuiMOreDictFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos)); } else if(type == 3) { return new GuiMMaterialFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos)); } else if(type == 6) { return new GuiMModIDFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos)); } } else if(packetType == MinerGuiPacket.CLIENT_INDEX) { if(type == 1) { return new GuiMItemStackFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos), index); } else if(type == 2) { return new GuiMOreDictFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos), index); } else if(type == 3) { return new GuiMMaterialFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos), index); } else if(type == 6) { return new GuiMModIDFilter(player, (TileEntityDigitalMiner)world.getTileEntity(pos), index); } } } return null; } @Override public void toBytes(ByteBuf dataStream) { dataStream.writeInt(packetType.ordinal()); coord4D.write(dataStream); dataStream.writeInt(guiType); if(packetType == MinerGuiPacket.CLIENT || packetType == MinerGuiPacket.CLIENT_INDEX) { dataStream.writeInt(windowId); } if(packetType == MinerGuiPacket.SERVER_INDEX || packetType == MinerGuiPacket.CLIENT_INDEX) { dataStream.writeInt(index); } } @Override public void fromBytes(ByteBuf dataStream) { packetType = MinerGuiPacket.values()[dataStream.readInt()]; coord4D = Coord4D.read(dataStream); guiType = dataStream.readInt(); if(packetType == MinerGuiPacket.CLIENT || packetType == MinerGuiPacket.CLIENT_INDEX) { windowId = dataStream.readInt(); } if(packetType == MinerGuiPacket.SERVER_INDEX || packetType == MinerGuiPacket.CLIENT_INDEX) { index = dataStream.readInt(); } } } public static enum MinerGuiPacket { SERVER, CLIENT, SERVER_INDEX, CLIENT_INDEX } }