Yet Another Config Lib, like, what were you expecting?
This mod was made to fill a hole in this area of Fabric modding. The existing main config libraries don't achieve what I want from them:
As you can see, there's sadly a drawback with all of them and this is where YetAnotherConfigLib comes in.
YACL has the favour of hindsight. Whilst developing this fresh library, I can make sure that it does everything right:
YACL has a ton of configuration features:
The wiki contains a full documentation on how to use YACL.

This mod is under the GNU Lesser General Public License, v3.0.
Optional
Optional
Terms for using, modifying and redistributing this product.
19.07.2026 · Modrinth
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
Screenshots and images from the original Modrinth page.



Published versions and original Modrinth files.
19.07.2026 · 56 152 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 78 714 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 1 765 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 1 765 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 938 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 701 210 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 9 318 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 19 653 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 11 892 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 1 181 770 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
04.06.2026 · 7 595 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
04.06.2026 · 1 182 078 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
04.06.2026 · 13 038 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
04.06.2026 · 712 730 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
10.04.2026 · 13 527 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
10.04.2026 · 760 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
10.04.2026 · 27 786 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
10.04.2026 · 1 732 378 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
31.03.2026 · 10 673 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
31.03.2026 · 1 113 576 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
25.03.2026 · 347 009 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
25.03.2026 · 970 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
11.03.2026 · 11 643 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
09.01.2026 · 7 842 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 609 443 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 246 242 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 11 394 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 11 819 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 11 895 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 775 593 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 57 853 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 1 425 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 9 272 381 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 71 566 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 13 943 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 1 321 060 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 1 723 815 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
09.01.2026 · 4 153 593 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
| 1.21.11 | ✅ | ✅ | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
19.12.2025 · 9 393 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 103 940 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 16 934 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 782 525 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 329 096 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 1 164 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 2 320 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 1 818 945 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 2 913 997 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 154 717 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 4 346 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 356 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 1 724 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
07.12.2025 · 205 918 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.11 | ✅ | ❌ Unreleased | ❌ |
| 1.21.10 | ✅ | ✅ | ❌ |
| 1.21.9 | ✅ 1.21.10 | ✅ 1.21.10 | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
01.10.2025 · 175 878 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ✅ | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 2 789 871 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 3 714 208 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 335 983 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 22 100 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 6 614 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 126 784 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 337 246 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 2 799 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 1 846 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 343 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
26.09.2025 · 368 349 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.9 | ✅ | ❌ Unreleased | ❌ |
| 1.21.8 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.7 | ✅ 1.21.6 | ✅ 1.21.6 | ❌ |
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
15.08.2025 · 5 293 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
31.07.2025 · 4 073 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 4 419 154 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ 1.21.7 | ✅ 1.21.7 | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 1 165 370 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 1 492 883 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 39 587 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 764 455 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 5 803 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 506 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 4 996 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 24 646 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 499 593 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 401 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
17.06.2025 · 243 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 2 980 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 18 250 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 2 721 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 227 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 2 774 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 2 241 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 113 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 128 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)17.06.2025 · 21 928 downloads
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 1.21.6 | ✅ | ✅ | ❌ |
| 1.21.5 | ✅ | ✅ | ❌ |
| 1.21.4 | ✅ | ✅ | ❌ |
| 1.21.3 | ✅ | ✅ | ❌ |
| 1.21.2 | ✅ 1.21.3 | ✅ 1.21.3 | ❌ |
| 1.21.1 | ✅ | ✅ | ❌ |
| 1.20.6 | ❌ | ❌ | ❌ |
| 1.20.4 | ❌ | ❌ | ❌ |
| 1.20.1 | ❌ | ❌ | ❌ |
#271)#271)null with InstantStateManager.#267)#268)#269)#272)25.03.2025 · 18 451 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 8 927 779 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 6 328 867 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 258 125 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 2 687 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 130 672 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 41 929 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 834 291 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 2 213 942 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 2 668 755 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 2 166 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 495 676 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 5 151 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
23.03.2025 · 597 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 15 481 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 43 060 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 164 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 8 251 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 139 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 2 157 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 24 411 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 112 668 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 189 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 4 003 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 964 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 1 610 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 105 510 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 2 760 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 2 391 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 77 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 277 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 69 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 310 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 272 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 6 430 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 63 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 220 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 140 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 100 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
17.03.2025 · 2 622 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
25.02.2025 · 20 148 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 12 974 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 167 876 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 617 315 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 200 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 138 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 7 562 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 625 901 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 211 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 2 554 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)25.02.2025 · 22 894 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
categoryIf to YetAnotherConfigLib.Builder (thanks Kevin)04.12.2024 · 1 138 268 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 89 523 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 3 186 902 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 606 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 494 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 2 374 745 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 24 812 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 160 664 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 1 039 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 46 707 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 1 466 622 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)04.12.2024 · 9 812 downloads
This version of YACL has many different version targets.
Ensure you download the correct version of YACL for your MC version.
groupIf to ConfigCategory.Builder (thanks Kevin)22.10.2024 · 40 621 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 2 517 253 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 10 114 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 1 763 217 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 117 182 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 15 334 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 228 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 359 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 3 161 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
22.10.2024 · 406 920 downloads
This build supports the following versions:
- Fabric 1.21.2
- NeoForge 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
19.10.2024 · 8 078 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 1 405 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 129 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 105 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 94 368 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 2 278 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 7 102 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 22 522 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
19.10.2024 · 1 685 downloads
This build supports the following versions:
- Fabric 1.21.2
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
Options now no longer hold their state themselves. This job is now delegated to the StateManager.
This change serves to allow multiple options to share the same state, but with different controllers, descriptions,
names, etc.
Take an example of how this might be useful:
You have a long range of gamepad bindings, utilising a custom YACL controller. They are sorted alphabetically in YACL.
You want a specific gamepad binding, let's call it 'Jump', to be featured at the top of the list, but also still
appear alphabetically in the list.
You add a second 'Jump' YACL option and place it at the beginning of the category, you assign it an identical
binding.
This appears to work, but you discover a problem: you can modify the featured option just fine, but when you hit
'Save Changes', you see an error in your log 'Option value mismatch' and your option defaults to the previous, now
unchanged value.
Why is this? Each instance of Option holds its own pending value. Which is then applied to the binding when you
click save. When you click save, YACL iterates over each option in-order and applies the pending value to the binding.
Which leads to the following series of events:
State managers essentially solve this by moving the pending value into a separate object that can then be given to
multiple options. They ensure that each option's controller is kept up to date by emitting events upon the state's
change that controllers then listen to, to keep themselves up to date.
StateManager<Boolean> stateManager = StateManager.createSimple(getter, setter, def);
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Tick Box"))
.stateManager(stateManager)
.controller(TickBoxControllerBuilder::create)
.build());
category.option(Option.<Boolean>createOption()
.name(Component.literal("Sharing Boolean"))
.stateManager(stateManager)
.controller(BooleanControllerBuilder::create)
.build());
Here, instead of using a .binding(), you use a .stateManager(). Now both share and update the same state!
Options that listen to events, .listener((option, newValue) -> {}), the syntax has slightly changed. The
aforementioned methods have been deprecated, replaced with .addListener((option, event) -> {}), you can retrieve the
new value with option.pendingValue().
Because of this open-ness of how an option's pending value gets applied, users of YACL have a lot more power
on what happens with how an option's state is applied.
.stateManager(StateManager.createInstant(getter, setter, def))
Is the new way to get instantly applied options. You can also implement StateManager yourself.
13.06.2024 · 71 504 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
13.06.2024 · 4 116 131 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
13.06.2024 · 4 782 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
13.06.2024 · 219 972 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
13.06.2024 · 9 433 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
13.06.2024 · 387 639 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
13.06.2024 · 319 672 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
13.06.2024 · 2 184 478 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- Fabric 1.21
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
This update brings a new experimental config API that utilises Mojang's Codec for (de)serialization.
public class CodecConfig extends JsonFileCodecConfig/*or*/CodecConfig {
public static final CodecConfig INSTANCE = new CodecConfig();
public final ConfigEntry<Integer> myInt =
register("my_int", 0, Codec.INT);
public final ReadonlyConfigEntry<InnerCodecConfig> myInnerConfig =
register("my_inner_config", InnerCodecConfig.INSTANCE);
public CodecConfig() {
super(path);
}
void test() {
loadFromFile(); // load like this
saveToFile(); // save like this
// or if you just extend CodecConfig instead of JsonFileConfig:
JsonElement element = null;
this.decode(element, JsonOps.INSTANCE); // load
DataResult<JsonElement> encoded = this.encodeStart(JsonOps.INSTANCE); // save
}
}
or in Kotlin...
object CodecConfig : JsonFileCodecConfig(path) {
val myInt by register<Int>(0, Codec.INT)
val myInnerConfig by register(InnerCodecConfig)
fun test() {
loadFromFile()
saveToFile()
// blah blah blah
}
}
Completely rewrote the Kotlin DSL!
YetAnotherConfigLib("namespace") {
val category by categories.registering {
val option by rootOptions.registering<Int> {
controller = slider(range = 5..10)
binding(::thisProp, default)
val otherOption by categories["category"]["group"].futureRef<Boolean>()
otherOption.onReady { it.setAvailable(false) }
}
// translation key is generated automagically
val label by rootOptions.registeringLabel
val group by groups.registering {
val otherOption = options.register<Boolean>("otherOption") {
controller = tickBox()
}
}
}
}
27.05.2024 · 405 742 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 21 828 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 117 792 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 143 085 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 1 125 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 378 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 587 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 138 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 795 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
27.05.2024 · 150 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.6 (also supports 1.20.5)
- NeoForge 1.20.4
- MinecraftForge 1.20.1
29.04.2024 · 1 316 464 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
- NeoForge 1.20.5
29.04.2024 · 93 225 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
- NeoForge 1.20.5
29.04.2024 · 172 511 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
- NeoForge 1.20.5
29.04.2024 · 1 839 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
- NeoForge 1.20.5
29.04.2024 · 153 968 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
- NeoForge 1.20.5
29.04.2024 · 504 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
- NeoForge 1.20.5
24.04.2024 · 70 022 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
24.04.2024 · 3 944 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
24.04.2024 · 102 528 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
24.04.2024 · 228 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
24.04.2024 · 169 322 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
23.04.2024 · 147 096 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
This is the first build which uses a new build toolchain to support multiple minecraft versions in the same codebase.
With this change, the artifact of the mod has changed.
modImplementation "dev.isxander:yet-another-config-lib:{modversion}+{mcversion}-{loader}"
// for example...
modImplementation "dev.isxander:yet-another-config-lib:3.4.0+1.20.1-fabric"
If you are using YACL in an architectury project (one with a common subproject), you will from now on depend on
the fabric version of YACL. There is no longer any common artifact. I don't believe there to be any issues with doing it
like this.

