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]