package appeng.core.sync.packets; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.io.IOException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.tileentity.TileEntity; import appeng.api.storage.data.IAEItemStack; import appeng.client.ClientHelper; import appeng.container.AEBaseContainer; import appeng.container.ContainerOpenContext; import appeng.container.implementations.ContainerCraftAmount; import appeng.core.sync.AppEngPacket; import appeng.core.sync.GuiBridge; import appeng.core.sync.network.INetworkInfo; import appeng.helpers.InventoryAction; import appeng.util.Platform; import appeng.util.item.AEItemStack; public class PacketInventoryAction extends AppEngPacket { final public InventoryAction action; final public int slot; final public IAEItemStack slotItem; // automatic. public PacketInventoryAction(ByteBuf stream) throws IOException { action = InventoryAction.values()[stream.readInt()]; slot = stream.readInt(); boolean hasItem = stream.readBoolean(); if ( hasItem ) slotItem = AEItemStack.loadItemStackFromPacket( stream ); else slotItem = null; } @Override public void serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player) { EntityPlayerMP sender = (EntityPlayerMP) player; if ( sender.openContainer instanceof AEBaseContainer ) { AEBaseContainer aebc = (AEBaseContainer) sender.openContainer; if ( action == InventoryAction.AUTOCRAFT ) { ContainerOpenContext context = aebc.openContext; if ( context != null ) { TileEntity te = context.w.getTileEntity( context.x, context.y, context.z ); Platform.openGUI( sender, te, aebc.openContext.side, GuiBridge.GUI_CRAFTING_AMOUNT ); if ( sender.openContainer instanceof ContainerCraftAmount ) { ContainerCraftAmount cca = (ContainerCraftAmount) sender.openContainer; if ( aebc.getTargetStack() != null ) cca.craftingItem.putStack( aebc.getTargetStack().getItemStack() ); cca.detectAndSendChanges(); } } } else { aebc.doAction( sender, action, slot ); } } } @Override public void clientPacketData(INetworkInfo network, AppEngPacket packet, EntityPlayer player) { if ( action == InventoryAction.UPDATE_HAND ) { if ( slotItem == null ) ClientHelper.proxy.getPlayers().get( 0 ).inventory.setItemStack( null ); else ClientHelper.proxy.getPlayers().get( 0 ).inventory.setItemStack( slotItem.getItemStack() ); } } // api public PacketInventoryAction(InventoryAction action, int slot, IAEItemStack slotItem) throws IOException { if ( Platform.isClient() && slotItem != null ) throw new RuntimeException( "invalid packet, client cannot post inv actions with stacks." ); this.action = action; this.slot = slot; this.slotItem = slotItem; ByteBuf data = Unpooled.buffer(); data.writeInt( getPacketID() ); data.writeInt( action.ordinal() ); data.writeInt( slot ); if ( slotItem == null ) data.writeBoolean( false ); else { data.writeBoolean( true ); slotItem.writeToPacket( data ); } configureWrite( data ); } }