CustomTabProvider. Javadoc is available.23.04.2024 · 2 160 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
This is the first build which uses a new build toolchain to support multiple minecraft versions in the same codebase.
With this change, the artifact of the mod has changed.
modImplementation "dev.isxander:yet-another-config-lib:{modversion}+{mcversion}-{loader}"
// for example...
modImplementation "dev.isxander:yet-another-config-lib:3.4.0+1.20.1-fabric"
If you are using YACL in an architectury project (one with a common subproject), you will from now on depend on
the fabric version of YACL. There is no longer any common artifact. I don't believe there to be any issues with doing it
like this.

CustomTabProvider. Javadoc is available.23.04.2024 · 14 086 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
This is the first build which uses a new build toolchain to support multiple minecraft versions in the same codebase.
With this change, the artifact of the mod has changed.
modImplementation "dev.isxander:yet-another-config-lib:{modversion}+{mcversion}-{loader}"
// for example...
modImplementation "dev.isxander:yet-another-config-lib:3.4.0+1.20.1-fabric"
If you are using YACL in an architectury project (one with a common subproject), you will from now on depend on
the fabric version of YACL. There is no longer any common artifact. I don't believe there to be any issues with doing it
like this.

CustomTabProvider. Javadoc is available.23.04.2024 · 146 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
This is the first build which uses a new build toolchain to support multiple minecraft versions in the same codebase.
With this change, the artifact of the mod has changed.
modImplementation "dev.isxander:yet-another-config-lib:{modversion}+{mcversion}-{loader}"
// for example...
modImplementation "dev.isxander:yet-another-config-lib:3.4.0+1.20.1-fabric"
If you are using YACL in an architectury project (one with a common subproject), you will from now on depend on
the fabric version of YACL. There is no longer any common artifact. I don't believe there to be any issues with doing it
like this.

