diff --git a/src/main/java/li/cil/oc/api/machine/Context.java b/src/main/java/li/cil/oc/api/machine/Context.java
index 622696e2a..fe82dacb6 100644
--- a/src/main/java/li/cil/oc/api/machine/Context.java
+++ b/src/main/java/li/cil/oc/api/machine/Context.java
@@ -153,6 +153,7 @@ public interface Context {
*
Strings.
* Byte arrays (which appear as strings on the Lua side, e.g.).
* Maps if and only if both keys and values are strings.
+ * NBTTagCompounds.
*
* If an unsupported type is specified the method will enqueue nothing
* instead, resulting in a nil on the Lua side, e.g., and log a
diff --git a/src/main/scala/li/cil/oc/integration/vanilla/ConverterNBT.scala b/src/main/scala/li/cil/oc/integration/vanilla/ConverterNBT.scala
new file mode 100644
index 000000000..c5a815c8c
--- /dev/null
+++ b/src/main/scala/li/cil/oc/integration/vanilla/ConverterNBT.scala
@@ -0,0 +1,35 @@
+package li.cil.oc.integration.vanilla
+
+import java.util
+
+import li.cil.oc.api
+import net.minecraft.nbt._
+
+import scala.collection.convert.WrapAsScala._
+
+object ConverterNBT extends api.driver.Converter {
+ override def convert(value: AnyRef, output: util.Map[AnyRef, AnyRef]) =
+ value match {
+ case nbt: NBTTagCompound => output += "oc:flatten" -> convert(nbt)
+ case _ =>
+ }
+
+ private def convert(nbt: NBTBase): AnyRef = nbt match {
+ case tag: NBTTagByte => byte2Byte(tag.func_150290_f())
+ case tag: NBTTagShort => short2Short(tag.func_150289_e())
+ case tag: NBTTagInt => int2Integer(tag.func_150287_d())
+ case tag: NBTTagLong => long2Long(tag.func_150291_c())
+ case tag: NBTTagFloat => float2Float(tag.func_150288_h())
+ case tag: NBTTagDouble => double2Double(tag.func_150286_g())
+ case tag: NBTTagByteArray => tag.func_150292_c()
+ case tag: NBTTagString => tag.func_150285_a_()
+ case tag: NBTTagList =>
+ val copy = tag.copy().asInstanceOf[NBTTagList]
+ (0 until copy.tagCount).map(_ => convert(copy.removeTag(0))).toArray
+ case tag: NBTTagCompound =>
+ tag.func_150296_c().collect {
+ case key: String => key -> convert(tag.getTag(key))
+ }.toMap
+ case tag: NBTTagIntArray => tag.func_150302_c()
+ }
+}
diff --git a/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala b/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala
index cf98113bf..f525cc064 100644
--- a/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala
+++ b/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala
@@ -31,5 +31,6 @@ object ModVanilla extends ModProxy {
Driver.add(ConverterFluidStack)
Driver.add(ConverterFluidTankInfo)
Driver.add(ConverterItemStack)
+ Driver.add(ConverterNBT)
}
}
diff --git a/src/main/scala/li/cil/oc/server/machine/Machine.scala b/src/main/scala/li/cil/oc/server/machine/Machine.scala
index c895aeaee..39b481079 100644
--- a/src/main/scala/li/cil/oc/server/machine/Machine.scala
+++ b/src/main/scala/li/cil/oc/server/machine/Machine.scala
@@ -238,6 +238,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
case arg: java.lang.String => arg
case arg: Array[Byte] => arg
case arg: Map[_, _] if arg.isEmpty || arg.head._1.isInstanceOf[String] && arg.head._2.isInstanceOf[String] => arg
+ case arg: NBTTagCompound => arg
case arg =>
OpenComputers.log.warn("Trying to push signal with an unsupported argument of type " + arg.getClass.getName)
null
@@ -247,7 +248,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
}
})
- override def popSignal(): Machine.Signal = signals.synchronized(if (signals.isEmpty) null else signals.dequeue())
+ override def popSignal(): Machine.Signal = signals.synchronized(if (signals.isEmpty) null else signals.dequeue().convert())
override def methods(value: scala.AnyRef) = Callbacks(value).map(entry => {
val (name, callback) = entry
@@ -628,6 +629,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
data += tag.getStringTagAt(i) -> tag.getStringTagAt(i + 1)
}
data
+ case tag: NBTTagCompound => tag
case _ => null
}.toArray[AnyRef])
})
@@ -705,6 +707,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
list.append(value.toString)
}
args.setTag("arg" + i, list)
+ case (arg: NBTTagCompound, i) => args.setTag("arg" + i, arg)
case (_, i) => args.setByte("arg" + i, -1)
}
})
@@ -936,7 +939,9 @@ object Machine extends MachineAPI {
}
/** Signals are messages sent to the Lua state from Java asynchronously. */
- private[machine] class Signal(val name: String, val args: Array[AnyRef]) extends machine.Signal
+ private[machine] class Signal(val name: String, val args: Array[AnyRef]) extends machine.Signal {
+ def convert() = new Signal(name, Registry.convert(args))
+ }
private val threadPool = ThreadPoolFactory.create("Computer", Settings.get.threads)
}
\ No newline at end of file