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
Умови використання, зміни та поширення цього товару.
19.07.2026 · Modrinth
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
Скриншоти та зображення з оригінальної сторінки Modrinth.



Опубліковані версії та оригінальні файли Modrinth.
19.07.2026 · 56 152 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 78 714 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 1 765 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 1 765 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
19.07.2026 · 938 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 701 210 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 9 318 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 19 653 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 11 892 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
23.06.2026 · 1 181 770 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
| 26.3-snapshot | ✅ | ❌ | ❌ |
04.06.2026 · 7 595 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
04.06.2026 · 1 182 078 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
04.06.2026 · 13 038 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
04.06.2026 · 712 730 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2 | ✅ | ✅ | ❌ |
10.04.2026 · 13 527 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
10.04.2026 · 760 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
10.04.2026 · 27 786 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
10.04.2026 · 1 732 378 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ✅ | ❌ |
| 26.2-snapshot | ✅ | ❌ | ❌ |
31.03.2026 · 10 673 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
31.03.2026 · 1 113 576 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
25.03.2026 · 347 009 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
25.03.2026 · 970 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 | ✅ | ❌ | ❌ |
11.03.2026 · 11 643 завантаження
| Fabric | NeoForge | Forge | |
|---|---|---|---|
| 26.1 (Snapshots) | ✅ | ❌ | ❌ |
09.01.2026 · 7 842 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
| 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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
12.02.2024 · 838 374 завантаження
19.01.2024 · 14 540 завантаження
19.01.2024 · 800 825 завантаження
07.12.2023 · 3 745 завантаження
07.12.2023 · 191 184 завантаження
07.12.2023 · 229 завантаження
Updates to support 1.20.4.
07.12.2023 · 2 192 завантаження
Updates to support 1.20.4.
05.12.2023 · 6 925 завантаження
Updates to support 1.20.3.
29.10.2023 · 11 531 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
04.07.2023 · 60 190 завантаження
04.07.2023 · 3 996 завантаження
04.07.2023 · 61 608 завантаження
25.06.2023 · 380 завантаження
25.06.2023 · 7 763 завантаження
17.06.2023 · 2 728 завантаження
IntegerFieldController and LongFieldController not allowing negative values.ButtonOption changing the 'EXECUTE' text with ButtonOption.Builder#text()17.06.2023 · 87 068 завантаження
IntegerFieldController and LongFieldController not allowing negative values.ButtonOption changing the 'EXECUTE' text with ButtonOption.Builder#text()17.06.2023 · 177 завантаження
ButtonOption.Builder#text()17.06.2023 · 4 072 завантаження
ButtonOption.Builder#text()08.06.2023 · 2 721 завантаження
08.06.2023 · 113 841 завантаження
08.06.2023 · 439 завантаження
08.06.2023 · 37 724 завантаження
07.06.2023 · 5 082 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
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 завантаження
29.05.2023 · 106 завантаження
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 завантаження
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 завантаження
22.05.2023 · 102 завантаження
No changelog provided.
17.05.2023 · 234 завантаження
No changelog provided.
05.05.2023 · 1 384 завантаження
05.05.2023 · 76 562 завантаження
25.04.2023 · 2 458 завантаження
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 завантаження
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 завантаження
15.04.2023 · 10 956 завантаження
OptionGroup.Builder and ConfigCategory.Builder now extend OptionAddable so you can abstractlyOption.Builder due to unsafe varargs. There is now04.04.2023 · 7 808 завантаження
29.03.2023 · 3 483 завантаження
15.03.2023 · 9 670 завантаження
22.02.2023 · 400 завантаження
08.02.2023 · 1 130 завантаження
08.02.2023 · 214 завантаження
23.01.2023 · 1 097 342 завантаження
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 завантаження
List is empty text when lists are emptyLabelOption for shorthand to making labels!14.12.2022 · 10 335 завантаження
11.12.2022 · 1 422 завантаження
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 завантаження
14.11.2022 · 132 176 завантаження
GsonConfigInstance now only serializes fields annotated with @ConfigEntry to prevent strange GSON problem.13.11.2022 · 948 завантаження
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 завантаження
23.09.2022 · 12 984 завантаження
availableValues to be passed to EnumController23.09.2022 · 1 362 завантаження
23.09.2022 · 255 завантаження
22.09.2022 · 1 875 завантаження
StringControllerElement methods to be inheritable20.09.2022 · 470 завантаження
20.09.2022 · 202 завантаження
19.09.2022 · 727 завантаження
ButtonOption now consumes itself, so you can access it when building.Option#available mutable with Option#setAvailable18.09.2022 · 1 036 завантаження
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 завантаження
15.09.2022 · 1 200 завантаження
13.09.2022 · 768 завантаження
12.09.2022 · 11 861 завантаження
10.09.2022 · 2 696 завантаження
06.09.2022 · 1 404 завантаження
05.09.2022 · 159 завантаження
05.09.2022 · 1 649 завантаження
No changelog provided.