CIT Base
Note that features marked in italics are unique to CIT Resewn.
All CIT types, while having different effects, originate from CIT Base. Think of it as a parent for all other types and every type inherits its properties, sometimes overriding their behavior.
When a property is not specified, its default value is used instead, meaning all properties are optional by default.
Some property keys have aliases, these were added for legacy support. Hover over keys to see if they have aliases, try not to use them when possible.
Hover over the properties' types to see example values.
CITs are split into 2 parts: Conditions which determine how items are selected and Effects that change something about the item. All conditions must match for the CIT to apply.
Conditions
Key | Value Type | Description | Default |
---|---|---|---|
weight |
Integer | When multiple CITs match the same item, the CIT with the higher weight is chosen. When multiple matching CITs have the same weight, the CIT file name/path is the tie breaker. |
0 |
items |
List of items | Requires that the item is either of the ones listed. Separated by spaces. Namespaces ( minecraft: ) are optional. If not declared and the cit file name is a valid item id, it is used instead. |
None |
stackSize |
Positive integer or a range | Requires that the item matches a specific amount. Supports open ended ranges. |
Any |
damage |
Positive integer or a range | Requires that the item matches a specific damage. Supports open ended ranges. Supports percentages using % . |
Any |
damageMask |
Integer | Applies a binary mask on the item's damage prior to checking damage (does damage match item damage & damageMask ). Useless with modern items, added just for legacy support. |
Any |
hand |
Literal | Requires that the item is in a specific hand. Either: main / off for mainhand or offhand |
Any |
enchantments |
List of enchantments | Requires that the item has at least one of the enchantments listed. Separated by spaces. Namespaces ( minecraft: ) are optional. |
Any |
enchantmentLevels |
List of levels/ranges | Requires that one of the item's enchantments matches one of the levels listed. When enchantments is declared, requires that either one of enchantments matches the levels. Separated by spaces. |
Any |
nbt. path |
NBT Match | Requires that the item matches the specified NBT predicate. Multiple nbt conditions are allowed. Accepts literal, pattern and regex checks, along with ignore-case alternatives. When path is display.Name or display.Lore.__ , the nbt is json evaluated when the match value is not a json. See NBT Path and NBT Match for more info. |
None |
Effects
Key | Value Type | Description | Default |
---|---|---|---|
type |
Literal | Which type to apply on this CIT. Either: item / armor / elytra / enchantment Other mods may add different options. |
item |
NBT Path
The nbt
property cannot be declared by itself, there must be a unique nbt tag
path to target for every nbt
condition.
The path starts from the item's tag
root and is separated by dots. For example:
nbt.CustomModelData=53
will match the nbt for {tag:{CustomModelData:53}}
.
And
nbt.display.Name={"text":"Some Item's Name"}
will match the nbt for {tag:{display:{Name:"{\"text\":\"Some Item's Name\"}"}}}
.
When a path crosses an nbt list, the next part of the path is the index.
Paths also support wildcards using *
for both nbt lists and compounds.
So to match the first lore line you'd use:
nbt.display.Lore.0=The first line of the lore
And to match any lore line you'd use:
nbt.display.Lore.*=Any line in the lore
NBT Match
There are multiple options for how you could do this. Either by literal values, matching patterns or by matching regex. Pattern and regex matching also provide case-insensitive options.
To match literally, the value is used normally. So to match the item name
"Some Name
", you'd write:
nbt.display.Name=Some Name
To match a pattern, add the pattern:
prefix or the ipattern:
prefix for
case-insensitivity.
Patterns allow for both wild cards and wild characters, declared using *
and
?
respectively.
To match a name before "'s Sword
", you'd write:
nbt.display.Name=pattern:*'s Sword
To match any one character after "Part
", you'd write:
nbt.display.Name=pattern:Part ?
Multiple wild cards and characters are allowed.
To match regex, add the regex:
prefix or the iregex:
prefix for case-insensitivity.
For example, to match any of the following: "First Item
" / "Second Item
" / "Third Item
",
you'd write:
nbt.display.Name=regex:^(First|Second|Third) Item$
Matching json
When matching either nbt.display.Name
or nbt.display.Lore.___
, the match part can be
either a json or not. When not matching a json, the json in the item is evaluated into its
plain text representation. For example {"text":"Some Item's Name"}
is evaluated and matches
correctly against Some Item's Name
.
This means that to match an item that's been named: "Some Item's Name
", you can either do:
nbt.display.Name={"text":"Some Item's Name"}
or
nbt.display.Name=Some Item's Name
Note that this is supported for both patterns and regex as well by prefixing before the json if present.
Asset Resolution
Most effects use the Asset
type to find files. CITs will find assets in their own
resourcepack through either an absolute or a relative declared path.
Assets are type specific, meaning that the file extension is optional in the properties
declaration but required for the file name. For example the texture
property will only
look for textures, so both example
and example.png
would work when texture
is
looking for example.png
.
While not required, you can force a path to be relative by prefixing it with ./
like so:
# minecraft/citresewn/cit/sticks/stick.properties
# ↓
# minecraft/citresewn/cit/sticks/my_textures/stick_texture.png
# forced relative texture
texture=./my_textures/stick_texture.png
# assumed relative texture
texture=my_textures/stick_texture.png
Relative paths also support going up directories with ..
like so:
# minecraft/citresewn/cit/sticks/properties/stick.properties
# ↓
# minecraft/citresewn/cit/sticks/my_textures/stick_texture.png
# go back one level and into textures
texture=./../my_textures/stick_texture.png
Absolute paths can start from multiple roots, examples:
# Full resourcepack path:
texture=assets/minecraft/citresewn/cit/item_textures/texture.png
# ↓
# assets/minecraft/citresewn/cit/item_textures/texture.png
# Namespaced full path:
texture=minecraft:citresewn/cit/item_textures/texture.png
# ↓
# assets/minecraft/citresewn/cit/item_textures/texture.png
# Relative namespace full path:
texture=citresewn/cit/item_textures/texture.png
# ↓ (when the CIT is in the minecraft namespace)
# assets/minecraft/citresewn/cit/item_textures/texture.png
# Namespaced typed directories:
texture=minecraft:item/texture.png
# ↓
# assets/minecraft/textures/item/texture.png
# Relative namespace typed directories:
texture=item/texture.png
# ↓ (when the CIT is in the minecraft namespace)
# assets/minecraft/textures/item/texture.png
# The typed directories are:
# .png → textures/
# .json → models/
When an asset is not declared, some properties will also try to find assets with similar names as their CITs' in the same directory. For Example:
# assets/minecraft/citresewn/cit/stuff/my_cool_stick.properties
type=item
items=stick
nbt.CustomModelData=1
# because no texture/model were declared, the item CIT will search for either:
# model=assets/minecraft/citresewn/cit/stuff/my_cool_stick.json
# or
# texture=assets/minecraft/citresewn/cit/stuff/my_cool_stick.png
# with models having more priority than textures.