Added some more utility methods for database component to allow manipulating slots (copy and clear).

This commit is contained in:
Florian Nücke 2014-11-27 18:04:34 +01:00
parent ef5e6e0b5b
commit 62e669ec9d

View File

@ -1,9 +1,14 @@
package li.cil.oc.server.component package li.cil.oc.server.component
import com.google.common.hash.Hashing import com.google.common.hash.Hashing
import li.cil.oc.api.machine.{Arguments, Callback, Context} import li.cil.oc.api.Network
import li.cil.oc.api.network.{Component, Visibility} import li.cil.oc.api.internal
import li.cil.oc.api.{Network, internal, prefab} import li.cil.oc.api.machine.Arguments
import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context
import li.cil.oc.api.network.Component
import li.cil.oc.api.network.Visibility
import li.cil.oc.api.prefab
import li.cil.oc.util.ExtendedArguments._ import li.cil.oc.util.ExtendedArguments._
import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ExtendedNBT._
import net.minecraft.inventory.IInventory import net.minecraft.inventory.IInventory
@ -37,21 +42,38 @@ class UpgradeDatabase(val data: IInventory) extends prefab.ManagedEnvironment wi
@Callback(doc = "function(hash:string):number -- Get the index of an item stack with the specified hash. Returns a negative value if no such stack was found.") @Callback(doc = "function(hash:string):number -- Get the index of an item stack with the specified hash. Returns a negative value if no such stack was found.")
def indexOf(context: Context, args: Arguments): Array[AnyRef] = result(indexOf(args.checkString(0), 1)) def indexOf(context: Context, args: Arguments): Array[AnyRef] = result(indexOf(args.checkString(0), 1))
@Callback(doc = "function(slot:number):boolean -- Clears the specified slot. Returns true if there was something in the slot before.")
def clearSlot(context: Context, args: Arguments): Array[AnyRef] = {
val slot = args.checkInteger(0)
val nonEmpty = data.getStackInSlot(slot) != null
data.setInventorySlotContents(slot, null)
result(nonEmpty)
}
@Callback(doc = "function(fromSlot:number, toSlot:number[, address:string]):boolean -- Copies an entry to another slot, optionally to another database. Returns true if something was overwritten.")
def copy(context: Context, args: Arguments): Array[AnyRef] = {
val fromSlot = args.checkSlot(data, 0)
val entry = data.getStackInSlot(fromSlot)
def set(inventory: IInventory) = {
val toSlot = args.checkSlot(inventory, 1)
val nonEmpty = inventory.getStackInSlot(toSlot) != null
inventory.setInventorySlotContents(toSlot, entry)
result(nonEmpty)
}
if (args.count > 2) withDatabase(args.checkString(2), database => set(database.data))
else set(data)
}
@Callback(doc = "function(address:string):number -- Copies the data stored in this database to another database with the specified address.") @Callback(doc = "function(address:string):number -- Copies the data stored in this database to another database with the specified address.")
def clone(context: Context, args: Arguments): Array[AnyRef] = { def clone(context: Context, args: Arguments): Array[AnyRef] = {
node.network.node(args.checkString(0)) match { withDatabase(args.checkString(0), database => {
case component: Component => component.host match { val numberToCopy = math.min(data.getSizeInventory, database.data.getSizeInventory)
case database: UpgradeDatabase => for (slot <- 0 until numberToCopy) {
val numberToCopy = math.min(data.getSizeInventory, database.data.getSizeInventory) database.data.setInventorySlotContents(slot, data.getStackInSlot(slot))
for (slot <- 0 until numberToCopy) {
database.data.setInventorySlotContents(slot, data.getStackInSlot(slot))
}
context.pause(0.25)
result(numberToCopy)
case _ => throw new IllegalArgumentException("not a database")
} }
case _ => throw new IllegalArgumentException("no such component") context.pause(0.25)
} result(numberToCopy)
})
} }
private def indexOf(needle: String, offset: Int = 0): Int = { private def indexOf(needle: String, offset: Int = 0): Int = {
@ -63,4 +85,14 @@ class UpgradeDatabase(val data: IInventory) extends prefab.ManagedEnvironment wi
} }
-1 -1
} }
private def withDatabase(address: String, f: UpgradeDatabase => Array[AnyRef]): Array[AnyRef] = {
node.network.node(address) match {
case component: Component => component.host match {
case database: UpgradeDatabase => f(database)
case _ => throw new IllegalArgumentException("not a database")
}
case _ => throw new IllegalArgumentException("no such component")
}
}
} }