mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-24 04:50:30 -04:00
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:
parent
1647ff6597
commit
1531647248
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user