From c063bb4853e1f7cb318c5d4477edb5c48fbac4e1 Mon Sep 17 00:00:00 2001 From: Jonathan Brouwer Date: Sun, 23 Feb 2025 17:24:36 +0100 Subject: [PATCH 1/7] Add `fluidTransferRate` logic to transposer Co-authored-by: Julia Dijkstra --- .../cil/oc/common/block/Microcontroller.scala | 2 +- .../li/cil/oc/common/block/Transposer.scala | 27 +++++++++++++- .../scala/li/cil/oc/common/init/Items.scala | 8 ++--- .../oc/common/item/data/TransposerData.scala | 36 +++++++++++++++++++ .../cil/oc/common/tileentity/Transposer.scala | 7 ++++ .../cil/oc/server/component/Transposer.scala | 4 +++ .../component/traits/InventoryTransfer.scala | 4 ++- 7 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 src/main/scala/li/cil/oc/common/item/data/TransposerData.scala diff --git a/src/main/scala/li/cil/oc/common/block/Microcontroller.scala b/src/main/scala/li/cil/oc/common/block/Microcontroller.scala index dc22a4173f..8581bef109 100644 --- a/src/main/scala/li/cil/oc/common/block/Microcontroller.scala +++ b/src/main/scala/li/cil/oc/common/block/Microcontroller.scala @@ -38,7 +38,7 @@ class Microcontroller(protected implicit val tileTag: ClassTag[tileentity.Microc // ----------------------------------------------------------------------- // - override def getPickBlock(target: MovingObjectPosition, world: World, x: Int, y: Int, z: Int) = + override def getPickBlock(target: MovingObjectPosition, world: World, x: Int, y: Int, z: Int, entityPlayer: EntityPlayer) = world.getTileEntity(x, y, z) match { case mcu: tileentity.Microcontroller => mcu.info.copyItemStack() case _ => null diff --git a/src/main/scala/li/cil/oc/common/block/Transposer.scala b/src/main/scala/li/cil/oc/common/block/Transposer.scala index d0c7171494..db391e536b 100644 --- a/src/main/scala/li/cil/oc/common/block/Transposer.scala +++ b/src/main/scala/li/cil/oc/common/block/Transposer.scala @@ -5,12 +5,19 @@ import cpw.mods.fml.relauncher.SideOnly import li.cil.oc.Settings import li.cil.oc.client.Textures import li.cil.oc.common.tileentity +import li.cil.oc.integration.util.NEI import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.entity.EntityLivingBase +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.util.MovingObjectPosition import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection -class Transposer extends SimpleBlock { +import scala.reflect.ClassTag + +class Transposer(protected implicit val tileTag: ClassTag[tileentity.Transposer]) extends SimpleBlock with traits.CustomDrops[tileentity.Transposer] { override protected def customTextures = Array( Some("TransposerTop"), Some("TransposerTop"), @@ -33,4 +40,22 @@ class Transposer extends SimpleBlock { override def hasTileEntity(metadata: Int) = true override def createTileEntity(world: World, metadata: Int) = new tileentity.Transposer() + + override def getPickBlock(target: MovingObjectPosition, world: World, x: Int, y: Int, z: Int, entityPlayer: EntityPlayer) = + world.getTileEntity(x, y, z) match { + case transposer: tileentity.Transposer => transposer.info.copyItemStack() + case _ => null + } + + override protected def doCustomInit(tileEntity: tileentity.Transposer, player: EntityLivingBase, stack: ItemStack): Unit = { + super.doCustomInit(tileEntity, player, stack) + if (!tileEntity.world.isRemote) { + tileEntity.info.load(stack) + } + } + + override protected def doCustomDrops(tileEntity: tileentity.Transposer, player: EntityPlayer, willHarvest: Boolean): Unit = { + super.doCustomDrops(tileEntity, player, willHarvest) + dropBlockAsItem(tileEntity.world, tileEntity.x, tileEntity.y, tileEntity.z, tileEntity.info.createItemStack()) + } } diff --git a/src/main/scala/li/cil/oc/common/init/Items.scala b/src/main/scala/li/cil/oc/common/init/Items.scala index 1051ebf4f6..2d5e376e8e 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -1,7 +1,6 @@ package li.cil.oc.common.init import java.util.concurrent.Callable - import cpw.mods.fml.common.registry.GameRegistry import li.cil.oc.Constants import li.cil.oc.OpenComputers @@ -15,11 +14,7 @@ import li.cil.oc.common.Tier import li.cil.oc.common.block.SimpleBlock import li.cil.oc.common.item import li.cil.oc.common.item.Delegator -import li.cil.oc.common.item.data.DroneData -import li.cil.oc.common.item.data.HoverBootsData -import li.cil.oc.common.item.data.MicrocontrollerData -import li.cil.oc.common.item.data.RobotData -import li.cil.oc.common.item.data.TabletData +import li.cil.oc.common.item.data.{DroneData, HoverBootsData, MicrocontrollerData, RobotData, TabletData, TransposerData} import li.cil.oc.common.item.traits.Delegate import li.cil.oc.common.item.traits.SimpleItem import li.cil.oc.common.recipe.Recipes @@ -226,6 +221,7 @@ object Items extends ItemAPI { data.createItemStack() } + def createConfiguredRobot() = { val data = new RobotData() diff --git a/src/main/scala/li/cil/oc/common/item/data/TransposerData.scala b/src/main/scala/li/cil/oc/common/item/data/TransposerData.scala new file mode 100644 index 0000000000..ff603002ee --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/data/TransposerData.scala @@ -0,0 +1,36 @@ +package li.cil.oc.common.item.data + +import li.cil.oc.{Constants, Settings, api} +import li.cil.oc.common.Tier +import li.cil.oc.util.ExtendedNBT._ +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.common.util.Constants.NBT + +class TransposerData(itemName: String = Constants.BlockName.Transposer) extends ItemData(itemName) { + def this(stack: ItemStack) { + this() + load(stack) + } + + private val FLUID_TRANSFER_RATE: String = Settings.namespace + "fluidTransferRate"; + + var fluidTransferRate: Int = Settings.get.transposerFluidTransferRate + + override def load(nbt: NBTTagCompound) { + if (nbt.hasKey(FLUID_TRANSFER_RATE)) { + fluidTransferRate = nbt.getInteger(FLUID_TRANSFER_RATE) + } + } + + override def save(nbt: NBTTagCompound) { + nbt.setInteger(Settings.namespace + "fluidTransferRate", fluidTransferRate) + } + + def copyItemStack() = { + val stack = createItemStack() + val newInfo = new TransposerData(stack) + newInfo.save(stack) + stack + } +} diff --git a/src/main/scala/li/cil/oc/common/tileentity/Transposer.scala b/src/main/scala/li/cil/oc/common/tileentity/Transposer.scala index 4860a866fd..16edc6fcbc 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Transposer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Transposer.scala @@ -1,9 +1,14 @@ package li.cil.oc.common.tileentity +import li.cil.oc.Settings +import li.cil.oc.common.item.data.TransposerData import li.cil.oc.server.component +import li.cil.oc.util.ExtendedNBT.extendNBTTagCompound import net.minecraft.nbt.NBTTagCompound class Transposer extends traits.Environment { + val info = new TransposerData() + val transposer = new component.Transposer.Block(this) def node = transposer.node @@ -15,11 +20,13 @@ class Transposer extends traits.Environment { override def readFromNBTForServer(nbt: NBTTagCompound) { super.readFromNBTForServer(nbt) + info.load(nbt.getCompoundTag(Settings.namespace + "info")) transposer.load(nbt) } override def writeToNBTForServer(nbt: NBTTagCompound) { super.writeToNBTForServer(nbt) + nbt.setNewCompoundTag(Settings.namespace + "info", info.save) transposer.save(nbt) } } diff --git a/src/main/scala/li/cil/oc/server/component/Transposer.scala b/src/main/scala/li/cil/oc/server/component/Transposer.scala index e2cea4e0d8..aed8edc4b3 100644 --- a/src/main/scala/li/cil/oc/server/component/Transposer.scala +++ b/src/main/scala/li/cil/oc/server/component/Transposer.scala @@ -54,12 +54,16 @@ object Transposer { if (result.isEmpty) ServerPacketSender.sendTransposerActivity(host) result } + + override def fluidTransferRate(): Int = 1024 } class Upgrade(val host: EnvironmentHost) extends Common { node.setVisibility(Visibility.Neighbors) override def position = BlockPosition(host) + + override def fluidTransferRate(): Int = 1024 } } diff --git a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala index be3cc69b4d..1e825924cd 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala @@ -13,6 +13,8 @@ trait InventoryTransfer extends traits.WorldAware with traits.SideRestricted { // Return None on success, else Some("failure reason") def onTransferContents(): Option[String] + def fluidTransferRate(): Int; + @Callback(doc = """function(sourceSide:number, sinkSide:number[, count:number[, sourceSlot:number[, sinkSlot:number]]]):number -- Transfer some items between two inventories.""") def transferItem(context: Context, args: Arguments): Array[AnyRef] = { val sourceSide = checkSideForAction(args, 0) @@ -55,7 +57,7 @@ trait InventoryTransfer extends traits.WorldAware with traits.SideRestricted { result(Unit, reason) case _ => val moved = FluidUtils.transferBetweenFluidHandlersAt(sourcePos, sourceSide.getOpposite, sinkPos, sinkSide.getOpposite, count, sourceTank) - if (moved > 0) context.pause(moved / Settings.get.transposerFluidTransferRate) // Allow up to 16 buckets per second. + if (moved > 0) context.pause(moved / fluidTransferRate()) // Allow up to 16 buckets per second. result(moved > 0, moved) } } From a9d8cb55c86a628af6c6fe871b2a6ebdb732f2f3 Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Sun, 23 Feb 2025 19:08:57 +0100 Subject: [PATCH 2/7] Get correct `fluidTransferRate` for block, microcontroller and robot --- .../cil/oc/server/component/Transposer.scala | 22 +++++++++++++++++-- .../component/traits/InventoryTransfer.scala | 6 ++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/Transposer.scala b/src/main/scala/li/cil/oc/server/component/Transposer.scala index aed8edc4b3..0084a76ad9 100644 --- a/src/main/scala/li/cil/oc/server/component/Transposer.scala +++ b/src/main/scala/li/cil/oc/server/component/Transposer.scala @@ -55,7 +55,7 @@ object Transposer { result } - override def fluidTransferRate(): Int = 1024 + override def fluidTransferRate(): Int = host.info.fluidTransferRate } class Upgrade(val host: EnvironmentHost) extends Common { @@ -63,7 +63,25 @@ object Transposer { override def position = BlockPosition(host) - override def fluidTransferRate(): Int = 1024 + override def fluidTransferRate(): Int = { + host match { + case microcontroller: tileentity.Microcontroller => + microcontroller + .info + .components + .find(_.isItemEqual(api.Items.get("transposer").createItemStack(1))) + .map(_.getTagCompound.getInteger("oc:fluidTransferRate")) + .getOrElse(0) + case robot: tileentity.Robot => + robot + .info + .components + .find(_.isItemEqual(api.Items.get("transposer").createItemStack(1))) + .map(_.getTagCompound.getInteger("oc:fluidTransferRate")) + .getOrElse(0) + case _ => 0 + } + } } } diff --git a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala index 1e825924cd..8dbaedb312 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala @@ -56,8 +56,12 @@ trait InventoryTransfer extends traits.WorldAware with traits.SideRestricted { case Some(reason) => result(Unit, reason) case _ => + val fluidTransferRate = this.fluidTransferRate() + if (fluidTransferRate == 0) { + return result(Unit, "device has fluid transfer rate of 0") + } val moved = FluidUtils.transferBetweenFluidHandlersAt(sourcePos, sourceSide.getOpposite, sinkPos, sinkSide.getOpposite, count, sourceTank) - if (moved > 0) context.pause(moved / fluidTransferRate()) // Allow up to 16 buckets per second. + if (moved > 0) context.pause(moved / fluidTransferRate) result(moved > 0, moved) } } From 569a3e62c2dbd77249f245d2a97d659bd4761c6c Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Sun, 23 Feb 2025 19:23:05 +0100 Subject: [PATCH 3/7] Expose getter for `fluidTransferRate` --- .../cil/oc/server/component/traits/InventoryTransfer.scala | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala index 8dbaedb312..dd6a9da0e7 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala @@ -65,4 +65,9 @@ trait InventoryTransfer extends traits.WorldAware with traits.SideRestricted { result(moved > 0, moved) } } + + @Callback(doc = """function():number -- Returns the fluid transfer rate in liters per second.""") + def getFluidTransferRate(context: Context, args: Arguments): Array[AnyRef] = { + result(fluidTransferRate()) + } } From 47bbd4d3345255b2265dd66e78bc1187fbfca6b5 Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Sun, 23 Feb 2025 19:26:34 +0100 Subject: [PATCH 4/7] Use constants --- src/main/scala/li/cil/oc/server/component/Transposer.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/Transposer.scala b/src/main/scala/li/cil/oc/server/component/Transposer.scala index 0084a76ad9..593eee6306 100644 --- a/src/main/scala/li/cil/oc/server/component/Transposer.scala +++ b/src/main/scala/li/cil/oc/server/component/Transposer.scala @@ -69,14 +69,14 @@ object Transposer { microcontroller .info .components - .find(_.isItemEqual(api.Items.get("transposer").createItemStack(1))) + .find(_.isItemEqual(api.Items.get(Constants.BlockName.Transposer).createItemStack(1))) .map(_.getTagCompound.getInteger("oc:fluidTransferRate")) .getOrElse(0) case robot: tileentity.Robot => robot .info .components - .find(_.isItemEqual(api.Items.get("transposer").createItemStack(1))) + .find(_.isItemEqual(api.Items.get(Constants.BlockName.Transposer).createItemStack(1))) .map(_.getTagCompound.getInteger("oc:fluidTransferRate")) .getOrElse(0) case _ => 0 From 404a118a73585ac9806c2d73dc9715d986a15792 Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Sun, 23 Feb 2025 20:40:35 +0100 Subject: [PATCH 5/7] Set tooltip --- .../scala/li/cil/oc/common/block/Transposer.scala | 13 +++++++++++++ .../li/cil/oc/server/component/Transposer.scala | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/block/Transposer.scala b/src/main/scala/li/cil/oc/common/block/Transposer.scala index db391e536b..40d730af5b 100644 --- a/src/main/scala/li/cil/oc/common/block/Transposer.scala +++ b/src/main/scala/li/cil/oc/common/block/Transposer.scala @@ -15,6 +15,7 @@ import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection +import java.util import scala.reflect.ClassTag class Transposer(protected implicit val tileTag: ClassTag[tileentity.Transposer]) extends SimpleBlock with traits.CustomDrops[tileentity.Transposer] { @@ -58,4 +59,16 @@ class Transposer(protected implicit val tileTag: ClassTag[tileentity.Transposer] super.doCustomDrops(tileEntity, player, willHarvest) dropBlockAsItem(tileEntity.world, tileEntity.x, tileEntity.y, tileEntity.z, tileEntity.info.createItemStack()) } + + override protected def tooltipBody(metadata: Int, stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean): Unit = { + val tag = stack.getTagCompound + val transferRate = + if (tag != null && tag.hasKey(Settings.namespace + "fluidTransferRate")) + tag.getInteger(Settings.namespace + "fluidTransferRate") + else + Settings.get.transposerFluidTransferRate + + tooltip.add(s"Transfers up to ${transferRate}L/s.") + super.tooltipBody(metadata, stack, player, tooltip, advanced) + } } diff --git a/src/main/scala/li/cil/oc/server/component/Transposer.scala b/src/main/scala/li/cil/oc/server/component/Transposer.scala index 593eee6306..771c089e6b 100644 --- a/src/main/scala/li/cil/oc/server/component/Transposer.scala +++ b/src/main/scala/li/cil/oc/server/component/Transposer.scala @@ -70,14 +70,14 @@ object Transposer { .info .components .find(_.isItemEqual(api.Items.get(Constants.BlockName.Transposer).createItemStack(1))) - .map(_.getTagCompound.getInteger("oc:fluidTransferRate")) + .map(_.getTagCompound.getInteger(Settings.namespace + "fluidTransferRate")) .getOrElse(0) case robot: tileentity.Robot => robot .info .components .find(_.isItemEqual(api.Items.get(Constants.BlockName.Transposer).createItemStack(1))) - .map(_.getTagCompound.getInteger("oc:fluidTransferRate")) + .map(_.getTagCompound.getInteger(Settings.namespace + "fluidTransferRate")) .getOrElse(0) case _ => 0 } From a77a17daac6039895a7a7f534214d8f9f3f611e1 Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Wed, 26 Feb 2025 17:31:30 +0100 Subject: [PATCH 6/7] Improve fluid transfer delay resolution from seconds to ticks --- .../li/cil/oc/server/component/traits/InventoryTransfer.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala index dd6a9da0e7..9a12219319 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/InventoryTransfer.scala @@ -1,6 +1,5 @@ package li.cil.oc.server.component.traits -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 @@ -61,7 +60,8 @@ trait InventoryTransfer extends traits.WorldAware with traits.SideRestricted { return result(Unit, "device has fluid transfer rate of 0") } val moved = FluidUtils.transferBetweenFluidHandlersAt(sourcePos, sourceSide.getOpposite, sinkPos, sinkSide.getOpposite, count, sourceTank) - if (moved > 0) context.pause(moved / fluidTransferRate) + val delay = moved.toDouble / fluidTransferRate.toDouble - 0.05 + if (delay > 0) context.pause(delay) result(moved > 0, moved) } } From 9ccad805b53440f791b55c9ff5dc0fa4b98874d0 Mon Sep 17 00:00:00 2001 From: Vlamonster Date: Wed, 26 Feb 2025 18:41:01 +0100 Subject: [PATCH 7/7] Improve tooltip formatting --- src/main/scala/li/cil/oc/common/block/Transposer.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/block/Transposer.scala b/src/main/scala/li/cil/oc/common/block/Transposer.scala index 40d730af5b..8ea87fbff1 100644 --- a/src/main/scala/li/cil/oc/common/block/Transposer.scala +++ b/src/main/scala/li/cil/oc/common/block/Transposer.scala @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly import li.cil.oc.Settings import li.cil.oc.client.Textures import li.cil.oc.common.tileentity -import li.cil.oc.integration.util.NEI import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.player.EntityPlayer @@ -15,6 +14,7 @@ import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection +import java.text.NumberFormat import java.util import scala.reflect.ClassTag @@ -68,7 +68,7 @@ class Transposer(protected implicit val tileTag: ClassTag[tileentity.Transposer] else Settings.get.transposerFluidTransferRate - tooltip.add(s"Transfers up to ${transferRate}L/s.") + tooltip.add(s"Transfers up to ${NumberFormat.getIntegerInstance.format(transferRate)}L/s.") super.tooltipBody(metadata, stack, player, tooltip, advanced) } }