blob: a6b682f6db7e2ca6fc5195da7a99223a9996efb6 [file] [log] [blame] [raw]
Florian Nücked7143f52014-05-20 16:00:04 +02001package li.cil.oc.util
2
Florian Nücke15618542015-02-03 23:34:35 +01003import li.cil.oc.api.internal.MultiTank
Florian Nücke5d908fc2014-09-19 19:54:44 +02004import li.cil.oc.api.machine.Arguments
Florian Nücked7143f52014-05-20 16:00:04 +02005import net.minecraft.inventory.IInventory
Florian Nückecf521f42014-06-19 16:23:26 +02006import net.minecraftforge.common.util.ForgeDirection
Florian Nücked7143f52014-05-20 16:00:04 +02007
Florian Nückee3d3e3c2014-06-25 22:10:34 +02008import scala.language.implicitConversions
9
Florian Nücked7143f52014-05-20 16:00:04 +020010object ExtendedArguments {
11
Florian Nückef4258aa2014-11-12 11:08:13 +010012 implicit def extendedArguments(args: Arguments): ExtendedArguments = new ExtendedArguments(args)
Florian Nücked7143f52014-05-20 16:00:04 +020013
14 class ExtendedArguments(val args: Arguments) {
15 def optionalItemCount(n: Int) =
16 if (args.count > n && args.checkAny(n) != null) {
17 math.max(0, math.min(64, args.checkInteger(n)))
18 }
19 else 64
20
Florian Nücke21488bc2014-10-01 14:35:21 +020021 def optionalFluidCount(n: Int) =
22 if (args.count > n && args.checkAny(n) != null) {
23 math.max(0, args.checkInteger(n))
24 }
25 else 1000
26
Florian Nücked7143f52014-05-20 16:00:04 +020027 def checkSlot(inventory: IInventory, n: Int) = {
28 val slot = args.checkInteger(n) - 1
29 if (slot < 0 || slot >= inventory.getSizeInventory) {
30 throw new IllegalArgumentException("invalid slot")
31 }
32 slot
Florian Nückebd0ae242014-10-14 22:25:08 +020033 }
34
35 def optSlot(inventory: IInventory, n: Int, default: Int) = {
36 if (n >= 0 && n < args.count()) checkSlot(inventory, n)
37 else default
Florian Nücked7143f52014-05-20 16:00:04 +020038 }
39
Florian Nückec5e79df2014-12-15 21:38:54 +010040 def checkTank(multi: MultiTank, n: Int) = {
Florian Nücke21488bc2014-10-01 14:35:21 +020041 val tank = args.checkInteger(n) - 1
Florian Nückec5e79df2014-12-15 21:38:54 +010042 if (tank < 0 || tank >= multi.tankCount) {
Florian Nücke21488bc2014-10-01 14:35:21 +020043 throw new IllegalArgumentException("invalid tank index")
44 }
45 tank
46 }
47
Florian Nücked7143f52014-05-20 16:00:04 +020048 def checkSideForAction(n: Int) = checkSide(n, ForgeDirection.SOUTH, ForgeDirection.UP, ForgeDirection.DOWN)
49
50 def checkSideForMovement(n: Int) = checkSide(n, ForgeDirection.SOUTH, ForgeDirection.NORTH, ForgeDirection.UP, ForgeDirection.DOWN)
51
52 def checkSideForFace(n: Int, facing: ForgeDirection) = checkSide(n, ForgeDirection.VALID_DIRECTIONS.filter(_ != facing.getOpposite): _*)
53
Florian Nückef7540d42014-07-11 14:40:03 +020054 def checkSide(n: Int, allowed: ForgeDirection*) = {
Florian Nücked7143f52014-05-20 16:00:04 +020055 val side = args.checkInteger(n)
56 if (side < 0 || side > 5) {
57 throw new IllegalArgumentException("invalid side")
58 }
59 val direction = ForgeDirection.getOrientation(side)
60 if (allowed.isEmpty || (allowed contains direction)) direction
61 else throw new IllegalArgumentException("unsupported side")
62 }
63 }
64
Florian Nücked7143f52014-05-20 16:00:04 +020065}