From 416735e32c3d51ca4481cb9a154fe6e6bc9b61c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 27 Apr 2014 21:05:25 +0200 Subject: [PATCH] New API for fetching items and blocks provided by OpenComputers, abstracting things away a bit more and making it more easily extendable. --- src/main/java/li/cil/oc/api/Blocks.java | 37 -------- src/main/java/li/cil/oc/api/Items.java | 88 ++++++++----------- .../java/li/cil/oc/api/detail/ItemAPI.java | 29 ++++++ .../java/li/cil/oc/api/detail/ItemInfo.java | 39 ++++++++ src/main/scala/li/cil/oc/Blocks.scala | 22 ----- src/main/scala/li/cil/oc/Items.scala | 83 +++++++---------- src/main/scala/li/cil/oc/Recipes.scala | 43 +++++++-- src/main/scala/li/cil/oc/common/Proxy.scala | 1 + 8 files changed, 174 insertions(+), 168 deletions(-) delete mode 100644 src/main/java/li/cil/oc/api/Blocks.java create mode 100644 src/main/java/li/cil/oc/api/detail/ItemAPI.java create mode 100644 src/main/java/li/cil/oc/api/detail/ItemInfo.java diff --git a/src/main/java/li/cil/oc/api/Blocks.java b/src/main/java/li/cil/oc/api/Blocks.java deleted file mode 100644 index d7b7bb218..000000000 --- a/src/main/java/li/cil/oc/api/Blocks.java +++ /dev/null @@ -1,37 +0,0 @@ -package li.cil.oc.api; - -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; - -/** - * Item stacks for all blocks OpenComputers defines. - *

- * The underlying items of those are all of type {@link ItemBlock}, so you can - * use that to get the block ID if required. - */ -public final class Blocks { - public static ItemStack - AccessPoint, - Adapter, - Cable, - Capacitor, - Charger, - CaseTier1, - CaseTier2, - CaseTier3, - DiskDrive, - Keyboard, - HologramProjector, - PowerConverter, - PowerDistributor, - RedstoneIO, - Robot, - ScreenTier1, - ScreenTier2, - ScreenTier3, - ServerRack, - Switch; - - private Blocks() { - } -} diff --git a/src/main/java/li/cil/oc/api/Items.java b/src/main/java/li/cil/oc/api/Items.java index 0a0073dd5..c996ba536 100644 --- a/src/main/java/li/cil/oc/api/Items.java +++ b/src/main/java/li/cil/oc/api/Items.java @@ -1,60 +1,50 @@ package li.cil.oc.api; +import li.cil.oc.api.detail.ItemAPI; +import li.cil.oc.api.detail.ItemInfo; import net.minecraft.item.ItemStack; /** - * Item stacks for all items OpenComputers defines. + * Access to item definitions for all blocks and items provided by + * OpenComputers. */ public final class Items { - public static ItemStack - AbstractBusCard, - Acid, - ALU, - Analyzer, - ButtonArrows, - ButtonGroup, - ButtonNumPad, - CardBase, - CircuitBoard, - ControlUnit, - CPUTier1, - CPUTier2, - CPUTier3, - CuttingWire, - DiskPlatter, - FloppyDisk, - GraphicsCardTier1, - GraphicsCardTier2, - GraphicsCardTier3, - HardDiskTier2, - HardDiskTier3, - HardDriveTier1, - InternetCard, - IronNugget, - MemoryTier1, - MemoryTier2, - MemoryTier3, - MemoryTier4, - MemoryTier5, - MicrochipTier1, - MicroChipTier2, - MicroChipTier3, - NetworkCard, - PrintedCircuitBoard, - RawCircuitBoard, - RedstoneCard, - ServerTier1, - ServerTier2, - ServerTier3, - Terminal, - Transistor, - UpgradeCrafting, - UpgradeGenerator, - UpgradeNavigation, - UpgradeSign, - UpgradeSolarGenerator, - WirelessNetworkCard; + /** + * Get a descriptor object for the block or item with the specified name. + *

+ * The names are the same as the ones used in the recipe files. An info + * object can be used to retrieve both the block and item instance of the + * item, if available. It can also be used to create a new item stack of + * the item. + * + * @param name the name of the item to get the descriptor for. + * @return the descriptor for the item with the specified name, or + * null if there is no such item. + */ + public static ItemInfo get(String name) { + if (instance != null) + return instance.get(name); + return null; + } + + /** + * Get a descriptor object for the block or item represented by the + * specified item stack. + * + * @param stack the stack to get the descriptor for. + * @return the descriptor for the specified item stack, or null + * if the stack is not a valid OpenComputers item or block. + */ + public static ItemInfo get(ItemStack stack) { + if (instance != null) + return instance.get(stack); + return null; + } + + // ----------------------------------------------------------------------- // private Items() { } + + public static ItemAPI instance = null; } diff --git a/src/main/java/li/cil/oc/api/detail/ItemAPI.java b/src/main/java/li/cil/oc/api/detail/ItemAPI.java new file mode 100644 index 000000000..8ae9f334d --- /dev/null +++ b/src/main/java/li/cil/oc/api/detail/ItemAPI.java @@ -0,0 +1,29 @@ +package li.cil.oc.api.detail; + +import net.minecraft.item.ItemStack; + +public interface ItemAPI { + /** + * Get a descriptor object for the block or item with the specified name. + *

+ * The names are the same as the ones used in the recipe files. An info + * object can be used to retrieve both the block and item instance of the + * item, if available. It can also be used to create a new item stack of + * the item. + * + * @param name the name of the item to get the descriptor for. + * @return the descriptor for the item with the specified name, or + * null if there is no such item. + */ + ItemInfo get(String name); + + /** + * Get a descriptor object for the block or item represented by the + * specified item stack. + * + * @param stack the stack to get the descriptor for. + * @return the descriptor for the specified item stack, or null + * if the stack is not a valid OpenComputers item or block. + */ + ItemInfo get(ItemStack stack); +} diff --git a/src/main/java/li/cil/oc/api/detail/ItemInfo.java b/src/main/java/li/cil/oc/api/detail/ItemInfo.java new file mode 100644 index 000000000..ac9b9dc21 --- /dev/null +++ b/src/main/java/li/cil/oc/api/detail/ItemInfo.java @@ -0,0 +1,39 @@ +package li.cil.oc.api.detail; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public interface ItemInfo { + /** + * Returns the block type of the represented item. In case the item is not + * a block this will return null. + *

+ * Note that OpenComputers represents most of its items using just a few + * actual Block instances, so descriptors for different blocks may + * return the same object here. + * + * @return the block type of the represented block. + */ + Block block(); + + /** + * Returns the item type of the represented item. In case the item is a + * blocks this will return null. + *

+ * Note that OpenComputers represents most of its items using just a few + * actual Item instances, so descriptors for different items may + * return the same object here. + * + * @return the item type of the represented item. + */ + Item item(); + + /** + * Creates a new item stack of the item represended by this descriptor. + * + * @param size the size of the item stack to create. + * @return the created item stack. + */ + ItemStack createItemStack(int size); +} diff --git a/src/main/scala/li/cil/oc/Blocks.scala b/src/main/scala/li/cil/oc/Blocks.scala index 47531b852..10b7a4a82 100644 --- a/src/main/scala/li/cil/oc/Blocks.scala +++ b/src/main/scala/li/cil/oc/Blocks.scala @@ -106,28 +106,6 @@ object Blocks { // v1.2.6 case4 = new Case.TierCreative(blockSimpleWithRedstone) - // Initialize API. - api.Blocks.AccessPoint = wirelessRouter.createItemStack() - api.Blocks.Adapter = adapter.createItemStack() - api.Blocks.Cable = cable.createItemStack() - api.Blocks.Capacitor = capacitor.createItemStack() - api.Blocks.Charger = charger.createItemStack() - api.Blocks.CaseTier1 = case1.createItemStack() - api.Blocks.CaseTier2 = case2.createItemStack() - api.Blocks.CaseTier3 = case3.createItemStack() - api.Blocks.DiskDrive = diskDrive.createItemStack() - api.Blocks.Keyboard = keyboard.createItemStack() - api.Blocks.HologramProjector = hologram.createItemStack() - api.Blocks.PowerConverter = powerConverter.createItemStack() - api.Blocks.PowerDistributor = powerDistributor.createItemStack() - api.Blocks.RedstoneIO = redstone.createItemStack() - api.Blocks.Robot = robotProxy.createItemStack() - api.Blocks.Switch = router.createItemStack() - api.Blocks.ScreenTier1 = screen1.createItemStack() - api.Blocks.ScreenTier2 = screen2.createItemStack() - api.Blocks.ScreenTier3 = screen3.createItemStack() - api.Blocks.ServerRack = serverRack.createItemStack() - // ----------------------------------------------------------------------- // register("oc:craftingCable", cable.createItemStack()) diff --git a/src/main/scala/li/cil/oc/Items.scala b/src/main/scala/li/cil/oc/Items.scala index 6df5ded19..b3e62f9b4 100644 --- a/src/main/scala/li/cil/oc/Items.scala +++ b/src/main/scala/li/cil/oc/Items.scala @@ -4,11 +4,41 @@ import cpw.mods.fml.common.registry.GameRegistry import li.cil.oc.common.item import li.cil.oc.util.mods.Mods import net.minecraft.block.Block -import net.minecraft.item.{Item, ItemStack} +import net.minecraft.item.{ItemBlock, Item, ItemStack} import net.minecraftforge.oredict.OreDictionary import scala.collection.convert.WrapAsScala._ +import scala.collection.mutable +import li.cil.oc.api.detail.{ItemAPI, ItemInfo} + +object Items extends ItemAPI { + val descriptors = mutable.Map.empty[String, ItemInfo] + + val names = mutable.Map.empty[Any, String] + + override def get(name: String): ItemInfo = descriptors.get(name).orNull + + override def get(stack: ItemStack) = names.get(getBlockOrItem(stack)) match { + case Some(name) => get(name) + case _ => null + } + + private def getBlockOrItem(stack: ItemStack): Any = { + multi.subItem(stack).getOrElse( + Blocks.blockSimple.subBlock(stack).getOrElse( + Blocks.blockSimpleWithRedstone.subBlock(stack).getOrElse( + Blocks.blockSpecial.subBlock(stack).getOrElse( + Blocks.blockSpecialWithRedstone.subBlock(stack).getOrElse(stack.getItem match { + case block: ItemBlock if block.getBlockID >= 0 => net.minecraft.block.Block.blocksList(block.getBlockID) + case item => item + }) + ) + ) + ) + ) + } + + // ----------------------------------------------------------------------- // -object Items { var multi: item.Delegator = _ // ----------------------------------------------------------------------- // @@ -152,55 +182,6 @@ object Items { upgradeAngel = Recipes.addItemDelegate(new item.UpgradeAngel(multi), "angelUpgrade") ram2 = Recipes.addItemDelegate(new item.Memory(multi, 1), "ram2") - // Initialize API. - api.Items.AbstractBusCard = abstractBus.createItemStack() - api.Items.Acid = acid.createItemStack() - api.Items.ALU = alu.createItemStack() - api.Items.Analyzer = analyzer.createItemStack() - api.Items.ButtonArrows = arrowKeys.createItemStack() - api.Items.ButtonGroup = buttonGroup.createItemStack() - api.Items.ButtonNumPad = numPad.createItemStack() - api.Items.CardBase = card.createItemStack() - api.Items.CircuitBoard = circuitBoard.createItemStack() - api.Items.ControlUnit = cu.createItemStack() - api.Items.CPUTier1 = cpu0.createItemStack() - api.Items.CPUTier2 = cpu1.createItemStack() - api.Items.CPUTier3 = cpu2.createItemStack() - api.Items.CuttingWire = cuttingWire.createItemStack() - api.Items.DiskPlatter = disk.createItemStack() - api.Items.FloppyDisk = floppyDisk.createItemStack() - api.Items.GraphicsCardTier1 = gpu1.createItemStack() - api.Items.GraphicsCardTier2 = gpu2.createItemStack() - api.Items.GraphicsCardTier3 = gpu3.createItemStack() - api.Items.HardDiskTier2 = hdd1.createItemStack() - api.Items.HardDiskTier3 = hdd2.createItemStack() - api.Items.HardDriveTier1 = hdd3.createItemStack() - api.Items.InternetCard = internet.createItemStack() - api.Items.IronNugget = ironNugget.createItemStack() - api.Items.MemoryTier1 = ram1.createItemStack() - api.Items.MemoryTier2 = ram2.createItemStack() - api.Items.MemoryTier3 = ram3.createItemStack() - api.Items.MemoryTier4 = ram4.createItemStack() - api.Items.MemoryTier5 = ram5.createItemStack() - api.Items.MicrochipTier1 = chip1.createItemStack() - api.Items.MicroChipTier2 = chip2.createItemStack() - api.Items.MicroChipTier3 = chip3.createItemStack() - api.Items.NetworkCard = lan.createItemStack() - api.Items.PrintedCircuitBoard = pcb.createItemStack() - api.Items.RawCircuitBoard = rawCircuitBoard.createItemStack() - api.Items.RedstoneCard = rs.createItemStack() - api.Items.ServerTier1 = server1.createItemStack() - api.Items.ServerTier2 = server2.createItemStack() - api.Items.ServerTier3 = server3.createItemStack() - api.Items.Terminal = terminal.createItemStack() - api.Items.Transistor = transistor.createItemStack() - api.Items.UpgradeCrafting = upgradeCrafting.createItemStack() - api.Items.UpgradeGenerator = upgradeGenerator.createItemStack() - api.Items.UpgradeNavigation = upgradeNavigation.createItemStack() - api.Items.UpgradeSign = upgradeSign.createItemStack() - api.Items.UpgradeSolarGenerator = upgradeSolarGenerator.createItemStack() - api.Items.WirelessNetworkCard = wlan.createItemStack() - // ----------------------------------------------------------------------- // registerExclusive("craftingPiston", new ItemStack(Block.pistonBase), new ItemStack(Block.pistonStickyBase)) diff --git a/src/main/scala/li/cil/oc/Recipes.scala b/src/main/scala/li/cil/oc/Recipes.scala index 96612fb08..658e0b26c 100644 --- a/src/main/scala/li/cil/oc/Recipes.scala +++ b/src/main/scala/li/cil/oc/Recipes.scala @@ -13,23 +13,48 @@ import net.minecraftforge.oredict.{OreDictionary, ShapelessOreRecipe, ShapedOreR import org.apache.commons.io.FileUtils import scala.collection.convert.WrapAsScala._ import scala.collection.mutable +import li.cil.oc.api.detail.ItemInfo object Recipes { val list = mutable.LinkedHashMap.empty[ItemStack, String] - def addBlockDelegate[T <: common.block.Delegate](block: T, name: String) = { - list += block.createItemStack() -> name - block + def addBlockDelegate[T <: common.block.Delegate](delegate: T, name: String) = { + Items.descriptors += name -> new ItemInfo { + override def block = delegate.parent + + override def item = null + + override def createItemStack(size: Int) = delegate.createItemStack(size) + } + Items.names += delegate -> name + list += delegate.createItemStack() -> name + delegate } - def addItemDelegate[T <: common.item.Delegate](item: T, name: String) = { - list += item.createItemStack() -> name - item + def addItemDelegate[T <: common.item.Delegate](delegate: T, name: String) = { + Items.descriptors += name -> new ItemInfo { + override def block = null + + override def item = delegate.parent + + override def createItemStack(size: Int) = delegate.createItemStack(size) + } + Items.names += delegate -> name + list += delegate.createItemStack() -> name + delegate } - def addItem(item: Item, name: String) = { - list += new ItemStack(item) -> name - item + def addItem(instance: Item, name: String) = { + Items.descriptors += name -> new ItemInfo { + override def block = null + + override def item = instance + + override def createItemStack(size: Int) = new ItemStack(instance, size) + } + Items.names += instance -> name + list += new ItemStack(instance) -> name + instance } def init() { diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index 892da9d42..92c1e7be3 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -35,6 +35,7 @@ class Proxy { api.CreativeTab.Instance = CreativeTab api.Driver.instance = driver.Registry api.FileSystem.instance = fs.FileSystem + api.Items.instance = Items api.Machine.instance = machine.Machine api.Machine.LuaArchitecture = if (LuaStateFactory.isAvailable) classOf[NativeLuaArchitecture]