Skip to content

UI System

EverEssentials uses Hytale’s native UI system to provide interactive administration panels.

The admin panel extends InteractiveCustomUIPage, which provides:

  • Page lifecycle management
  • Event handling for user interactions
  • Data binding with codecs
public class AdminPage extends InteractiveCustomUIPage<AdminPage.AdminEventData> {
// ...
}

The admin panel consists of several UI elements:

ElementDescription
#PlayerListContainer for player buttons
#PlayerButtonIndividual player selection button
#SelectedPlayerNameDisplay for selected player’s name
#SelectedPlayerUUIDDisplay for selected player’s UUID
#SelectedPlayerWorldDisplay for selected player’s world
#SelectedPlayerPositionDisplay for selected player’s coordinates
Button IDAction
#TeleportToButtonTeleport to selected player
#TeleportHereButtonTeleport player to you
#KickButtonKick selected player
#BanButtonBan selected player
#RefreshButtonRefresh player list
public static class AdminEventData {
public String action;
public String targetUuid;
public String targetName;
}

Events are serialized using a BuilderCodec:

public static final BuilderCodec<AdminEventData> EVENT_CODEC =
BuilderCodec.builder(AdminEventData.class, AdminEventData::new)
.addField(new KeyedCodec<>("Action", Codec.STRING),
(e, v) -> e.action = v, e -> e.action)
.addField(new KeyedCodec<>("TargetUuid", Codec.STRING),
(e, v) -> e.targetUuid = v, e -> e.targetUuid)
.addField(new KeyedCodec<>("TargetName", Codec.STRING),
(e, v) -> e.targetName = v, e -> e.targetName)
.build();
ActionDescription
selectSelect a player from the list
teleport_toTeleport to selected player
teleport_hereTeleport selected player to you
kickKick selected player
banBan selected player
refreshRefresh the player list

To create your own admin pages:

  1. Create a new class extending InteractiveCustomUIPage
  2. Define your event data class and codec
  3. Implement build() to construct the UI
  4. Implement handleDataEvent() to process events
public class CustomPage extends InteractiveCustomUIPage<CustomPage.EventData> {
@Override
public void build(...) {
commandBuilder.append("Pages/CustomPage.ui");
// Add your UI logic
}
@Override
public void handleDataEvent(...) {
// Handle your events
}
}
  1. Rebuild on changes: Call rebuild() after state changes to update the UI
  2. Validate player references: Always check if players are still online
  3. Use proper error messages: Inform users when actions fail
  4. Close pages appropriately: Call close() after actions that dismiss the UI