diff --git a/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala b/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala index 0cd279c9b..8be2de463 100644 --- a/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala +++ b/src/main/scala/li/cil/oc/client/gui/DynamicGuiContainer.scala @@ -1,7 +1,7 @@ package li.cil.oc.client.gui import li.cil.oc.client.Textures -import li.cil.oc.common.Tier +import li.cil.oc.common import li.cil.oc.common.container.{ComponentSlot, Player} import li.cil.oc.util.RenderState import li.cil.oc.util.mods.NEI @@ -40,7 +40,7 @@ abstract class DynamicGuiContainer(container: Container) extends CustomGuiContai override def drawSlotInventory(slot: Slot) { slot match { - case component: ComponentSlot if component.tier == Tier.None => // Ignore. + case component: ComponentSlot if component.tier == common.Tier.None || component.slot == common.Slot.None => // Ignore. case _ => if (!isInPlayerInventory(slot)) { GL11.glDisable(GL11.GL_DEPTH_TEST) diff --git a/src/main/scala/li/cil/oc/common/Slot.scala b/src/main/scala/li/cil/oc/common/Slot.scala index 4ee0660c4..07922fb6a 100644 --- a/src/main/scala/li/cil/oc/common/Slot.scala +++ b/src/main/scala/li/cil/oc/common/Slot.scala @@ -1,5 +1,8 @@ package li.cil.oc.common +import li.cil.oc.api +import net.minecraft.item.ItemStack + object Slot { val None = "none" @@ -15,7 +18,7 @@ object Slot { val All = Array(Card, ComponentBus, Container, CPU, Floppy, HDD, Memory, Tool, Upgrade) - def fromApi(slotType: li.cil.oc.api.driver.Slot) = slotType match { + def apply(driver: api.driver.Item, stack: ItemStack, f: Option[ItemStack => api.driver.Slot] = scala.None) = f.getOrElse(driver.slot _)(stack) match { case li.cil.oc.api.driver.Slot.Card => Card case li.cil.oc.api.driver.Slot.Disk => Floppy case li.cil.oc.api.driver.Slot.HardDiskDrive => HDD @@ -24,6 +27,9 @@ object Slot { case li.cil.oc.api.driver.Slot.Tool => Tool case li.cil.oc.api.driver.Slot.Upgrade => Upgrade case li.cil.oc.api.driver.Slot.UpgradeContainer => Container - case _ => None + case _ => + val descriptor = api.Items.get(stack) + if (descriptor == api.Items.get("componentBus1") || descriptor == api.Items.get("componentBus2") || descriptor == api.Items.get("componentBus3")) ComponentBus + else None } } diff --git a/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala b/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala index f467308f6..7512bce61 100644 --- a/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala +++ b/src/main/scala/li/cil/oc/common/container/ComponentSlot.scala @@ -1,7 +1,7 @@ package li.cil.oc.common.container import cpw.mods.fml.relauncher.{Side, SideOnly} -import li.cil.oc.common.Tier +import li.cil.oc.common import net.minecraft.entity.player.EntityPlayer import net.minecraft.inventory.Slot import net.minecraft.item.ItemStack @@ -21,7 +21,7 @@ trait ComponentSlot extends Slot { // ----------------------------------------------------------------------- // @SideOnly(Side.CLIENT) - override def func_111238_b() = tier != Tier.None && super.func_111238_b() + override def func_111238_b() = slot != common.Slot.None && tier != common.Tier.None && super.func_111238_b() override def isItemValid(stack: ItemStack) = inventory.isItemValidForSlot(getSlotIndex, stack) diff --git a/src/main/scala/li/cil/oc/common/inventory/ServerInventory.scala b/src/main/scala/li/cil/oc/common/inventory/ServerInventory.scala index 6c18a8ece..8519b402c 100644 --- a/src/main/scala/li/cil/oc/common/inventory/ServerInventory.scala +++ b/src/main/scala/li/cil/oc/common/inventory/ServerInventory.scala @@ -1,6 +1,6 @@ package li.cil.oc.common.inventory -import li.cil.oc.api.{Driver, Items} +import li.cil.oc.api.Driver import li.cil.oc.common.{InventorySlots, Slot} import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack @@ -19,14 +19,6 @@ trait ServerInventory extends ItemStackInventory { override def isItemValidForSlot(slot: Int, stack: ItemStack) = Option(Driver.driverFor(stack)).fold(false)(driver => { val provided = InventorySlots.server(tier)(slot) - // TODO remove special code in 1.4 when slot type API changes. - val requiredSlot = Slot.fromApi(driver.slot(stack)) - val isComponentBus = provided.slot == Slot.ComponentBus && { - val descriptor = Items.get(stack) - descriptor == Items.get("componentBus1") || - descriptor == Items.get("componentBus2") || - descriptor == Items.get("componentBus3") - } - (requiredSlot == provided.slot || isComponentBus) && driver.tier(stack) <= provided.tier + Slot(driver, stack) == provided.slot && driver.tier(stack) <= provided.tier }) } diff --git a/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala b/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala index ee1445693..2ae1dc970 100644 --- a/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala +++ b/src/main/scala/li/cil/oc/common/template/AssemblerTemplates.scala @@ -60,17 +60,15 @@ object AssemblerTemplates { def validate(inventory: IInventory, slot: Int, stack: ItemStack) = validator match { case Some(method) => tryInvokeStatic(method, inventory, slot.underlying(), stack)(false) case _ => Option(api.Driver.driverFor(stack)) match { - case Some(driver) => validateInternal(stack, driver) && Slot.fromApi(driver.slot(stack)) == kind + case Some(driver) => Slot(driver, stack) == kind && driver.tier(stack) <= tier case _ => false } } - - protected def validateInternal(stack: ItemStack, driver: api.driver.Item) = driver.tier(stack) <= tier } private def parseSlot(kindOverride: Option[String] = None)(nbt: NBTTagCompound) = { val kind = kindOverride.getOrElse(if (nbt.hasKey("type")) nbt.getString("type") else Slot.None) - val tier = if (nbt.hasKey("tier")) nbt.getInteger("tier") else Tier.None + val tier = if (nbt.hasKey("tier")) nbt.getInteger("tier") else Tier.Any val validator = if (nbt.hasKey("validator")) Option(getStaticMethod(nbt.getString("validator"), classOf[ItemStack], classOf[Int], classOf[ItemStack])) else None new Slot(kind, tier, validator) } diff --git a/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala b/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala index 9622397b4..e0f3c07cf 100644 --- a/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala +++ b/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala @@ -251,7 +251,7 @@ object RobotTemplate { }) private def hasFileSystem(inventory: IInventory) = exists(inventory, stack => Option(api.Driver.driverFor(stack)) match { - case Some(driver) => Slot.fromApi(driver.slot(stack)) == Slot.Floppy || Slot.fromApi(driver.slot(stack)) == Slot.HDD + case Some(driver) => Slot(driver, stack) == Slot.Floppy || Slot(driver, stack) == Slot.HDD case _ => false }) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Case.scala b/src/main/scala/li/cil/oc/common/tileentity/Case.scala index c9661e376..90146ffa7 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Case.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Case.scala @@ -60,7 +60,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with def hasCPU = items.exists { case Some(stack) => Option(Driver.driverFor(stack)) match { - case Some(driver) => Slot.fromApi(driver.slot(stack)) == Slot.CPU + case Some(driver) => Slot(driver, stack) == Slot.CPU case _ => false } case _ => false @@ -125,6 +125,6 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with override def isItemValidForSlot(slot: Int, stack: ItemStack) = Option(Driver.driverFor(stack)).fold(false)(driver => { val provided = InventorySlots.computer(tier)(slot) - Slot.fromApi(driver.slot(stack)) == provided.slot && driver.tier(stack) <= provided.tier + Slot(driver, stack) == provided.slot && driver.tier(stack) <= provided.tier }) } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala b/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala index ab0d40637..0473b2e2b 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala @@ -29,7 +29,7 @@ class DiskDrive extends traits.Environment with traits.ComponentInventory with t override def getSizeInventory = 1 override def isItemValidForSlot(slot: Int, stack: ItemStack) = (slot, Option(Driver.driverFor(stack))) match { - case (0, Some(driver)) => Slot.fromApi(driver.slot(stack)) == Slot.Floppy + case (0, Some(driver)) => Slot(driver, stack) == Slot.Floppy case _ => false } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index ca6bedd2a..79290b6ba 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -492,7 +492,7 @@ class Robot extends traits.Computer with traits.PowerInformation with api.machin def containerSlotType(slot: Int) = if (containerSlots contains slot) { val stack = info.containers(slot - 1) Option(Driver.driverFor(stack)) match { - case Some(driver: api.driver.UpgradeContainer) => Slot.fromApi(driver.providedSlot(stack)) + case Some(driver: api.driver.UpgradeContainer) => Slot(driver, stack, Some(driver.providedSlot)) case _ => Slot.None } } @@ -515,7 +515,7 @@ class Robot extends traits.Computer with traits.PowerInformation with api.machin def isFloppySlot(slot: Int) = isComponentSlot(slot) && (Option(getStackInSlot(slot)) match { case Some(stack) => Option(Driver.driverFor(stack)) match { - case Some(driver) => Slot.fromApi(driver.slot(stack)) == Slot.Floppy + case Some(driver) => Slot(driver, stack) == Slot.Floppy case _ => false } case _ => false @@ -622,7 +622,7 @@ class Robot extends traits.Computer with traits.PowerInformation with api.machin // logic making the differentiation of assembler and containers generic. driver != server.driver.item.Screen && driver != server.driver.item.Keyboard && - Slot.fromApi(driver.slot(stack)) == containerSlotType(i) && + Slot(driver, stack) == containerSlotType(i) && driver.tier(stack) <= containerSlotTier(i) case (i, _) if isInventorySlot(i) => true // Normal inventory. case _ => false // Invalid slot. diff --git a/src/main/scala/li/cil/oc/common/tileentity/Switch.scala b/src/main/scala/li/cil/oc/common/tileentity/Switch.scala index 503149c91..774b34256 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Switch.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Switch.scala @@ -157,14 +157,14 @@ class Switch extends traits.Hub with traits.NotAnalyzable with IPeripheral with private def updateLimits(slot: Int, stack: ItemStack) { Driver.driverFor(stack) match { - case driver if Slot.fromApi(driver.slot(stack)) == Slot.CPU => + case driver if Slot(driver, stack) == Slot.CPU => relayDelay = math.max(1, relayBaseDelay - ((driver.tier(stack) + 1) * relayDelayPerUpgrade)) - case driver if Slot.fromApi(driver.slot(stack)) == Slot.Memory => + case driver if Slot(driver, stack) == Slot.Memory => relayAmount = math.max(1, relayBaseAmount + (Items.multi.subItem(stack) match { case Some(ram: item.Memory) => (ram.tier + 1) * relayAmountPerUpgrade case _ => (driver.tier(stack) + 1) * (relayAmountPerUpgrade * 2) })) - case driver if Slot.fromApi(driver.slot(stack)) == Slot.HDD => + case driver if Slot(driver, stack) == Slot.HDD => maxQueueSize = math.max(1, queueBaseSize + (driver.tier(stack) + 1) * queueSizePerUpgrade) } } @@ -172,9 +172,9 @@ class Switch extends traits.Hub with traits.NotAnalyzable with IPeripheral with override protected def onItemRemoved(slot: Int, stack: ItemStack) { super.onItemRemoved(slot, stack) Driver.driverFor(stack) match { - case driver if Slot.fromApi(driver.slot(stack)) == Slot.CPU => relayDelay = relayBaseDelay - case driver if Slot.fromApi(driver.slot(stack)) == Slot.Memory => relayAmount = relayBaseAmount - case driver if Slot.fromApi(driver.slot(stack)) == Slot.HDD => maxQueueSize = queueBaseSize + case driver if Slot(driver, stack) == Slot.CPU => relayDelay = relayBaseDelay + case driver if Slot(driver, stack) == Slot.Memory => relayAmount = relayBaseAmount + case driver if Slot(driver, stack) == Slot.HDD => maxQueueSize = queueBaseSize } } @@ -183,7 +183,7 @@ class Switch extends traits.Hub with traits.NotAnalyzable with IPeripheral with override def isItemValidForSlot(slot: Int, stack: ItemStack) = Option(Driver.driverFor(stack)).fold(false)(driver => { val provided = InventorySlots.switch(slot) - Slot.fromApi(driver.slot(stack)) == provided.slot && driver.tier(stack) <= provided.tier + Slot(driver, stack) == provided.slot && driver.tier(stack) <= provided.tier }) // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/server/component/Server.scala b/src/main/scala/li/cil/oc/server/component/Server.scala index a5829c16c..3649535a1 100644 --- a/src/main/scala/li/cil/oc/server/component/Server.scala +++ b/src/main/scala/li/cil/oc/server/component/Server.scala @@ -58,7 +58,7 @@ class Server(val rack: tileentity.ServerRack, val number: Int) extends Owner { def hasCPU = inventory.items.exists { case Some(stack) => Option(Driver.driverFor(stack)) match { - case Some(driver) => Slot.fromApi(driver.slot(stack)) == Slot.CPU + case Some(driver) => Slot(driver, stack) == Slot.CPU case _ => false } case _ => false