Allow pushing NBTTagCompounds as signals and added converter for NBTTagCompound.

This commit is contained in:
Florian Nücke 2015-02-01 23:02:11 +01:00
parent 8092fae0a1
commit 0fdbd38643
4 changed files with 44 additions and 2 deletions

View File

@ -153,6 +153,7 @@ public interface Context {
* <li>Strings.</li> * <li>Strings.</li>
* <li>Byte arrays (which appear as strings on the Lua side, e.g.).</li> * <li>Byte arrays (which appear as strings on the Lua side, e.g.).</li>
* <li>Maps if and only if both keys and values are strings.</li> * <li>Maps if and only if both keys and values are strings.</li>
* <li>NBTTagCompounds.</li>
* </ul> * </ul>
* If an unsupported type is specified the method will enqueue nothing * If an unsupported type is specified the method will enqueue nothing
* instead, resulting in a <tt>nil</tt> on the Lua side, e.g., and log a * instead, resulting in a <tt>nil</tt> on the Lua side, e.g., and log a

View File

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

View File

@ -31,5 +31,6 @@ object ModVanilla extends ModProxy {
Driver.add(ConverterFluidStack) Driver.add(ConverterFluidStack)
Driver.add(ConverterFluidTankInfo) Driver.add(ConverterFluidTankInfo)
Driver.add(ConverterItemStack) Driver.add(ConverterItemStack)
Driver.add(ConverterNBT)
} }
} }

View File

@ -238,6 +238,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
case arg: java.lang.String => arg case arg: java.lang.String => arg
case arg: Array[Byte] => 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: Map[_, _] if arg.isEmpty || arg.head._1.isInstanceOf[String] && arg.head._2.isInstanceOf[String] => arg
case arg: NBTTagCompound => arg
case arg => case arg =>
OpenComputers.log.warn("Trying to push signal with an unsupported argument of type " + arg.getClass.getName) OpenComputers.log.warn("Trying to push signal with an unsupported argument of type " + arg.getClass.getName)
null 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 => { override def methods(value: scala.AnyRef) = Callbacks(value).map(entry => {
val (name, callback) = 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 += tag.getStringTagAt(i) -> tag.getStringTagAt(i + 1)
} }
data data
case tag: NBTTagCompound => tag
case _ => null case _ => null
}.toArray[AnyRef]) }.toArray[AnyRef])
}) })
@ -705,6 +707,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
list.append(value.toString) list.append(value.toString)
} }
args.setTag("arg" + i, list) args.setTag("arg" + i, list)
case (arg: NBTTagCompound, i) => args.setTag("arg" + i, arg)
case (_, i) => args.setByte("arg" + i, -1) 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. */ /** 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) private val threadPool = ThreadPoolFactory.create("Computer", Settings.get.threads)
} }