CurseForge · Minecraft mod
Icterine
Advancements optimization (specifically, InventoryChangeTrigger)
Quick answer
Which Icterine release should I use?
Icterine 1.3.0 NeoForge 1.20.3 - 1.20.4 targets 1.20.5-Snapshot, 1.20.3-Snapshot, 1.20.3 with NeoForge. The project page does not say whether it belongs on the client. The project page does not say whether it belongs on the dedicated server. No extra mods listed for this file.
Where it goes
Is Icterine required on the client, server, or both?
The project page does not say whether it belongs on the client. The project page does not say whether it belongs on the dedicated server.
The source does not explicitly classify this release as client-only or server-only.
What else does Icterine 1.3.0 NeoForge 1.20.3 - 1.20.4 need?
Icterine 1.3.0 NeoForge 1.20.3 - 1.20.4. Change the file and its required mods may change too.
This file does not list any required mods. Do not add a library just because a different file uses it.
This file does not list any required or optional mods.
Before you install it
Add Icterine without breaking your instance.
Built for Icterine 1.3.0 NeoForge 1.20.3 - 1.20.4. Pick another file and the loader, install side or required mods may change.
- 01
Stick to this file
Use Icterine 1.3.0 NeoForge 1.20.3 - 1.20.4. It targets 1.20.5-Snapshot, 1.20.3-Snapshot, 1.20.3 with NeoForge; another release may have different loader, side or dependency requirements.
- 02
Bring the mods it needs
This file does not list any required mods. Do not add a library just because a different file uses it.
- 03
Put it on the correct side
The project page does not say whether it belongs on the client. The project page does not say whether it belongs on the dedicated server.
- 04
Pick the file you checked
Use the “Get this file” button beside Icterine 1.3.0 NeoForge 1.20.3 - 1.20.4. It opens that exact file at the source.
About this project
What does Icterine add?
InventoryChangeTrigger Optimization
Summary
- Optimizes triggering advancements for obtaining items;
- Might break parity with vanilla, but doesn't affect vanilla advancements and shouldn't affect the vast majority of mods/datapacks;
- Even if it does affect something, advancement still should be obtainable by just dropping and picking up one of required items;
- Currently, there are no known incompatibilities or issues;
- Every injection into vanilla code can be disabled in config file.
- All changes are server-side.
Results
Live test performed on dedicated server with 3 active players online, running custom Forge modpack with over 200 mods and BlazeandCave's Advancements Pack, which adds over 950 advancements. Stats collected using Spark for one hour.
With Icterine, InventoryChangeTrigger executes almost 2.5 times faster (as of version 1.1.0), spending about 7.5% of the tick time instead of 20%.
Stats comparison for Icterine 1.0.0 (~2 times faster):

How vanilla InventoryChangeTrigger works
- When the game detects that stack in player inventory has changed, it calls InventoryChangeTrigger for it. This includes picking up items, dropping items, dropping whole stacks, moving items in your inventory.
- Also, when you open a container (chest, furnace, etc.), game thinks that all the slots in your inventory changed, and calls trigger for all of them, including empty slots.
InventoryChangeTrigger counts empty, non-empty and completely filled slots in your inventory. This information could be used in advancement triggers, but is not used in vanilla.
InventoryChangeTrigger goes over registered advancement criteria.
If criterion has slot count requirements and they don't match values from step 2, or if criterion doesn't have item requirements, criterion is skipped.
If criterion has only one item requirement, changed stack is checked against this requirement.
If criterion has multiple items requirements (e.g., "Cover me with debris" requires having full netherite armor set), every item stack in the inventory is checked against every requirement (but fulfilled requirements get removed and are no longer checked).
Item matching, especially against tag, is very heavy. But the game first checks if the player's item type matches the one from the requirement, and only then checks other parameters like count, enchants and other NBT data.
How Icterine's optimizations work
In step 1, do not call InventoryChangeTrigger when you drop stacks or move them out of your inventory (e.g. to chest). This is controlled by the
ignore_triggers_for_emptied_stacksparameter in config file.Similarly, do not call InventoryChangeTrigger if stack change was caused by decreasing stack but not emptying it (e.g. player dropped single item from the full stack). Controlled by
ignore_triggers_for_decreased_stacks.And also do not call InventoryChangeTrigger if stack size increased, but hasn't passed threshold for any advancement. For example, dirt stack size increased from 52 to 53, but there's no advancement for getting 53 dirt in your modpack. Controlled by
optimize_triggers_for_increased_stacks.Modify how game checks for changed items when player opens container screen, so it doesn't treat all the stack as changed the second you open anything. Controlled by
initialize_inventory_last_slots.In step 6, firstly check if changed slot matches any requirement, and only then check other stack in the inventory. Controlled by
optimize_multiple_predicate_trigger.In step 7, compare the stack count first to avoid unneeded tag matching. Also use previous stack count to avoid even more unneeded matching. Controlled by
check_count_before_item_predicate_match.
Supported versions
Icterine v1.2.0 works with Minecraft Fabric/Quilt from 1.18.2 to 1.19.4, and Forge from 1.18.2 to 1.19.2 (forge moment).
Icterine v1.3.0 has the same features as v1.2.0 and works with Fabric/Quilt 1.20 - 1.20.4, Forge 1.19.3 - 1.20.4, and NeoForge 1.20.1 - 1.20.4.
Use filter on the Files page to choose the right file.
If you need port to any other version, please open an issue, or ask on Discord server.
Project description from CurseForge.
Pick your setup
Icterine by Minecraft version and loader
Choose the version and loader you play, then open the matching release.
1.20.4
4 loader builds1.20.3-Snapshot
4 loader builds1.20.3
4 loader builds1.20.2-Snapshot
4 loader builds1.20.2
4 loader builds1.20.1
4 loader builds1.20-Snapshot
4 loader builds1.20
4 loader builds1.19.4-Snapshot
3 loader builds1.19.4
3 loader builds1.19.3-Snapshot
3 loader buildsShowing the newest 12 of 18 game versions. Older files are in the list below.
Check the dependencies, then try the file in a copied instance before changing a world you care about.
Recent files
Icterine versions and loaders
Icterine 1.3.0 NeoForge 1.20.3 - 1.20.4
Icterine-neoforge-1.20.3-4-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 Forge 1.20.3 - 1.20.4
Icterine-forge-1.20.4-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 Fabric 1.20.3 - 1.20.4
Icterine-fabric-1.20.3-4-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 NeoForge 1.20.2
Icterine-neoforge-1.20.2-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 Forge 1.20.2
Icterine-forge-1.20.2-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 Fabric 1.20.2
Icterine-fabric-1.20.2-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 Forge 1.20 - 1.20.1
Icterine-forge-1.20.0-1-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 Fabric 1.20 - 1.20.1
Icterine-fabric-1.20.0-1-1.3.0.jar
14 Feb 2024
Icterine 1.3.0 Forge 1.19.3 - 1.19.4
Icterine-forge-1.19.3-4-1.3.0.jar
14 Feb 2024
Icterine 1.2.0 Forge 1.18.2 - 1.19.2
Icterine-forge-1.2.0.jar
14 Feb 2024
Icterine 1.2.0 Fabric 1.18.2 - 1.19.4
Icterine-fabric-1.2.0.jar
14 Feb 2024
1.1.0
Icterine-forge-1.19.2-1.1.0.jar
29 Dec 2023
Looking for an older file? The official CurseForge project page is in Resources.