Extend OpenComputers Transposers to support fluid transfer rate upgrades (#150)

Co-authored-by: Martin Robertz <dream-master@gmx.net>
Co-authored-by: Maya <10861407+serenibyss@users.noreply.github.com>
This commit is contained in:
Julia 2025-03-22 15:22:41 +01:00 committed by GitHub
parent 1647ff6597
commit 1531647248
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 120 additions and 10 deletions

View File

@ -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

View File

@ -6,11 +6,19 @@ import li.cil.oc.Settings
import li.cil.oc.client.Textures
import li.cil.oc.common.tileentity
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 java.text.NumberFormat
import java.util
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 +41,34 @@ 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())
}
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 ${NumberFormat.getIntegerInstance.format(transferRate)}L/s.")
super.tooltipBody(metadata, stack, player, tooltip, advanced)
}
}

View File

@ -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()

View File

@ -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
}
}

View File

@ -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)
}
}

View File

@ -54,12 +54,34 @@ object Transposer {
if (result.isEmpty) ServerPacketSender.sendTransposerActivity(host)
result
}
override def fluidTransferRate(): Int = host.info.fluidTransferRate
}
class Upgrade(val host: EnvironmentHost) extends Common {
node.setVisibility(Visibility.Neighbors)
override def position = BlockPosition(host)
override def fluidTransferRate(): Int = {
host match {
case microcontroller: tileentity.Microcontroller =>
microcontroller
.info
.components
.find(_.isItemEqual(api.Items.get(Constants.BlockName.Transposer).createItemStack(1)))
.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(Settings.namespace + "fluidTransferRate"))
.getOrElse(0)
case _ => 0
}
}
}
}

View File

@ -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
@ -13,6 +12,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)
@ -54,9 +55,19 @@ 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 / Settings.get.transposerFluidTransferRate) // Allow up to 16 buckets per second.
val delay = moved.toDouble / fluidTransferRate.toDouble - 0.05
if (delay > 0) context.pause(delay)
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())
}
}