Bedrock Forms
Bedrock players — those joining a Java server through Geyser with Floodgate installed — do not see chest GUIs the way Java players do. A chest menu is clunky on a touch screen. So when uxmEssentials detects a Bedrock viewer, it renders the very same menu as a native Bedrock form instead: the clean, scrollable, tappable UI Bedrock players already know.
This is automatic. You author one menu; Java players get the chest, Bedrock players get the form. You only reach for the options below when you want to tune what the form looks like.
How a menu becomes a form¶
When a Bedrock viewer opens a menu, the engine picks a Cumulus form type to match its shape:
| Form | Used for | Looks like |
|---|---|---|
| SimpleForm | A menu whose tiles are buttons (the common case) | A vertical list of tappable buttons, one per clickable item. |
| ModalForm | A two-choice menu | Two buttons (confirm / cancel). |
| CustomForm | A menu with an explicit bedrock { } block |
A form built from dropdowns, sliders, toggles and text inputs. |
For a SimpleForm, the degradation is done for you: each item that binds at least one click action becomes a button carrying that item's name. Decorative tiles — the filler panes, blank borders, display-only info items — bind no action, so they are left off the form (a button that does nothing on tap would be meaningless). Tap a button and its action list runs exactly as a click would on Java.
Floodgate is what makes this happen
The redirect only fires when Floodgate is present and reports the viewer as a Bedrock player. On a Java-only server, Floodgate loads none of its classes and every player takes the chest path. See Bedrock (Floodgate).
When the chest is kept anyway: chest-only¶
Some menus can't be a form. A form is a flat list of buttons — it cannot display or edit real item stacks. So a menu that shows an inventory (the vault, the inventory viewer, a storage-style grid) stays a chest even for a Bedrock viewer.
The built-in storage menus already do this. For a custom menu that displays item stacks, set the flag yourself:
With chest-only, a Bedrock viewer gets the chest GUI instead of a form. A menu that
uses bottom-inventory is chest-only automatically, since its raw-slot geometry only
makes sense in a chest.
An explicit form: the bedrock { } block¶
The automatic SimpleForm is a button list — it can't offer a dropdown, a slider or a
text field. When you want those form-native controls, add a bedrock { } block. A
Bedrock viewer then gets that explicit CustomForm; a Java viewer never sees it and
keeps the chest.
title = "<gold>Warp Creator"
rows = 3
# The chest tiles a Java player sees:
items {
# … your normal item map …
}
# The native form a Bedrock player sees instead:
bedrock {
title = "Create a Warp"
content = "Fill in the details, then submit."
widgets = [
{ type = input, name = warp-name, label = "Warp name", placeholder = "spawn", default = "" }
{ type = dropdown, name = category, label = "Category", options = ["Public", "Staff", "VIP"], default = 0 }
{ type = slider, name = cost, label = "Cost", min = 0, max = 1000, step = 50, default = 100 }
{ type = toggle, name = locked, label = "Locked?", default = false }
{ type = label, text = "You can edit this later with /warp editor." }
]
on-submit = [
"console:uxmwarp create %warp-name% %cost%",
"message:<green>Created warp %warp-name%."
]
}
Each value widget carries a name. When the player submits, its value is bound to a
%name% placeholder — %warp-name%, %cost%, %locked% above — and the on-submit
action list runs with those values in scope.
Widget types¶
type |
Keys | Value bound to %name% |
|---|---|---|
label |
text |
(none — display only) |
input |
name, label, placeholder, default |
The typed text |
dropdown |
name, label, options, default (index) |
The selected option string |
slider |
name, label, min, max, step, default |
The chosen number |
toggle |
name, label, default |
true / false |
Widget labels, the form title and content are verbatim MiniMessage (or @catalog.key),
just like item names — they may hold placeholders and are resolved per open.
Graceful fallback¶
Everything degrades to something sensible:
- No Floodgate → the form path never engages; everyone gets the chest.
chest-only→ this menu is a chest for Bedrock viewers too.- No
bedrock { }block → the automatic SimpleForm/ModalForm degradation is used. - A
bedrock { }block → Bedrock viewers get that CustomForm; Java viewers ignore it.
You never end up with a broken menu — the worst case is a Bedrock player seeing the same chest a Java player would.
Next Steps¶
- Bedrock (Floodgate) — enabling Floodgate detection.
- Custom Menu Engine — the
chest-onlyandbedrockkeys in context. - Actions & Requirements — what
on-submitactions can do.