New pattern manipulation functions:

storeInterfacePatternInput(slot:number, index:number, database:address, entry:number):boolean -- Store pattern input at the given index to the database entry.
  storeInterfacePatternOutput(slot:number, index:number, database:address, entry:number):boolean -- Store pattern output at the given index to the database entry.
  clearInterfacePatternInput(slot:number, index:number):boolean -- Clear pattern input at the given index.
  clearInterfacePatternOutput(slot:number, index:number):boolean -- Clear pattern output at the given index.
This commit is contained in:
repo_alt 2022-03-01 19:05:20 +03:00
parent 6018ba6b15
commit 522f434513

View File

@ -11,10 +11,11 @@ import li.cil.oc.api.network.Component
import li.cil.oc.api.network.ManagedEnvironment
import li.cil.oc.api.prefab.DriverSidedTileEntity
import li.cil.oc.integration.ManagedTileEntityEnvironment
import li.cil.oc.util.DatabaseAccess
import li.cil.oc.util.ExtendedArguments._
import li.cil.oc.util.ResultWrapper._
import li.cil.oc.util.ResultWrapper.result
import net.minecraft.item.ItemStack
import net.minecraft.nbt.{NBTTagCompound, NBTTagList}
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.world.World
import net.minecraftforge.common.util.ForgeDirection
@ -29,6 +30,7 @@ object DriverBlockInterface extends DriverSidedTileEntity {
override def priority = 5
//noinspection ScalaUnusedSymbol
@Callback(doc = "function([slot:number]):table -- Get the configuration of the interface.")
def getInterfaceConfiguration(context: Context, args: Arguments): Array[AnyRef] = {
val config = tileEntity.getInventoryByName("config")
@ -68,6 +70,7 @@ object DriverBlockInterface extends DriverSidedTileEntity {
}
else null
//noinspection ScalaUnusedSymbol
@Callback(doc = "function([slot:number]):table -- Get the given pattern in the interface.")
def getInterfacePattern(context: Context, args: Arguments): Array[AnyRef] = {
val inv = tileEntity.getInventoryByName("patterns")
@ -77,17 +80,65 @@ object DriverBlockInterface extends DriverSidedTileEntity {
}
@Callback(doc = "function(slot:number, database:address, entry:number, size:number, index:number):boolean -- Set the pattern input at the given index.")
def setInterfacePatternInput(context: Context, args: Arguments): Array[AnyRef] = {
def setInterfacePatternInput(context: Context, args: Arguments): Array[AnyRef] =
setPatternSlot(context, args, "in")
result(true)
}
@Callback(doc = "function(slot:number, database:address, entry:number, size:number, index:number):boolean -- Set the pattern output at the given index.")
def setInterfacePatternOutput(context: Context, args: Arguments): Array[AnyRef] = {
def setInterfacePatternOutput(context: Context, args: Arguments): Array[AnyRef] =
setPatternSlot(context, args, "out")
@Callback(doc = "function(slot:number, index:number, database:address, entry:number):boolean -- Store pattern input at the given index to the database entry.")
def storeInterfacePatternInput(context: Context, args: Arguments): Array[AnyRef] =
storeInterfacePattern(context, args, "in")
@Callback(doc = "function(slot:number, index:number, database:address, entry:number):boolean -- Store pattern output at the given index to the database entry.")
def storeInterfacePatternOutput(context: Context, args: Arguments): Array[AnyRef] =
storeInterfacePattern(context, args, "out")
@Callback(doc = "function(slot:number, index:number):boolean -- Clear pattern input at the given index.")
def clearInterfacePatternInput(context: Context, args: Arguments): Array[AnyRef] =
clearInterfacePattern(context, args, "in")
@Callback(doc = "function(slot:number, index:number):boolean -- Clear pattern output at the given index.")
def clearInterfacePatternOutput(context: Context, args: Arguments): Array[AnyRef] =
clearInterfacePattern(context, args, "out")
private def storeInterfacePattern(context: Context, args: Arguments, tag: String): Array[AnyRef] = {
val inv = tileEntity.getInventoryByName("patterns")
val pattern = inv.getStackInSlot(args.checkSlot(inv, 0))
val encodedValue = pattern.getTagCompound
if (encodedValue == null)
throw new IllegalArgumentException("No pattern here!")
val nbt = encodedValue.getTagList(tag, 10)
val stackNBT = nbt.getCompoundTagAt(args.checkInteger(1))
val stack = ItemStack.loadItemStackFromNBT(stackNBT)
DatabaseAccess.withDatabase(node, args.checkString(2), database => {
val slot = args.optSlot(database.data, 3, 0)
database.setStackInSlot(slot, stack)
context.pause(0.1)
result(true)
})
}
private def clearInterfacePattern(context: Context, args: Arguments, tag: String): Array[AnyRef] = {
val inv = tileEntity.getInventoryByName("patterns")
val slot = args.checkSlot(inv, 0)
val pattern = inv.getStackInSlot(slot)
val encodedValue = pattern.getTagCompound
if (encodedValue == null)
throw new IllegalArgumentException("No pattern here!")
val nbt = encodedValue.getTagList(tag, 10)
val index = args.checkInteger(1)
nbt.removeTag(index)
encodedValue.setTag(tag, nbt)
pattern.setTagCompound(encodedValue)
inv.setInventorySlotContents(slot, pattern)
context.pause(0.1)
result(true)
}
private def setPatternSlot(context: Context, args: Arguments, tag: String) = {
private def setPatternSlot(context: Context, args: Arguments, tag: String): Array[AnyRef] = {
val inv = tileEntity.getInventoryByName("patterns")
val slot = if (args.isString(0)) 0 else args.optSlot(inv, 0, 0)
val stack = getStack(args)
@ -102,13 +153,18 @@ object DriverBlockInterface extends DriverSidedTileEntity {
val inTag = encodedValue.getTagList(tag, 10)
while (inTag.tagCount() <= index)
inTag.appendTag(new NBTTagCompound())
val nbt = new NBTTagCompound()
stack.writeToNBT(nbt)
inTag.func_150304_a(index, nbt)
if (stack != null) {
val nbt = new NBTTagCompound()
stack.writeToNBT(nbt)
inTag.func_150304_a(index, nbt)
}
else
inTag.removeTag(index)
encodedValue.setTag(tag, inTag)
pattern.setTagCompound(encodedValue)
inv.setInventorySlotContents(slot, pattern)
context.pause(0.1)
result(true)
}
}