hytale-reactiveui-1.0.jar
9 Feb 2026
CurseForge · Hytale mod
A simple, reactive UI framework that offers better event handling, easy UI data-binding, and reusable components for making complex & dynamic user interfaces in Hytale!
Quick answer
ReactiveUI hytale-reactiveui-1.0.jar targets Hytale. Do not install it as a separate client mod. Enable it on the world host—the local server in singleplayer or the dedicated server in multiplayer. No required dependencies listed for this file.
Where it goes
Do not install it as a separate client mod. Enable it on the world host—the local server in singleplayer or the dedicated server in multiplayer.
Put Hytale mods on the world host or dedicated server. Singleplayer runs a local server too; Hytale does not use separate client mods.
hytale-reactiveui-1.0.jar. Change the file and its required mods may change too.
This file does not list any required mods. Do not add a library just because a different file uses it.
This file does not list any required or optional project dependencies. Check the creator notes before changing an existing world.
Before you install it
Built for ReactiveUI hytale-reactiveui-1.0.jar. Pick another file and the loader, install side or required mods may change.
Use hytale-reactiveui-1.0.jar. It targets Hytale; another release may target a different game build or dependency set.
This file does not list any required mods. Do not add a library just because a different file uses it.
Do not install it as a separate client mod. Enable it on the world host—the local server in singleplayer or the dedicated server in multiplayer.
Use the “Get this file” button beside hytale-reactiveui-1.0.jar. It opens that exact file at the source.
About this project
A modern, reactive UI framework for Hytale server-side modding that simplifies UI management through automatic data binding, declarative event handling, and reusable components.
Join our Discord to get support & stay updated with new additions!

