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 c52690c1b..76a2eef58 100644 --- a/src/main/scala/li/cil/oc/server/component/RedstoneVanilla.scala +++ b/src/main/scala/li/cil/oc/server/component/RedstoneVanilla.scala @@ -7,6 +7,9 @@ import li.cil.oc.api.machine.Callback import li.cil.oc.api.machine.Context import li.cil.oc.api.network._ import li.cil.oc.common.tileentity.traits.RedstoneAware +import li.cil.oc.util.BlockPosition +import li.cil.oc.util.ExtendedWorld._ +import li.cil.oc.util.ExtendedBlock._ import net.minecraftforge.common.util.ForgeDirection trait RedstoneVanilla extends RedstoneSignaller { @@ -36,6 +39,20 @@ trait RedstoneVanilla extends RedstoneSignaller { result(redstone.output(side)) } + @Callback(direct = true, doc = """function(side:number):number -- Get the comparator input on the specified side.""") + def getComparatorInput(context: Context, args: Arguments): Array[AnyRef] = { + val side = checkSide(args, 0) + val blockPos = BlockPosition(redstone).offset(side) + if (redstone.world.blockExists(blockPos)) { + val block = redstone.world.getBlock(blockPos) + if (block.hasComparatorInputOverride) { + val comparatorOverride = block.getComparatorInputOverride(blockPos, side.getOpposite) + return result(comparatorOverride) + } + } + result(0) + } + // ----------------------------------------------------------------------- // override def onMessage(message: Message): Unit = { diff --git a/src/main/scala/li/cil/oc/util/ExtendedBlock.scala b/src/main/scala/li/cil/oc/util/ExtendedBlock.scala index 5dcc0eb77..608f5bb36 100644 --- a/src/main/scala/li/cil/oc/util/ExtendedBlock.scala +++ b/src/main/scala/li/cil/oc/util/ExtendedBlock.scala @@ -1,6 +1,7 @@ package li.cil.oc.util import net.minecraft.block.Block +import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.IFluidBlock import scala.language.implicitConversions @@ -19,6 +20,8 @@ object ExtendedBlock { def getSelectedBoundingBoxFromPool(position: BlockPosition) = block.getSelectedBoundingBoxFromPool(position.world.get, position.x, position.y, position.z) def getCollisionBoundingBoxFromPool(position: BlockPosition) = block.getCollisionBoundingBoxFromPool(position.world.get, position.x, position.y, position.z) + + def getComparatorInputOverride(position: BlockPosition, side: ForgeDirection) = block.getComparatorInputOverride(position.world.get, position.x, position.y, position.z, side.ordinal()) } implicit def extendedFluidBlock(block: IFluidBlock): ExtendedFluidBlock = new ExtendedFluidBlock(block)