From b79b9428190362038329c900a57d067f063a1c03 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sat, 29 Jun 2019 03:29:29 -0300 Subject: [PATCH] inv size --- .../java/carpet/script/CarpetExpression.java | 21 +++++++++++++++---- src/main/java/carpet/script/Expression.java | 3 ++- .../script/value/NBTSerializableValue.java | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index a5bfa90d..434430cb 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -873,6 +873,15 @@ public class CarpetExpression public void API_InventoryManipulation() { + this.expr.addLazyFunction("inventory_size", -1, (c, t, lv) -> { + CarpetContext cc = (CarpetContext) c; + NBTSerializableValue.InventoryLocator inventoryLocator = NBTSerializableValue.locateInventory(cc, lv, 0); + if (inventoryLocator == null) + return (_c, _t) -> Value.NULL; + Value res = new NumericValue(inventoryLocator.inventory.getInvSize()); + return (_c, _t) -> res; + }); + //inventory_get(, ) -> item_triple this.expr.addLazyFunction("inventory_get", -1, (c, t, lv) -> { CarpetContext cc = (CarpetContext) c; @@ -890,8 +899,9 @@ public class CarpetExpression return (_c, _t) -> res; } int slot = (int)NumericValue.asNumber(lv.get(inventoryLocator.offset).evalValue(c)).getLong(); - if (slot < 0 || slot > inventoryLocator.inventory.getInvSize()) - throw new InternalExpressionException("Inventory has "+inventoryLocator.inventory.getInvSize()+" slots available"); + slot = NBTSerializableValue.validateSlot(slot, inventoryLocator.inventory); + if (slot == inventoryLocator.inventory.getInvSize()) + return (_c, _t) -> Value.NULL; Value res = ListValue.fromItemStack(inventoryLocator.inventory.getInvStack(slot)); return (_c, _t) -> res; }); @@ -905,8 +915,9 @@ public class CarpetExpression if (lv.size() == inventoryLocator.offset) throw new InternalExpressionException("slot number is required for inventory_drop"); int slot = (int)NumericValue.asNumber(lv.get(inventoryLocator.offset).evalValue(c)).getLong(); - if (slot < 0 || slot > inventoryLocator.inventory.getInvSize()) - throw new InternalExpressionException("Inventory has "+inventoryLocator.inventory.getInvSize()+" slots available"); + slot = NBTSerializableValue.validateSlot(slot, inventoryLocator.inventory); + if (slot == inventoryLocator.inventory.getInvSize()) + return (_c, _t) -> Value.NULL; int amount = 0; if (lv.size() > inventoryLocator.offset+1) amount = (int)NumericValue.asNumber(lv.get(inventoryLocator.offset+1).evalValue(c)).getLong(); @@ -989,6 +1000,8 @@ public class CarpetExpression throw new InternalExpressionException("inventory_set requires at least slot number and new stack size, and optional new item"); int slot = (int) NumericValue.asNumber(lv.get(inventoryLocator.offset+0).evalValue(c)).getLong(); slot = NBTSerializableValue.validateSlot(slot, inventoryLocator.inventory); + if (slot == inventoryLocator.inventory.getInvSize()) + return (_c, _t) -> Value.NULL; int count = (int) NumericValue.asNumber(lv.get(inventoryLocator.offset+1).evalValue(c)).getLong(); if (count == 0) { diff --git a/src/main/java/carpet/script/Expression.java b/src/main/java/carpet/script/Expression.java index f04693fe..2eec66ac 100644 --- a/src/main/java/carpet/script/Expression.java +++ b/src/main/java/carpet/script/Expression.java @@ -2242,7 +2242,7 @@ public class Expression implements Cloneable * number('2')+number('2') => 4 * * - *

str(expr, params? ... )

+ *

str(expr, params? ... ), str(expr, param_list)

* *

Returns a formatted string representing expression. * Accepts formatting style accepted by String.format. @@ -2265,6 +2265,7 @@ public class Expression implements Cloneable * str('3bar') => null * str(2)+str(2) => 22 * str('pi: %.2f',pi) => 'pi: 3.14' + * str('player at: %d %d %d',pos(player())) => 'player at: 567, -2423, 124' * * *


diff --git a/src/main/java/carpet/script/value/NBTSerializableValue.java b/src/main/java/carpet/script/value/NBTSerializableValue.java index a7dfe4dc..282364be 100644 --- a/src/main/java/carpet/script/value/NBTSerializableValue.java +++ b/src/main/java/carpet/script/value/NBTSerializableValue.java @@ -119,7 +119,7 @@ public class NBTSerializableValue extends Value if (slot < 0) slot = invSize + slot; if (slot < 0 || slot >= invSize) - throw new InternalExpressionException("Slot for inventory should be between 0 and "+(invSize-1)); + return inv.getInvSize(); // outside of inventory return slot; }