blob: 34637a4696c452e035ce39df3174466d8b8062a1 [file] [log] [blame] [raw]
package li.cil.oc.server.component
import li.cil.oc.Items
import li.cil.oc.api.driver.Slot
import li.cil.oc.api.machine.Owner
import li.cil.oc.api.network.{Message, Node}
import li.cil.oc.api.{Driver, Machine, driver}
import li.cil.oc.common.inventory.ComponentInventory
import li.cil.oc.common.inventory.ServerInventory
import li.cil.oc.common.item
import li.cil.oc.common.tileentity
import li.cil.oc.util.ExtendedNBT._
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
class Server(val rack: tileentity.Rack, val number: Int) extends Owner {
val machine = Machine.create(this)
val inventory = new NetworkedInventory()
def tier = Items.multi.subItem(rack.getStackInSlot(number)) match {
case Some(server: item.Server) => server.tier
case _ => 0
}
// ----------------------------------------------------------------------- //
override def node = machine.node
override def start() = machine.start()
override def stop() = machine.stop()
override def pause(seconds: Double) = machine.pause(seconds)
override def isPaused = machine.isPaused
override def isRunning = machine.isRunning
override def signal(name: String, args: AnyRef*) = machine.signal(name, args: _*)
override def canInteract(player: String) = machine.canInteract(player)
// ----------------------------------------------------------------------- //
override def installedMemory = inventory.items.foldLeft(0)((sum, stack) => sum + (stack match {
case Some(item) => Option(Driver.driverFor(item)) match {
case Some(driver: driver.Memory) => driver.amount(item)
case _ => 0
}
case _ => 0
}))
lazy val maxComponents = inventory.items.foldLeft(0)((sum, stack) => sum + (stack match {
case Some(item) => Option(Driver.driverFor(item)) match {
case Some(driver: driver.Processor) => driver.supportedComponents(item)
case _ => 0
}
case _ => 0
}))
def hasCPU = inventory.items.exists {
case Some(stack) => Option(Driver.driverFor(stack)) match {
case Some(driver) => driver.slot(stack) == Slot.Processor
case _ => false
}
case _ => false
}
override def x = rack.x
override def y = rack.y
override def z = rack.z
override def world = rack.world
override def markAsChanged() = rack.markAsChanged()
// ----------------------------------------------------------------------- //
override def onMachineConnect(node: Node) = inventory.onConnect(node)
override def onMachineDisconnect(node: Node) = inventory.onDisconnect(node)
def load(nbt: NBTTagCompound) {
machine.load(nbt.getCompoundTag("machine"))
}
def save(nbt: NBTTagCompound) {
nbt.setNewCompoundTag("machine", machine.save)
// Dummy tag compound, we just want to flush the components to the actual
// tag compound, which is the one of the stack representing us.
inventory.save(new NBTTagCompound())
inventory.onInventoryChanged()
}
// Required due to abstract overrides in component inventory.
class NetworkedInventory extends ServerInventory with ComponentInventory {
override def onConnect(node: Node) {
if (node == this.node) {
connectComponents()
}
}
override def onDisconnect(node: Node) {
if (node == this.node) {
disconnectComponents()
}
}
override def tier = Server.this.tier
var containerOverride: ItemStack = _
override def container = if (containerOverride != null) containerOverride else rack.getStackInSlot(number)
override def node() = machine.node
override def onMessage(message: Message) {}
override def componentContainer = rack
// Resolves conflict between ComponentInventory and ServerInventory.
override def getInventoryStackLimit = 1
}
}