blob: 42a4733616613ca84b96c6e4463e77311beb6c80 [file] [log] [blame] [raw]
package li.cil.oc.common.template
import java.lang.reflect.Method
import li.cil.oc.OpenComputers
import li.cil.oc.common.IMC
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import scala.collection.mutable
object DisassemblerTemplates {
private val templates = mutable.ArrayBuffer.empty[Template]
def add(template: NBTTagCompound): Unit = try {
val selector = IMC.getStaticMethod(template.getString("select"), classOf[ItemStack])
val disassembler = IMC.getStaticMethod(template.getString("disassemble"), classOf[ItemStack], classOf[Array[ItemStack]])
templates += new Template(selector, disassembler)
}
catch {
case t: Throwable => OpenComputers.log.warn("Failed registering disassembler template.", t)
}
def select(stack: ItemStack) = templates.find(_.select(stack))
class Template(val selector: Method,
val disassembler: Method) {
def select(stack: ItemStack) = IMC.tryInvokeStatic(selector, stack)(false)
def disassemble(stack: ItemStack, ingredients: Array[ItemStack]) = IMC.tryInvokeStatic(disassembler, stack, ingredients)(null: Array[_]) match {
case Array(stacks: Array[ItemStack], drops: Array[ItemStack]) => (Some(stacks), Some(drops))
case Array(stack: ItemStack, drops: Array[ItemStack]) => (Some(Array(stack)), Some(drops))
case Array(stacks: Array[ItemStack], drop: ItemStack) => (Some(stacks), Some(Array(drop)))
case stacks: Array[ItemStack] => (Some(stacks), None)
case _ => (None, None)
}
}
}