blob: 53b1c844bc3b6042e9383a42f6944ccb1886d98a [file] [log] [blame] [raw]
package li.cil.oc.server.component
import li.cil.oc.api.Network
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.Visibility
import li.cil.oc.api.prefab
import net.minecraft.nbt.NBTTagCompound
trait RedstoneSignaller extends prefab.ManagedEnvironment {
override val node = Network.newNode(this, Visibility.Network).
withComponent("redstone", Visibility.Neighbors).
create()
var wakeThreshold = 0
var wakeNeighborsOnly = true
// ----------------------------------------------------------------------- //
@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):number -- Set the wake-up threshold.""")
def setWakeThreshold(context: Context, args: Arguments): Array[AnyRef] = {
val oldThreshold = wakeThreshold
wakeThreshold = args.checkInteger(0)
result(oldThreshold)
}
// ----------------------------------------------------------------------- //
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) {
if (wakeNeighborsOnly)
node.sendToNeighbors("computer.start")
else
node.sendToReachable("computer.start")
}
}
// ----------------------------------------------------------------------- //
override def load(nbt: NBTTagCompound): Unit = {
super.load(nbt)
wakeThreshold = nbt.getInteger("wakeThreshold")
}
override def save(nbt: NBTTagCompound): Unit = {
super.save(nbt)
nbt.setInteger("wakeThreshold", wakeThreshold)
}
}