blob: 900f0e8f1fecfcae659de7825379d0ab18555dda [file] [log] [blame] [raw]
package li.cil.oc
import cpw.mods.fml.common.registry.GameRegistry
import li.cil.oc.api.detail.{ItemAPI, ItemInfo}
import li.cil.oc.common.recipe.Recipes
import li.cil.oc.common.{Loot, Tier, item}
import li.cil.oc.util.Color
import li.cil.oc.util.mods.Mods
import net.minecraft.block.Block
import net.minecraft.creativetab.CreativeTabs
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.{Item, ItemBlock, ItemStack}
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.world.World
import scala.collection.mutable
object Items extends ItemAPI {
private val descriptors = mutable.Map.empty[String, ItemInfo]
private 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
}
def registerBlock[T <: common.block.Delegate](delegate: T, id: String) = {
descriptors += id -> new ItemInfo {
override def name = id
override def block = delegate.parent
override def item = null
override def createItemStack(size: Int) = delegate.createItemStack(size)
}
names += delegate -> id
delegate
}
def registerBlock(instance: Block, id: String) = {
descriptors += id -> new ItemInfo {
override def name = id
override def block = instance
override def item = null
override def createItemStack(size: Int) = new ItemStack(instance, size)
}
names += instance -> id
instance
}
def registerItem[T <: common.item.Delegate](delegate: T, id: String) = {
descriptors += id -> new ItemInfo {
override def name = id
override def block = null
override def item = delegate.parent
override def createItemStack(size: Int) = delegate.createItemStack(size)
}
names += delegate -> id
delegate
}
def registerItem(instance: Item, id: String) = {
descriptors += id -> new ItemInfo {
override def name = id
override def block = null
override def item = instance
override def createItemStack(size: Int) = new ItemStack(instance, size)
}
names += instance -> id
instance
}
private def getBlockOrItem(stack: ItemStack): Any = if (stack == null) null
else {
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
})
)
)
)
)
}
// ----------------------------------------------------------------------- //
var multi: item.Delegator = _
// ----------------------------------------------------------------------- //
// Crafting
var ironNugget: item.IronNugget = _
def init() {
multi = new item.Delegator(Settings.get.itemId) {
override def getSubItems(itemId: Int, tab: CreativeTabs, list: java.util.List[_]) {
// Workaround for MC's untyped lists...
def add[T](list: java.util.List[T], value: Any) = list.add(value.asInstanceOf[T])
super.getSubItems(itemId, tab, list)
Loot.worldDisks.values.foreach(entry => add(list, entry._1))
}
}
GameRegistry.registerItem(multi, Settings.namespace + "item")
Recipes.addItem(new item.Analyzer(multi), "analyzer", "oc:analyzer")
Recipes.addItem(new item.Memory(multi, Tier.One), "ram1", "oc:ram1")
Recipes.addItem(new item.Memory(multi, Tier.Three), "ram3", "oc:ram3")
Recipes.addItem(new item.Memory(multi, Tier.Four), "ram4", "oc:ram4")
Recipes.addItem(new item.FloppyDisk(multi), "floppy", "oc:floppy")
Recipes.addItem(new item.HardDiskDrive(multi, Tier.One), "hdd1", "oc:hdd1")
Recipes.addItem(new item.HardDiskDrive(multi, Tier.Two), "hdd2", "oc:hdd2")
Recipes.addItem(new item.HardDiskDrive(multi, Tier.Three), "hdd3", "oc:hdd3")
Recipes.addItem(new item.GraphicsCard(multi, Tier.One), "graphicsCard1", "oc:graphicsCard1")
Recipes.addItem(new item.GraphicsCard(multi, Tier.Two), "graphicsCard2", "oc:graphicsCard2")
Recipes.addItem(new item.GraphicsCard(multi, Tier.Three), "graphicsCard3", "oc:graphicsCard3")
Recipes.addItem(new item.NetworkCard(multi), "lanCard", "oc:lanCard")
Recipes.addItem(new item.RedstoneCard(multi, Tier.Two), "redstoneCard2", "oc:redstoneCard2")
Recipes.addItem(new item.WirelessNetworkCard(multi), "wlanCard", "oc:wlanCard")
Recipes.addItem(new item.UpgradeCrafting(multi), "craftingUpgrade", "oc:craftingUpgrade")
Recipes.addItem(new item.UpgradeGenerator(multi), "generatorUpgrade", "oc:generatorUpgrade")
ironNugget = new item.IronNugget(multi)
Recipes.addItem(new item.CuttingWire(multi), "cuttingWire", "oc:materialCuttingWire")
Recipes.addItem(new item.Acid(multi), "acid", "oc:materialAcid")
Recipes.addItem(new item.Disk(multi), "disk", "oc:materialDisk")
Recipes.addItem(new item.ButtonGroup(multi), "buttonGroup", "oc:materialButtonGroup")
Recipes.addItem(new item.ArrowKeys(multi), "arrowKeys", "oc:materialArrowKey")
Recipes.addItem(new item.NumPad(multi), "numPad", "oc:materialNumPad")
Recipes.addItem(new item.Transistor(multi), "transistor", "oc:materialTransistor")
Recipes.addItem(new item.Microchip(multi, Tier.One), "chip1", "oc:circuitChip1")
Recipes.addItem(new item.Microchip(multi, Tier.Two), "chip2", "oc:circuitChip2")
Recipes.addItem(new item.Microchip(multi, Tier.Three), "chip3", "oc:circuitChip3")
Recipes.addItem(new item.ALU(multi), "alu", "oc:materialALU")
Recipes.addItem(new item.ControlUnit(multi), "cu", "oc:materialCU")
Recipes.addItem(new item.CPU(multi, Tier.One), "cpu1", "oc:cpu1")
Recipes.addItem(new item.RawCircuitBoard(multi), "rawCircuitBoard", "oc:materialCircuitBoardRaw")
Recipes.addItem(new item.CircuitBoard(multi), "circuitBoard", "oc:materialCircuitBoard")
Recipes.addItem(new item.PrintedCircuitBoard(multi), "printedCircuitBoard", "oc:materialCircuitBoardPrinted")
Recipes.addItem(new item.CardBase(multi), "card", "oc:materialCard")
// v1.1.0
Recipes.addItem(new item.UpgradeSolarGenerator(multi), "solarGeneratorUpgrade", "oc:solarGeneratorUpgrade")
Recipes.addItem(new item.UpgradeSign(multi), "signUpgrade", "oc:signUpgrade")
Recipes.addItem(new item.UpgradeNavigation(multi), "navigationUpgrade", "oc:navigationUpgrade")
// Always create, to avoid shifting IDs.
val abstractBus = new item.AbstractBusCard(multi)
if (Mods.StargateTech2.isAvailable) {
Recipes.addItem(abstractBus, "abstractBusCard", "oc:abstractBusCard")
}
Recipes.addItem(new item.Memory(multi, Tier.Five), "ram5", "oc:ram5")
Recipes.addItem(new item.Memory(multi, Tier.Six), "ram6", "oc:ram6")
// v1.2.0
Recipes.addItem(new item.Server(multi, Tier.Three), "server3", "oc:server3")
Recipes.addItem(new item.Terminal(multi), "terminal", "oc:terminal")
Recipes.addItem(new item.CPU(multi, Tier.Two), "cpu2", "oc:cpu2")
Recipes.addItem(new item.CPU(multi, Tier.Three), "cpu3", "oc:cpu3")
Recipes.addItem(new item.InternetCard(multi), "internetCard", "oc:internetCard")
Recipes.addItem(new item.Server(multi, Tier.One), "server1", "oc:server1")
Recipes.addItem(new item.Server(multi, Tier.Two), "server2", "oc:server2")
// v1.2.3
registerItem(new item.FloppyDisk(multi) {
showInItemList = false
override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = {
if (player.isSneaking) get("floppy").createItemStack(1)
else super.onItemRightClick(stack, world, player)
}
}, "lootDisk")
// v1.2.6
Recipes.addItem(new item.Interweb(multi), "interweb", "oc:materialInterweb")
Recipes.addItem(new item.UpgradeAngel(multi), "angelUpgrade", "oc:angelUpgrade")
Recipes.addItem(new item.Memory(multi, Tier.Two), "ram2", "oc:ram2")
// v1.3.0
Recipes.addItem(new item.LinkedCard(multi), "linkedCard", "oc:linkedCard")
Recipes.addItem(new item.UpgradeExperience(multi), "experienceUpgrade", "oc:experienceUpgrade")
Recipes.addItem(new item.UpgradeInventory(multi), "inventoryUpgrade", "oc:inventoryUpgrade")
Recipes.addItem(new item.UpgradeContainerUpgrade(multi, Tier.One), "upgradeContainer1", "oc:upgradeContainer1")
Recipes.addItem(new item.UpgradeContainerUpgrade(multi, Tier.Two), "upgradeContainer2", "oc:upgradeContainer2")
Recipes.addItem(new item.UpgradeContainerUpgrade(multi, Tier.Three), "upgradeContainer3", "oc:upgradeContainer3")
Recipes.addItem(new item.UpgradeContainerCard(multi, Tier.One), "cardContainer1", "oc:cardContainer1")
Recipes.addItem(new item.UpgradeContainerCard(multi, Tier.Two), "cardContainer2", "oc:cardContainer2")
Recipes.addItem(new item.UpgradeContainerCard(multi, Tier.Three), "cardContainer3", "oc:cardContainer3")
// Special case loot disk because this one's craftable and having it have
// the same item damage would confuse NEI and the item costs computation.
Recipes.addItem(new item.FloppyDisk(multi) {
override def createItemStack(amount: Int) = {
val data = new NBTTagCompound()
data.setString(Settings.namespace + "fs.label", "openos")
val nbt = new NBTTagCompound("tag")
nbt.setTag(Settings.namespace + "data", data)
nbt.setString(Settings.namespace + "lootPath", "OpenOS")
nbt.setInteger(Settings.namespace + "color", Color.dyes.indexOf("dyeGreen"))
val stack = super.createItemStack(amount)
stack.setTagCompound(nbt)
stack
}
override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = {
if (player.isSneaking) get("floppy").createItemStack(1)
else super.onItemRightClick(stack, world, player)
}
}, "openOS")
Recipes.addItem(new item.UpgradeInventoryController(multi), "inventoryControllerUpgrade", "oc:inventoryControllerUpgrade")
Recipes.addItem(new item.UpgradeChunkloader(multi), "chunkloaderUpgrade", "oc:chunkloaderUpgrade")
Recipes.addItem(new item.UpgradeBattery(multi, Tier.One), "batteryUpgrade1", "oc:batteryUpgrade1")
Recipes.addItem(new item.UpgradeBattery(multi, Tier.Two), "batteryUpgrade2", "oc:batteryUpgrade2")
Recipes.addItem(new item.UpgradeBattery(multi, Tier.Three), "batteryUpgrade3", "oc:batteryUpgrade3")
Recipes.addItem(new item.RedstoneCard(multi, Tier.One), "redstoneCard1", "oc:redstoneCard1")
// 1.3.2
Recipes.addItem(new item.UpgradeTractorBeam(multi), "tractorBeamUpgrade", "oc:tractorBeamUpgrade")
// 1.3.?
registerItem(new item.Tablet(multi), "tablet")
// 1.3.2 (cont.)
registerItem(new item.Server(multi, Tier.Four), "serverCreative")
// 1.3.3
Recipes.addItem(new item.ComponentBus(multi, Tier.One), "componentBus1", "oc:componentBus1")
Recipes.addItem(new item.ComponentBus(multi, Tier.Two), "componentBus2", "oc:componentBus2")
Recipes.addItem(new item.ComponentBus(multi, Tier.Three), "componentBus3", "oc:componentBus3")
registerItem(new item.DebugCard(multi), "debugCard")
// 1.3.?
registerItem(new item.TabletCase(multi), "tabletCase")
}
}