CustomTabProvider. Javadoc is available.23.04.2024 · 11 577 downloads
This build supports the following versions:
- Fabric 1.20.1
- Fabric 1.20.4
- Fabric 1.20.5
- Forge 1.20.1
- NeoForge 1.20.4
This is the first build which uses a new build toolchain to support multiple minecraft versions in the same codebase.
With this change, the artifact of the mod has changed.
modImplementation "dev.isxander:yet-another-config-lib:{modversion}+{mcversion}-{loader}"
// for example...
modImplementation "dev.isxander:yet-another-config-lib:3.4.0+1.20.1-fabric"
If you are using YACL in an architectury project (one with a common subproject), you will from now on depend on
the fabric version of YACL. There is no longer any common artifact. I don't believe there to be any issues with doing it
like this.

CustomTabProvider. Javadoc is available.12.02.2024 · 121 046 downloads
12.02.2024 · 838 374 downloads
19.01.2024 · 14 540 downloads
19.01.2024 · 800 825 downloads
07.12.2023 · 3 745 downloads
07.12.2023 · 191 184 downloads
07.12.2023 · 229 downloads
Updates to support 1.20.4.
07.12.2023 · 2 192 downloads
Updates to support 1.20.4.
05.12.2023 · 6 925 downloads
Updates to support 1.20.3.
29.10.2023 · 11 531 downloads
As you can see, a lot of the contributions to this release are from other people! That's incredible, and I'm very
thankful for the community commitment to this project!
This release is a beta release, which just means that I'm not 100% sure that everything works as intended.
I encourage developers to at least try this build out, and if there are no problems, you're safe to release (I hope!).
optionIf!Home and End keys. (#108)Ctrl + Left/Right (you can now jump over words, without selecting it). (#108)NumberFieldController increasing their values by a power of 10 when clicking on the screen. Issue @ #103 PR @ #108-Dyacl3.debug.imageFiltering=true/false which applies experimental filtering to imagesbuild.gradle.https://maven.quiltmc.org/repository/release/https://oss.sonatype.org/content/repositories/snapshots/29.10.2023 · 367 674 downloads
As you can see, a lot of the contributions to this release are from other people! That's incredible, and I'm very
thankful for the community commitment to this project!
This release is a beta release, which just means that I'm not 100% sure that everything works as intended.
I encourage developers to at least try this build out, and if there are no problems, you're safe to release (I hope!).
optionIf!Home and End keys. (#108)Ctrl + Left/Right (you can now jump over words, without selecting it). (#108)NumberFieldController increasing their values by a power of 10 when clicking on the screen. Issue @ #103 PR @ #108-Dyacl3.debug.imageFiltering=true/false which applies experimental filtering to imagesbuild.gradle.https://maven.quiltmc.org/repository/release/https://oss.sonatype.org/content/repositories/snapshots/28.09.2023 · 149 151 downloads
ConfigClassHandler#save and ConfigClassHandler#load and deprecated ConfigClassHandler#serializer.ConfigSerializer#load for ConfigSerializer#loadSafely.SerialEntry, called required. SerialEntry, called nullable.28.09.2023 · 3 454 892 downloads
ConfigClassHandler#save and ConfigClassHandler#load and deprecated ConfigClassHandler#serializer.ConfigSerializer#load for ConfigSerializer#loadSafely.SerialEntry, called required. SerialEntry, called nullable.28.09.2023 · 5 015 downloads
ConfigClassHandler#save and ConfigClassHandler#load and deprecated ConfigClassHandler#serializer.ConfigSerializer#load for ConfigSerializer#loadSafely.SerialEntry, called required. SerialEntry, called nullable.28.09.2023 · 298 864 downloads
ConfigClassHandler#save and ConfigClassHandler#load and deprecated ConfigClassHandler#serializer.ConfigSerializer#load for ConfigSerializer#loadSafely.SerialEntry, called required. SerialEntry, called nullable.24.09.2023 · 1 263 downloads
The artifact for this release is
dev.isxander.yacl:yet-another-config-lib-fabric:3.2.0+1.20 (assuming Fabric)
Starting this update, the previous config api is now deprecated.
The new API is much more modular, and is now fully API-safe.
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@SerialEntry(comment = "optional comment!")
public boolean myOption = true;
public static void save() {
MyConfig.HANDLER.serializer().save();
}
public static void load() {
MyConfig.HANDLER.serializer().load();
}
}
As you can see from the above example, it's syntactically quite similar
to the old API, but with a few key differences:
- The method of serialization has been separated from the class handler itself,
allowing an API safe implementation without needing to override the class handler.
- Supports abstract serialization.
- Names make a lot more sense.
The new API can now fully auto-generate your config into a YACL GUI with annotations.
I have been very wary of this feature, since usually it can be very limiting, destroying most
of the core values of the powerful YACL builder interface. However, I believe I've found a great
modular way so that developers can extend the auto-gen feature with their own custom annotations,
adding support for their own custom controllers!
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@AutoGen(category = "my_category", group = "my_group")
@Boolean(formatter = Boolean.Formatter.YES_NO, colored = true)
public boolean myOption = true;
public static Screen createScreen(Screen parent) {
return MyConfig.HANDLER.generateGui().generateScreen(parent);
}
}
Above is an example of auto-generating a BooleanController. Notice how
the field does not require @SerialEntry. These are completely separate,
and you can use both at the same time.
For the full range of auto-gen annotations, check the source!
Documentation for the new API is still a work in progress. For now, it's best
to look at the following class: dev.isxander.yacl3.test.AutogenConfigTest (not available on the artifact).
This is bringing the off-branch hotfix 3.1.1 to the main branch.
Crendgrim has PRed a dropdown controller! Which is in this release!
This adds two new controller builders, DropdownStringControllerBuilder and ItemControllerBuilder.
The latter renders the item in the dropdown, and suggests only the items.
24.09.2023 · 37 123 downloads
The artifact for this release is
dev.isxander.yacl:yet-another-config-lib-fabric:3.2.0+1.20 (assuming Fabric)
Starting this update, the previous config api is now deprecated.
The new API is much more modular, and is now fully API-safe.
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@SerialEntry(comment = "optional comment!")
public boolean myOption = true;
public static void save() {
MyConfig.HANDLER.serializer().save();
}
public static void load() {
MyConfig.HANDLER.serializer().load();
}
}
As you can see from the above example, it's syntactically quite similar
to the old API, but with a few key differences:
- The method of serialization has been separated from the class handler itself,
allowing an API safe implementation without needing to override the class handler.
- Supports abstract serialization.
- Names make a lot more sense.
The new API can now fully auto-generate your config into a YACL GUI with annotations.
I have been very wary of this feature, since usually it can be very limiting, destroying most
of the core values of the powerful YACL builder interface. However, I believe I've found a great
modular way so that developers can extend the auto-gen feature with their own custom annotations,
adding support for their own custom controllers!
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@AutoGen(category = "my_category", group = "my_group")
@Boolean(formatter = Boolean.Formatter.YES_NO, colored = true)
public boolean myOption = true;
public static Screen createScreen(Screen parent) {
return MyConfig.HANDLER.generateGui().generateScreen(parent);
}
}
Above is an example of auto-generating a BooleanController. Notice how
the field does not require @SerialEntry. These are completely separate,
and you can use both at the same time.
For the full range of auto-gen annotations, check the source!
Documentation for the new API is still a work in progress. For now, it's best
to look at the following class: dev.isxander.yacl3.test.AutogenConfigTest (not available on the artifact).
This is bringing the off-branch hotfix 3.1.1 to the main branch.
Crendgrim has PRed a dropdown controller! Which is in this release!
This adds two new controller builders, DropdownStringControllerBuilder and ItemControllerBuilder.
The latter renders the item in the dropdown, and suggests only the items.
24.09.2023 · 404 downloads
The artifact for this release is
dev.isxander.yacl:yet-another-config-lib-fabric:3.2.0+1.20.2 (assuming Fabric)
Starting this update, the previous config api is now deprecated.
The new API is much more modular, and is now fully API-safe.
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@SerialEntry(comment = "optional comment!")
public boolean myOption = true;
public static void save() {
MyConfig.HANDLER.serializer().save();
}
public static void load() {
MyConfig.HANDLER.serializer().load();
}
}
As you can see from the above example, it's syntactically quite similar
to the old API, but with a few key differences:
- The method of serialization has been separated from the class handler itself,
allowing an API safe implementation without needing to override the class handler.
- Supports abstract serialization.
- Names make a lot more sense.
The new API can now fully auto-generate your config into a YACL GUI with annotations.
I have been very wary of this feature, since usually it can be very limiting, destroying most
of the core values of the powerful YACL builder interface. However, I believe I've found a great
modular way so that developers can extend the auto-gen feature with their own custom annotations,
adding support for their own custom controllers!
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@AutoGen(category = "my_category", group = "my_group")
@Boolean(formatter = Boolean.Formatter.YES_NO, colored = true)
public boolean myOption = true;
public static Screen createScreen(Screen parent) {
return MyConfig.HANDLER.generateGui().generateScreen(parent);
}
}
Above is an example of auto-generating a BooleanController. Notice how
the field does not require @SerialEntry. These are completely separate,
and you can use both at the same time.
For the full range of auto-gen annotations, check the source!
Documentation for the new API is still a work in progress. For now, it's best
to look at the following class: dev.isxander.yacl3.test.AutogenConfigTest (not available on the artifact).
This is bringing the off-branch hotfix 3.1.1 to the main branch.
Crendgrim has PRed a dropdown controller! Which is in this release!
This adds two new controller builders, DropdownStringControllerBuilder and ItemControllerBuilder.
The latter renders the item in the dropdown, and suggests only the items.
24.09.2023 · 8 676 downloads
The artifact for this release is
dev.isxander.yacl:yet-another-config-lib-fabric:3.2.0+1.20.2 (assuming Fabric)
Starting this update, the previous config api is now deprecated.
The new API is much more modular, and is now fully API-safe.
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@SerialEntry(comment = "optional comment!")
public boolean myOption = true;
public static void save() {
MyConfig.HANDLER.serializer().save();
}
public static void load() {
MyConfig.HANDLER.serializer().load();
}
}
As you can see from the above example, it's syntactically quite similar
to the old API, but with a few key differences:
- The method of serialization has been separated from the class handler itself,
allowing an API safe implementation without needing to override the class handler.
- Supports abstract serialization.
- Names make a lot more sense.
The new API can now fully auto-generate your config into a YACL GUI with annotations.
I have been very wary of this feature, since usually it can be very limiting, destroying most
of the core values of the powerful YACL builder interface. However, I believe I've found a great
modular way so that developers can extend the auto-gen feature with their own custom annotations,
adding support for their own custom controllers!
public class MyConfig {
public static final ConfigClassHandler<MyConfig> HANDLER = ConfigClassHandler.createBuilder(MyConfig.class)
.id(new ResourceLocation("my_mod", "my_config")) // unique ID for your config
.serializer(config -> GsonConfigSerializerBuilder.create(config)
.setPath(FabricLoader.getInstance().getConfigDir().resolve("my_config.json"))
.setJson5(true) // json5 support, with GSON!
.build())
.build();
@AutoGen(category = "my_category", group = "my_group")
@Boolean(formatter = Boolean.Formatter.YES_NO, colored = true)
public boolean myOption = true;
public static Screen createScreen(Screen parent) {
return MyConfig.HANDLER.generateGui().generateScreen(parent);
}
}
Above is an example of auto-generating a BooleanController. Notice how
the field does not require @SerialEntry. These are completely separate,
and you can use both at the same time.
For the full range of auto-gen annotations, check the source!
Documentation for the new API is still a work in progress. For now, it's best
to look at the following class: dev.isxander.yacl3.test.AutogenConfigTest (not available on the artifact).
This is bringing the off-branch hotfix 3.1.1 to the main branch.
Crendgrim has PRed a dropdown controller! Which is in this release!
This adds two new controller builders, DropdownStringControllerBuilder and ItemControllerBuilder.
The latter renders the item in the dropdown, and suggests only the items.
29.08.2023 · 13 818 downloads
ImageRenderer APIThe ImageRenderer API has been rewritten internally to use a dual-thread
initialization. Before, GL calls were made on a separate thread, which silently
threw errors. Sodium 0.5 introduced an option called No Error Context, which turned
these warnings into complete JVM crashes.
Because of this, this rewrite was unavailable.
In the process of a huge YACL update, this commit was buried under a lot more changes
that are not ready for production yet, so I decided to branch from 3.1.0 and cherrypick
this commit to fix the issue.
Most likely not, declaring images through OptionDescription.Builder is unaffected as that
is part of the safe API. However, if you use the ImageRenderer directly to create your own
custom renderers, you will have to update your code to use the new API.
Most likely, yes. Zoomify and a few other popular mods use the ImageRenderer API directly,
these mods will need updating, and will fail to load the images or even crash if they are not updated.
29.08.2023 · 130 523 downloads
ImageRenderer APIThe ImageRenderer API has been rewritten internally to use a dual-thread
initialization. Before, GL calls were made on a separate thread, which silently
threw errors. Sodium 0.5 introduced an option called No Error Context, which turned
these warnings into complete JVM crashes.
Because of this, this rewrite was unavailable.
In the process of a huge YACL update, this commit was buried under a lot more changes
that are not ready for production yet, so I decided to branch from 3.1.0 and cherrypick
this commit to fix the issue.
Most likely not, declaring images through OptionDescription.Builder is unaffected as that
is part of the safe API. However, if you use the ImageRenderer directly to create your own
custom renderers, you will have to update your code to use the new API.
Most likely, yes. Zoomify and a few other popular mods use the ImageRenderer API directly,
these mods will need updating, and will fail to load the images or even crash if they are not updated.
29.08.2023 · 5 363 downloads
ImageRenderer APIThe ImageRenderer API has been rewritten internally to use a dual-thread
initialization. Before, GL calls were made on a separate thread, which silently
threw errors. Sodium 0.5 introduced an option called No Error Context, which turned
these warnings into complete JVM crashes.
Because of this, this rewrite was unavailable.
In the process of a huge YACL update, this commit was buried under a lot more changes
that are not ready for production yet, so I decided to branch from 3.1.0 and cherrypick
this commit to fix the issue.
Most likely not, declaring images through OptionDescription.Builder is unaffected as that
is part of the safe API. However, if you use the ImageRenderer directly to create your own
custom renderers, you will have to update your code to use the new API.
Most likely, yes. Zoomify and a few other popular mods use the ImageRenderer API directly,
these mods will need updating, and will fail to load the images or even crash if they are not updated.
29.08.2023 · 453 110 downloads
ImageRenderer APIThe ImageRenderer API has been rewritten internally to use a dual-thread
initialization. Before, GL calls were made on a separate thread, which silently
threw errors. Sodium 0.5 introduced an option called No Error Context, which turned
these warnings into complete JVM crashes.
Because of this, this rewrite was unavailable.
In the process of a huge YACL update, this commit was buried under a lot more changes
that are not ready for production yet, so I decided to branch from 3.1.0 and cherrypick
this commit to fix the issue.
Most likely not, declaring images through OptionDescription.Builder is unaffected as that
is part of the safe API. However, if you use the ImageRenderer directly to create your own
custom renderers, you will have to update your code to use the new API.
Most likely, yes. Zoomify and a few other popular mods use the ImageRenderer API directly,
these mods will need updating, and will fail to load the images or even crash if they are not updated.
24.07.2023 · 11 396 downloads
ListOption changesA PR by Crendgrim - thanks a lot!
minimumNumberOfEntriesmaximumNumberOfEntries builder methods.insertEntriesAtEnd builder method.ImageRenderer changesAdded a tick() method to image renderers that allows to update the image in a regular interval.
24.07.2023 · 389 820 downloads
ListOption changesA PR by Crendgrim - thanks a lot!
minimumNumberOfEntriesmaximumNumberOfEntries builder methods.insertEntriesAtEnd builder method.ImageRenderer changesAdded a tick() method to image renderers that allows to update the image in a regular interval.
24.07.2023 · 821 downloads
ListOption changesA PR by Crendgrim - thanks a lot!
minimumNumberOfEntriesmaximumNumberOfEntries builder methods.insertEntriesAtEnd builder method.ImageRenderer changesAdded a tick() method to image renderers that allows to update the image in a regular interval.
24.07.2023 · 57 139 downloads
ListOption changesA PR by Crendgrim - thanks a lot!
minimumNumberOfEntriesmaximumNumberOfEntries builder methods.insertEntriesAtEnd builder method.ImageRenderer changesAdded a tick() method to image renderers that allows to update the image in a regular interval.
04.07.2023 · 797 downloads
04.07.2023 · 60 190 downloads
04.07.2023 · 3 996 downloads
04.07.2023 · 61 608 downloads
25.06.2023 · 380 downloads
25.06.2023 · 7 763 downloads
17.06.2023 · 2 728 downloads
IntegerFieldController and LongFieldController not allowing negative values.ButtonOption changing the 'EXECUTE' text with ButtonOption.Builder#text()17.06.2023 · 87 068 downloads
IntegerFieldController and LongFieldController not allowing negative values.ButtonOption changing the 'EXECUTE' text with ButtonOption.Builder#text()17.06.2023 · 177 downloads
ButtonOption.Builder#text()17.06.2023 · 4 072 downloads
ButtonOption.Builder#text()08.06.2023 · 2 721 downloads
08.06.2023 · 113 841 downloads
08.06.2023 · 439 downloads
08.06.2023 · 37 724 downloads
07.06.2023 · 5 082 downloads
3.0 of YACL introduces a new UI layout, taking advantage of 1.19.4's new tab system!
The description panel takes the place of the old category buttons, you can now interact with the text by clicking or hovering and the description can contain an animated WebP file or a static image. This can help you as a developer to portray what your option does with an actual example.
Like the old tooltip system, these descriptions can dynamically change based on the value of the option, including the image.
After a few seconds of hovering, the description will start to auto-scroll if necessary so inputs such as controller can still use the UI.
.description(OptionDescription.createBuilder()
.text(Text.literal("Line 1"))
.text(Text.literal("Line 2"))
.webpImage(new Identifier("mymod", "config/screenshots/config_example.webp"))
.build())
the above is applicable to both groups and options
YACL now uses a slightly modified version of 1.19.4's new create world screen, this adds tab overflow, so you can scroll through the tabs in case there are too many to fit on the screen.
Controllers now use a builder system, rather than using constructors. This allows for more flexibility in the future.
You can still use your own controller implementations without creating a builder, using .customController().
This update is for both 1.19.4 and 1.20, there is complete API parity. 1.20 is now the active branch,
and 1.19.4 is now considered LTS and may receive features from 1.20 at a later date.
YACL 3.0 includes the old 2.x inside the new JAR. So you can safely upgrade to 3.0 without breaking
mods that have not yet updated. However, the old UI will still be present for this outdated mods.
07.06.2023 · 408 downloads
3.0 of YACL introduces a new UI layout, taking advantage of 1.19.4's new tab system!
The description panel takes the place of the old category buttons, you can now interact with the text by clicking or hovering and the description can contain an animated WebP file or a static image. This can help you as a developer to portray what your option does with an actual example.
Like the old tooltip system, these descriptions can dynamically change based on the value of the option, including the image.
After a few seconds of hovering, the description will start to auto-scroll if necessary so inputs such as controller can still use the UI.
.description(OptionDescription.createBuilder()
.text(Text.literal("Line 1"))
.text(Text.literal("Line 2"))
.webpImage(new Identifier("mymod", "config/screenshots/config_example.webp"))
.build())
the above is applicable to both groups and options
YACL now uses a slightly modified version of 1.19.4's new create world screen, this adds tab overflow, so you can scroll through the tabs in case there are too many to fit on the screen.
Controllers now use a builder system, rather than using constructors. This allows for more flexibility in the future.
You can still use your own controller implementations without creating a builder, using .customController().
This update is for both 1.19.4 and 1.20, there is complete API parity. 1.20 is now the active branch,
and 1.19.4 is now considered LTS and may receive features from 1.20 at a later date.
YACL 3.0 includes the old 2.x inside the new JAR. So you can safely upgrade to 3.0 without breaking
mods that have not yet updated. However, the old UI will still be present for this outdated mods.
07.06.2023 · 1 172 downloads
3.0 of YACL introduces a new UI layout, taking advantage of 1.19.4's new tab system!
The description panel takes the place of the old category buttons, you can now interact with the text by clicking or hovering and the description can contain an animated WebP file or a static image. This can help you as a developer to portray what your option does with an actual example.
Like the old tooltip system, these descriptions can dynamically change based on the value of the option, including the image.
After a few seconds of hovering, the description will start to auto-scroll if necessary so inputs such as controller can still use the UI.
.description(OptionDescription.createBuilder()
.text(Text.literal("Line 1"))
.text(Text.literal("Line 2"))
.webpImage(new Identifier("mymod", "config/screenshots/config_example.webp"))
.build())
the above is applicable to both groups and options
YACL now uses a slightly modified version of 1.19.4's new create world screen, this adds tab overflow, so you can scroll through the tabs in case there are too many to fit on the screen.
Controllers now use a builder system, rather than using constructors. This allows for more flexibility in the future.
You can still use your own controller implementations without creating a builder, using .customController().
This update is for both 1.19.4 and 1.20, there is complete API parity. 1.20 is now the active branch,
and 1.19.4 is now considered LTS and may receive features from 1.20 at a later date.
YACL 3.0 includes the old 2.x inside the new JAR. So you can safely upgrade to 3.0 without breaking
mods that have not yet updated. However, the old UI will still be present for this outdated mods.
04.06.2023 · 217 downloads
This version adds no features, nor bug fixes, instead it implements a breaking change:
The YACL package has changed to dev.isxander.yacl3 and the YACL mod-id has changed to yet_another_config_lib_v3.
This is to prevent conflicts with 2.0, so you can load both versions at the same time so older mods don't break.
04.06.2023 · 2 340 downloads
This version adds no features, nor bug fixes, instead it implements a breaking change:
The YACL package has changed to dev.isxander.yacl3 and the YACL mod-id has changed to yet_another_config_lib_v3.
This is to prevent conflicts with 2.0, so you can load both versions at the same time so older mods don't break.
04.06.2023 · 12 392 downloads
This version adds no features, nor bug fixes, instead it implements a breaking change:
The YACL package has changed to dev.isxander.yacl3 and the YACL mod-id has changed to yet_another_config_lib_v3.
This is to prevent conflicts with 2.0, so you can load both versions at the same time so older mods don't break.
01.06.2023 · 169 downloads
This release is parity with 3.0.0-beta.6 for 1.20.
Unfortunately, 3.0 will only be available for 1.19.4 and up, not 1.19.2. This is because YACL
now highly depends on .4's new tab system (found in the create new world screen).
If there is a high enough demand for a backport to 1.19.2, I will consider it, but no promises!
01.06.2023 · 5 303 downloads
This release is parity with 3.0.0-beta.6 for 1.20.
Unfortunately, 3.0 will only be available for 1.19.4 and up, not 1.19.2. This is because YACL
now highly depends on .4's new tab system (found in the create new world screen).
If there is a high enough demand for a backport to 1.19.2, I will consider it, but no promises!
01.06.2023 · 107 downloads
29.05.2023 · 106 downloads
OptionDescription.Builder#description has been renamed to text, to make it more clear as it used to look like:java
.description(OptionDescription.createBuilder()
.description(Component.literal("This is some text"))
.build())ListOption.createBuilder now no longer takes a class parameter, to match with Option. This means you can no longerListOption.createBuilder(String.class), instead you should do ListOption.<String>createBuilder().27.05.2023 · 75 downloads
OptionDescription.Builder.customImage() to add your own renderer for the option description.This release brings a few API breakages, getting them out the way, as it is a major update.
.customController(). An example would be .controller(TickBoxControllerBuilder::create) or:java
.controller(opt -> IntegerSliderControllerBuilder.create(opt)
.range(0, 10)
.step(1)).tooltip() from groups and options. You should use .description() instead.OptionDescription.of(Component...) has been added so you don't need toOptionDescription.Builder.name(Component) as it now just uses the option name.23.05.2023 · 102 downloads
22.05.2023 · 102 downloads
No changelog provided.
17.05.2023 · 234 downloads
No changelog provided.
05.05.2023 · 1 384 downloads
05.05.2023 · 76 562 downloads
25.04.2023 · 2 458 downloads
The gradle dependency has changed:
modImplementation("dev.isxander.yacl:yet-another-config-lib-fabric:2.5.0+1.19.4")
25.04.2023 · 73 805 downloads
The gradle dependency has changed:
modImplementation("dev.isxander.yacl:yet-another-config-lib-fabric:2.5.0+1.19.4")
21.04.2023 · 5 383 downloads
15.04.2023 · 10 956 downloads
OptionGroup.Builder and ConfigCategory.Builder now extend OptionAddable so you can abstractlyOption.Builder due to unsafe varargs. There is now04.04.2023 · 7 808 downloads
29.03.2023 · 3 483 downloads
15.03.2023 · 9 670 downloads
22.02.2023 · 400 downloads
08.02.2023 · 1 130 downloads
08.02.2023 · 214 downloads
23.01.2023 · 1 097 342 downloads
Due to breaking JAR compatibility in an earlier version of YACL, mods that support YACL for
1.19.3 can no longer support 1.19.2. This is a backport of YACL 2.2.0 to 1.19.2 to allow mods to
support it.
Personally, I hate to backport my mods. When breaking changes are made in Minecraft between versions,
the code of the mod has to be changed to support the new version, making the older version of MC incompatible.
If you want to support multiple versions of Minecraft, you have to maintain multiple branches of the mod, which
is a lot of work for just one person, and I don't have the time to do that.
This is a one-off backport, and I will not be backporting any future versions of YACL to 1.19.2. If you want to
support and use new features of YACL in your mod, you will have to drop support for 1.19.2.
25.12.2022 · 102 293 downloads
List is empty text when lists are emptyLabelOption for shorthand to making labels!14.12.2022 · 10 335 downloads
11.12.2022 · 1 422 downloads
Implements mutable list options where you can create, remove and shift entries in a list.
Lists hack option groups with their own implementation for this, so each individual list takes form as a whole option group.
ListOption.createBuilder(String.class)
.name(Text.of("List Option"))
.binding(/* gets and sets a List, requires list field to be not final, does not manipulate the list */)
.controller(StringController::new) // usual controllers, passed to every entry
.initial("") // when adding a new entry to the list, this is the initial value it has
.build()
When implementing this, it was vital to me that all controllers work with lists, not ones specifically designed
for list entries. This was achieved quite easily by having each entry being its own option with an empty name and tooltip with its own controller, that pairs with its list "parent" to actually modify the option.
Option groups were taken advantage of and hacked into its own option, only minor changes had to be made to get this
to work with value application.
Applicable controllers have been modified to expand their inputs to near full width when no name is present.

