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.