blob: 375e8f1417dbe66b1de0bf3a3166422bb27ebcb1 [file] [log] [blame] [raw]
package li.cil.oc.integration.util
import li.cil.oc.integration.Mods
import li.cil.oc.util.BlockPosition
import li.cil.oc.util.ExtendedWorld._
import net.minecraftforge.common.util.ForgeDirection
import scala.collection.mutable
object BundledRedstone {
val providers = mutable.Buffer.empty[RedstoneProvider]
def addProvider(provider: RedstoneProvider): Unit = providers += provider
def isAvailable = Mods.MineFactoryReloaded.isAvailable || providers.nonEmpty
def computeInput(pos: BlockPosition, side: ForgeDirection): Int = {
if (pos.world.get.blockExists(pos.offset(side)))
providers.map(_.computeInput(pos, side)).padTo(1, 0).max
else 0
}
def computeBundledInput(pos: BlockPosition, side: ForgeDirection): Array[Int] = {
if (pos.world.get.blockExists(pos.offset(side))) {
val inputs = providers.map(_.computeBundledInput(pos, side)).filter(_ != null)
if (inputs.isEmpty) null
else inputs.reduce((a, b) => (a, b).zipped.map((l, r) => math.max(l, r)))
}
else null
}
trait RedstoneProvider {
def computeInput(pos: BlockPosition, side: ForgeDirection): Int
def computeBundledInput(pos: BlockPosition, side: ForgeDirection): Array[Int]
}
}