From f981a05c0f6bb7f803e8cc94cf4224ed2688a07f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 15 Jan 2015 19:39:43 +0100 Subject: [PATCH] Added `redstone.get/setWakeThreshold`, allows setting a redstone signal threshold that, when crossed from low to high causes connect computers to start. --- .../server/component/RedstoneSignaller.scala | 44 ++++++++++++++++--- .../oc/server/component/RedstoneVanilla.scala | 5 +-- .../server/component/RedstoneWireless.scala | 5 +-- .../li/cil/oc/server/machine/Machine.scala | 4 +- 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/RedstoneSignaller.scala b/src/main/scala/li/cil/oc/server/component/RedstoneSignaller.scala index 8ea7c31a4..1b911599e 100644 --- a/src/main/scala/li/cil/oc/server/component/RedstoneSignaller.scala +++ b/src/main/scala/li/cil/oc/server/component/RedstoneSignaller.scala @@ -1,12 +1,44 @@ package li.cil.oc.server.component -import li.cil.oc.api.Persistable -import li.cil.oc.api.network.Node +import li.cil.oc.Settings +import li.cil.oc.api.machine.Arguments +import li.cil.oc.api.machine.Callback +import li.cil.oc.api.machine.Context +import li.cil.oc.api.prefab +import net.minecraft.nbt.NBTTagCompound -trait RedstoneSignaller extends Persistable { - def node: Node +trait RedstoneSignaller extends prefab.ManagedEnvironment { + var wakeThreshold = 0 - def onRedstoneChanged(side: AnyRef, oldMaxValue: AnyRef, newMaxValue: AnyRef): Unit = { - node.sendToReachable("computer.signal", "redstone_changed", side, oldMaxValue, newMaxValue) + // ----------------------------------------------------------------------- // + + @Callback(direct = true, doc = """function():number -- Get the current wake-up threshold.""") + def getWakeThreshold(context: Context, args: Arguments): Array[AnyRef] = result(wakeThreshold) + + @Callback(doc = """function(threshold:number) -- Set the wake-up threshold.""") + def setWakeThreshold(context: Context, args: Arguments): Array[AnyRef] = { + wakeThreshold = args.checkInteger(0) + null + } + + // ----------------------------------------------------------------------- // + + def onRedstoneChanged(side: AnyRef, oldMaxValue: Int, newMaxValue: Int): Unit = { + node.sendToReachable("computer.signal", "redstone_changed", side, int2Integer(oldMaxValue), int2Integer(newMaxValue)) + if (oldMaxValue < wakeThreshold && newMaxValue >= wakeThreshold) { + node.sendToNeighbors("computer.start") + } + } + + // ----------------------------------------------------------------------- // + + override def load(nbt: NBTTagCompound): Unit = { + super.load(nbt) + wakeThreshold = nbt.getInteger(Settings.namespace + "wakeThreshold") + } + + override def save(nbt: NBTTagCompound): Unit = { + super.save(nbt) + nbt.setInteger(Settings.namespace + "wakeThreshold", wakeThreshold) } } diff --git a/src/main/scala/li/cil/oc/server/component/RedstoneVanilla.scala b/src/main/scala/li/cil/oc/server/component/RedstoneVanilla.scala index fd83cc951..4196fa9f8 100644 --- a/src/main/scala/li/cil/oc/server/component/RedstoneVanilla.scala +++ b/src/main/scala/li/cil/oc/server/component/RedstoneVanilla.scala @@ -6,11 +6,10 @@ import li.cil.oc.api.machine.Arguments import li.cil.oc.api.machine.Callback import li.cil.oc.api.machine.Context import li.cil.oc.api.network._ -import li.cil.oc.api.prefab import li.cil.oc.common.tileentity.traits.RedstoneAware import net.minecraftforge.common.util.ForgeDirection -trait RedstoneVanilla extends prefab.ManagedEnvironment with RedstoneSignaller { +trait RedstoneVanilla extends RedstoneSignaller { override val node = Network.newNode(this, Visibility.Network). withComponent("redstone", Visibility.Neighbors). create() @@ -46,7 +45,7 @@ trait RedstoneVanilla extends prefab.ManagedEnvironment with RedstoneSignaller { super.onMessage(message) if (message.name == "redstone.changed") message.data match { case Array(side: ForgeDirection, oldMaxValue: Number, newMaxValue: Number) => - onRedstoneChanged(int2Integer(side.ordinal()), oldMaxValue, newMaxValue) + onRedstoneChanged(int2Integer(side.ordinal()), oldMaxValue.intValue(), newMaxValue.intValue()) case _ => } } diff --git a/src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala b/src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala index dbcd54f2c..37df26e97 100644 --- a/src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala +++ b/src/main/scala/li/cil/oc/server/component/RedstoneWireless.scala @@ -9,7 +9,6 @@ import li.cil.oc.api.machine.Arguments import li.cil.oc.api.machine.Callback import li.cil.oc.api.machine.Context import li.cil.oc.api.network._ -import li.cil.oc.api.prefab import li.cil.oc.common.EventHandler import li.cil.oc.integration.Mods import li.cil.oc.integration.util @@ -19,7 +18,7 @@ import net.minecraft.nbt.NBTTagCompound new Optional.Interface(iface = "codechicken.wirelessredstone.core.WirelessReceivingDevice", modid = Mods.IDs.WirelessRedstoneCBE), new Optional.Interface(iface = "codechicken.wirelessredstone.core.WirelessTransmittingDevice", modid = Mods.IDs.WirelessRedstoneCBE) )) -trait RedstoneWireless extends prefab.ManagedEnvironment with RedstoneSignaller with WirelessReceivingDevice with WirelessTransmittingDevice { +trait RedstoneWireless extends RedstoneSignaller with WirelessReceivingDevice with WirelessTransmittingDevice { def redstone: EnvironmentHost var wirelessFrequency = 0 @@ -77,7 +76,7 @@ trait RedstoneWireless extends prefab.ManagedEnvironment with RedstoneSignaller override def updateDevice(frequency: Int, on: Boolean) { if (frequency == wirelessFrequency && on != wirelessInput) { wirelessInput = on - onRedstoneChanged("wireless", boolean2Boolean(!on), boolean2Boolean(on)) + onRedstoneChanged("wireless", if (on) 0 else 1, if (on) 1 else 0) } } 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 565afbd5d..31fd20ce6 100644 --- a/src/main/scala/li/cil/oc/server/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/machine/Machine.scala @@ -90,7 +90,7 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach override def getBootAddress = bootAddress - override def setBootAddress(value: String) = bootAddress = Option(value).map(_.take(36)).getOrElse("") + override def setBootAddress(value: String) = bootAddress = Option(value).fold("")(_.take(36)) override def components = scala.collection.convert.WrapAsJava.mapAsJavaMap(_components) @@ -490,6 +490,8 @@ class Machine(val host: MachineHost) extends prefab.ManagedEnvironment with mach if (canInteract(player.getCommandSenderName)) signal(name, Seq(message.source.address) ++ args: _*) case _ => + if (message.name == "computer.start" && !isPaused) start() + else if (message.name == "computer.stop") stop() } }