Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend OpenComputers Transposers to support fluid transfer rate upgrades #150

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
40 changes: 39 additions & 1 deletion src/main/scala/li/cil/oc/common/block/Transposer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand All @@ -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)
}
}
8 changes: 2 additions & 6 deletions src/main/scala/li/cil/oc/common/init/Items.scala
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -226,6 +221,7 @@ object Items extends ItemAPI {
data.createItemStack()
}


def createConfiguredRobot() = {
val data = new RobotData()

Expand Down
36 changes: 36 additions & 0 deletions src/main/scala/li/cil/oc/common/item/data/TransposerData.scala
Original file line number Diff line number Diff line change
@@ -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
}
}
7 changes: 7 additions & 0 deletions src/main/scala/li/cil/oc/common/tileentity/Transposer.scala
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
}
}
22 changes: 22 additions & 0 deletions src/main/scala/li/cil/oc/server/component/Transposer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}

}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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())
}
}