This documentation is based on reverse-engineering. Some features may not work as described. We're actively testing and updating this page.
manifest.json MUST include "IncludesAssetPack": truefor the game to find your .ui files. Without this, you'll get "Could not find document" errors even if your files are correctly placed.Project Structure
UI files must be placed in Common/UI/Custom/Pages/ inside your JAR:
1my-plugin.jar2├── manifest.json # MUST have "IncludesAssetPack": true3├── Common/4│ └── UI/5│ └── Custom/6│ └── Pages/7│ └── MyMod_Page.ui # Prefix with unique identifier8└── com/9 └── example/10 └── myplugin/11 ├── MyPlugin.java12 └── MyUIPage.javamanifest.json (Required Fields)
1{2 "Group": "com.example",3 "Name": "my-plugin",4 "Version": "1.0.0",5 "Main": "com.example.myplugin.MyPlugin",6 "IncludesAssetPack": true7}UI File Path in Code
When referencing UI files in Java, use path relative to Common/UI/Custom/:
1// File location: Common/UI/Custom/Pages/MyMod_Page.ui2// Java reference:3builder.append("Pages/MyMod_Page.ui"); // ✓ Correct45// NOT these:6builder.append("Common/UI/Custom/Pages/MyMod_Page.ui"); // ✗ Wrong7builder.append("Custom/Pages/MyMod_Page.ui"); // ✗ Wrong8builder.append("MyMod_Page.ui"); // ✗ WrongArchitecture Overview
Hytale's UI system is composed of three managers, each handling a different type of interface:
| manager | purpose | examples |
|---|---|---|
| PageManager | Full-screen menus, dialogs | Shop, respawn screen, NPC dialog |
| HudManager | Persistent on-screen elements | Health bar, custom boss bar, quest tracker |
| WindowManager | Inventory-based interfaces | Containers, crafting benches |
1// Access managers from Player2Player player = ctx.senderAs(Player.class);34PageManager pageManager = player.getPageManager();5HudManager hudManager = player.getHudManager();6WindowManager windowManager = player.getWindowManager();Custom Pages
Pages are full-screen interfaces that can be dismissed by the player. There are two types: BasicCustomUIPage (display only) andInteractiveCustomUIPage (with event handling).
BasicCustomUIPage
For simple display-only pages without interaction:
1import com.hypixel.hytale.server.core.entity.entities.player.pages.BasicCustomUIPage;2import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder;3import com.hypixel.hytale.server.core.universe.PlayerRef;4import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;56public class WelcomePage extends BasicCustomUIPage {7 8 private final String playerName;9 10 public WelcomePage(PlayerRef playerRef, String playerName) {11 super(playerRef, CustomPageLifetime.CanDismiss);12 this.playerName = playerName;13 }14 15 @Override16 public void build(UICommandBuilder commands) {17 // Path relative to Common/UI/Custom/18 commands.append("Pages/MyMod_WelcomePage.ui");19 20 // Set dynamic values using element selectors21 commands.set("#Title.Text", "Welcome!");22 commands.set("#PlayerName.Text", playerName);23 commands.set("#Badge.Visible", true);24 }25}UI File Syntax (.ui)
The .ui format is Hytale's declarative UI language:
1$C = "../Common.ui";23$C.@PageOverlay {45 $C.@Container {6 Anchor: (Width: 600, Height: 400);78 #Title {9 Group {10 $C.@Title {11 @Text = "Welcome Page";12 }13 }14 }1516 #Content {17 LayoutMode: Top;18 Padding: (Full: 20);1920 Label #PlayerName {21 Style: (FontSize: 18, TextColor: #ffffff);22 Anchor: (Bottom: 10);23 }2425 Group #Badge {26 Visible: false;27 // Badge content...28 }2930 Button #CloseButton {31 Anchor: (Width: 200, Height: 50);32 Background: (Color: #d4a054);33 Style: (34 Hovered: (Background: #e8b868),35 Pressed: (Background: #a67c3d)36 );3738 Label {39 Style: (FontSize: 14, RenderBold: true, TextColor: #000000);40 Text: "Close";41 }42 }43 }44 }45}4647$C.@BackButton {}| syntax | meaning |
|---|---|
| $C = "../Common.ui" | Import base components from Common.ui |
| $C.@PageOverlay | Use PageOverlay template from Common.ui |
| $C.@Container | Use Container template |
| #ElementId | Element ID for targeting in Java code |
| Anchor: (Width: X, Height: Y) | Size constraints |
| LayoutMode: Top | Stack children vertically from top |
| Padding: (Full: 20) | 20px padding on all sides |
| Style: (...) | Visual styling properties |
| Visible: false | Hide element by default |
InteractiveCustomUIPage
For pages that respond to user input (buttons, clicks, etc.):
1import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;2import com.hypixel.hytale.server.core.ui.builder.*;3import com.hypixel.hytale.protocol.packets.interface_.*;4import com.hypixel.hytale.codec.builder.BuilderCodec;5import com.hypixel.hytale.codec.KeyedCodec;6import com.hypixel.hytale.codec.Codec;78public class ShopPage extends InteractiveCustomUIPage { 9 10 private int playerCoins;11 12 public ShopPage(PlayerRef playerRef, int coins) {13 super(playerRef, CustomPageLifetime.CanDismiss, ShopEventData.CODEC);14 this.playerCoins = coins;15 }16 17 @Override18 public void build(19 Ref ref, 20 UICommandBuilder commands,21 UIEventBuilder events,22 Store store 23 ) {24 commands.append("Pages/ShopPage.ui");25 commands.set("#coins-display", playerCoins + " coins");26 27 // Bind button click event28 events.addEventBinding(29 CustomUIEventBindingType.Activating,30 "#buy-button",31 EventData.of("Action", "buy").append("ItemId", "sword_01")32 );33 34 // Bind close button35 events.addEventBinding(36 CustomUIEventBindingType.Activating,37 "#close-button",38 EventData.of("Action", "close")39 );40 }41 42 @Override43 public void handleDataEvent(44 Ref ref, 45 Store store, 46 ShopEventData data47 ) {48 if ("buy".equals(data.action)) {49 // Handle purchase50 playerCoins -= 100;51 52 // Update UI dynamically53 UICommandBuilder update = new UICommandBuilder();54 update.set("#coins-display", playerCoins + " coins");55 // sendUpdate(update); // Send update to client56 } else if ("close".equals(data.action)) {57 // Close the page58 // close();59 }60 }61 62 // Event data codec for deserializing client events63 public static class ShopEventData {64 public static final BuilderCodec CODEC = 65 BuilderCodec.builder(ShopEventData.class, ShopEventData::new)66 .append(new KeyedCodec<>("Action", Codec.STRING),67 (d, v) -> d.action = v, d -> d.action).add()68 .append(new KeyedCodec<>("ItemId", Codec.STRING),69 (d, v) -> d.itemId = v, d -> d.itemId).add()70 .build();71 72 public String action;73 public String itemId;74 }75}Opening Pages
1// Must run on world thread!2player.getWorld().execute(() -> {3 // Get required references4 Ref entityRef = player.getReference(); 5 Store store = player.getWorld().getEntityStore().getStore(); 6 7 // Create and open page8 WelcomePage page = new WelcomePage(player.getPlayerRef(), player.getName());9 player.getPageManager().openCustomPage(entityRef, store, page);10});1112// Open a built-in page13player.getPageManager().setPage(entityRef, store, Page.Inventory);1415// Open page with windows (e.g., container + custom UI)16player.getPageManager().openCustomPageWithWindows(entityRef, store, myPage, myWindow);openCustomPage() must be called within world.execute(). Calling from wrong thread will cause issues.Page Lifetime
| lifetime | behavior |
|---|---|
| CantClose | Player cannot close the page (forced display) |
| CanDismiss | Player can press ESC or click outside to close |
| CanDismissOrCloseThroughInteraction | Can be closed by ESC or by clicking a close button |
UI Builders
UICommandBuilder
Used to manipulate UI structure and set values:
1UICommandBuilder commands = new UICommandBuilder();23// Layout commands - load/modify UI structure4commands.append("Pages/MyPage.ui"); // Load UI document5commands.append("#container", "Components/Item.ui"); // Append to element6commands.appendInline("#container", ""); // Append inline markup7commands.insertBefore("#target", "Components/Header.ui");8commands.remove("#old-element"); // Remove element9commands.clear("#container"); // Clear all children1011// Value commands - set element values12commands.set("#text", "Hello World"); // String13commands.set("#count", 42); // int14commands.set("#progress", 0.75f); // float15commands.set("#enabled", true); // boolean16commands.setNull("#optional"); // null value17commands.setObject("#complex", myObject); // Object (needs codec)UIEventBuilder
Used to bind UI events to callbacks:
1UIEventBuilder events = new UIEventBuilder();23// Simple event binding4events.addEventBinding(5 CustomUIEventBindingType.Activating, // Event type6 "#my-button" // Element selector7);89// Event with data10events.addEventBinding(11 CustomUIEventBindingType.Activating,12 "#buy-btn",13 EventData.of("Action", "buy").append("Id", "123")14);1516// Non-locking event (UI stays responsive while processing)17events.addEventBinding(18 CustomUIEventBindingType.ValueChanged,19 "#slider",20 EventData.of("Type", "volume"),21 false // locksInterface = false22);EventData
1// Create event data (key-value pairs)2EventData data = new EventData();3data = data.append("Action", "submit");4data = data.append("Quantity", "5"); // Note: values are strings56// Or use static factory7EventData data = EventData.of("Action", "buy")8 .append("ItemId", "sword")9 .append("Price", "100");KeyedCodec and EventData keys MUST start with an uppercase letter. Use "Action" not "action", "ItemId" not "itemId"..append("Count", String.valueOf(42))UI Event Types
Available event types in CustomUIEventBindingType:
| event | trigger |
|---|---|
| Activating | Primary click/activation |
| RightClicking | Right mouse button |
| DoubleClicking | Double click |
| MouseEntered | Mouse enters element |
| MouseExited | Mouse leaves element |
| ValueChanged | Input value changed (sliders, text) |
| FocusGained | Element receives focus |
| FocusLost | Element loses focus |
| KeyDown | Key pressed while focused |
| Dismissing | Page is being dismissed |
| Validating | Form validation triggered |
Slot Events (for grids/inventories)
| event | trigger |
|---|---|
| SlotClicking | Click on inventory slot |
| SlotDoubleClicking | Double-click on slot |
| SlotMouseEntered | Mouse enters slot |
| SlotMouseExited | Mouse leaves slot |
| SlotMouseDragCompleted | Drag operation completed |
| SlotMouseDragExited | Drag left the slot area |
| SlotClickReleaseWhileDragging | Released click while dragging |
| SlotClickPressWhileDragging | Pressed click while dragging |
Other Events
| event | trigger |
|---|---|
| ElementReordered | List element was reordered |
| DragCancelled | Drag operation cancelled |
| Dropped | Item dropped on element |
| SelectedTabChanged | Tab selection changed |
| MouseButtonReleased | Any mouse button released |
Custom HUD
HUD elements are persistent on-screen displays that don't block gameplay.
Creating Custom HUD
1import com.hypixel.hytale.server.core.entity.entities.player.hud.CustomUIHud;2import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder;34public class BossHealthHud extends CustomUIHud {5 6 private String bossName;7 private float healthPercent;8 9 public BossHealthHud(PlayerRef playerRef, String bossName) {10 super(playerRef);11 this.bossName = bossName;12 this.healthPercent = 1.0f;13 }14 15 // Called when HUD is first shown16 // Override the build method to set up initial UI17 18 public void updateHealth(float percent) {19 this.healthPercent = percent;20 21 UICommandBuilder update = new UICommandBuilder();22 update.set("#health-fill", healthPercent);23 update.set("#health-text", Math.round(healthPercent * 100) + "%");24 25 // false = don't clear existing HUD, just update26 update(false, update);27 }28}HudManager Methods
1HudManager hudManager = playerComponent.getHudManager();23// Set custom HUD (replaces any existing)4hudManager.setCustomHud(playerRef, new BossHealthHud(playerRef, "Dragon"));56// Remove custom HUD7hudManager.setCustomHud(playerRef, null);89// Get current custom HUD10CustomUIHud currentHud = hudManager.getCustomHud();1112// Reset to default HUD state13hudManager.resetHud(playerRef);1415// Reset entire UI state16hudManager.resetUserInterface(playerRef);Built-in HUD Components
Control visibility of built-in HUD elements:
1// Show only specific components2hudManager.setVisibleHudComponents(playerRef,3 HudComponent.Hotbar,4 HudComponent.Health,5 HudComponent.Chat,6 HudComponent.Reticle7);89// Show additional components10hudManager.showHudComponents(playerRef,11 HudComponent.Compass,12 HudComponent.Stamina13);1415// Hide specific components16hudManager.hideHudComponents(playerRef,17 HudComponent.KillFeed,18 HudComponent.PlayerList19);HudComponent Enum
| component | description |
|---|---|
| Hotbar | Bottom action bar |
| Health | Health display |
| Mana | Mana display |
| Stamina | Stamina bar |
| Oxygen | Underwater oxygen |
| Sleep | Sleep indicator |
| Reticle | Crosshair/cursor |
| Chat | Chat window |
| Notifications | Toast notifications |
| KillFeed | Kill/death feed |
| PlayerList | Tab player list |
| EventTitle | Title/subtitle display |
| Compass | Direction compass |
| ObjectivePanel | Quest/objective display |
| PortalPanel | Portal information |
| StatusIcons | Status effect icons |
| InputBindings | Control hints |
| Requests | Request notifications |
| Speedometer | Vehicle speed |
| AmmoIndicator | Weapon ammo |
| UtilitySlotSelector | Utility item selector |
| BlockVariantSelector | Block variant picker |
| BuilderToolsLegend | Builder mode legend |
| BuilderToolsMaterialSlotSelector | Builder material selector |
Windows (Containers)
Windows are used for inventory-based interfaces like containers and crafting.
WindowManager Methods
1WindowManager windowManager = playerComponent.getWindowManager();23// Open a window4windowManager.openWindow(myWindow);56// Open multiple windows7windowManager.openWindows(window1, window2);89// Get window by ID10Window window = windowManager.getWindow(windowId);1112// Get all open windows13List windows = windowManager.getWindows(); 1415// Update window data16windowManager.updateWindow(myWindow);1718// Close window by ID19windowManager.closeWindow(windowId);2021// Close all windows22windowManager.closeAllWindows();Window Types
| windowtype | purpose |
|---|---|
| Container | Generic item container (chest, etc.) |
| PocketCrafting | Quick crafting (2x2) |
| BasicCrafting | Standard crafting table |
| DiagramCrafting | Pattern-based crafting |
| StructuralCrafting | Building/structural crafting |
| Processing | Furnace/processing blocks |
| Memories | Memory/collection UI |
ContainerWindow Example
1import com.hypixel.hytale.server.core.entity.entities.player.windows.ContainerWindow;2import com.hypixel.hytale.server.core.inventory.container.ItemContainer;34// Create container window from an ItemContainer5ItemContainer container = // ... get or create container6ContainerWindow window = new ContainerWindow(container);78// Register close event9window.registerCloseEvent(event -> {10 // Handle window close11 getLogger().info("Container closed");12});1314// Open the window15windowManager.openWindow(window);Notifications
Toast-style notifications that appear briefly on screen.
1import com.hypixel.hytale.protocol.packets.interface_.Notification;2import com.hypixel.hytale.protocol.packets.interface_.NotificationStyle;34// Create notification packet5Notification notification = new Notification(6 formattedMessage, // Main message7 secondaryMessage, // Secondary text (nullable)8 "icons/achievement", // Icon path (nullable)9 itemWithMetadata, // Item to display (nullable)10 NotificationStyle.Success11);1213// Send to player14player.getPlayerConnection().write(notification);NotificationStyle
| style | use case |
|---|---|
| Default | General information |
| Success | Positive feedback (green) |
| Warning | Caution notices (yellow) |
| Danger | Errors/critical info (red) |
Kill Feed
1import com.hypixel.hytale.protocol.packets.interface_.KillFeedMessage;23// Create kill feed entry4KillFeedMessage killFeed = new KillFeedMessage(5 killerFormattedMessage, // Killer name6 victimFormattedMessage, // Victim name 7 "icons/sword" // Weapon/cause icon8);910// Send to player11player.getPlayerConnection().write(killFeed);UI Value Types
Special types for complex UI values:
Value<T>
1import com.hypixel.hytale.server.core.ui.Value;23// Direct value4Value<String> directValue = Value.of("Hello");56// Reference to another UI element's value7Value refValue = Value.ref("OtherPage.ui", "#element.property"); Area
1import com.hypixel.hytale.server.core.ui.Area;23Area area = new Area()4 .setX(10)5 .setY(20)6 .setWidth(100)7 .setHeight(50);89commands.set("#element.area", area);Anchor
1import com.hypixel.hytale.server.core.ui.Anchor;23Anchor anchor = new Anchor();4anchor.setLeft(Value.of(10));5anchor.setTop(Value.of(20));6anchor.setWidth(Value.of(200));7anchor.setHeight(Value.of(100));89// Or use shortcuts10anchor.setFull(Value.of(0)); // Fill parent11anchor.setHorizontal(Value.of(10)); // Horizontal margins12anchor.setVertical(Value.of(10)); // Vertical marginsPatchStyle
1import com.hypixel.hytale.server.core.ui.PatchStyle;23PatchStyle style = new PatchStyle()4 .setTexturePath(Value.of("textures/button.png"))5 .setBorder(Value.of(4))6 .setColor(Value.of("#FF0000"));78commands.set("#button.background", style);ItemGridSlot
1import com.hypixel.hytale.server.core.ui.ItemGridSlot;23ItemGridSlot slot = new ItemGridSlot(itemStack)4 .setName("Magic Sword")5 .setDescription("A powerful weapon")6 .setActivatable(true)7 .setItemIncompatible(false);89commands.set("#inventory-slot-0", slot);LocalizableString
1import com.hypixel.hytale.server.core.ui.LocalizableString;23// From raw string4LocalizableString text = LocalizableString.fromString("Hello World");56// From localization key (for translations)7LocalizableString localized = LocalizableString.fromMessageId("ui.welcome.title");89// With parameters10Map<String, String> params = Map.of("player", playerName);11LocalizableString withParams = LocalizableString.fromMessageId("ui.welcome.greeting", params);DropdownEntryInfo
1import com.hypixel.hytale.server.core.ui.DropdownEntryInfo;23// For dropdown/select elements4DropdownEntryInfo entry = new DropdownEntryInfo(5 LocalizableString.fromString("Option 1"),6 "value_1" // Internal value7);Built-in Pages
Hytale provides some pre-built page types:
Page Enum (Built-in)
| page | description |
|---|---|
| None | No page (close current) |
| Inventory | Player inventory |
| Bench | Crafting bench |
| Map | World map |
| ToolsSettings | Tool configuration |
| MachinimaEditor | Machinima/cinematic editor |
| ContentCreation | Content creation tools |
| Custom | Custom page marker |
1// Open built-in page2pageManager.setPage(ref, store, Page.Inventory);34// Close any page5pageManager.setPage(ref, store, Page.None);RespawnPage
1import com.hypixel.hytale.server.core.entity.entities.player.pages.RespawnPage;23// Built-in respawn screen4RespawnPage respawnPage = new RespawnPage(5 playerRef,6 Message.raw("You Died"), // Death message7 true, // Allow respawn8 deathItemLoss // Item loss config9);1011pageManager.openCustomPage(ref, store, respawnPage);ChoiceBasePage
For dialog/choice-based interactions (NPC dialogs, etc.):
1import com.hypixel.hytale.server.core.entity.entities.player.pages.choices.*;23// ChoiceElement represents a selectable option4// Extend ChoiceBasePage for custom dialog pages5// Use ChoiceInteraction for what happens when selected6// Use ChoiceRequirement for conditions to show/enable optionsCommon Patterns
Complete Shop Example
1public class FullShopPage extends InteractiveCustomUIPage { 2 3 private final List items; 4 private int coins;5 6 public FullShopPage(PlayerRef playerRef, List items, int coins) { 7 super(playerRef, CustomPageLifetime.CanDismiss, EventData.CODEC);8 this.items = items;9 this.coins = coins;10 }11 12 @Override13 public void build(Ref ref, UICommandBuilder cmd, 14 UIEventBuilder evt, Store store) { 15 16 cmd.append("Pages/Shop.ui");17 cmd.set("#coins", coins);18 19 for (int i = 0; i < items.size(); i++) {20 ShopItem item = items.get(i);21 22 // Add item entry to list23 cmd.append("#item-list", "Components/ShopItem.ui");24 cmd.set("#item-" + i + "-name", item.name);25 cmd.set("#item-" + i + "-price", item.price);26 cmd.set("#item-" + i + "-icon", item.icon);27 28 // Bind buy button29 evt.addEventBinding(30 CustomUIEventBindingType.Activating,31 "#item-" + i + "-buy",32 EventData.of("Action", "buy")33 .append("index", String.valueOf(i))34 );35 }36 37 // Close button38 evt.addEventBinding(39 CustomUIEventBindingType.Activating,40 "#close",41 EventData.of("Action", "close")42 );43 }44 45 @Override46 public void handleDataEvent(Ref ref, Store store, 47 EventData data) {48 switch (data.action) {49 case "buy":50 int index = Integer.parseInt(data.index);51 ShopItem item = items.get(index);52 53 if (coins >= item.price) {54 coins -= item.price;55 // Give item to player...56 57 // Update UI58 UICommandBuilder update = new UICommandBuilder();59 update.set("#coins", coins);60 // sendUpdate(update);61 }62 break;63 64 case "close":65 // close();66 break;67 }68 }69 70 public static class EventData {71 public static final BuilderCodec CODEC = /* ... */; 72 public String action;73 public String index;74 }75}Dynamic HUD Updates
1public class QuestTrackerHud extends CustomUIHud {2 3 private List activeQuests; 4 5 public void addQuest(Quest quest) {6 activeQuests.add(quest);7 refreshQuestList();8 }9 10 public void updateQuestProgress(String questId, int progress) {11 UICommandBuilder update = new UICommandBuilder();12 update.set("#quest-" + questId + "-progress", progress);13 update(false, update);14 }15 16 public void completeQuest(String questId) {17 UICommandBuilder update = new UICommandBuilder();18 update.remove("#quest-" + questId);19 update(false, update);20 }21 22 private void refreshQuestList() {23 UICommandBuilder update = new UICommandBuilder();24 update.clear("#quest-list");25 26 for (Quest quest : activeQuests) {27 update.append("#quest-list", "Components/QuestEntry.ui");28 update.set("#quest-" + quest.id + "-name", quest.name);29 update.set("#quest-" + quest.id + "-progress", quest.progress);30 }31 32 update(false, update);33 }34}Known Limitations
What Works
- Opening custom pages with
openCustomPage() - Setting initial values in
build()withcmd.set("#Element.Text", value) - Button click events with
addEventBinding()andhandleDataEvent() - Closing pages with
close() - Using Hytale's native templates (
$C.@PageOverlay,$C.@Container,$C.@Title)
What Does NOT Work (Yet)
sendUpdate()- Dynamic UI updates after initial build don't reflect visuallyrebuild()- Rebuilding the page doesn't update the display- Custom textures/images from plugin JAR - Can't reference external assets
- Complex styling - Limited to basic colors, no custom PNG backgrounds from plugins
sendUpdate() and rebuild() don't work reliably, consider closing and reopening the page to show updated values, or design your UI to not require dynamic updates.Troubleshooting
Could not find document
Common causes:
| cause | solution |
|---|---|
| Missing IncludesAssetPack | Add "IncludesAssetPack": true to manifest.json |
| Wrong path in append() | Use "Pages/Name.ui" not "Common/UI/Custom/Pages/Name.ui" |
| File not in JAR | Ensure .ui file is in Common/UI/Custom/Pages/ in JAR |
| Typo in filename | Paths are case-sensitive! Check exact spelling |
| JAR not rebuilt | Recompile and rebuild JAR after changes |
Selected element was not found
This happens when using sendUpdate() with selectors that worked in build(). The element context is different after the initial build. This is a known limitation.
CustomUI command data must be an object
You must specify the property to set. Use #Element.Text not just #Element.
Client Disconnects When Opening UI
If opening UI crashes/disconnects the client:
- Syntax error in
.uifile - check brackets and commas - Invalid texture path - don't reference external PNG files
- Calling
openCustomPageoutside world thread - Null value passed to
cmd.set()- always check for null
world.execute().EventData.of("Action", "value")where "Action" matches the key in your BuilderCodec.Package Reference
| package | contents |
|---|---|
| server.core.ui | Value, Area, Anchor, PatchStyle, ItemGridSlot, LocalizableString |
| server.core.ui.builder | UICommandBuilder, UIEventBuilder, EventData |
| server.core.entity.entities.player.pages | PageManager, CustomUIPage, BasicCustomUIPage, InteractiveCustomUIPage |
| server.core.entity.entities.player.hud | HudManager, CustomUIHud |
| server.core.entity.entities.player.windows | WindowManager, Window, ContainerWindow |
| protocol.packets.interface_ | CustomPage, CustomHud, Notification, HudComponent, etc. |