BlazeBans/Configuration

Menus

Every in-game interface BlazeBans shows is defined in `menus.yml`: the items, their names and lore, the titles, the sizes, and the sounds. Nothing is hard-coded.

The menus

SectionOpened by
settings/blazebans settings
punishgui/punishgui <player>
profile/blazebans profile <player>
staff-profile/blazebans staffprofile <staff>
banlist/banlist
mutelist/mutelist
warnlist/warnlist
kicklist/kicklist
punishlist/punishlist

These are chest inventories, with native dialogs used for text input where the client supports them.

Item format

Every item takes the same four fields:

yaml
material: "PLAYER_HEAD"
amount: 1
name: "<color:{color_positive}>{victim_name}</color>"
lore:
  - "<color:{color_text}>UUID:</color> <color:{color_accent}>{victim_uuid}</color>"
  - "<color:{color_text}>Last seen:</color> <color:{color_accent}>{last_seen}</color>"

material is a vanilla material name. Names and lore are MiniMessage and support that menu's placeholders. lore is a list, one entry per line.

Shared items

Items reused across menus are defined once:

yaml
shared:
  text-input:
    chat-hint: "{meta_prefix_short}<color:{color_text}>Type your answer in chat, or type</color> <color:{color_accent}>cancel</color> <color:{color_text}>to go back.</color>"

  filler:
    material: "GRAY_STAINED_GLASS_PANE"
    amount: 1
    name: "<gray> </gray>"
    lore: []

  profile-head:
    material: "PLAYER_HEAD"
    amount: 1
    name: "<color:{color_positive}>{victim_name}</color>"

chat-hint is the fallback prompt shown when a native dialog is unavailable, which happens on servers running 1.21.0 to 1.21.5 and for clients older than 1.21.6.

Reference a shared item elsewhere by path:

yaml
fill:
  enabled: true
  item: "shared.filler"

Sounds

yaml
sounds:
  click:
    enabled: true
    key: "minecraft:block.wooden_button.click_on"
    volume: 1.0
    pitch: 1.0
  error:
    enabled: true
    key: "minecraft:block.note_block.bass"
  toggle-on:
    enabled: true
  toggle-off:
    enabled: true

Set enabled: false on any of them to silence it. key is a vanilla sound identifier.

Fixed-slot menus

The profile menus place each panel at a specific slot:

yaml
menus:
  profile:
    inventory:
      title: "<color:{color_accent}>{victim_name}</color> <color:{color_text}>Profile</color>"
      size: 27
      fill:
        enabled: false
        item: "shared.filler"
      items:
        identity:
          slot: 4
          material: "PLAYER_HEAD"
        summary:
          slot: 10
          material: "RECOVERY_COMPASS"
        counts:
          slot: 12
          material: "WRITABLE_BOOK"

Slots are zero-indexed. In a 27-slot inventory, 0 to 8 is the top row, 9 to 17 the middle, 18 to 26 the bottom. Sizes must be multiples of nine.

Turning fill.enabled on pads every unused slot with the filler item, which gives a cleaner look at the cost of a busier inventory.

Multi-step menus

The punish GUI has three steps with their own sizes:

yaml
menus:
  punishgui:
    inventory:
      type-size: 27
      reason-size: 45
      confirm-size: 27

The reason step is larger because it holds one item per template. Increase it if you have many.

Paginated lists

The five list menus share a structure:

yaml
menus:
  banlist:
    title: "<color:{color_text}>Banlist</color> <color:{color_subtle}>({count})</color> <color:{color_accent}>Page {page}/{pages}</color>"
    searching-title: "<color:{color_text}>Searching:</color> <color:{color_accent}>\"{search_query}\"</color>"
    search:
      name: "<color:{color_accent}>Search & Filter</color>"
    filters:
      title: "<color:{color_text}>Filter Banlist</color>"
    previous:
      name: "<color:#ff262a>Previous page</color>"
    next:
      name: "<color:#3ddc57>Next page</color>"
    record:
      name: "<color:{color_negative}>{victim_name}</color> <color:{color_subtle}>({punishment_id})</color>"
      lore:
        - "<color:{color_text}>Type:</color> <color:{color_accent}>{type}</color>"
        - "<color:{color_text}>Staff:</color> <color:{color_accent}>{staff_name}</color>"
        - "<color:{color_text}>Reason:</color> <color:{color_detail}>{punishment_reason}</color>"

record is the item drawn for each entry in the list. The title uses {count}, {page}, and {pages}; the searching title uses {search_query}.

Staff can search by player, staff, reason, ID, type, status, or server, and the advanced filter panel adds type, status, duration, age, proof, and silent state. {filter_summary} shows what is currently applied.

Placeholders by menu

MenuPlaceholders
profile{victim_name}, {victim_uuid}, {last_seen}, {status_line}, {history_total}, {active_count}, {alts_count}, {latest_record}, {ban_count}, {mute_count}, {warn_count}, {kick_count}, {active_ban}, {active_mute}, {linked_accounts}, {proof_links}, {latest_record_details}
staff-profile{staff_name}, {audit_action}, {punishment_id}, plus issued and reversal totals
punishgui{victim_name}, {template_id}, {duration}, {reason}, {proof_required}, {proof_url}, {type_label}, {ip_mode}, {search_query}
List menus{count}, {page}, {pages}, {search_query}, {filter_summary}, and the punishment placeholders on record
settings{setting_color}, {setting_state}, {setting_toggle_hint}

The theme values ({color_*}, {meta_prefix_*}) work in every menu.

Player heads

Titles can embed a player's head:

yaml
title: "{meta_prefix_short}<head:{victim_name}> <color:{color_accent}>{victim_name}</color>"

The <head:> tag renders the player's skin inline. It resolves by name, so it works for anyone the server knows.

Applying changes

minecraft
/blazebans reload menus.yml

Menus rebuild from the new configuration the next time they are opened. Anyone with a menu already open keeps the old one until they close it.