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;
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.
* <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.
*/
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 <tt>null</tt>
* 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;
}

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
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())

View File

@ -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))

View File

@ -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() {

View File

@ -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]