From 9448c7ab51cd43bdff1e6921b01187658e30746d Mon Sep 17 00:00:00 2001 From: DadamaldaDad Date: Thu, 15 Oct 2026 17:28:11 +0200 Subject: [PATCH] Add drivers for blast furnaces and smokers --- .../minecraft/DriverBlastFurnace.scala | 26 ++++++++++ .../integration/minecraft/DriverFurnace.scala | 49 ++----------------- .../integration/minecraft/DriverSmoker.scala | 26 ++++++++++ .../minecraft/EnvironmentFurnace.scala | 38 ++++++++++++++ .../integration/minecraft/ModMinecraft.scala | 4 ++ 5 files changed, 99 insertions(+), 44 deletions(-) create mode 100644 src/main/scala/li/cil/oc/integration/minecraft/DriverBlastFurnace.scala create mode 100644 src/main/scala/li/cil/oc/integration/minecraft/DriverSmoker.scala create mode 100644 src/main/scala/li/cil/oc/integration/minecraft/EnvironmentFurnace.scala diff --git a/src/main/scala/li/cil/oc/integration/minecraft/DriverBlastFurnace.scala b/src/main/scala/li/cil/oc/integration/minecraft/DriverBlastFurnace.scala new file mode 100644 index 0000000000..b7430e0705 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/minecraft/DriverBlastFurnace.scala @@ -0,0 +1,26 @@ +package li.cil.oc.integration.minecraft + +import li.cil.oc.api.driver.EnvironmentProvider +import li.cil.oc.api.network.ManagedEnvironment +import li.cil.oc.api.prefab.DriverSidedBlockEntity +import net.minecraft.core.{BlockPos, Direction} +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.entity.{AbstractFurnaceBlockEntity, BlastFurnaceBlockEntity} +import net.minecraft.world.level.block.{Block, Blocks} + +object DriverBlastFurnace extends DriverSidedBlockEntity { + override def getBlockEntityClass: Class[_] = classOf[BlastFurnaceBlockEntity] + + override def createEnvironment(world: Level, pos: BlockPos, side: Direction): ManagedEnvironment = + new EnvironmentFurnace(world.getBlockEntity(pos).asInstanceOf[AbstractFurnaceBlockEntity], "blast_furnace") + + object Provider extends EnvironmentProvider { + override def getEnvironment(stack: ItemStack): Class[_] = { + if (!stack.isEmpty && Block.byItem(stack.getItem) == Blocks.BLAST_FURNACE) + classOf[EnvironmentFurnace] + else null + } + } + +} diff --git a/src/main/scala/li/cil/oc/integration/minecraft/DriverFurnace.scala b/src/main/scala/li/cil/oc/integration/minecraft/DriverFurnace.scala index eda0dd8afd..4d7e0aa093 100644 --- a/src/main/scala/li/cil/oc/integration/minecraft/DriverFurnace.scala +++ b/src/main/scala/li/cil/oc/integration/minecraft/DriverFurnace.scala @@ -1,63 +1,24 @@ package li.cil.oc.integration.minecraft import li.cil.oc.api.driver.EnvironmentProvider -import li.cil.oc.api.driver.NamedBlock -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.ManagedEnvironment import li.cil.oc.api.prefab.DriverSidedBlockEntity -import li.cil.oc.integration.ManagedBlockEntityEnvironment -import li.cil.oc.util.ResultWrapper.result -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.Blocks +import net.minecraft.core.{BlockPos, Direction} import net.minecraft.world.item.ItemStack -import net.minecraft.core.Direction -import net.minecraft.core.BlockPos import net.minecraft.world.level.Level -import net.minecraft.world.level.block.entity.FurnaceBlockEntity +import net.minecraft.world.level.block.{Block, Blocks} +import net.minecraft.world.level.block.entity.{AbstractFurnaceBlockEntity, FurnaceBlockEntity} object DriverFurnace extends DriverSidedBlockEntity { override def getBlockEntityClass: Class[_] = classOf[FurnaceBlockEntity] override def createEnvironment(world: Level, pos: BlockPos, side: Direction): ManagedEnvironment = - new Environment(world.getBlockEntity(pos).asInstanceOf[FurnaceBlockEntity]) - - final class Environment(tileEntity: FurnaceBlockEntity) extends ManagedBlockEntityEnvironment[FurnaceBlockEntity](tileEntity, "furnace") with NamedBlock { - override def preferredName = "furnace" - - override def priority = 0 - - @Callback(doc = "function():number -- The number of ticks that the furnace will keep burning from the last consumed fuel.") - def getBurnTime(context: Context, args: Arguments): Array[AnyRef] = { - result(tileEntity.litTime) - } - - @Callback(doc = "function():number -- The number of ticks that the currently burning fuel lasts in total.") - def getCurrentItemBurnTime(context: Context, args: Arguments): Array[AnyRef] = { - result(tileEntity.litDuration) - } - - @Callback(doc = "function():number -- The number of ticks that the current item has been cooking for.") - def getCookTime(context: Context, args: Arguments): Array[AnyRef] = { - result(tileEntity.cookingProgress) - } - - @Callback(doc = "function():number -- The number of ticks that the current item needs to cook.") - def getTotalCookTime(context: Context, args: Arguments): Array[AnyRef] = { - result(tileEntity.cookingTotalTime) - } - - @Callback(doc = "function():boolean -- Get whether the furnace is currently active.") - def isBurning(context: Context, args: Arguments): Array[AnyRef] = { - result(tileEntity.litTime > 0) - } - } + new EnvironmentFurnace(world.getBlockEntity(pos).asInstanceOf[AbstractFurnaceBlockEntity], "furnace") object Provider extends EnvironmentProvider { override def getEnvironment(stack: ItemStack): Class[_] = { if (!stack.isEmpty && Block.byItem(stack.getItem) == Blocks.FURNACE) - classOf[Environment] + classOf[EnvironmentFurnace] else null } } diff --git a/src/main/scala/li/cil/oc/integration/minecraft/DriverSmoker.scala b/src/main/scala/li/cil/oc/integration/minecraft/DriverSmoker.scala new file mode 100644 index 0000000000..ae428adba8 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/minecraft/DriverSmoker.scala @@ -0,0 +1,26 @@ +package li.cil.oc.integration.minecraft + +import li.cil.oc.api.driver.EnvironmentProvider +import li.cil.oc.api.network.ManagedEnvironment +import li.cil.oc.api.prefab.DriverSidedBlockEntity +import net.minecraft.core.{BlockPos, Direction} +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.entity.{AbstractFurnaceBlockEntity, SmokerBlockEntity} +import net.minecraft.world.level.block.{Block, Blocks} + +object DriverSmoker extends DriverSidedBlockEntity { + override def getBlockEntityClass: Class[_] = classOf[SmokerBlockEntity] + + override def createEnvironment(world: Level, pos: BlockPos, side: Direction): ManagedEnvironment = + new EnvironmentFurnace(world.getBlockEntity(pos).asInstanceOf[AbstractFurnaceBlockEntity], "smoker") + + object Provider extends EnvironmentProvider { + override def getEnvironment(stack: ItemStack): Class[_] = { + if (!stack.isEmpty && Block.byItem(stack.getItem) == Blocks.SMOKER) + classOf[EnvironmentFurnace] + else null + } + } + +} diff --git a/src/main/scala/li/cil/oc/integration/minecraft/EnvironmentFurnace.scala b/src/main/scala/li/cil/oc/integration/minecraft/EnvironmentFurnace.scala new file mode 100644 index 0000000000..37d23c386a --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/minecraft/EnvironmentFurnace.scala @@ -0,0 +1,38 @@ +package li.cil.oc.integration.minecraft + +import li.cil.oc.api.driver.NamedBlock +import li.cil.oc.api.machine.{Arguments, Callback, Context} +import li.cil.oc.integration.ManagedBlockEntityEnvironment +import li.cil.oc.util.ResultWrapper.result +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity + +final class EnvironmentFurnace(tileEntity: AbstractFurnaceBlockEntity, name: String) extends ManagedBlockEntityEnvironment[AbstractFurnaceBlockEntity](tileEntity, name) with NamedBlock { + override def preferredName: String = name + + override def priority = 0 + + @Callback(doc = "function():number -- The number of ticks that the furnace will keep burning from the last consumed fuel.") + def getBurnTime(context: Context, args: Arguments): Array[AnyRef] = { + result(tileEntity.litTime) + } + + @Callback(doc = "function():number -- The number of ticks that the currently burning fuel lasts in total.") + def getCurrentItemBurnTime(context: Context, args: Arguments): Array[AnyRef] = { + result(tileEntity.litDuration) + } + + @Callback(doc = "function():number -- The number of ticks that the current item has been cooking for.") + def getCookTime(context: Context, args: Arguments): Array[AnyRef] = { + result(tileEntity.cookingProgress) + } + + @Callback(doc = "function():number -- The number of ticks that the current item needs to cook.") + def getTotalCookTime(context: Context, args: Arguments): Array[AnyRef] = { + result(tileEntity.cookingTotalTime) + } + + @Callback(doc = "function():boolean -- Get whether the furnace is currently active.") + def isBurning(context: Context, args: Arguments): Array[AnyRef] = { + result(tileEntity.litTime > 0) + } +} diff --git a/src/main/scala/li/cil/oc/integration/minecraft/ModMinecraft.scala b/src/main/scala/li/cil/oc/integration/minecraft/ModMinecraft.scala index a7cd8e450b..9ff3f453c6 100644 --- a/src/main/scala/li/cil/oc/integration/minecraft/ModMinecraft.scala +++ b/src/main/scala/li/cil/oc/integration/minecraft/ModMinecraft.scala @@ -20,6 +20,8 @@ object ModMinecraft extends ModProxy with RedstoneProvider { Driver.add(DriverBrewingStand) Driver.add(DriverComparator) Driver.add(DriverFurnace) + Driver.add(DriverBlastFurnace) + Driver.add(DriverSmoker) Driver.add(DriverMobSpawner) Driver.add(DriverNoteBlock) Driver.add(DriverRecordPlayer) @@ -28,6 +30,8 @@ object ModMinecraft extends ModProxy with RedstoneProvider { Driver.add(DriverBrewingStand.Provider) Driver.add(DriverComparator.Provider) Driver.add(DriverFurnace.Provider) + Driver.add(DriverBlastFurnace.Provider) + Driver.add(DriverSmoker.Provider) Driver.add(DriverMobSpawner.Provider) Driver.add(DriverNoteBlock.Provider) Driver.add(DriverRecordPlayer.Provider)