Skip to content

ItemStack ​

ItemStacks, as by far the most used type of IIngredient, have additional features that most other IIngredients do not have.

Obtaining ​

ItemStacks can be obtained with the item Object Mapper.

groovy
def iron_ingot = item('minecraft:iron_ingot', 4) * 6

The 4 inside the () is the metadata. Iron ingot doesn't have any sub items, so it will result in an item that doesn't actually exist. The * 6 at the end marks the amount. The item id 'minecraft:iron_ingot' is a string and can be replaced by anything that makes a string.
The following also returns an iron ingot.

groovy
def iron_ingot = 'iron_ingot'
item("minecraft:$iron_ingot")

NBT ​

Nbt data is minecraft data format used for items and world saving. Adding a nbt tag is easy.

groovy
itemStack.withNbt(Map<String, Object> map)

Now this looks complicated, but it isn't.

groovy
item('minecraft:iron_ingot').withNbt([Name: 'Epic Ingot'])

More ​

  • .withNbt(null) removes the nbt tag
  • .withEmptyNbt() adds an empty nbt tag

Match Conditions ​

This allows for dynamic item checking in recipes.

Note

At this moment (ver. 0.3.1) only crafting and Draconic Evolution fusion crafting is supported.

groovy
itemStack.when(Closure<Boolean> condition)

Example

groovy
item('minecraft:iron_axe:*').when({stack -> stack.getDamage() < 50})

Let's see what this does. First item('minecraft:iron_axe:*') matches an iron axe with any damage. Then .when({stack -> stack.getDamage() < 50}) only validates items that have taken less than 50 damage.

Transformer ​

This transforms an item ingredient to a new item on craft. For example a water bucket returns an empty bucket after crafting.

Warning

This only works for crafting.

groovy
itemStack.transform(Closure<ItemStack> transformer)

Example

groovy
def transformer = { stack -> stack.copyWithMeta(stack.getItemDamage() + 1)}
item('minecraft:iron_axe:*').transform(transformer)

First we create a transformer closure, so we can easier see what's going on. It simply creates a new item with one more damage. In the second line that transformer is applied to the item. So at the end when you craft a recipe with that iron axe it will get damaged by 1.

Default Transformer ​

  • .noreturn() will not return anything. Useful when you want to consume a water bucket with the bucket for example.
  • .reuse() will return itself. That means the item will not be consumed.

Comparing items ​

Sometimes you want to check if items are equal to each other. This is more complicated than it sounds. Using == will almost always fail. Instead, you can use in operator. It compares the item, meta and nbt data. The count is ignored.

Example
groovy
def wool0 = item('minecraft:wool', 0)
def wool1 = item('minecraft:wool', 1)
log.info wool0 in wool1                          // false, since different meta
log.info item('minecraft:wool', 0) in wool0      // true, since same item and meta
log.info item('minecraft:wool', 0) * 5 in wool0  // true, amount is ignored

If you want to check if two items are exactly equal with count you need to use ItemStack.areItemsEqual(ItemStack, ItemStack).

Example
groovy
def wool0 = item('minecraft:wool', 0)
def wool1 = item('minecraft:wool', 1)
log.info ItemStack.areItemsEqual(wool0, wool1)                       // false
log.info ItemStack.areItemsEqual(item('minecraft:wool', 0), wool1)   // true
log.info ItemStack.areItemsEqual(item('minecraft:wool', 0) * 5, wool1)   // false

You can also use the in operator if it matches any IIngredient.

Example
groovy
log.info item('minecraft:iron_ingot') in ore('ingotIron') // true
log.info ore('ingotIron') in item('minecraft:iron_ingot') // false, the iron ingot is in the ore dict and not vice versa.

To elevate the level of cursedness you can use << and >> to further compare items. << is exactly like the in operator, but the count of the ingredient must also be greater or equal to the item on the left side. >> is the same thing but sides swapped.

Contributors

© 2024 CleanroomMC. All Rights Reserved.