Added IMC callback to add custom ink providers (i.e. callbacks that let us know how much ink an item is worth). Closes #1135.

This commit is contained in:
Florian Nücke 2015-05-09 12:01:37 +02:00
parent 1ecd5063af
commit ba6053ab0c
3 changed files with 41 additions and 8 deletions

View File

@ -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}.")
}

View File

@ -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 = {

View File

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