From ba6053ab0c0758eb3b1dbbe6985e5b1090c3471e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 9 May 2015 12:01:37 +0200 Subject: [PATCH] Added IMC callback to add custom ink providers (i.e. callbacks that let us know how much ink an item is worth). Closes #1135. --- src/main/scala/li/cil/oc/common/IMC.scala | 7 ++++++ .../cil/oc/common/item/data/PrintData.scala | 23 ++++++++++++------- .../opencomputers/ModOpenComputers.scala | 19 +++++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/IMC.scala b/src/main/scala/li/cil/oc/common/IMC.scala index 7f491004f..14bb196f0 100644 --- a/src/main/scala/li/cil/oc/common/IMC.scala +++ b/src/main/scala/li/cil/oc/common/IMC.scala @@ -7,6 +7,7 @@ import com.typesafe.config.Config import cpw.mods.fml.common.event.FMLInterModComms.IMCEvent import li.cil.oc.OpenComputers import li.cil.oc.Settings +import li.cil.oc.common.item.data.PrintData import li.cil.oc.common.template.AssemblerTemplates import li.cil.oc.common.template.DisassemblerTemplates import li.cil.oc.integration.util.ItemCharge @@ -84,6 +85,12 @@ object IMC { case t: Throwable => OpenComputers.log.warn("Failed registering assembler template filter.", t) } } + else if (message.key == "registerInkProvider" && message.isStringMessage) { + OpenComputers.log.info(s"Registering new ink provider '${message.getStringValue}' from mod ${message.getSender}.") + try PrintData.addInkProvider(getStaticMethod(message.getStringValue, classOf[ItemStack])) catch { + case t: Throwable => OpenComputers.log.warn("Failed registering ink provider.", t) + } + } else { OpenComputers.log.warn(s"Got an unrecognized or invalid IMC message '${message.key}' from mod ${message.getSender}.") } diff --git a/src/main/scala/li/cil/oc/common/item/data/PrintData.scala b/src/main/scala/li/cil/oc/common/item/data/PrintData.scala index 341a6962f..5b915a380 100644 --- a/src/main/scala/li/cil/oc/common/item/data/PrintData.scala +++ b/src/main/scala/li/cil/oc/common/item/data/PrintData.scala @@ -1,9 +1,11 @@ package li.cil.oc.common.item.data +import java.lang.reflect.Method + import li.cil.oc.Constants import li.cil.oc.Settings import li.cil.oc.api -import li.cil.oc.util.Color +import li.cil.oc.common.IMC import li.cil.oc.util.ExtendedAABB._ import li.cil.oc.util.ExtendedNBT._ import net.minecraft.item.ItemStack @@ -103,6 +105,10 @@ object PrintData { private val step = stepping / 16f private val invMaxVolume = 1f / (stepping * stepping * stepping) + private val inkProviders = mutable.LinkedHashSet.empty[Method] + + def addInkProvider(provider: Method): Unit = inkProviders += provider + def computeApproximateOpacity(shapes: Iterable[PrintData.Shape]) = { var volume = 1f if (shapes.size > 0) for (x <- 0 until 16 / stepping; y <- 0 until 16 / stepping; z <- 0 until 16 / stepping) { @@ -133,7 +139,6 @@ object PrintData { } private val materialPerItem = Settings.get.printMaterialValue - private val inkPerCartridge = Settings.get.printInkValue def materialValue(stack: ItemStack) = { if (api.Items.get(stack) == api.Items.get(Constants.ItemName.Chamelium)) @@ -148,12 +153,14 @@ object PrintData { else 0 } - def inkValue(stack: ItemStack) = { - if (api.Items.get(stack) == api.Items.get(Constants.ItemName.InkCartridge)) - inkPerCartridge - else if (Color.isDye(stack)) - inkPerCartridge / 10 - else 0 + def inkValue(stack: ItemStack): Int = { + for (provider <- inkProviders) { + val value = IMC.tryInvokeStatic(provider, stack)(0) + if (value > 0) { + return value + } + } + 0 } def nbtToShape(nbt: NBTTagCompound): Shape = { diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala index 7ae85d195..07f0df2be 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/ModOpenComputers.scala @@ -36,6 +36,7 @@ import li.cil.oc.integration.util.BundledRedstone import li.cil.oc.integration.util.WirelessRedstone import li.cil.oc.server.network.Waypoints import li.cil.oc.server.network.WirelessNetwork +import li.cil.oc.util.Color import li.cil.oc.util.ExtendedNBT._ import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack @@ -57,12 +58,16 @@ object ModOpenComputers extends ModProxy { TemplateBlacklist.register() FMLInterModComms.sendMessage(Mods.IDs.OpenComputers, "registerWrenchTool", "li.cil.oc.integration.opencomputers.ModOpenComputers.useWrench") + val chargerNbt = new NBTTagCompound() chargerNbt.setString("name", "OpenComputers") chargerNbt.setString("canCharge", "li.cil.oc.integration.opencomputers.ModOpenComputers.canCharge") chargerNbt.setString("charge", "li.cil.oc.integration.opencomputers.ModOpenComputers.charge") FMLInterModComms.sendMessage(Mods.IDs.OpenComputers, "registerItemCharge", chargerNbt) + FMLInterModComms.sendMessage(Mods.IDs.OpenComputers, "registerInkProvider", "li.cil.oc.integration.opencomputers.ModOpenComputers.inkCartridgeInkProvider") + FMLInterModComms.sendMessage(Mods.IDs.OpenComputers, "registerInkProvider", "li.cil.oc.integration.opencomputers.ModOpenComputers.dyeInkProvider") + ForgeChunkManager.setForcedChunkLoadingCallback(OpenComputers, ChunkloaderUpgradeHandler) FMLCommonHandler.instance.bus.register(EventHandler) @@ -254,6 +259,20 @@ object ModOpenComputers extends ModProxy { } } + def inkCartridgeInkProvider(stack: ItemStack): Int = { + if (api.Items.get(stack) == api.Items.get(Constants.ItemName.InkCartridge)) + Settings.get.printInkValue + else + 0 + } + + def dyeInkProvider(stack: ItemStack): Int = { + if (Color.isDye(stack)) + Settings.get.printInkValue / 10 + else + 0 + } + private def blacklistHost(host: Class[_], itemNames: String*) { for (itemName <- itemNames) { val nbt = new NBTTagCompound()