StringControllerElement to have unlimited text lengthDelete in a text field whilst text is highlighted, Backspace like it should.07.12.2022 · 3 058 downloads
14.11.2022 · 132 176 downloads
GsonConfigInstance now only serializes fields annotated with @ConfigEntry to prevent strange GSON problem.13.11.2022 · 948 downloads
Dimension into Dimension and MutableDimensiondim private in AbstractWidget so mods can't change the dimension without setDimensionisPendingValueDefault to check if pending value is equal to default value of bindingOption#requestSetDefault and Option#forgetPendingValue implementations weren't notifying listeners20.10.2022 · 10 732 downloads
23.09.2022 · 12 984 downloads
availableValues to be passed to EnumController23.09.2022 · 1 362 downloads
23.09.2022 · 255 downloads
22.09.2022 · 1 875 downloads
StringControllerElement methods to be inheritable20.09.2022 · 470 downloads
20.09.2022 · 202 downloads
19.09.2022 · 727 downloads
ButtonOption now consumes itself, so you can access it when building.Option#available mutable with Option#setAvailable18.09.2022 · 1 036 downloads
PlaceholderCategory: A category that when selected, just opens a screeninstant property for option builders: makes the option apply instantly instead of when pressing "Apply"17.09.2022 · 485 downloads
15.09.2022 · 1 200 downloads
13.09.2022 · 768 downloads
12.09.2022 · 11 861 downloads
10.09.2022 · 2 696 downloads
06.09.2022 · 1 404 downloads
05.09.2022 · 159 downloads
05.09.2022 · 1 649 downloads
No changelog provided.