Version 0.6.0 implements several breaking changes, please update implementations as needed, and feel free to reach out to discuss issues that come up.
ValidatedEntityAttributeis removedCustom[Widgets]are moved from the internal widget package to the custom package- Several widgets and other classes have been deleted
PopupWidgethas many deprecations, and probably at least one breaking change despite my best efforts- Possibly more, I didn't take great notes
Registrar is still marked experimental with anticipated stability by 0.7.0
As of 0.6.0, 1.20.4 and 1.20.6 will no longer be receiving active updates.
Additions
- Created a ground-up list widget system with
CustomListWidgetand the built-in implementationDynamicListWidget. This new list is more powerful than the vanilla lists, allowing for varying heights for each element, hiding/unhiding individual entries, built in searching of entries, and more. - Created
Searchersystem for building simple search implementations from a collection of elements. ValidatedPairand corresponding methodValidatedPair.pairWith. This new validation joins two settings into one, and displays their widgets side-by-side. This is convenient for number ranges and so on.- Validated numbers now have a third widget type,
TEXTBOX_WITH_BUTTONS. The standard entrybox also has a small up and down button with this layout. - Added custom ScreenNarrator implementation for config screens with several improvements and bug fixes over the vanilla narrator.
Translatable Updates
Translatablenow includes aprefixelement. Add a lang key for a setting, section, or config to add inline "prefix text" that appears above the setting or at the top of the setting list, respectively. This pairs well with the next addition- For implementations of
Translatable, be sure to overridehasPrefix,prefix, andprefixKeyas needed.
Config Groups
- Added new Config Group system. Groups are inline, collapsible collections of settings. Groups are an excellent place to add a prefix, to provide a general description of what the settings inside the group do.
- Groups can be nested, though this is probably not needed in most circumstances
Screen Anchors
- Configs, Sections, and Groups are now Anchors, much like anchors in a web page.
- A new go-to menu in the bottom left (accessible by pressing Ctrl + E also) allows you to quickly navigate between all the anchors of the current config namespace.
Context Action System
- Created new keybind-like
ContextActionsystem that allows for powerful handling of context actions and key presses. - Automatically builds context menus as applicable to the right-clicked element.
- Handles complex keybinds like ctrl-shift-C, etc.
- Handles inputs in a layered manner, allowing each layer to only capture the inputs it cares about, passing the input
- Added several new keybinds
- F1: Opens info screen
- Ctrl + E: Opens goto menu
- Backspace: Return to the previous config screen
- Home: Scrolls to the top of the config list
- End: Scrolls to the bottom of the config list
- (Context menu): You can now fully clear collection settings with the Clear command.
EntryCreator
- New system for creating list entries in an orderly manner
ValidatedFieldnow has several helper methods for easily creating custom entries without needing to fully re-implement the base design.
LayoutWidget
LayoutWidgetadded, a generalization and improvement of the system inPopupWidget. This widget can be used to create automatically laid out collections of widgets using a DOM-like layout model.- Entry creators and several other systems in FC now use these layouts.
Changes
- The Result Provider API is promoted to stable
- The
Possystem now implementsSupplier - Overhauled the
Decorationsystem, nowDecorated, a simple Drawable-like interface that allows passing of different types of icons to various FC systems, dynamically rendered, animated, etc. - Most custom widget implementations now use a
TextureSetsystem for defining textures to use in various hovered and focused states
Fixes
- Fix apparent concurrent modification problem with screen scope registration.
- Moved catalogue compat back to somewhere that Catalogue can actually find it.
- Fix crash on suggestion windows trying to substring empty suggestions.
- Fix config objects that don't implement
equalsnot mapping properly between de/serializations, which improperly caused resets of data. - Fixed bug with update de/serialization not working properly on nested config sections
Scheduled API removal in 0.6.0: ValidatedEntityAttribute. Reimplement usages of this class as needed.
Additions
- New
isDevmethod inPlatformApifor checking if the instance is running in a development environment. - Implemented a barebones
Registrarsystem for platform-agnostic registration of objects. This API is experimental, with scheduled stability by 0.6.0.- Registers objects into
RegistrySupplierinstances, much like the (Neo)Forge deferred registry system.
- Registers objects into
- Added
onRegisteredClientandonRegisteredServerto theEventApifor listening to config registrations and only acting after the config has been successfully registered. - New version of
ValidatedField.validateAndSet,validateAndSetFlaggedthat acceptsEntryFlag.Flag(and inspects the field own flags) and changes set behavior based on flags present.EntryFlag.Flag.QUIET: flagged field won't call listeners on changeEntryFlag.Flag.STRONG: fieldvalidateAndSet/validateAndSetFlaggedwill use strong validation. Weak validation is standard.EntryFlag.Flag.UPDATE: field will update its current sync state when the value is set.
- Added overload to
ValidationResult.reportthat takes a string consumer directly for immediate reporting of issues. - New
Codecshelper class in PortingUtils for handling version-agnostic Packet Codecs. Thanks Mojang.
Changes
ConfigApi.isConfigLoaded(scope)has been deprecated in favor ofConfigApi.isConfigLoaded(scope, type). This new overload can check for client configs; the now-deprecated method only checked synced ones.- Also consider the new register event instead of trying to check for config load yourself.
- Scheduled
ValidatedEntityAttributefor removal in 0.6.0. It is completely unused as far as I can tell with a github-wide search, and quite an unstable concept in general. If needed, a similar validation can be built for your own usage.
Fixes
- Fixed inaccurate docs in
ValidatedEntityAttribute.BuilderandEntityAttributeInstanceHolder