repositories {
mavenCentral()
}
dependencies {
implementation("dev.jonrapp:hytale-reactiveui:1.0")
}
repositories {
mavenCentral()
}
dependencies {
implementation 'dev.jonrapp:hytale-reactiveui:1.0'
}
<dependency>
<groupId>dev.jonrapp</groupId>
<artifactId>hytale-reactiveui</artifactId>
<version>1.0</version>
</dependency>
Pages are the primary entry point for UI in Hytale. ReactiveUI provides ReactiveUiPage, an enhanced page implementation that simplifies event handling, data binding, and element management. It includes built-in support for managing a "primary element", a single element that can be easily swapped out, making it perfect for tabbed interfaces or wizard-style UIs.
public class MyPage extends ReactiveUiPage {
public MyPage(@Nonnull PlayerRef playerRef) {
super(playerRef, CustomPageLifetime.CanDismiss);
}
@Override
public void build(@Nonnull Ref<EntityStore> ref,
@Nonnull UICommandBuilder commands,
@Nonnull UIEventBuilder events,
@Nonnull Store<EntityStore> store) {
// Load your UI file
commands.append("MyPage.ui");
// Bind events
bindEvent(
CustomUIEventBindingType.Activating,
"#TabButton",
events,
EventBinding.action("tab-clicked")
.onEvent(context -> showPrimaryElement(new MyTab(this)))
);
// Show initial element
showPrimaryElement(new MyTab(this));
}
@Override
public String getRootContentSelector() {
return "#Content"; // Where primary elements are displayed
}
}
Elements are reusable UI components that manage their own lifecycle, events, and data bindings.
public class MyElement extends Element<MyPage> {
public MyElement(MyPage pageRef) {
super(pageRef);
}
@Override
protected void onCreate(String root, UICommandBuilder commands, UIEventBuilder events) {
// Load element UI
commands.append(root, "MyElement.ui");
// Bind button click event
bindEvent(
CustomUIEventBindingType.Activating,
"#SubmitButton",
events,
EventBinding.action("submit-clicked")
.onEvent(context -> handleSubmit())
);
}
private void handleSubmit() {
// Handle the event
}
}
ReactiveUI provides a fluent API for binding events to UI elements with automatic cleanup.
// Simple event binding
bindEvent(
CustomUIEventBindingType.Activating,
"#Button",
events,
EventBinding.action("button-clicked")
.onEvent(context -> {
// Handle click
})
);
// Event with parameters
bindEvent(
CustomUIEventBindingType.Activating,
"#ItemButton",
events,
EventBinding.action("item-selected")
.withEventData("itemId", Codec.STRING, "item_123")
.onEvent(context -> {
String itemId = context.getParameter("itemId");
// Use the parameter
})
);
// Conditional event handling (return true if handled)
bindEvent(
CustomUIEventBindingType.Activating,
"#ConditionalButton",
events,
EventBinding.action("conditional-action")
.onEventConditional(context -> {
if (someCondition()) {
// Handle event
return true; // Event consumed
}
return false; // Continue to next handler
})
);
Use @UIBinding annotations for automatic UI updates when values change.
public class PlayerCard extends Element<MyPage> {
@UIBinding(selector = "#PlayerName.TextSpans")
private UIBindable<String> playerName;
@UIBinding(selector = "#PlayerScore.TextSpans")
private UIBindable<String> score;
public PlayerCard(MyPage pageRef) {
super(pageRef);
}
@Override
protected void onCreate(String root, UICommandBuilder commands, UIEventBuilder events) {
commands.append(root, "PlayerCard.ui");
// Set initial values
playerName.set("Steve");
score.set("100");
}
public void updateScore(int newScore) {
// UI automatically updates when you call set()
score.set(String.valueOf(newScore));
}
}
Key Points:
set() immediately updates the UIset(value, commands) to batch multiple updates togetherString, Message, or any type (converted via toString())Create multiple instances of elements for lists, inventories, or repeated patterns.
public class ItemList extends Element<MyPage> {
public ItemList(MyPage pageRef) {
super(pageRef);
}
@Override
protected void onCreate(String root, UICommandBuilder commands, UIEventBuilder events) {
commands.append(root, "ItemList.ui");
// Create 10 item elements
for (int i = 0; i < 10; i++) {
ItemElement item = new ItemElement(pageRef, i);
item.create("#ItemContainer", i, commands, events);
}
}
}
public class ItemElement extends Element<MyPage> {
private final int index;
@UIBinding(selector = "#ItemIndex.TextSpans")
private UIBindable<String> itemIndex;
public ItemElement(MyPage pageRef, int index) {
super(pageRef);
this.index = index;
}
@Override
protected void onCreate(String root, UICommandBuilder commands, UIEventBuilder events) {
commands.append(root, "ItemElement.ui");
// Set the index value (batched with creation)
itemIndex.set(String.valueOf(index), commands);
}
}
How it works:
create(root, index, commands, events) creates a container with an indexed selector#ItemElement0, #ItemElement1, etc.Elements are generic and provide type-safe access to their parent page:
public class MyElement extends Element<MySpecificPage> {
public MyElement(MySpecificPage pageRef) {
super(pageRef);
}
@Override
protected void onCreate(String root, UICommandBuilder commands, UIEventBuilder events) {
// Access page-specific methods with full type safety
pageRef.someCustomMethod();
}
}
For more control, register event handlers directly:
registerEventHandler("my-action", EventHandlerBuilder.create()
.withParameter("playerId", Codec.STRING)
.build(context -> {
String playerId = context.getParameter("playerId");
// Handle event
})
);
Elements automatically clean up their event handlers when unloaded:
@Override
public void onUnload() {
super.onUnload(); // Cleans up all registered events
// Add custom cleanup here
}
Check out the examples directory for complete working examples including:
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
If you're migrating from the previous iteration of this project (HyUI), the only thing that has changed is naming of the Page class and packages:
HyUiPage -> ReactiveUiPage
import dev.jonrapp.hyui. -> import dev.jonrapp.hytaleReactiveUi.
Project description from CurseForge.
Recent files
9 Feb 2026
Looking for an older file? The official CurseForge project page is in Resources.