Merge branch 'master-MC1.7.10' of github.com:MightyPirates/OpenComputers into master-MC1.8.9

# Conflicts:
#	src/main/java/li/cil/oc/api/driver/MethodWhitelist.java
#	src/main/java/li/cil/oc/api/driver/NamedBlock.java
#	src/main/scala/li/cil/oc/common/tileentity/Adapter.scala
This commit is contained in:
Florian Nücke 2016-02-27 19:33:16 +01:00
commit 3b64c413cf
4 changed files with 35 additions and 34 deletions

View File

@ -15,7 +15,7 @@ package li.cil.oc.api.driver;
* suppress inventory functionality if your TileEntity implements IInventory. * suppress inventory functionality if your TileEntity implements IInventory.
* <p/> * <p/>
* To do so, implement this interface in the <em>environment</em> that you * To do so, implement this interface in the <em>environment</em> that you
* return from your driver's {@link Block#createEnvironment(net.minecraft.world.World, net.minecraft.util.BlockPos)} * return from your driver's {@link SidedBlock#createEnvironment(net.minecraft.world.World, net.minecraft.util.BlockPos, net.minecraft.util.EnumFacing)}
* method, and provide the names of the allowed methods from {@link #whitelistedMethods()}. * method, and provide the names of the allowed methods from {@link #whitelistedMethods()}.
* <p/> * <p/>
* <em>Important</em>: if multiple drivers apply to a single block that each * <em>Important</em>: if multiple drivers apply to a single block that each

View File

@ -7,7 +7,7 @@ package li.cil.oc.api.driver;
* <p/> * <p/>
* This was previously to be implemented on the driver itself, but that has been * This was previously to be implemented on the driver itself, but that has been
* deprecated. Implement it in the environment returned from the block driver's * deprecated. Implement it in the environment returned from the block driver's
* {@link Block#createEnvironment(net.minecraft.world.World, net.minecraft.util.BlockPos)} * {@link SidedBlock#createEnvironment(net.minecraft.world.World, net.minecraft.util.BlockPos, net.minecraft.util.EnumFacing)}
* method instead. * method instead.
*/ */
public interface NamedBlock { public interface NamedBlock {

View File

@ -19,7 +19,7 @@ import scala.collection.mutable
class Adapter extends traits.Environment with traits.ComponentInventory with Analyzable with internal.Adapter { class Adapter extends traits.Environment with traits.ComponentInventory with Analyzable with internal.Adapter {
val node = api.Network.newNode(this, Visibility.Network).create() val node = api.Network.newNode(this, Visibility.Network).create()
private val blocks = Array.fill[Option[(ManagedEnvironment, api.driver.Block)]](6)(None) private val blocks = Array.fill[Option[(ManagedEnvironment, api.driver.SidedBlock)]](6)(None)
private val updatingBlocks = mutable.ArrayBuffer.empty[ManagedEnvironment] private val updatingBlocks = mutable.ArrayBuffer.empty[ManagedEnvironment]
@ -55,7 +55,7 @@ class Adapter extends traits.Environment with traits.ComponentInventory with Ana
// but the only 'downside' is that it can't be used to manipulate // but the only 'downside' is that it can't be used to manipulate
// inventories, which I actually consider a plus :P // inventories, which I actually consider a plus :P
case _ => case _ =>
Option(api.Driver.driverFor(world, blockPos)) match { Option(api.Driver.driverFor(world, blockPos, d)) match {
case Some(newDriver) => blocks(d.ordinal()) match { case Some(newDriver) => blocks(d.ordinal()) match {
case Some((oldEnvironment, driver)) => case Some((oldEnvironment, driver)) =>
if (newDriver != driver) { if (newDriver != driver) {
@ -66,7 +66,7 @@ class Adapter extends traits.Environment with traits.ComponentInventory with Ana
node.disconnect(oldEnvironment.node) node.disconnect(oldEnvironment.node)
// Then rebuild - if we have something. // Then rebuild - if we have something.
val environment = newDriver.createEnvironment(world, blockPos) val environment = newDriver.createEnvironment(world, blockPos, d)
if (environment != null) { if (environment != null) {
blocks(d.ordinal()) = Some((environment, newDriver)) blocks(d.ordinal()) = Some((environment, newDriver))
if (environment.canUpdate) { if (environment.canUpdate) {
@ -78,7 +78,7 @@ class Adapter extends traits.Environment with traits.ComponentInventory with Ana
} // else: the more things change, the more they stay the same. } // else: the more things change, the more they stay the same.
case _ => case _ =>
// A challenger appears. Maybe. // A challenger appears. Maybe.
val environment = newDriver.createEnvironment(world, blockPos) val environment = newDriver.createEnvironment(world, blockPos, d)
if (environment != null) { if (environment != null) {
blocks(d.ordinal()) = Some((environment, newDriver)) blocks(d.ordinal()) = Some((environment, newDriver))
if (environment.canUpdate) { if (environment.canUpdate) {

View File

@ -298,35 +298,36 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach
} }
} }
override def signal(name: String, args: AnyRef*) = state.synchronized(state.top match { override def signal(name: String, args: AnyRef*): Boolean = {
case Machine.State.Stopped | Machine.State.Stopping => false state.synchronized(state.top match {
case _ => signals.synchronized { case Machine.State.Stopped | Machine.State.Stopping => return false
if (signals.size >= 256) false case _ => signals.synchronized {
else if (args == null) { if (signals.size >= 256) return false
signals.enqueue(new Machine.Signal(name, Array.empty)) else if (args == null) {
if (architecture != null) architecture.onSignal() signals.enqueue(new Machine.Signal(name, Array.empty))
true }
else {
signals.enqueue(new Machine.Signal(name, args.map {
case null | Unit | None => null
case arg: java.lang.Boolean => arg
case arg: java.lang.Character => Double.box(arg.toDouble)
case arg: java.lang.Long => arg
case arg: java.lang.Number => Double.box(arg.doubleValue)
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
}.toArray[AnyRef]))
}
} }
else { })
signals.enqueue(new Machine.Signal(name, args.map {
case null | Unit | None => null if (architecture != null) architecture.onSignal()
case arg: java.lang.Boolean => arg true
case arg: java.lang.Character => Double.box(arg.toDouble) }
case arg: java.lang.Long => arg
case arg: java.lang.Number => Double.box(arg.doubleValue)
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
}.toArray[AnyRef]))
if (architecture != null) architecture.onSignal()
true
}
}
})
override def popSignal(): Machine.Signal = signals.synchronized(if (signals.isEmpty) null else signals.dequeue().convert()) override def popSignal(): Machine.Signal = signals.synchronized(if (signals.isEmpty) null else signals.dequeue().convert())