New API for fetching items and blocks provided by OpenComputers, abstracting things away a bit more and making it more easily extendable.

This commit is contained in:
Florian Nücke 2014-04-27 21:05:25 +02:00
parent 05c63c6a8d
commit 416735e32c
8 changed files with 174 additions and 168 deletions

View File

@ -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.
* </p>
* 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() {
}
}

View File

@ -1,60 +1,50 @@
package li.cil.oc.api; package li.cil.oc.api;
import li.cil.oc.api.detail.ItemAPI;
import li.cil.oc.api.detail.ItemInfo;
import net.minecraft.item.ItemStack; 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 final class Items {
public static ItemStack /**
AbstractBusCard, * Get a descriptor object for the block or item with the specified name.
Acid, * <p/>
ALU, * The names are the same as the ones used in the recipe files. An info
Analyzer, * object can be used to retrieve both the block and item instance of the
ButtonArrows, * item, if available. It can also be used to create a new item stack of
ButtonGroup, * the item.
ButtonNumPad, *
CardBase, * @param name the name of the item to get the descriptor for.
CircuitBoard, * @return the descriptor for the item with the specified name, or
ControlUnit, * <tt>null</tt> if there is no such item.
CPUTier1, */
CPUTier2, public static ItemInfo get(String name) {
CPUTier3, if (instance != null)
CuttingWire, return instance.get(name);
DiskPlatter, return null;
FloppyDisk, }
GraphicsCardTier1,
GraphicsCardTier2, /**
GraphicsCardTier3, * Get a descriptor object for the block or item represented by the
HardDiskTier2, * specified item stack.
HardDiskTier3, *
HardDriveTier1, * @param stack the stack to get the descriptor for.
InternetCard, * @return the descriptor for the specified item stack, or <tt>null</tt>
IronNugget, * if the stack is not a valid OpenComputers item or block.
MemoryTier1, */
MemoryTier2, public static ItemInfo get(ItemStack stack) {
MemoryTier3, if (instance != null)
MemoryTier4, return instance.get(stack);
MemoryTier5, return null;
MicrochipTier1, }
MicroChipTier2,
MicroChipTier3, // ----------------------------------------------------------------------- //
NetworkCard,
PrintedCircuitBoard,
RawCircuitBoard,
RedstoneCard,
ServerTier1,
ServerTier2,
ServerTier3,
Terminal,
Transistor,
UpgradeCrafting,
UpgradeGenerator,
UpgradeNavigation,
UpgradeSign,
UpgradeSolarGenerator,
WirelessNetworkCard;
private Items() { private Items() {
} }
public static ItemAPI instance = null;
} }

View File

@ -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.
* <p/>
* 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
* <tt>null</tt> 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 <tt>null</tt>
* if the stack is not a valid OpenComputers item or block.
*/
ItemInfo get(ItemStack stack);
}

View File

@ -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 <tt>null</tt>.
* <p/>
* Note that OpenComputers represents most of its items using just a few
* actual <tt>Block</tt> 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 <tt>null</tt>.
* <p/>
* Note that OpenComputers represents most of its items using just a few
* actual <tt>Item</tt> 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);
}

View File

@ -106,28 +106,6 @@ object Blocks {
// v1.2.6 // v1.2.6
case4 = new Case.TierCreative(blockSimpleWithRedstone) 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()) register("oc:craftingCable", cable.createItemStack())

View File

@ -4,11 +4,41 @@ import cpw.mods.fml.common.registry.GameRegistry
import li.cil.oc.common.item import li.cil.oc.common.item
import li.cil.oc.util.mods.Mods import li.cil.oc.util.mods.Mods
import net.minecraft.block.Block import net.minecraft.block.Block
import net.minecraft.item.{Item, ItemStack} import net.minecraft.item.{ItemBlock, Item, ItemStack}
import net.minecraftforge.oredict.OreDictionary import net.minecraftforge.oredict.OreDictionary
import scala.collection.convert.WrapAsScala._ 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 = _ var multi: item.Delegator = _
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
@ -152,55 +182,6 @@ object Items {
upgradeAngel = Recipes.addItemDelegate(new item.UpgradeAngel(multi), "angelUpgrade") upgradeAngel = Recipes.addItemDelegate(new item.UpgradeAngel(multi), "angelUpgrade")
ram2 = Recipes.addItemDelegate(new item.Memory(multi, 1), "ram2") 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)) registerExclusive("craftingPiston", new ItemStack(Block.pistonBase), new ItemStack(Block.pistonStickyBase))

View File

@ -13,23 +13,48 @@ import net.minecraftforge.oredict.{OreDictionary, ShapelessOreRecipe, ShapedOreR
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import scala.collection.convert.WrapAsScala._ import scala.collection.convert.WrapAsScala._
import scala.collection.mutable import scala.collection.mutable
import li.cil.oc.api.detail.ItemInfo
object Recipes { object Recipes {
val list = mutable.LinkedHashMap.empty[ItemStack, String] val list = mutable.LinkedHashMap.empty[ItemStack, String]
def addBlockDelegate[T <: common.block.Delegate](block: T, name: String) = { def addBlockDelegate[T <: common.block.Delegate](delegate: T, name: String) = {
list += block.createItemStack() -> name Items.descriptors += name -> new ItemInfo {
block 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) = { def addItemDelegate[T <: common.item.Delegate](delegate: T, name: String) = {
list += item.createItemStack() -> name Items.descriptors += name -> new ItemInfo {
item 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) = { def addItem(instance: Item, name: String) = {
list += new ItemStack(item) -> name Items.descriptors += name -> new ItemInfo {
item 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() { def init() {

View File

@ -35,6 +35,7 @@ class Proxy {
api.CreativeTab.Instance = CreativeTab api.CreativeTab.Instance = CreativeTab
api.Driver.instance = driver.Registry api.Driver.instance = driver.Registry
api.FileSystem.instance = fs.FileSystem api.FileSystem.instance = fs.FileSystem
api.Items.instance = Items
api.Machine.instance = machine.Machine api.Machine.instance = machine.Machine
api.Machine.LuaArchitecture = api.Machine.LuaArchitecture =
if (LuaStateFactory.isAvailable) classOf[NativeLuaArchitecture] if (LuaStateFactory.isAvailable) classOf[NativeLuaArchitecture]