Changelog
Additions
- Added 
ValidatedFieldmapping. Validation can be mapped to validation of any other convertible type with the newmapmethods.- New helper class 
ValidatedRegistryTypemapsValidatedIdentifierto registry objects, allowing for easy direct implmentation of setting based on registry objects (Items, Blocks, etc) without having to later map the identifiers yourself. 
 - New helper class 
 ValidatedFieldnow has a helpercodecmethod for generating a Codec of the underlying type.ValidatedFieldnow has a listener system that triggers on anysetof the field. This listener is aConsumer<ValidatedField<T>>and is added withwithListener- Added 
EventApiand corresponding direct implementations in theConfigclass- like other sub-apis, access this Api through the 
ConfigApi onSyncClient- fires when a config is synced to a clientonUpdateClient- fires when a config is updated in-game on the client sideonUpdateServer- fires when a config is updated in-game on the server side
 - like other sub-apis, access this Api through the 
 - Added 
ConfigAction, which can be used to add arbitrary on-click buttons in the Config GUI. Use them to link to your wiki, open a patchouli guide book, give the player an item, etc. - Added extremely basic 
PlatformApifor simple cross-loader tasks like checking if the game state is client-sided or not. 
Changes
- Specialized widgets no longer internally extend 
PressableWidgetorButtonWidget, which was causing issues with Visual Overhaul or any other mod that leaks the constructor of the widget. It is recommended to use theCustomvariants of those classes for any custom validation implementation. 
Fixes
ValidatedIdentifiercan now bind to dynamic registries using theofRegistryKeyinitializer methods.- Fix syncing on login not working.
 - Fixed updates on client-only configs sometimes blasting the log with the full config contents.
 

