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