Bedrock GUI Customization

Overview

Bedrock players don't use Java chest inventories — they see native SimpleForm / CustomForm UIs (think "form with buttons" rather than "inventory with items"). Since 2.3, every Bedrock form in SCS2 is defined in YAML under /plugins/SimpleClaimSystem/bedrock-guis/, parallel to the Java guis/ system.

On first start the plugin copies the 20 default yml files into that folder. You edit them in place; /scs reload picks up the changes without a restart.

Files shipped: menu_home, menu_list, menu_favorites_toggle, menu_claims, menu_claims_owner, menu_chunks, menu_members, menu_member_claim, menu_member_manage, menu_banned, menu_online_players, menu_permissions_choice_role, menu_permissions, menu_flags, menu_settings, menu_roles, menu_role_selector, menu_player, menu_player_warps, menu_players_with_warps.

YAML Structure

Each file describes one form:

# Example: menu_home.yml
form-type: SimpleForm           # SimpleForm | CustomForm | ModalForm
title: "bedrock-gui-home-title" # lang key OR raw MiniMessage
content: ""                      # optional body text (SimpleForm / ModalForm)

buttons:
  teleport:
    text: "bedrock-teleport-menu-button"
    icon: ""
  members:
    text: "bedrock-members-menu-button"
    icon: ""
  # ...

# Only for menus that show a dynamic list (claim list, member list, etc.).
# The template applies to every row the Java model generates; %placeholders%
# are substituted per-row.
dynamic-button:
  text: "bedrock-claim-list-title"
  icon: "https://mc-heads.net/avatar/%uuid%"

# Only for CustomForm (flags, permissions, settings).
components:
  - key: particles
    type: TOGGLE                # TOGGLE | INPUT | DROPDOWN | SLIDER | STEP_SLIDER | LABEL
    text: "bedrock-settings-particles"
    default: false
FieldDescription
form-typeSimpleForm (title + buttons), CustomForm (title + components), or ModalForm (title + 2 buttons).
title / contentEither a lang key (resolved from langs/<lang>.yml) or raw MiniMessage. Same fallback rules as Java gui-title — mismatched keys are parsed as MiniMessage, so Nexo <glyph:> / <shift:> tags work in titles when force-java-menus is off too.
buttons.<key>.textButton label. The Java model decides which keys to render for a given form — you customize their appearance, not which ones show up.
buttons.<key>.iconIcon source. http:// or https:// prefix → URL icon. Otherwise treated as a Bedrock resource-pack namespace:path. Empty = no icon.
dynamic-button.textTemplate for each row in a dynamic list. Supports placeholders like %claim%, %uuid%, %player%, %description%, %status%, etc. Placeholder set depends on the menu — see the defaults shipped in each yml.
components[].typeOne of TOGGLE, INPUT, DROPDOWN, SLIDER, STEP_SLIDER, LABEL. Additional fields per type: default (boolean/string), min/max/step (sliders).

Per-flag / per-permission overrides

The menu_flags.yml and menu_permissions.yml forms each append one toggle per flag (or permission) the player can change. The default label comes from the <flag-lowercase>-title (or <permission-lowercase>-title) lang key. To override the label of a specific flag/permission without editing the lang file, add its entry to the components list:

# menu_flags.yml
components:
  - key: CREEPER_EXPLOSIONS
    type: TOGGLE
    text: "<red>Creeper blasts allowed"
  - key: FIRE_SPREAD
    type: TOGGLE
    text: "my-server.flags.fire-spread"

Keys are case-insensitive and match the flag/permission name exactly. Unlisted entries keep the default lang key. Listed entries that don't correspond to a registered flag/permission are silently ignored.

What You Can and Can't Change

The yml controls the surface: titles, static button text, icons, component labels. The Java code still decides:

  • Which buttons appear (e.g. "invite" button only shows when the player has scs.claim.addmember)
  • What each button does when clicked
  • The contents of dynamic lists (which players, which claims, which chunks)
  • The order of static buttons (handler dispatch is index-based)

If a button key is missing from your yml, the corresponding button renders with blank text — the Java handler still dispatches correctly. If you delete an entire yml file, the form falls back to empty strings; put the file back from the jar (or delete the folder and restart) to restore defaults.

Using Resource Pack Icons

Bedrock clients can render either URL icons (hosted externally, e.g. mc-heads.net avatars) or icons from an attached Bedrock resource pack. To use a pack icon, give the icon field a namespace:path value — no http:// prefix — and ensure the texture exists in your pack at that path:

buttons:
  teleport:
    text: "bedrock-teleport-menu-button"
    icon: "scs:textures/ui/teleport_icon"

URL icons are simpler (no pack to maintain) but cause a brief fetch delay the first time each icon appears. Pack icons render instantly once the pack is loaded.