A general utility, GUI and config library for modding on Fabric and Quilt

A general utility, GUI and config library for modding on Fabric and Quilt
Features include:
owo-ui, a fully-featured declarative UI library for building dynamic, beautiful screens with blazingly fast development times
owo-config, a built-in, customizable configuration system built on top of owo-ui. It provides many of the same features as Cloth Config while many new conveniences, like server-client config synchronization, added on top
A fully automatic registration system that is designed to be as generic as possible. It is simple and non-verbose to use for basic registries, yet the underlying API tree is flexible and can also be used for many custom registration solutions
Item Group extensions which allow for sub-tabs inside your mod's group as well as a host of other features like custom buttons, textures and item variant handling
A fully-featured networking layer with fully automatic serialization, handshaking to ensure client compatibility and a built-in solution for triggering parametrized particle events in a side-agnostic manner
Client-sided particle helpers that allow for easily composing multi-particle effects
Rich text translations, allowing you to use Minecraft's text component format in your language files to provide styled text without any code
owo is documented in two main ways:
Required
Required
Terms for using, modifying and redistributing this product.
29.04.2026 · Modrinth
This release represents a build of the largely untested braid-ui-1.21 branch, hence it is marked as an alpha. It is not entirely equivalent in features to 0.13.0 for 1.21.11+ and the features which were backported have not been comprehensively tested for backwards compatibility with mods compiled against previous 1.21 versions of owo-lib.
This release is provided primarily for mods like Arcane Repository and Trickster, which want to make use of braid on 1.21....
Screenshots and images from the original Modrinth page.

