package micdoodle8.mods.galacticraft.core.network; import io.netty.buffer.ByteBuf; import micdoodle8.mods.galacticraft.core.GalacticraftCore; import micdoodle8.mods.galacticraft.core.inventory.IInventorySettable; import micdoodle8.mods.galacticraft.core.util.GCCoreUtil; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import java.io.IOException; public class PacketDynamicInventory extends PacketBase { private int type; private Object[] data; private ItemStack[] stacks; public PacketDynamicInventory() { super(); } public PacketDynamicInventory(Entity entity) { super(GCCoreUtil.getDimensionID(entity.worldObj)); assert entity instanceof IInventory : "Entity does not implement " + IInventory.class.getSimpleName(); this.type = 0; this.data = new Object[] { entity.getEntityId() }; this.stacks = new ItemStack[((IInventory) entity).getSizeInventory()]; for (int i = 0; i < this.stacks.length; i++) { this.stacks[i] = ((IInventory) entity).getStackInSlot(i); } } public PacketDynamicInventory(TileEntity chest) { super(GCCoreUtil.getDimensionID(chest.getWorld())); assert chest instanceof IInventory : "Tile does not implement " + IInventory.class.getSimpleName(); this.type = 1; this.data = new Object[] { chest.getPos() }; this.stacks = new ItemStack[((IInventory) chest).getSizeInventory()]; for (int i = 0; i < this.stacks.length; i++) { this.stacks[i] = ((IInventory) chest).getStackInSlot(i); } } @Override public void encodeInto(ByteBuf buffer) { super.encodeInto(buffer); buffer.writeInt(this.type); switch (this.type) { case 0: buffer.writeInt((Integer) this.data[0]); break; case 1: buffer.writeInt(((BlockPos) this.data[0]).getX()); buffer.writeInt(((BlockPos) this.data[0]).getY()); buffer.writeInt(((BlockPos) this.data[0]).getZ()); break; } buffer.writeInt(this.stacks.length); for (int i = 0; i < this.stacks.length; i++) { try { NetworkUtil.writeItemStack(this.stacks[i], buffer); } catch (IOException e) { e.printStackTrace(); } } } @Override public void decodeInto(ByteBuf buffer) { super.decodeInto(buffer); this.type = buffer.readInt(); switch (this.type) { case 0: this.data = new Object[1]; this.data[0] = buffer.readInt(); break; case 1: this.data = new Object[3]; this.data[0] = new BlockPos(buffer.readInt(), buffer.readInt(), buffer.readInt()); break; } this.stacks = new ItemStack[buffer.readInt()]; for (int i = 0; i < this.stacks.length; i++) { try { this.stacks[i] = NetworkUtil.readItemStack(buffer); } catch (IOException e) { e.printStackTrace(); } } } @Override public void handleClientSide(EntityPlayer player) { if (player.worldObj == null) { return; } switch (this.type) { case 0: Entity entity = player.worldObj.getEntityByID((Integer) this.data[0]); if (entity instanceof IInventorySettable) { this.setInventoryStacks((IInventorySettable) entity); } break; case 1: TileEntity tile = player.worldObj.getTileEntity((BlockPos) this.data[0]); if (tile instanceof IInventorySettable) { this.setInventoryStacks((IInventorySettable) tile); } break; } } @Override public void handleServerSide(EntityPlayer player) { switch (this.type) { case 0: Entity entity = player.worldObj.getEntityByID((Integer) this.data[0]); if (entity instanceof IInventorySettable) { GalacticraftCore.packetPipeline.sendTo(new PacketDynamicInventory(entity), (EntityPlayerMP) player); } break; case 1: TileEntity tile = player.worldObj.getTileEntity((BlockPos) this.data[0]); if (tile instanceof IInventorySettable) { GalacticraftCore.packetPipeline.sendTo(new PacketDynamicInventory(tile), (EntityPlayerMP) player); } break; } } private void setInventoryStacks(IInventorySettable inv) { inv.setSizeInventory(this.stacks.length); for (int i = 0; i < this.stacks.length; i++) { inv.setInventorySlotContents(i, this.stacks[i]); } } }