mirror of
https://github.com/GTNewHorizons/bdlib.git
synced 2026-11-12 08:17:37 +00:00
Added InventoryProxy and MultipleInventoryAdapter
This commit is contained in:
1 parent
610be18c74
commit
b015636514
2 files changed
+92
No files matched your search
@@ -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)
|
||||
}
|
||||
@@ -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 = ""
|
||||
}
|
||||
Reference in new issue
Block a user