Published versions and original Modrinth files.
29.04.2026 · 317 925 downloads
This release represents a build of the largely untested braid-ui-1.21 branch, hence it is marked as an alpha. It is not entirely equivalent in features to 0.13.0 for 1.21.11+ and the features which were backported have not been comprehensively tested for backwards compatibility with mods compiled against previous 1.21 versions of owo-lib.
This release is provided primarily for mods like Arcane Repository and Trickster, which want to make use of braid on 1.21. Besides fixes for major compatibility issues we will not be supporting or updating it.
24.03.2026 · 338 584 downloads
This is a straightforward port to 26.1
31.01.2026 · 811 008 downloads
In preparation for future unobfuscated versions of the game, owo-lib is now developed using the official Mojang Mappings and relevant API elements have been renamed accordingly. Besides a number of straight-forward adaptations (like World -> Level), this also meant that the core class of owo-ui (previously Component) had to be renamed to UIComponent to avoid a name collision with net.minecraft.network.chat.Component. Related classes follow suit, e.g. ParentComponent -> ParentUIComponent, Containers -> UIContainers.
In addition to Rich Translations, owo-lib now supports nested language files which help to greatly reduce repetition in language keys. Additionally, to reduce conflict potential, all of owo's language extensions are now opt-in. Check out the relevant section of the docs.
The majority of JSON files in any data/resource pack can be converted to use JSON5 when owo-lib is configured to read and convert them to JSON on-the-fly. Once again, check out the docs.
Due to unforeseen technical circumstances (I did not want to remap the entire library twice), this build includes an early pre-alpha version of the upcoming braid UI framework. While reasonably well-tested and somewhat mature feature-wise, we do not consider it ready for release and we make absolutely no guarantees about API stability.
If you want to try it out or toy around with it anyways, check out the getting started guide. We'd love to get some early feedback!
22.11.2025 · 10 275 downloads
Fix issues with concurrency leading to missing packets for mods using owo networking
21.11.2025 · 483 downloads
Fixes:
- missing AT entry for setTooltipForNextFrameInternal causing missing tooltips
13.10.2025 · 10 367 downloads
inspectorDescriptor getter to customize the text displayed below them when the inspector is activeReadView and WriteView have new methods for getting/setting values in them using keyed EndecsModDataLoader now works properly in a development environment using split sourcesDropdownComponent now correctly returns the dropdown09.10.2025 · 678 692 downloads
inspectorDescriptor getter to customize the text displayed below them when the inspector is activeReadView and WriteView have new methods for getting/setting values in them using keyed EndecsModDataLoader now works properly in a development environment using split sourcesDropdownComponent now correctly returns the dropdown09.10.2025 · 431 012 downloads
07.10.2025 · 561 downloads
zIndex property of owo-ui components has been removed - it has been nonfunctional since 1.21.601.10.2025 · 16 081 downloads
zIndex property of owo-ui components has been removed - it has been nonfunctional since 1.21.614.09.2025 · 5 317 downloads
Add AT entry for simple map of DataComponentMap to resolve crashing
11.09.2025 · 322 downloads
Attempt to resolve issues with client side loading of classes and methods leading to crashes
13.08.2025 · 1 426 downloads
Fix issues with MergedComponentMapMixin At targets due to not being remapped
08.08.2025 · 192 343 downloads
OwoItemGroup.getBackgroundTexture to getOwoBackgroundTexture to avoid a naming conflict when developing in an environment with Mojang MappingsDerivedComponentMap should play more nicely with other mods that manually check for component equality06.08.2025 · 450 downloads
This release is primarily a port to 1.21.6/7. Due to the massive vanilla refactors around GUI rendering in particular, this is a larger-than-usual update and we expect there will be some bugs and porting mistakes - please report anything you find!
OwoBlurRenderer has been replaced with BlurQuadElementRenderState in accordance with the vanilla GUI rendering changes(Block|Entity|Item)RegistryContainerOwoItemSettings, replaced by interface injection on Item.SettingsDraggableContainer.alwaysOnTopCodecUtils.ofEndec, replaced by toCodecConfigScreen.(registerProvider|getProvider|forEachProvider), replaced by ConfigScreenProvidersDerivedComponentMap equalityIdentityHolderChanges to how classes persist due to the removal of @OnlyIn could lead to issues but mostly taken care of.
19.07.2025 · 1 347 968 downloads
Attempt fix for issues with equality with DerivedComponentMap which resolves issues with other mods like Pastel
07.07.2025 · 27 488 downloads
Update attempts to remove dependency on FFAPI to resolve issues, fix missing owo item groups, and pull from upstream 1.21.1, and fix issues with optional serialization issues
01.07.2025 · 100 140 downloads
This release is primarily a port to 1.21.6/7. Due to the massive vanilla refactors around GUI rendering in particular, this is a larger-than-usual update and we expect there will be some bugs and porting mistakes - please report anything you find!
OwoBlurRenderer has been replaced with BlurQuadElementRenderState in accordance with the vanilla GUI rendering changes(Block|Entity|Item)RegistryContainerOwoItemSettings, replaced by interface injection on Item.SettingsDraggableContainer.alwaysOnTopCodecUtils.ofEndec, replaced by toCodecConfigScreen.(registerProvider|getProvider|forEachProvider), replaced by ConfigScreenProviders11.05.2025 · 6 494 downloads
Initial port of owolib 0.12.21 for Neoforge
11.05.2025 · 625 493 downloads
OwoBlurRenderer now uses the depth buffer in its render pass to fix blur rendering issues on some driversgui_textured render pipeline20.04.2025 · 11 100 955 downloads
18.04.2025 · 65 955 downloads
GlProgram API has been removed since it is no longer necessaryOwoClient.HSV_PROGRAM has been superseded by OwoUIPipelines.GUI_HSVOwoClient.BLUR_PROGRAM has been replaced with the OwoBlurRenderer, which uses the same shader and parameters under the hood17.04.2025 · 23 594 downloads
12.04.2025 · 373 671 downloads
Fixes:
- Fix issues with errors relating to texture identifier being null
- Fix issue involved with ModDataLoader on Connector not being able to get any mod list
17.03.2025 · 29 435 downloads
Fixes issues for devs due to improper declaration of Access Widner
16.03.2025 · 1 118 downloads
12.03.2025 · 505 048 downloads
NbtSerializer.Sequence to fix deserialization of types like UUID which expect a specialized NBT array type (#363, Blodhgarm)18.02.2025 · 10 098 downloads
Deal with issues involving recent changes to neos reload listeners changes
29.12.2024 · 1 054 554 downloads
drawComponentTooltip16.12.2024 · 1 202 downloads
12.12.2024 · 119 384 downloads
OwoUIAdapter is no longer drawn directly inside the adapter's render method. Instead, the separate drawTooltip method must be invoked after rendering, allowing tooltips to be rendered definitively after all main UI11.12.2024 · 1 018 downloads
Update to fix issues where networking would only register within debug environment.
29.11.2024 · 523 downloads
Removes final bit of renderdoc code
29.11.2024 · 65 743 downloads
Removes final bit of renderdoc code
20.11.2024 · 325 downloads
Update to 1.21.3 which brings less of a reliance on FFAPI and disabled RenderDoc utility to use neos RenderNurse within the future
20.11.2024 · 2 870 downloads
Disable RenderDoc Utils to be replaced with Neos RenderNurse
13.11.2024 · 2 385 downloads
Fix issues with config screens being non existant though mod info screen
08.11.2024 · 95 073 downloads
TextureComponent rendering now works properly again03.11.2024 · 3 540 downloads
Fix issues where during a ModLoading error, owolib would be blamed for Shader loading issues due to neos continuation of general asset loading
28.10.2024 · 4 703 downloads
field(...) methods on (De)Serializer.Struct have changed to accomodate24.10.2024 · 1 555 downloads
Update version to be consistent with maven
23.10.2024 · 12 308 downloads
Primarily, this release constitutes the first port of owo-lib to 1.21.2/3. There were however also a number of other changes:
CodecUtils now offers the eitherStructEndec(...) and xorStructEndec(...) methods for creating either/xor endecs which conform to the StructEndec interfaceConfigWrapper constructorAutoRegistryContainer API is deprecated for the moment and might be (partially) removed in a future release. We're investigating potential alternativesBaseOwoHandledScreen#componentsForExclusionAreas()BaseOwoHandledScreen#enableSlot(Slot) no longer incorrectly disables the slot23.10.2024 · 457 downloads
Fixes issues with Concurrent Modification Exception with FFAPI networking
22.10.2024 · 828 downloads
Initial Release of owo for Neoforge. Yippie!
08.10.2024 · 2 497 984 downloads
This release fundamentally changes the implementation used for Endec/Codec interop. Instead of always using EDM as the intermediary format, the framework will now try to determine if a format-appropriate (De)Serializer/DynamicOps implementation is available and use it if so. This means that the serialized representation of all data structures should now be both consistent and preserved correctly when in complex nested scenarios, something we hope will alleviate an entire class of bugs. Most of these are related to serialized EDM which turns out unrepresentable in NBT, but other formats might have been affected too
15.09.2024 · 233 961 downloads
CursorStyle now includes the whole range of standard cursors implemented by GLFW (#296, chyzman)ScissorStack utility - this fixes a bunch of edge-cases with mods like Ok Boomer13.09.2024 · 14 499 downloads
CheckboxComponent now functions correctly again03.09.2024 · 61 835 downloads
OwoItem#deriveStackComponents). The current implementation only re-derives components when Item#postProcessComponents gets invoked and is subject to changeConfigScreenProviders class to avoid classloading issues (the old methods on ConfigScreen remain but are deprecated for removal). Along with this change, the config screen generated by a provider no longer needs to extend owo's ConfigScreenSyncedProperty and screen handler messages APIs now properly pass registry context when serializing over the network28.07.2024 · 235 511 downloads
ComponentTypes can now have both their codec and packet codec populated by calling .endec(...)CodecUtils.toEndec along with CodecUtils.toEndecWithRegistries allow creating endecs from both a codec and packetcodec (where the latter one uses a packetcodec of RegistryByteBuf)Surface.panorama(...) allows using Minecraft's main menu panorama as an owo-ui surfaceSizing.RandomOwoItemSettings-specific methods are now interface-injected onto all item settings and the previous class deprecatedEndecRecipeSerializer is no longer abstract, making subclassing unnecessary in most casesEdmOps to alleviate most (hopefully all) problems related to codec <-> endec interop when NBT is involved (Blodhgarm)MinecraftEndecs.PACKET_BYTE_BUF no longer moves the reader index when encoding a bufferColor.ofDye, which was improperly ported, now produces correct colors again (#273, Blodhgarm)OverlayContainer no longer mounts its children incorrectly if it has a non-zero position (#278, kikugie)15.06.2024 · 339 477 downloads
This build is primarily a port of 0.12.9 to 1.21. This mandated a few other changes:
The Endec API is no longer built into owo-lib. Instead, owo now uses and ships the standalone endec library. This entails four major changes:
- Endecs for Minecraft's types are no longer found on BuiltInEndecs but instead on MinecraftEndecs
- DFU interop (namely, converting between codecs and endecs) is now handled through CodecUtils.toCodec/toEndec and related functions
- A number of package changes, primarily io.wispforest.owo.serialization -> io.wispforest.endec
- All JSON-related implementations are now named after the JSON library they use. In consequence, the previous JsonSerializer is now GsonSerializer and so on
EdmOps no longer uses null as its empty value, fixing a number of edge cases with particular types of DFU codecs when doing interopScreenHandler extensions don't require a HandledScreen anymore and now also support other screens which implement `ScreenHandlerProvider11.06.2024 · 61 475 downloads
SpriteComponent now supports sprites in the GUI atlasSpriteComponent can now enable blending, using the same API as TextureComponentColorPickerComponent, the curses now uses the MOVE style01.05.2024 · 12 057 downloads
29.04.2024 · 864 downloads
This build fixes a crash (#229) that would occur either on boot or when joining a server (depending on other context) with 0.12.6 for 1.20.5
28.04.2024 · 424 downloads
This release is primarily a (preliminary, hence beta) port of 0.12.6. However, prompted by the game's networking changes and further reliance on attaching registry references to serialization infrastructure, there have been major internal reworks to both the Networking API and Endec. The majority of these changes are transparent to users, with the exception of the occasional requirement to pass a SerializationContext into Endec methods (the documentation will be updated accordingly).
03.04.2024 · 272 426 downloads
Endec#flatFieldOf function creates special struct fields which enable merging the fields of a StructEndec into another one through StructEndecBuilder.ofEXPAND sizing method now works correctly in presence of a non-zero gap when used inside a FlowLayout (#219)17.02.2024 · 75 696 downloads
EdmElement instances which hold a MAP type can now be represented as an EdmMap (which, importantly, implements MapCarrier and can thus be used with KeyedEndec) using EdmElement#asMap (#209, Blodhgarm)RecordEndec is made) can now be annotated @NullableComponent to support null serialization (#216, Blodhgarm)OPEN_URL is clicked in an owo-ui label component, the resulting link confirmation screen now properly returns to the screen with label on it after the link has been confirmed/rejected by the user (#214)13.02.2024 · 8 078 downloads
BlockHitResult endec now encodes correctly and has been made publicly available as BuiltInEndecs.BLOCK_HIT_RESULT18.01.2024 · 36 506 downloads
17.01.2024 · 767 downloads
15.01.2024 · 1 801 downloads
A new sizing method joins the owo-ui framework - Sizing.expand. It works mostly the same as Sizing.fill (and indeed identically in a few cases) with the important difference that it applies after all other sizing types and only takes into account the space that remains after all other components have been inflated according to their sizing.
Along with this, the new Components.spacer can be used to, for example, easily push two components to opposite ends of their parent
OverlayContainer no longer closes itself when its child is clicked inbounds but doesn't consume the event. Further, it prevents the screen from closing when ESC is pressed and instead only closes itself and it consumes all scroll events to avoid scrolling through the overlay(#199)BaseOwoScreen and BaseOwoHandledScreen) can now process and consume ESC keypressesEntityComponent.RenderablePlayerEntity now correctly loads skins againBaseComponent.hovered is now only set to true when the component is not obscured by another one (#199)01.01.2024 · 19 761 downloads
The major addition this time around is the Endec serialization framework, an interoperable alternative to Mojang's own Codec. As outlined in the changes section, this supersedes a bunch of older owo APIs as well - notably networking. To get started with endec, check out the newly written documentation: https://docs.wispforest.io/owo/endec/
NbtKey and all associated API has been removed entirely in favor of the new, Endec-based and functionally extremely similar KeyedEndec used in conjunction with MapCarrier (which is interface-injected onto the same classes as NbtCarrier used to be)PacketBufSerializer has been removed in its entirety and all dependent API updated to use Endecs instead. For writing data directly to a network buffer like the old API used to allow, use the equivalent Endec (potentially obtained from the ReflectiveEndecBuilder) together with the interface-injected PacketByteBuf#write(Endec, Object) and PacketByteBuf#read(Endec)CustomTextContent along with CustomTextContentSerializer no longer exist - instead, simply implement the vanilla TextContent interface, create a TextContent.Type with the appropriate codec and register said type in the CustomTextRegistry as beforeScissorStack now clamps the width/height passed to glScissor to prevent causing OpenGL errors in contexts with funky transformationsFinally, the following previously deprecated API elements have been removed:
- BaseParentComponent#mountChild, use the new two-argument version instead to prevent unnecessary inflations
- ParentComponent#collectChildren, replaced by the more appropriately named but functionally identical ParentComponent#collectDescendants
- OwoItemGroup#setSelectedTab, OwoItemGroup#getSelectedTab and OwoItemGroup#getSelectedTabIndex - use the new equivalents which are aware that multiple tabs can be selected
- NinePatchRenderer and OwoNinePatchRenderers, long-replaced by NinePatchTexture and OwoNinePatchTextures
09.12.2023 · 86 652 downloads
librenderdoc available system-wide on Linux no longer causes a JVM crash due to a bug in JNA which we now circumvent (#197)02.10.2023 · 55 199 downloads
panelWithInset(...) surface allows building interfaces in the style of the Social Interactions screenOwoItemSettings#trackUsageStat()DisposableScreen interface if they need to be notified when the player actually closes all screens (that is, returns to the game) instead of immediately when navigating to a different screen (which might then later navigate back to the first screen)Sizing.fill() can now be called with zero arguments to indicate 100% fillUIParsing.registerFactory(...) can and should now be called with an indentifier instead of a plain string for the element nameParentComponent#childById(...) is no longer @Nullable, as it is generally expected to return a component in its most common use-case (querying the constituents of a UI model)12.09.2023 · 18 114 645 downloads
03.07.2023 · 185 196 downloads
ltr-text-flow algorithm for flow layouts no longer miscalculates its columns in some situations (#137)OwoUIDrawContext.of(...) now inherits the matrix- and scissor-stacks of the source context - this is more intuitive given how the method is named and used & fixes a few transform-related problems in owo-uiReiUIAdapter now flushes the draw buffer when its finished rendering to prevent mysteriously empty tooltipsScreenUtils.handleSlotTransfer(...) has been reversed to match vanilla behaviorDrawContext enable easy, fluent matrix-stack manipulation directly on the associated draw context (#136, Blodhgarm)ItemOps.decrementPlayerHandItem(...) and .emptyAwareDecrement(...) gained new overloads which accept a count instead of always decrementing by 1 (#141, chyzman)08.06.2023 · 154 954 downloads
When instantiating templates in a UI model, you can use the new <template-name>@<ui-model-id> syntax to reference a template from a different UI model. This allows much greater flexibility than before in modularizing and re-using templates across different screens.
Along with this change, the <components> element in UI model definitions is no longer required.
blur() surface now supports parsing from UI modelsBaseOwo*Screen implementations now provide the component(...) shorthand for this.adapter.rootComponent.childById(...)alignComponentToHandledScreenCoordinates(...) on the instanceSurface.PANEL_INSET was added, which renders an inset area to be used inside Surface.PANEL - this looks very similar to the vanilla recipe book panelsmallCheckbox(...) and slimSlider(...), were added - they function mostly identically to the already existing counterparts, but (as the name implies) take up less space and offer more customizabilityTextAreaComponent, a third new component, is an extension of vanilla's new EditBoxWidget for general-purpose use and optimized to play nicely within an owo-ui contextItemComponent offers a new property, setTooltipFromStack, which always keeps the component's tooltip in sync with the item stack it's displayingLabelComponent can now be configured using the new lineHeight property, which allows properly supporting non-standard fontsPositioning.across()StackLayout respects much the same layout rules as FlowLayout, but doesn't place components next to each other - instead it places them on top of each other, thus creating a stack of componentsContainers.ltrTextFlow(...) creates a new type of FlowLayout, which works just like Components.horizontalFlow(...) but wraps when it exceeds its own width - just like how left-to-right text is laid out in a documentServer-sided retrieval of a client's config options has been made more ergonomic. For this purpose, the generated config wrapper now exposes the key of each individual option through the .keys object. Further, ConfigSynchronizer.getClientOptions received a new override which directly accepts the config wrapper, enabling the following API:
var optionValue = ConfigSynchronizer.getClientOptions(player, MyMod.CONFIG).get(MyMod.CONFIG.keys.someOption);
AutoRegistryContainer provides two new convenience functions:.register(...), which is simply an alias for FieldRegistrationHandler.register(...).conform(...), which forcefully casts a Class<?> to a Class<T> for implementing getTargetFieldType() for parametrized classesHUD now processes removal requests before add requests, allowing HUD components to be properly reloaded within the same frameH: to denote the slot index in the handler and I: to indicate that slot's index into its respective inventoryfile(...) UI model data source is now deprecated in favor of a new, configurable hot reload system which is only active in development. This way, you cannot accidentally ship your mod with the file data source enabled, causing it to crash in productionNinePatchRenderer was renamed to NinePatchTexture and reworked to function in a data-driven manner. No old functionality has been removed yet, it was however deprecated. More details on how to use the new implementation will be added to the documentation shortlyItemComponents once again use correct lighting on side-lit models and apply lighting properly when non-side-lit models are scaled downLabelComponent now properly fetches the text style under the cursor when determining which hover and click events to executeTextFieldWidget and EditBoxWidget now have their tick() function called when wrapped by owo-ui, making their cursors blink properlyScrollContainer.scrollTo(...) now works properly on horizontal containers and has a new overload for directly specifying the target scroll offset without supplying a componentParticleSystemControllers no longer forcefully require handshaking when merely mentioned, fixing optional handshaking (BasiqueEvangelist, #123)Finally, the following previously deprecated API elements have been removed:
- VerticalFlowLayout and HorizontalFlowLayout, which have been replaced by instantiating FlowLayout with the respective Algorithm
- OptionComponent and OptionComponents.createSlider, which were replaced by OptionValueProvider and OptionComponents.createRangeControls respectivel
- SliderComponent#onChanged, replaced by the respective event stream
30.05.2023 · 38 969 downloads
Continuing the spirit of the last two releases, this build brings another very important fix - this time to config synchronization. The previous implementation had a bug where all synced options would be lost upon death of the player, which caused crashes specifically in conjunction with YIGD and Numismatic Overhaul
This should ideally be the last build that backports fixes from the 0.11 prereleases and therefor the last release for 1.19.4 before we move onto 1.20
25.05.2023 · 888 downloads
Just like 0.10.4, this is another round of small fixes:
- Fabric API fixed their implementation of the screen render event, leading to owo's workaround now breaking rendering of owo-ui layers
- Lighting orientation on owo-ui item components was fixed, as proposed in #119
19.05.2023 · 2 070 downloads
Similarly to 0.10.3, this build contains more changes to the core shader loading system.
The immediate effect of this is proper compatibility with the QSL implementation of Fabric's Core Shader API, although it should also make such incompatibilities much more unlikely to occur in the future
20.03.2023 · 41 183 downloads
This build is indentical feature-wise to 0.10.3 for 1.19.3
16.03.2023 · 21 348 downloads
This release primarily fixes compatibility with Fabric API's latest core shader registry addition. As such, Fabric API >=0.76.0 is now required.
Along with this, parsing order in owo-ui's text-box has been corrected to set max-length before reading text (#110)
31.01.2023 · 4 528 downloads
The vertical and horizontal layout algorithms that were previously implemented in the respective subclasses of FlowLayout have been factored out into two implementations of the new Algorithm interface. The subclasses are temporarily preserved for backwards-compatibility but are deprecated and will be removed in the next major version.
Ideally you should already migrate your code to use the generic FlowLayout class to prepare for the move
ShaderProgram are no longer required, which should fix compatibility with Satin on Quilt (#83)GreedyInputComponentsNaN has been resolved18.01.2023 · 3 302 downloads
This build fixes a crash that would occur when Satin is installed alongside owo by allowing Satin's shader identifier fixin to take precedence of owo's very similar implementation
17.01.2023 · 250 downloads
ColorPickerComponent presents an easy-to-use, self-contained way to choose a color. It visually presents a standard HSV picker, with a hue (and optionally alpha) slider and picker for value and saturation. The picker itself shows neither a color preview nor hex field - these can easily be added externally via the color selection event stream supplied by the pickerOverlayContainer, accessible via Containers.overlay(...). This component, when added to some parent (in most cases the root), renders an overlay covering the entire parent and places its child in the center. By default, it automatically closes itself when a click event is received outside the childItemComponent features the new tooltipFromItem utility method, which can be used to gather the full tooltip of an item stack, including extra tooltip dataEntityComponent can now be toggled on a per-component basisopenAsContextMenu function on DropdownComponent enables easy integration of context menus into any screenfinished() event stream which emits every time the animation finishes a full run in either directionRenderEffectWrapper, accessible via Containers.renderEffect offers a hassle-free way to apply arbitrary rendering effects to its children. Check out the component's javadoc for a more complete overviewColor type is now supported in configs. This means it will be properly serialized as a string representing the color in #AARRGGBB format and displayed that way in the config screen. With this also comes an optional color picker, allowing your users to easily pick a color (optionally with alpha as well)@RangeConstraint annotation has gained the new decimalPlaces parameter which controls how many decimal places are shown when this option is edited as a sliderThe Drawer class has gained a few new rendering functions to fill in missing functionality:
- drawCircle and drawRing can be used to draw either a filled circle or ring with specific inner and outer radius respectively
- drawLine draws an arbitrary line as a quad instead of using OpenGL's line mode, which allows more correct control over thickness
Additionally, the new GlProgram class and corresponding infrastructure enables usage of custom core shaders from mod namespaces. Two default programs are provided, although they are not currently part of stable public API:
- OwoClient.BLUR_PROGRAM applies an approximate gaussian blur to the area it draws over
- OwoClient.HSV_PROGRAM works much the same as the standard position-color program, but accepts the color attribute in HSVA format instead of RGBA
Color has been improved: Constructing a color with a hue of 1 no longer causes it to become yellow instead of red and the new hsv() getter can be used to convert from RGB to HSV easilyRenderablePlayerEntity inner class of EntityComponent is now publically accessible - this makes it easier to call methods on such entities and allows easily extending the class if so desiredDropdownComponent.requiresHover has been renamed to closeWhenNotHovered to more clearly communicate its purpose. The entire dropdown system has been slightly overhauled in general to be more visually pleasing and easier to use OptionComponentFactory.Result now features two type parameters to more cleanly carry information about the contained componentsEntityComponentOwoItemGroup sub-tabs which are not the first one are now properly indexed for search in the creative inventory09.12.2022 · 773 689 downloads
Refer to 0.9.3+1.19.3
09.12.2022 · 9 589 downloads
This build primarily constitutes the first public release for 1.19.3. It also fixes a bug introduced in 0.9 which caused text field event listeners to break in production.
28.11.2022 · 1 101 downloads
This build reverts a change made to the Item Group API when porting to 1.19.3 which caused the creative tabs of mods which use an owo Item Group without owo item settings to be empty. This affected primarily Conjuring (for which a separate update was released) and Numismatic Overhaul
27.11.2022 · 1 325 downloads
This build fixes an NPE that would occur when config search focuses an option inside 2+ collapsed containers
22.11.2022 · 907 downloads
OwoUIAdapter is now available globally via the new CursorAdapter abstraction, which also provides the implementation for owo-uiComponent enables inline configuration of component properties which don't return the component itself. Due to limitations with Java's generic parameters, it is required to manually specify the type of component you're configuring when calling this method, like so: Components.label(...).<LabelComponent>configure(label -> label.mouseDown().subscribe(...)). onToggled event stream as well as their current stateroot() methodmax-length elementScissorStack, allows escaping up to the given amount of clipping frames and execute the supplied draw callComponents#textBox(...) no longer creates and returns a TextFieldWidget, instead it creates a TextBoxComponent. This is owo-ui's extension of the vanilla text field, which properly sizes itself if the background is disabled and provides the onChanged event stream. This stream only emits events when the text in the box actually changes, unlike the vanilla change listener/owo-config command can open all config screens for which a provider is registered, even when modmenu is not installedSet<T> is now a supported type for config optionsBuilt on top of owo-ui, a new system called Layers has been introduced. This generic API allows adding, or layering if you will, owo-ui components onto arbitrary existing screens. It comes with a helper system that allows easily locating existing vanilla widgets on the screen, as well as the option to align your own components relative to them
The new createProperty along with addServerboundMessage and addClientboundMessage methods injected into ScreenHandler allow for a significant simplification of screen networking. Everything owo can serialize by default is supported out of the box for properties, which automatically get synchronized to the client, and for messages the same rules apply as for standard packets in an OwoNetChannel. As always, if a serializer is missing you can add your own via PacketBufSerializer.register(...)
This system should completely eliminate the need for externally defined networking, everything can be done directly inside the screen handler
primary attributeOwoItemGroups now define their icon in terms of an owo Icon, meaning you are no longer restricted to just item stacksslideEnd event stream which gets invoked when the user releases the slider handleapply_ContentSizing in BaseComponent has been replaced by determnine_ContentSizing which now returns the content size instead of applying it directlyMoreover, the layout algorithm has received a major optimization that improves layout times in complex screens by up to 560%
@Modmenu annotation has been made public as ConfigScreen#registerProvider. This means that any potential custom config screen implementations can now be easily registered without needing an additional dependency on modmenuowo.forceDisableDebug system property is now deprecated and superseded by simply setting owo.debug to falseTextFieldWidget, now properly respond to focus events@Nest options now show up properlyList config options to that lists elements (#69)TexturedButtonComponent, superseded by ButtonComponent.Renderer#texture(...)Components which returned ButtonWidget, superseded by ButtonComponentScreenUtils#generateSlotGrid and ScreenUtils#generatePlayerSlots, superseded by SlotGeneratorScrollContainer.scrollbarColor, superseded by ScrollContainer.Scrollbar#color(...)14.10.2022 · 53 237 downloads
BaseOwoHandledScreen now have overloads which directly accept a slot instance instead of just and ID10.10.2022 · 309 downloads
blend. When this is enabled, OpenGL alpha blending is properly set up and you can use translucent texturesINFORM_SERVER fashion even when playing singleplayerrenderdoc command is no longer registered on the server, allowing you to start servers with owo in debug mode againvisible-area declaration in the UI Model XML schema no longer requires all values to be specified03.10.2022 · 506 downloads
TexturedButtonComponent is now deprecated and superseded by the texture button rendererNinePatchRenderer utility, which can draw a nine-patch style texture in both tiled and stretched mode with next to no performance impact. This is used to enable the new scrollbar rendering and also allows buttons to scale to arbitrary sizes, contrary to the vanilla implementation. As it is also used to draw the panel surface, performance on all screens that use panels should be improvedWhen RenderDoc is injected into a game instance with owo installed, you can now take advantage of comprehensive bindings to RenderDoc API. In-game this enables the new /renderdoc client command which opens a screen that lets you configure the RenderDoc overlay as well as take captures and launch the Replay UI. Additionally, when in an owo screen, CTRL+ALT+R can create a capture of only the draw calls relevant to screen - check out the docs over at https://docs.wispforest.io/owo/renderdoc/
@Nest config entries can now have the same name as their class (#52)11.09.2022 · 22 094 downloads
slotAsComponent(int) method on BaseOwoHandledScreen. It will then always move the linked slot to where the component gets placed by the layout and apply clipping properly07.09.2022 · 794 downloads
06.09.2022 · 916 downloads
This release marks the first public beta of owo-lib 0.8, the UI and Config update. As that name suggests the primary new features in this release are the owo-ui GUI framework and the owo-config configuration and screen generation library. You can find their respective documentation here:
- owo-ui: https://docs.wispforest.io/owo/ui/
- owo-config: https://docs.wispforest.io/owo/config/
Both of these additions are highly complex and introduce potential bugs. There has been extensive testing to try and ensure a smooth start, but of course we cannot guarantee that everything has been squashed. So while we consider it more than safe enough to use, keep this in mind and please report any bugs you may find.
There have also been a number of smaller refactors and new deprecations across the entire library, notably ScreenUtils#generatePlayerSlots has been deprecated and replaced with the more flexible and powerful SlotGenerator utility. owo-sentinel has finally been fixed to work properly in 1.19 environments and the rich translations feature is now fully compatible with Server Translations API.
Another small new feature, courtesy of Blodhgarm, is the Recipe-specific Remainders API which, as the name suggests, enables recipe remainders to be defined and applied on a per-recipe level instead of globally.
As this is a large release, the majority if not all previously deprecated APIs have been stripped and/or partly refactored. The majority of mods should be fine, although if you haven't updated in a while there's potential you need to fix some things.
09.06.2022 · 24 582 downloads
07.06.2022 · 2 623 downloads
05.05.2022 · 14 516 downloads
Allow using custom stack generators with owo item groups
02.05.2022 · 1 969 downloads
NbtKey API for basic NBT serialization duties like in Item implementations and improved debug commands
20.04.2022 · 838 downloads
Headless environment support for sentinel, updated TagInjector framework, fix compatibility with Quilt Loader, add RegistryAccess, allow ClientParticles to randomize velocity on only one axis, deprecate @ElementType and @MapTypes, relocate RegistryHelper creation, add deferred packet and particle system handlers, add dispatched and polymorphic packet serializer framework, freeze particle systems
22.03.2022 · 1 297 downloads
Optional channels, automatic generics extraction, removed deprecated ServerParticles and field processing api
28.02.2022 · 368 downloads
First public release for 1.18.2
13.02.2022 · 3 490 downloads
Update to loom 0.11, add default serializers for ChunkPos and ParticleEffect, add 'query_poi' debug command, make text field injection trert didgts as word characters
29.01.2022 · 741 downloads
Fix handshake stalling the client when the server is incompatible, freeze channels after mod init, rename particle system exectute method to spawn, fix namespace of enum argument type
23.01.2022 · 294 downloads
Add handshake support to avoid joining incompatible servers, add offline data api, add new particle api, fix primitive array serialization
20.01.2022 · 183 downloads
Added networking API, some additions to ReflectionUtils
03.01.2022 · 221 downloads
Fix crash caused by an action registered via the RegistryHelper registering a new entry into its registry, make KawaiiUtil part of the public API
01.01.2022 · 150 downloads
API change in FieldProcessingSubject and its dependents - all methods that got passed ID and value now also get passed the field object
29.12.2021 · 162 downloads
Fix compat crash on servers if "OperatingSystem" was classloaded
27.12.2021 · 147 downloads
Fix crashing servers through item group init, allow agreeing to the eula in the server console
23.12.2021 · 166 downloads
Fix crash when using auto registry on a class with null fields, add /logger debug command for changing the global logging level at runtime, make opening links and files be handled off-thread to avoid stalling the client, make it possible for owo item groups to display only one tab, use the slider from the custom texture
02.12.2021 · 310 downloads
Port to 1.18 proper, fix hard-requiring REI in dev
25.11.2021 · 147 downloads
Fix TagInjector affecting all tag types
25.11.2021 · 158 downloads
Added TagInjector util
24.11.2021 · 149 downloads
I had to fix so many stupid mistakes while porting it's actually amazing
15.11.2021 · 2 938 downloads
Added teleport util
27.10.2021 · 816 downloads
First 1.18 port
27.10.2021 · 212 downloads
Added animated texture support for tab icons, added support for loading mod data from "moddata"
11.10.2021 · 474 downloads
Mid-sized feature update with breaking changes, for changelog see https://github.com/glisco03/owo-lib/releases/tag/0.3.0-fixed-rei
06.10.2021 · 160 downloads
Don't break when someone tries to use json groups
30.09.2021 · 1 271 downloads