package li.cil.oc.common.init import java.util.concurrent.Callable import cpw.mods.fml.common.registry.GameRegistry import li.cil.oc.Constants import li.cil.oc.OpenComputers import li.cil.oc.Settings import li.cil.oc.api.detail.ItemAPI import li.cil.oc.api.detail.ItemInfo import li.cil.oc.api.fs.FileSystem import li.cil.oc.common import li.cil.oc.common.Loot import li.cil.oc.common.Tier import li.cil.oc.common.block.SimpleBlock import li.cil.oc.common.item import li.cil.oc.common.item.Delegator import li.cil.oc.common.item.UpgradeLeash import li.cil.oc.common.item.data.DroneData import li.cil.oc.common.item.data.HoverBootsData import li.cil.oc.common.item.data.MicrocontrollerData import li.cil.oc.common.item.data.RobotData import li.cil.oc.common.item.data.TabletData import li.cil.oc.common.item.traits.Delegate import li.cil.oc.common.item.traits.SimpleItem import li.cil.oc.common.recipe.Recipes import li.cil.oc.integration.Mods import net.minecraft.block.Block import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.Item import net.minecraft.item.ItemBlock import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.world.World import scala.collection.mutable object Items extends ItemAPI { val descriptors = mutable.Map.empty[String, ItemInfo] val names = mutable.Map.empty[Any, String] val aliases = Map( "dataCard" -> Constants.ItemName.DataCardTier1 ) 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 <: Block](instance: T, id: String) = { instance match { case simple: SimpleBlock => instance.setBlockName("oc." + id) GameRegistry.registerBlock(simple, classOf[common.block.Item], id) case _ => } descriptors += id -> new ItemInfo { override def name = id override def block = instance override def item = null override def createItemStack(size: Int) = instance match { case simple: SimpleBlock => simple.createItemStack(size) case _ => new ItemStack(instance, size) } } names += instance -> id instance } def registerItem[T <: 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) = { instance match { case simple: SimpleItem => simple.setUnlocalizedName("oc." + id) GameRegistry.registerItem(simple, id) case _ => } descriptors += id -> new ItemInfo { override def name = id override def block = null override def item = instance override def createItemStack(size: Int) = instance match { case simple: SimpleItem => simple.createItemStack(size) case _ => new ItemStack(instance, size) } } names += instance -> id instance } def registerStack(stack: ItemStack, id: String) = { val immutableStack = stack.copy() descriptors += id -> new ItemInfo { override def name = id override def block = null override def createItemStack(size: Int): ItemStack = { val copy = immutableStack.copy() copy.stackSize = size copy } override def item = immutableStack.getItem } stack } private def getBlockOrItem(stack: ItemStack): Any = if (stack == null) null else Delegator.subItem(stack).getOrElse(stack.getItem match { case block: ItemBlock => block.field_150939_a case item => item }) // ----------------------------------------------------------------------- // val registeredItems = mutable.ArrayBuffer.empty[ItemStack] override def registerFloppy(name: String, color: Int, factory: Callable[FileSystem]): ItemStack = { val stack = Loot.registerLootDisk(name, color, factory) registeredItems += stack stack.copy() } override def registerEEPROM(name: String, code: Array[Byte], data: Array[Byte], readonly: Boolean): ItemStack = { val nbt = new NBTTagCompound() if (name != null) { nbt.setString(Settings.namespace + "label", name.trim.take(24)) } if (code != null) { nbt.setByteArray(Settings.namespace + "eeprom", code.take(Settings.get.eepromSize)) } if (data != null) { nbt.setByteArray(Settings.namespace + "userdata", data.take(Settings.get.eepromDataSize)) } nbt.setBoolean(Settings.namespace + "readonly", readonly) val stackNbt = new NBTTagCompound() stackNbt.setTag(Settings.namespace + "data", nbt) val stack = get(Constants.ItemName.EEPROM).createItemStack(1) stack.setTagCompound(stackNbt) registeredItems += stack stack.copy() } // ----------------------------------------------------------------------- // private def safeGetStack(name: String) = Option(get(name)).map(_.createItemStack(1)).orNull def createConfiguredDrone() = { val data = new DroneData() data.name = "Crecopter" data.tier = Tier.Four data.storedEnergy = Settings.get.bufferDrone.toInt data.components = Array( safeGetStack(Constants.ItemName.InventoryUpgrade), safeGetStack(Constants.ItemName.InventoryUpgrade), safeGetStack(Constants.ItemName.InventoryControllerUpgrade), safeGetStack(Constants.ItemName.TankUpgrade), safeGetStack(Constants.ItemName.TankControllerUpgrade), safeGetStack(Constants.ItemName.LeashUpgrade), safeGetStack(Constants.ItemName.WirelessNetworkCard), safeGetStack(Constants.ItemName.CPUTier3), safeGetStack(Constants.ItemName.RAMTier6), safeGetStack(Constants.ItemName.RAMTier6) ) data.createItemStack() } def createConfiguredMicrocontroller() = { val data = new MicrocontrollerData() data.tier = Tier.Four data.storedEnergy = Settings.get.bufferMicrocontroller.toInt data.components = Array( safeGetStack(Constants.ItemName.SignUpgrade), safeGetStack(Constants.ItemName.PistonUpgrade), safeGetStack(Constants.ItemName.RedstoneCardTier2), safeGetStack(Constants.ItemName.WirelessNetworkCard), safeGetStack(Constants.ItemName.CPUTier3), safeGetStack(Constants.ItemName.RAMTier6), safeGetStack(Constants.ItemName.RAMTier6) ) data.createItemStack() } def createConfiguredRobot() = { val data = new RobotData() data.name = "Creatix" data.tier = Tier.Four data.robotEnergy = Settings.get.bufferRobot.toInt data.totalEnergy = data.robotEnergy data.components = Array( safeGetStack(Constants.BlockName.ScreenTier1), safeGetStack(Constants.BlockName.Keyboard), safeGetStack(Constants.ItemName.InventoryUpgrade), safeGetStack(Constants.ItemName.InventoryUpgrade), safeGetStack(Constants.ItemName.InventoryUpgrade), safeGetStack(Constants.ItemName.InventoryUpgrade), safeGetStack(Constants.ItemName.InventoryControllerUpgrade), safeGetStack(Constants.ItemName.TankUpgrade), safeGetStack(Constants.ItemName.TankControllerUpgrade), safeGetStack(Constants.ItemName.CraftingUpgrade), safeGetStack(Constants.ItemName.GraphicsCardTier3), safeGetStack(Constants.ItemName.RedstoneCardTier2), safeGetStack(Constants.ItemName.WirelessNetworkCard), safeGetStack(Constants.ItemName.InternetCard), safeGetStack(Constants.ItemName.CPUTier3), safeGetStack(Constants.ItemName.RAMTier6), safeGetStack(Constants.ItemName.RAMTier6), safeGetStack(Constants.ItemName.LuaBios), safeGetStack(Constants.ItemName.OpenOS), safeGetStack(Constants.ItemName.HDDTier3) ) data.containers = Array( safeGetStack(Constants.ItemName.CardContainerTier3), safeGetStack(Constants.ItemName.UpgradeContainerTier3), safeGetStack(Constants.BlockName.DiskDrive) ) data.createItemStack() } def createConfiguredTablet() = { val data = new TabletData() data.tier = Tier.Four data.energy = Settings.get.bufferTablet data.maxEnergy = data.energy data.items = Array( Option(safeGetStack(Constants.BlockName.ScreenTier1)), Option(safeGetStack(Constants.BlockName.Keyboard)), Option(safeGetStack(Constants.ItemName.SignUpgrade)), Option(safeGetStack(Constants.ItemName.PistonUpgrade)), Option(safeGetStack(Constants.BlockName.Geolyzer)), Option(safeGetStack(Constants.ItemName.NavigationUpgrade)), Option(safeGetStack(Constants.ItemName.GraphicsCardTier2)), Option(safeGetStack(Constants.ItemName.RedstoneCardTier2)), Option(safeGetStack(Constants.ItemName.WirelessNetworkCard)), Option(safeGetStack(Constants.ItemName.CPUTier3)), Option(safeGetStack(Constants.ItemName.RAMTier6)), Option(safeGetStack(Constants.ItemName.RAMTier6)), Option(safeGetStack(Constants.ItemName.LuaBios)), Option(safeGetStack(Constants.ItemName.HDDTier3)) ).padTo(32, None) data.items(31) = Option(safeGetStack(Constants.ItemName.OpenOS)) data.container = Option(safeGetStack(Constants.BlockName.DiskDrive)) data.createItemStack() } def createChargedHoverBoots() = { val data = new HoverBootsData() data.charge = Settings.get.bufferHoverBoots data.createItemStack() } // ----------------------------------------------------------------------- // // Crafting def init() { val multi = new item.Delegator() { def additionalItems = Array( createConfiguredDrone(), createConfiguredMicrocontroller(), createConfiguredRobot(), createConfiguredTablet(), createChargedHoverBoots() ) ++ Loot.disksForClient ++ registeredItems override def getSubItems(item: Item, 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(item, tab, list) additionalItems.foreach(add(list, _)) } } GameRegistry.registerItem(multi, "item") Recipes.addSubItem(new item.Analyzer(multi), Constants.ItemName.Analyzer, "oc:analyzer") Recipes.addSubItem(new item.Memory(multi, Tier.One), Constants.ItemName.RAMTier1, "oc:ram1") Recipes.addSubItem(new item.Memory(multi, Tier.Three), Constants.ItemName.RAMTier3, "oc:ram3") Recipes.addSubItem(new item.Memory(multi, Tier.Four), Constants.ItemName.RAMTier4, "oc:ram4") Recipes.addSubItem(new item.FloppyDisk(multi), Constants.ItemName.Floppy, "oc:floppy") Recipes.addSubItem(new item.HardDiskDrive(multi, Tier.One), Constants.ItemName.HDDTier1, "oc:hdd1") Recipes.addSubItem(new item.HardDiskDrive(multi, Tier.Two), Constants.ItemName.HDDTier2, "oc:hdd2") Recipes.addSubItem(new item.HardDiskDrive(multi, Tier.Three), Constants.ItemName.HDDTier3, "oc:hdd3") Recipes.addSubItem(new item.GraphicsCard(multi, Tier.One), Constants.ItemName.GraphicsCardTier1, "oc:graphicsCard1") Recipes.addSubItem(new item.GraphicsCard(multi, Tier.Two), Constants.ItemName.GraphicsCardTier2, "oc:graphicsCard2") Recipes.addSubItem(new item.GraphicsCard(multi, Tier.Three), Constants.ItemName.GraphicsCardTier3, "oc:graphicsCard3") Recipes.addSubItem(new item.NetworkCard(multi), Constants.ItemName.NetworkCard, "oc:lanCard") Recipes.addSubItem(new item.RedstoneCard(multi, Tier.Two), Constants.ItemName.RedstoneCardTier2, "oc:redstoneCard2") Recipes.addSubItem(new item.WirelessNetworkCard(multi), Constants.ItemName.WirelessNetworkCard, "oc:wlanCard") Recipes.addSubItem(new item.UpgradeCrafting(multi), Constants.ItemName.CraftingUpgrade, "oc:craftingUpgrade") Recipes.addSubItem(new item.UpgradeGenerator(multi), Constants.ItemName.GeneratorUpgrade, "oc:generatorUpgrade") registerItem(new item.IronNugget(multi), Constants.ItemName.IronNugget) Recipes.addSubItem(new item.CuttingWire(multi), Constants.ItemName.CuttingWire, "oc:materialCuttingWire") Recipes.addSubItem(new item.Acid(multi), Constants.ItemName.Acid, "oc:materialAcid") Recipes.addSubItem(new item.Disk(multi), Constants.ItemName.Disk, "oc:materialDisk") Recipes.addSubItem(new item.ButtonGroup(multi), Constants.ItemName.ButtonGroup, "oc:materialButtonGroup") Recipes.addSubItem(new item.ArrowKeys(multi), Constants.ItemName.ArrowKeys, "oc:materialArrowKey") Recipes.addSubItem(new item.NumPad(multi), Constants.ItemName.NumPad, "oc:materialNumPad") Recipes.addSubItem(new item.Transistor(multi), Constants.ItemName.Transistor, "oc:materialTransistor") Recipes.addSubItem(new item.Microchip(multi, Tier.One), Constants.ItemName.ChipTier1, "oc:circuitChip1") Recipes.addSubItem(new item.Microchip(multi, Tier.Two), Constants.ItemName.ChipTier2, "oc:circuitChip2") Recipes.addSubItem(new item.Microchip(multi, Tier.Three), Constants.ItemName.ChipTier3, "oc:circuitChip3") Recipes.addSubItem(new item.ALU(multi), Constants.ItemName.Alu, "oc:materialALU") Recipes.addSubItem(new item.ControlUnit(multi), Constants.ItemName.ControlUnit, "oc:materialCU") Recipes.addSubItem(new item.CPU(multi, Tier.One), Constants.ItemName.CPUTier1, "oc:cpu1") Recipes.addSubItem(new item.RawCircuitBoard(multi), Constants.ItemName.RawCircuitBoard, "oc:materialCircuitBoardRaw") Recipes.addSubItem(new item.CircuitBoard(multi), Constants.ItemName.CircuitBoard, "oc:materialCircuitBoard") Recipes.addSubItem(new item.PrintedCircuitBoard(multi), Constants.ItemName.PrintedCircuitBoard, "oc:materialCircuitBoardPrinted") Recipes.addSubItem(new item.CardBase(multi), Constants.ItemName.Card, "oc:materialCard") // v1.1.0 Recipes.addSubItem(new item.UpgradeSolarGenerator(multi), Constants.ItemName.SolarGeneratorUpgrade, "oc:solarGeneratorUpgrade") Recipes.addSubItem(new item.UpgradeSign(multi), Constants.ItemName.SignUpgrade, "oc:signUpgrade") Recipes.addSubItem(new item.UpgradeNavigation(multi), Constants.ItemName.NavigationUpgrade, "oc:navigationUpgrade") // Always create, to avoid shifting IDs. val abstractBus = new item.AbstractBusCard(multi) if (Mods.StargateTech2.isAvailable) { Recipes.addSubItem(abstractBus, Constants.ItemName.AbstractBusCard, "oc:abstractBusCard") } Recipes.addSubItem(new item.Memory(multi, Tier.Five), Constants.ItemName.RAMTier5, "oc:ram5") Recipes.addSubItem(new item.Memory(multi, Tier.Six), Constants.ItemName.RAMTier6, "oc:ram6") // v1.2.0 Recipes.addSubItem(new item.Server(multi, Tier.Three), Constants.ItemName.ServerTier3, "oc:server3") Recipes.addSubItem(new item.Terminal(multi), Constants.ItemName.Terminal, "oc:terminal") Recipes.addSubItem(new item.CPU(multi, Tier.Two), Constants.ItemName.CPUTier2, "oc:cpu2") Recipes.addSubItem(new item.CPU(multi, Tier.Three), Constants.ItemName.CPUTier3, "oc:cpu3") Recipes.addSubItem(new item.InternetCard(multi), Constants.ItemName.InternetCard, "oc:internetCard") Recipes.addSubItem(new item.Server(multi, Tier.One), Constants.ItemName.ServerTier1, "oc:server1") Recipes.addSubItem(new item.Server(multi, Tier.Two), Constants.ItemName.ServerTier2, "oc:server2") // v1.2.3 registerItem(new item.FloppyDisk(multi) { showInItemList = false }, Constants.ItemName.LootDisk) // v1.2.6 Recipes.addSubItem(new item.Interweb(multi), Constants.ItemName.Interweb, "oc:materialInterweb") Recipes.addSubItem(new item.UpgradeAngel(multi), Constants.ItemName.AngelUpgrade, "oc:angelUpgrade") Recipes.addSubItem(new item.Memory(multi, Tier.Two), Constants.ItemName.RAMTier2, "oc:ram2") // v1.3.0 Recipes.addSubItem(new item.LinkedCard(multi), Constants.ItemName.LinkedCard, "oc:linkedCard") Recipes.addSubItem(new item.UpgradeExperience(multi), Constants.ItemName.ExperienceUpgrade, "oc:experienceUpgrade") Recipes.addSubItem(new item.UpgradeInventory(multi), Constants.ItemName.InventoryUpgrade, "oc:inventoryUpgrade") Recipes.addSubItem(new item.UpgradeContainerUpgrade(multi, Tier.One), Constants.ItemName.UpgradeContainerTier1, "oc:upgradeContainer1") Recipes.addSubItem(new item.UpgradeContainerUpgrade(multi, Tier.Two), Constants.ItemName.UpgradeContainerTier2, "oc:upgradeContainer2") Recipes.addSubItem(new item.UpgradeContainerUpgrade(multi, Tier.Three), Constants.ItemName.UpgradeContainerTier3, "oc:upgradeContainer3") Recipes.addSubItem(new item.UpgradeContainerCard(multi, Tier.One), Constants.ItemName.CardContainerTier1, "oc:cardContainer1") Recipes.addSubItem(new item.UpgradeContainerCard(multi, Tier.Two), Constants.ItemName.CardContainerTier2, "oc:cardContainer2") Recipes.addSubItem(new item.UpgradeContainerCard(multi, Tier.Three), Constants.ItemName.CardContainerTier3, "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. // UPDATE: screw that, keeping it for compatibility for now, but using recipe // below now (creating "normal" loot disk). new item.FloppyDisk(multi) { showInItemList = false override def createItemStack(amount: Int) = get(Constants.ItemName.OpenOS).createItemStack(1) override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = { if (player.isSneaking) get(Constants.ItemName.Floppy).createItemStack(1) else super.onItemRightClick(stack, world, player) } } Recipes.addSubItem(new item.UpgradeInventoryController(multi), Constants.ItemName.InventoryControllerUpgrade, "oc:inventoryControllerUpgrade") Recipes.addSubItem(new item.UpgradeChunkloader(multi), Constants.ItemName.ChunkloaderUpgrade, "oc:chunkloaderUpgrade") Recipes.addSubItem(new item.UpgradeBattery(multi, Tier.One), Constants.ItemName.BatteryUpgradeTier1, "oc:batteryUpgrade1") Recipes.addSubItem(new item.UpgradeBattery(multi, Tier.Two), Constants.ItemName.BatteryUpgradeTier2, "oc:batteryUpgrade2") Recipes.addSubItem(new item.UpgradeBattery(multi, Tier.Three), Constants.ItemName.BatteryUpgradeTier3, "oc:batteryUpgrade3") Recipes.addSubItem(new item.RedstoneCard(multi, Tier.One), Constants.ItemName.RedstoneCardTier1, "oc:redstoneCard1") // 1.3.2 Recipes.addSubItem(new item.UpgradeTractorBeam(multi), Constants.ItemName.TractorBeamUpgrade, "oc:tractorBeamUpgrade") // 1.3.? registerItem(new item.Tablet(multi), Constants.ItemName.Tablet) // 1.3.2 (cont.) registerItem(new item.Server(multi, Tier.Four), Constants.ItemName.ServerCreative) // 1.3.3 Recipes.addSubItem(new item.ComponentBus(multi, Tier.One), Constants.ItemName.ComponentBusTier1, "oc:componentBus1") Recipes.addSubItem(new item.ComponentBus(multi, Tier.Two), Constants.ItemName.ComponentBusTier2, "oc:componentBus2") Recipes.addSubItem(new item.ComponentBus(multi, Tier.Three), Constants.ItemName.ComponentBusTier3, "oc:componentBus3") registerItem(new item.DebugCard(multi), Constants.ItemName.DebugCard) // 1.3.5 Recipes.addSubItem(new item.TabletCase(multi, Tier.One), Constants.ItemName.TabletCaseTier1, "oc:tabletCase1") Recipes.addSubItem(new item.UpgradePiston(multi), Constants.ItemName.PistonUpgrade, "oc:pistonUpgrade") Recipes.addSubItem(new item.UpgradeTank(multi), Constants.ItemName.TankUpgrade, "oc:tankUpgrade") Recipes.addSubItem(new item.UpgradeTankController(multi), Constants.ItemName.TankControllerUpgrade, "oc:tankControllerUpgrade") // 1.4.0 Recipes.addSubItem(new item.UpgradeDatabase(multi, Tier.One), Constants.ItemName.DatabaseUpgradeTier1, "oc:databaseUpgrade1") Recipes.addSubItem(new item.UpgradeDatabase(multi, Tier.Two), Constants.ItemName.DatabaseUpgradeTier2, "oc:databaseUpgrade2") Recipes.addSubItem(new item.UpgradeDatabase(multi, Tier.Three), Constants.ItemName.DatabaseUpgradeTier3, "oc:databaseUpgrade3") registerItem(new item.Debugger(multi), Constants.ItemName.Debugger) // 1.4.2 val eeprom = new item.EEPROM() Recipes.addItem(eeprom, Constants.ItemName.EEPROM, "oc:eeprom") val luaBios = { val code = new Array[Byte](4 * 1024) val count = OpenComputers.getClass.getResourceAsStream(Settings.scriptPath + "bios.lua").read(code) registerEEPROM("EEPROM (Lua BIOS)", code.take(count), null, readonly = false) } Recipes.addStack(luaBios, Constants.ItemName.LuaBios) Recipes.addSubItem(new item.MicrocontrollerCase(multi, Tier.One), Constants.ItemName.MicrocontrollerCaseTier1, "oc:microcontrollerCase1") // 1.4.3 Recipes.addSubItem(new item.DroneCase(multi, Tier.One), Constants.ItemName.DroneCaseTier1, "oc:droneCase1") registerItem(new item.Drone(multi), Constants.ItemName.Drone) Recipes.addSubItem(new UpgradeLeash(multi), Constants.ItemName.LeashUpgrade, "oc:leashUpgrade") Recipes.addSubItem(new item.MicrocontrollerCase(multi, Tier.Two), Constants.ItemName.MicrocontrollerCaseTier2, "oc:microcontrollerCase2") Recipes.addSubItem(new item.DroneCase(multi, Tier.Two), Constants.ItemName.DroneCaseTier2, "oc:droneCase2") registerItem(new item.Present(multi), Constants.ItemName.Present) // Always create, to avoid shifting IDs. val worldSensorCard = new item.WorldSensorCard(multi) if (Mods.Galacticraft.isAvailable) { Recipes.addSubItem(worldSensorCard, Constants.ItemName.WorldSensorCard, "oc:worldSensorCard") } // 1.4.4 registerItem(new item.MicrocontrollerCase(multi, Tier.Four), Constants.ItemName.MicrocontrollerCaseCreative) registerItem(new item.DroneCase(multi, Tier.Four), Constants.ItemName.DroneCaseCreative) // 1.4.7 Recipes.addSubItem(new item.TabletCase(multi, Tier.Two), Constants.ItemName.TabletCaseTier2, "oc:tabletCase2") registerItem(new item.TabletCase(multi, Tier.Four), Constants.ItemName.TabletCaseCreative) // 1.5.4 Recipes.addSubItem(new item.InkCartridgeEmpty(multi), Constants.ItemName.InkCartridgeEmpty, "oc:inkCartridgeEmpty") Recipes.addSubItem(new item.InkCartridge(multi), Constants.ItemName.InkCartridge, "oc:inkCartridge") Recipes.addSubItem(new item.Chamelium(multi), Constants.ItemName.Chamelium, "oc:chamelium") Recipes.addSubItem(new item.TexturePicker(multi), Constants.ItemName.TexturePicker, "oc:texturePicker") // 1.5.7 Recipes.addSubItem(new item.Manual(multi), Constants.ItemName.Manual, "oc:manual", "craftingBook") Recipes.addItem(new item.Wrench(), Constants.ItemName.Wrench, "oc:wrench") // 1.5.8 Recipes.addSubItem(new item.UpgradeHover(multi, Tier.One), Constants.ItemName.HoverUpgradeTier1, "oc:hoverUpgrade1") Recipes.addSubItem(new item.UpgradeHover(multi, Tier.Two), Constants.ItemName.HoverUpgradeTier2, "oc:hoverUpgrade2") // 1.5.10 Recipes.addSubItem(new item.APU(multi, Tier.One), Constants.ItemName.APUTier1, "oc:apu1") Recipes.addSubItem(new item.APU(multi, Tier.Two), Constants.ItemName.APUTier2, "oc:apu2") // 1.5.11 Recipes.addItem(new item.HoverBoots(), Constants.ItemName.HoverBoots, "oc:hoverBoots") // 1.5.12 registerItem(new item.APU(multi, Tier.Three), Constants.ItemName.APUCreative) // 1.5.13 Recipes.addSubItem(new item.DataCard(multi, Tier.One), Constants.ItemName.DataCardTier1, "oc:dataCard1") // 1.5.15 Recipes.addSubItem(new item.DataCard(multi, Tier.Two), Constants.ItemName.DataCardTier2, "oc:dataCard2") Recipes.addSubItem(new item.DataCard(multi, Tier.Three), Constants.ItemName.DataCardTier3, "oc:dataCard3") // 1.5.18 Recipes.addSubItem(new item.Nanomachines(multi), Constants.ItemName.Nanomachines, "oc:nanomachines") // 1.6.0 Recipes.addSubItem(new item.TerminalServer(multi), Constants.ItemName.TerminalServer, "oc:terminalServer") Recipes.addSubItem(new item.DiskDriveMountable(multi), Constants.ItemName.DiskDriveMountable, "oc:diskDriveMountable") // Register aliases. for ((k, v) <- aliases) { descriptors.getOrElseUpdate(k, descriptors(v)) } } }