diff --git a/src/net/bdew/lib/tile/inventory/InventoryProxy.scala b/src/net/bdew/lib/tile/inventory/InventoryProxy.scala new file mode 100644 index 0000000..7bf36db --- /dev/null +++ b/src/net/bdew/lib/tile/inventory/InventoryProxy.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) bdew, 2013 - 2014 + * https://github.com/bdew/bdlib + * + * This mod is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://bdew.net/minecraft-mod-public-license/ + */ + +package net.bdew.lib.tile.inventory + +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.inventory.IInventory +import net.minecraft.item.ItemStack +import net.minecraft.tileentity.TileEntity + +trait InventoryProxy extends TileEntity with IInventory { + def targetInventory: Option[IInventory] + + override def openInventory() = targetInventory map (_.openInventory()) + override def closeInventory() = targetInventory map (_.closeInventory()) + + override def markDirty() = { + targetInventory map (_.markDirty()) + super.markDirty() + } + + override def getSizeInventory = targetInventory map (_.getSizeInventory) getOrElse 0 + override def getInventoryStackLimit = targetInventory map (_.getInventoryStackLimit) getOrElse 64 + + override def getStackInSlot(slot: Int) = targetInventory.map(_.getStackInSlot(slot)).orNull + override def getStackInSlotOnClosing(slot: Int) = targetInventory.map(_.getStackInSlotOnClosing(slot)).orNull + override def setInventorySlotContents(slot: Int, item: ItemStack) = targetInventory.map(_.setInventorySlotContents(slot, item)) + override def decrStackSize(slot: Int, num: Int) = targetInventory.map(_.decrStackSize(slot, num)).orNull + + override def isItemValidForSlot(slot: Int, item: ItemStack) = targetInventory.exists(_.isItemValidForSlot(slot, item)) + override def isUseableByPlayer(player: EntityPlayer) = targetInventory.exists(_.isUseableByPlayer(player)) + + override def getInventoryName = targetInventory.map(_.getInventoryName).getOrElse("") + override def hasCustomInventoryName = targetInventory.exists(_.hasCustomInventoryName) +} diff --git a/src/net/bdew/lib/tile/inventory/MultipleInventoryAdapter.scala b/src/net/bdew/lib/tile/inventory/MultipleInventoryAdapter.scala new file mode 100644 index 0000000..bb21867 --- /dev/null +++ b/src/net/bdew/lib/tile/inventory/MultipleInventoryAdapter.scala @@ -0,0 +1,51 @@ +/* + * Copyright (c) bdew, 2013 - 2014 + * https://github.com/bdew/bdlib + * + * This mod is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://bdew.net/minecraft-mod-public-license/ + */ + +package net.bdew.lib.tile.inventory + +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.inventory.IInventory +import net.minecraft.item.ItemStack + +class MultipleInventoryAdapter(val map: Map[Int, (IInventory, Int)]) extends IInventory { + def this(inventories: Iterable[IInventory]) = + this((inventories map { inv => (0 until inv.getSizeInventory).map((inv, _))}).flatten.zipWithIndex.map(_.swap).toMap) + def this(inventories: IInventory*) = + this((inventories map { inv => (0 until inv.getSizeInventory).map((inv, _))}).flatten.zipWithIndex.map(_.swap).toMap) + + lazy val inventories = map.values.map(_._1).toSet + override lazy val getInventoryStackLimit = inventories.map(_.getInventoryStackLimit).min + override lazy val getSizeInventory = map.keySet.max + 1 + + private def run[T](slot: Int, f: (IInventory, Int) => T): Option[T] = + map.get(slot).map(f.tupled) + + override def decrStackSize(slot: Int, num: Int) = + run(slot, (i, s) => i.decrStackSize(s, num)).orNull + + override def isItemValidForSlot(slot: Int, item: ItemStack) = + run(slot, (i, s) => i.isItemValidForSlot(s, item)).getOrElse(false) + + override def getStackInSlotOnClosing(slot: Int) = + run(slot, (i, s) => i.getStackInSlotOnClosing(s)).orNull + + override def setInventorySlotContents(slot: Int, stack: ItemStack) = + run(slot, (i, s) => i.setInventorySlotContents(s, stack)) + + override def getStackInSlot(slot: Int) = + run(slot, (i, s) => i.getStackInSlot(s)).orNull + + override def markDirty() = inventories.foreach(_.markDirty()) + override def closeInventory() = inventories.foreach(_.closeInventory()) + override def openInventory() = inventories.foreach(_.openInventory()) + override def isUseableByPlayer(p: EntityPlayer) = inventories.exists(_.isUseableByPlayer(p)) + + override def hasCustomInventoryName = false + override def getInventoryName = "" +}