Skip to main content

Open GUI

Open a GUI for the player

Single entry used to open a GUI for a player. Unlike the original GUI extensions that required several entries for definitions and item data, this action embeds all required information such as type, title, size and individual slot items. Each item can define a custom name and lore.

Fields

FieldTypeDefaultDescription
guiTypeGuiTypeCUSTOMType of GUI to open: CUSTOM (standard inventory), ANVIL, ENCHANTING_TABLE, etc.Values:ANVILBARRELBEACONBLAST_FURNACEBOOKBREWING_STANDCARTOGRAPHY_TABLECRAFTING_TABLEDISPENSERDROPPERENCHANTING_TABLEENDER_CHESTFURNACEGRINDSTONEHOPPERLOOMMERCHANTSHULKER_BOXSMITHING_TABLESMOKERSTONECUTTERVILLAGER_TRADECHESTCUSTOM
titleVar<String>—Title displayed at the top of the inventory. Supports MiniMessage and PlaceholderAPI.PlaceholdersColorsMulti-line
sizeInventorySize?—Inventory size (only for CUSTOM guiType). Default: 6 rows (54 slots).Values:SIZE_9SIZE_18SIZE_27SIZE_36SIZE_45SIZE_54
layoutPoolList<LayoutData>emptyCollection of layouts available to this menu. Referenced by mainLayoutId and frame layoutId fields.Variants:bookcompositeflexframeleaderboardmerchantpaginatedscrollablesimplestorage
book (1)
FieldTypeDefaultDescription
pagesList<Var<String>>emptyText pages of the book. Each string becomes a separate page. Supports MiniMessage and PlaceholderAPI.
composite (1)
FieldTypeDefaultDescription
childrenList<String>empty—
flex (5)
FieldTypeDefaultDescription
itemsList<GuiItemData>empty—
GuiItemData (25)
FieldTypeDefaultDescription
itemVar<Item>—The item to display. Leave empty to use the item held in the player's hand.
displayNameVar<String>?—Custom display name for this item. Supports MiniMessage and PlaceholderAPI.
loreList<Var<String>>emptyCustom lore lines for this item. Supports MiniMessage and PlaceholderAPI.
criteriaList<Criteria>emptyCriteria to determine if this slot should be visible to the player.
allowPickupBooleanfalseIf true, the player can pick up this item from the inventory.
modifiersList<Modifier>emptyModifiers applied when this slot is rendered.
triggersList<Ref<TriggerableEntry>>emptyTriggers executed when this slot is clicked (regardless of interaction type).
interactionListList<InteractionData>emptyPer-click-type interactions (commands and triggers for LEFT, RIGHT, SHIFT, etc.). Use this instead of the legacy 'commands' field.
inputInputData?—Input dialog configuration. When set, clicking this slot opens an input prompt.
storageIdString?—ID of a reusable storage configuration from the menu storagePool. Leave empty for a normal slot.
isGhostBooleanfalseIf true, the item appears as a ghost (not collectable, same as allowPickup=false but semantically different).
animationSlotAnimationData?—Animation applied to this slot when the menu opens.
cooldownTicksLong0Cooldown in ticks before this slot can be clicked again.
buttonTypeString?—Button type tag for button resolvers (e.g. 'next_page', 'close', 'SHOP_ITEM'). The configured item visuals are preserved. Pair with buttonPrefix for extension-specific buttons.
buttonPrefixString?—Prefix prepended to button type tag. Default: 'dungeon_button:'. Set to e.g. 'shop_button:' or 'codex_button:' for other extensions.
viewPermissionString?—Permission required to SEE this slot (null = everyone).
clickPermissionString?—Permission required to INTERACT with this slot; without it the slot renders but is inert.
xInt0Starting X position (column) of this slot. 0 = leftmost.
yInt0Starting Y position (row) of this slot. 0 = top row.
countInt1How many times this slot repeats along 'direction' — a number of SLOTS, not a stack size. To show a stack of 64, set the item's amount instead. Ignored when direction is unset.
directionDirection?—Direction in which to repeat this slot (right, left, down, up). Leave null for a single slot at (x, y).
gapInt1Step between two repeated slots, NOT a spacing: 1 = adjacent, 2 = one empty slot between each. Applies to both axes.
repeatYInt1How many times the whole repetition repeats on the axis PERPENDICULAR to 'direction' — vertically for right/left, horizontally for down/up. A number of ROWS of slots, not a stack size.
rollPerSlotBooleanfalseOnly matters when this item repeats over several slots and its 'item' is random (a variable backed by a ranged or case variable). Off = the item is rolled once and every repeated slot shows that same result. On = each repeated slot rolls the item on its own when the menu opens; the result is then kept for as long as the menu stays open. Off, even with a lore that refreshes, still means ONE draw for the whole session: the text refreshes, the item is never rolled again. All of this holds unless 'liveItem' is on.
liveItemBooleanfalseOff (default) = the item is drawn when the menu opens and kept for the whole session; on refresh only its name and lore follow. On = the item (a variable) is evaluated again at every refresh, so a random item is drawn again each time. Combine with 'rollPerSlot' to choose between one draw per repeated slot (on) and one draw shared by all repeated slots at each refresh (off). A blank name is still ignored.
justifyContentFlexJustifybtcrenaud.gui.api.FlexJustify.START—Values:STARTCENTERENDSPACE_BETWEEN
alignItemsFlexAlignbtcrenaud.gui.api.FlexAlign.START—Values:STARTCENTEREND
wrapBooleantrue—
virtualHeightInt6—
frame (1)
FieldTypeDefaultDescription
framesList<FrameData>emptyList of frames defining independent regions within the inventory.
FrameData (5)
FieldTypeDefaultDescription
xInt0Starting X position (column) of this frame.
yInt0Starting Y position (row) of this frame.
widthInt9Width of this frame in slots.
heightInt1Height of this frame in slots.
layoutIdString?—Optional reference to another layout in the pool that provides this frame's content.
leaderboard (7)
FieldTypeDefaultDescription
leaderboardRef<GuiLeaderboardEntry>—Reusable gui_leaderboard entry to render.
xInt0First column of the dynamic rows.
yInt0First row of the dynamic rows.
widthInt9Number of columns reserved for dynamic rows.
heightInt5Number of rows reserved for dynamic rows.
previousButtonGuiItemData?—Optional previous-page button. Its position comes from the GuiItemData.
GuiItemData (25)
FieldTypeDefaultDescription
itemVar<Item>—The item to display. Leave empty to use the item held in the player's hand.
displayNameVar<String>?—Custom display name for this item. Supports MiniMessage and PlaceholderAPI.
loreList<Var<String>>emptyCustom lore lines for this item. Supports MiniMessage and PlaceholderAPI.
criteriaList<Criteria>emptyCriteria to determine if this slot should be visible to the player.
allowPickupBooleanfalseIf true, the player can pick up this item from the inventory.
modifiersList<Modifier>emptyModifiers applied when this slot is rendered.
triggersList<Ref<TriggerableEntry>>emptyTriggers executed when this slot is clicked (regardless of interaction type).
interactionListList<InteractionData>emptyPer-click-type interactions (commands and triggers for LEFT, RIGHT, SHIFT, etc.). Use this instead of the legacy 'commands' field.
inputInputData?—Input dialog configuration. When set, clicking this slot opens an input prompt.
storageIdString?—ID of a reusable storage configuration from the menu storagePool. Leave empty for a normal slot.
isGhostBooleanfalseIf true, the item appears as a ghost (not collectable, same as allowPickup=false but semantically different).
animationSlotAnimationData?—Animation applied to this slot when the menu opens.
cooldownTicksLong0Cooldown in ticks before this slot can be clicked again.
buttonTypeString?—Button type tag for button resolvers (e.g. 'next_page', 'close', 'SHOP_ITEM'). The configured item visuals are preserved. Pair with buttonPrefix for extension-specific buttons.
buttonPrefixString?—Prefix prepended to button type tag. Default: 'dungeon_button:'. Set to e.g. 'shop_button:' or 'codex_button:' for other extensions.
viewPermissionString?—Permission required to SEE this slot (null = everyone).
clickPermissionString?—Permission required to INTERACT with this slot; without it the slot renders but is inert.
xInt0Starting X position (column) of this slot. 0 = leftmost.
yInt0Starting Y position (row) of this slot. 0 = top row.
countInt1How many times this slot repeats along 'direction' — a number of SLOTS, not a stack size. To show a stack of 64, set the item's amount instead. Ignored when direction is unset.
directionDirection?—Direction in which to repeat this slot (right, left, down, up). Leave null for a single slot at (x, y).
gapInt1Step between two repeated slots, NOT a spacing: 1 = adjacent, 2 = one empty slot between each. Applies to both axes.
repeatYInt1How many times the whole repetition repeats on the axis PERPENDICULAR to 'direction' — vertically for right/left, horizontally for down/up. A number of ROWS of slots, not a stack size.
rollPerSlotBooleanfalseOnly matters when this item repeats over several slots and its 'item' is random (a variable backed by a ranged or case variable). Off = the item is rolled once and every repeated slot shows that same result. On = each repeated slot rolls the item on its own when the menu opens; the result is then kept for as long as the menu stays open. Off, even with a lore that refreshes, still means ONE draw for the whole session: the text refreshes, the item is never rolled again. All of this holds unless 'liveItem' is on.
liveItemBooleanfalseOff (default) = the item is drawn when the menu opens and kept for the whole session; on refresh only its name and lore follow. On = the item (a variable) is evaluated again at every refresh, so a random item is drawn again each time. Combine with 'rollPerSlot' to choose between one draw per repeated slot (on) and one draw shared by all repeated slots at each refresh (off). A blank name is still ignored.
nextButtonGuiItemData?—Optional next-page button. Its position comes from the GuiItemData.
GuiItemData (25)
FieldTypeDefaultDescription
itemVar<Item>—The item to display. Leave empty to use the item held in the player's hand.
displayNameVar<String>?—Custom display name for this item. Supports MiniMessage and PlaceholderAPI.
loreList<Var<String>>emptyCustom lore lines for this item. Supports MiniMessage and PlaceholderAPI.
criteriaList<Criteria>emptyCriteria to determine if this slot should be visible to the player.
allowPickupBooleanfalseIf true, the player can pick up this item from the inventory.
modifiersList<Modifier>emptyModifiers applied when this slot is rendered.
triggersList<Ref<TriggerableEntry>>emptyTriggers executed when this slot is clicked (regardless of interaction type).
interactionListList<InteractionData>emptyPer-click-type interactions (commands and triggers for LEFT, RIGHT, SHIFT, etc.). Use this instead of the legacy 'commands' field.
inputInputData?—Input dialog configuration. When set, clicking this slot opens an input prompt.
storageIdString?—ID of a reusable storage configuration from the menu storagePool. Leave empty for a normal slot.
isGhostBooleanfalseIf true, the item appears as a ghost (not collectable, same as allowPickup=false but semantically different).
animationSlotAnimationData?—Animation applied to this slot when the menu opens.
cooldownTicksLong0Cooldown in ticks before this slot can be clicked again.
buttonTypeString?—Button type tag for button resolvers (e.g. 'next_page', 'close', 'SHOP_ITEM'). The configured item visuals are preserved. Pair with buttonPrefix for extension-specific buttons.
buttonPrefixString?—Prefix prepended to button type tag. Default: 'dungeon_button:'. Set to e.g. 'shop_button:' or 'codex_button:' for other extensions.
viewPermissionString?—Permission required to SEE this slot (null = everyone).
clickPermissionString?—Permission required to INTERACT with this slot; without it the slot renders but is inert.
xInt0Starting X position (column) of this slot. 0 = leftmost.
yInt0Starting Y position (row) of this slot. 0 = top row.
countInt1How many times this slot repeats along 'direction' — a number of SLOTS, not a stack size. To show a stack of 64, set the item's amount instead. Ignored when direction is unset.
directionDirection?—Direction in which to repeat this slot (right, left, down, up). Leave null for a single slot at (x, y).
gapInt1Step between two repeated slots, NOT a spacing: 1 = adjacent, 2 = one empty slot between each. Applies to both axes.
repeatYInt1How many times the whole repetition repeats on the axis PERPENDICULAR to 'direction' — vertically for right/left, horizontally for down/up. A number of ROWS of slots, not a stack size.
rollPerSlotBooleanfalseOnly matters when this item repeats over several slots and its 'item' is random (a variable backed by a ranged or case variable). Off = the item is rolled once and every repeated slot shows that same result. On = each repeated slot rolls the item on its own when the menu opens; the result is then kept for as long as the menu stays open. Off, even with a lore that refreshes, still means ONE draw for the whole session: the text refreshes, the item is never rolled again. All of this holds unless 'liveItem' is on.
liveItemBooleanfalseOff (default) = the item is drawn when the menu opens and kept for the whole session; on refresh only its name and lore follow. On = the item (a variable) is evaluated again at every refresh, so a random item is drawn again each time. Combine with 'rollPerSlot' to choose between one draw per repeated slot (on) and one draw shared by all repeated slots at each refresh (off). A blank name is still ignored.
merchant (1)
FieldTypeDefaultDescription
tradesList<TradeData>emptyList of trade offers displayed in the merchant GUI.
TradeData (8)
FieldTypeDefaultDescription
resultVar<Item>—The item the player receives from this trade.
costOneVar<Item>—First cost item the player must provide.
costTwoVar<Item>?—Optional second cost item.
maxUsesInt1Maximum number of uses before the trade locks. Set to 999999 for unlimited.
experienceRewardBooleantrueIf true, the player receives experience when completing this trade.
villagerExperienceInt0Amount of villager experience gained from this trade.
priceMultiplierFloat0.0Price multiplier applied to this trade after each use (0.0 = no change).
criteriaList<Criteria>emptyCriteria to determine if this trade should be visible to the player.
paginated (4)
FieldTypeDefaultDescription
itemsPerPageInt45Number of items per page. Default: 45 (5 rows of 9).
slotsList<Int>emptyCustom slot indices for paginated items. When empty, items fill top-to-bottom left-to-right.
itemsList<GuiItemData>emptyItems to paginate across multiple pages.
GuiItemData (25)
FieldTypeDefaultDescription
itemVar<Item>—The item to display. Leave empty to use the item held in the player's hand.
displayNameVar<String>?—Custom display name for this item. Supports MiniMessage and PlaceholderAPI.
loreList<Var<String>>emptyCustom lore lines for this item. Supports MiniMessage and PlaceholderAPI.
criteriaList<Criteria>emptyCriteria to determine if this slot should be visible to the player.
allowPickupBooleanfalseIf true, the player can pick up this item from the inventory.
modifiersList<Modifier>emptyModifiers applied when this slot is rendered.
triggersList<Ref<TriggerableEntry>>emptyTriggers executed when this slot is clicked (regardless of interaction type).
interactionListList<InteractionData>emptyPer-click-type interactions (commands and triggers for LEFT, RIGHT, SHIFT, etc.). Use this instead of the legacy 'commands' field.
inputInputData?—Input dialog configuration. When set, clicking this slot opens an input prompt.
storageIdString?—ID of a reusable storage configuration from the menu storagePool. Leave empty for a normal slot.
isGhostBooleanfalseIf true, the item appears as a ghost (not collectable, same as allowPickup=false but semantically different).
animationSlotAnimationData?—Animation applied to this slot when the menu opens.
cooldownTicksLong0Cooldown in ticks before this slot can be clicked again.
buttonTypeString?—Button type tag for button resolvers (e.g. 'next_page', 'close', 'SHOP_ITEM'). The configured item visuals are preserved. Pair with buttonPrefix for extension-specific buttons.
buttonPrefixString?—Prefix prepended to button type tag. Default: 'dungeon_button:'. Set to e.g. 'shop_button:' or 'codex_button:' for other extensions.
viewPermissionString?—Permission required to SEE this slot (null = everyone).
clickPermissionString?—Permission required to INTERACT with this slot; without it the slot renders but is inert.
xInt0Starting X position (column) of this slot. 0 = leftmost.
yInt0Starting Y position (row) of this slot. 0 = top row.
countInt1How many times this slot repeats along 'direction' — a number of SLOTS, not a stack size. To show a stack of 64, set the item's amount instead. Ignored when direction is unset.
directionDirection?—Direction in which to repeat this slot (right, left, down, up). Leave null for a single slot at (x, y).
gapInt1Step between two repeated slots, NOT a spacing: 1 = adjacent, 2 = one empty slot between each. Applies to both axes.
repeatYInt1How many times the whole repetition repeats on the axis PERPENDICULAR to 'direction' — vertically for right/left, horizontally for down/up. A number of ROWS of slots, not a stack size.
rollPerSlotBooleanfalseOnly matters when this item repeats over several slots and its 'item' is random (a variable backed by a ranged or case variable). Off = the item is rolled once and every repeated slot shows that same result. On = each repeated slot rolls the item on its own when the menu opens; the result is then kept for as long as the menu stays open. Off, even with a lore that refreshes, still means ONE draw for the whole session: the text refreshes, the item is never rolled again. All of this holds unless 'liveItem' is on.
liveItemBooleanfalseOff (default) = the item is drawn when the menu opens and kept for the whole session; on refresh only its name and lore follow. On = the item (a variable) is evaluated again at every refresh, so a random item is drawn again each time. Combine with 'rollPerSlot' to choose between one draw per repeated slot (on) and one draw shared by all repeated slots at each refresh (off). A blank name is still ignored.
navigationButtonsList<PaginationButtonData>emptyNavigation buttons. Add NEXT, PREVIOUS, BACK and/or INDICATOR roles as needed.
PaginationButtonData (2)
FieldTypeDefaultDescription
rolePaginationButtonRoleNEXTRole performed by this navigation button.Values:NEXTPREVIOUSBACKINDICATOR
itemGuiItemData—The item displayed for this navigation button.
scrollable (6)
FieldTypeDefaultDescription
innerIdString?—Identifier of the inner layout to scroll. Usually references another layout in the pool.
virtualWidthInt?—Virtual width of the scrollable area. Default: inventory width.
virtualHeightInt?—Virtual height of the scrollable area. Default: inventory height.
buttonsList<ScrollButtonData>emptyScroll navigation buttons (up, down, left, right arrows). These are fixed outside the scrollable viewport.
ScrollButtonData (3)
FieldTypeDefaultDescription
itemGuiItemData—The item that acts as a scroll button (arrow, head, etc.).
directionScrollDirectionUPDirection to scroll when clicked.Values:UPDOWNLEFTRIGHT
stepInt1Number of slots/lines to scroll per click.
showDefaultButtonsBooleantrueIf true, an arrow is added for every scroll direction that has no button of its own above, only while the content can scroll that way and only on a cell with nothing else on it (item, name and place can be changed in the gui_settings entry). Set to false for no arrows at all.
defaultStepInt1Number of slots/lines the default arrows scroll per click. Custom buttons use their own step. Minimum 1.
simple (3)
FieldTypeDefaultDescription
itemsList<GuiItemData>emptyList of items to display in this layout.
GuiItemData (25)
FieldTypeDefaultDescription
itemVar<Item>—The item to display. Leave empty to use the item held in the player's hand.
displayNameVar<String>?—Custom display name for this item. Supports MiniMessage and PlaceholderAPI.
loreList<Var<String>>emptyCustom lore lines for this item. Supports MiniMessage and PlaceholderAPI.
criteriaList<Criteria>emptyCriteria to determine if this slot should be visible to the player.
allowPickupBooleanfalseIf true, the player can pick up this item from the inventory.
modifiersList<Modifier>emptyModifiers applied when this slot is rendered.
triggersList<Ref<TriggerableEntry>>emptyTriggers executed when this slot is clicked (regardless of interaction type).
interactionListList<InteractionData>emptyPer-click-type interactions (commands and triggers for LEFT, RIGHT, SHIFT, etc.). Use this instead of the legacy 'commands' field.
inputInputData?—Input dialog configuration. When set, clicking this slot opens an input prompt.
storageIdString?—ID of a reusable storage configuration from the menu storagePool. Leave empty for a normal slot.
isGhostBooleanfalseIf true, the item appears as a ghost (not collectable, same as allowPickup=false but semantically different).
animationSlotAnimationData?—Animation applied to this slot when the menu opens.
cooldownTicksLong0Cooldown in ticks before this slot can be clicked again.
buttonTypeString?—Button type tag for button resolvers (e.g. 'next_page', 'close', 'SHOP_ITEM'). The configured item visuals are preserved. Pair with buttonPrefix for extension-specific buttons.
buttonPrefixString?—Prefix prepended to button type tag. Default: 'dungeon_button:'. Set to e.g. 'shop_button:' or 'codex_button:' for other extensions.
viewPermissionString?—Permission required to SEE this slot (null = everyone).
clickPermissionString?—Permission required to INTERACT with this slot; without it the slot renders but is inert.
xInt0Starting X position (column) of this slot. 0 = leftmost.
yInt0Starting Y position (row) of this slot. 0 = top row.
countInt1How many times this slot repeats along 'direction' — a number of SLOTS, not a stack size. To show a stack of 64, set the item's amount instead. Ignored when direction is unset.
directionDirection?—Direction in which to repeat this slot (right, left, down, up). Leave null for a single slot at (x, y).
gapInt1Step between two repeated slots, NOT a spacing: 1 = adjacent, 2 = one empty slot between each. Applies to both axes.
repeatYInt1How many times the whole repetition repeats on the axis PERPENDICULAR to 'direction' — vertically for right/left, horizontally for down/up. A number of ROWS of slots, not a stack size.
rollPerSlotBooleanfalseOnly matters when this item repeats over several slots and its 'item' is random (a variable backed by a ranged or case variable). Off = the item is rolled once and every repeated slot shows that same result. On = each repeated slot rolls the item on its own when the menu opens; the result is then kept for as long as the menu stays open. Off, even with a lore that refreshes, still means ONE draw for the whole session: the text refreshes, the item is never rolled again. All of this holds unless 'liveItem' is on.
liveItemBooleanfalseOff (default) = the item is drawn when the menu opens and kept for the whole session; on refresh only its name and lore follow. On = the item (a variable) is evaluated again at every refresh, so a random item is drawn again each time. Combine with 'rollPerSlot' to choose between one draw per repeated slot (on) and one draw shared by all repeated slots at each refresh (off). A blank name is still ignored.
dropOnCloseBooleanfalseWhen the menu closes, hand back whatever still sits in this layout's slots that the player can take from (allowPickup): loot they did not pick up, or an item they put there. Slots with allowPickup off are decoration and are never handed back. Off = the contents vanish with the menu.
closeDeliveryCloseDelivery—How the contents are handed back when dropOnClose is on. GIVE_OR_DROP: into the player's inventory, the surplus falls at their feet when it is full. DROP: everything falls at their feet.
storage (3)
FieldTypeDefaultDescription
entryRef<GuiStorageEntry>—Reference to a gui_storage artifact entry that persists the stored items.
groupKeyVar<String>%player_uuid%Group key for storage scope. Use %player_uuid% for per-player, or a group reference for shared storage.
slotsList<StorageSlotLayoutItemData>emptyList of storage slot definitions (position, maxStack, triggers, etc.).
StorageSlotLayoutItemData (12)
FieldTypeDefaultDescription
xInt0X position (column) of this storage slot. 0 = leftmost.
yInt0Y position (row) of this storage slot. 0 = top row.
maxStackInt64Maximum item amount allowed in this slot (1-64).
temporaryBooleanfalseIf true, the slot content is lost when the menu closes.
dropOnCloseBooleanfalseIf true, remaining contents are dropped on the ground when the menu really closes.
placeholderVar<Item>?—Placeholder item shown when the slot is empty.
onFillList<Ref<TriggerableEntry>>emptyTriggers executed when the slot becomes non-empty.
onEmptyList<Ref<TriggerableEntry>>emptyTriggers executed when the slot becomes empty.
requiredItemVar<Item>?—If set, only items matching this type can be stored in this slot.
requiredAmountInt0Number of items that must be deposited to trigger onReachRequired.
onReachRequiredList<Ref<TriggerableEntry>>emptyTriggers executed when the required amount is reached.
consumeItemsBooleantrueIf true, deposited items are consumed when requiredAmount is reached.
storagePoolList<StorageSlotData>emptyReusable storage configurations referenced by GUI items through storageId.
StorageSlotData (14)
FieldTypeDefaultDescription
entryRef<GuiStorageEntry>—Reference to a gui_storage artifact entry
groupRef<GroupEntry>—Group that determines the storage scope. Leave empty for per-player storage. Use a group entry (e.g. island group) for shared storage.
maxAmountInt64Maximum item amount allowed in this slot (1-64)
temporaryBooleanfalseIf true, the slot content is lost when the menu closes
dropOnCloseBooleanfalseIf true, remaining contents are dropped on the ground when the menu really closes. Independent from take/place clicks.
temporaryTriggersList<Ref<TriggerableEntry>>emptyTriggers executed when the menu closes if the slot was filled and temporary is true
placeholderVar<Item>?—Placeholder item shown when the slot is empty
requiredItemVar<Item>?—If set, only items matching this type can be stored in this slot
requiredAmountInt0Number of items that must be deposited to trigger onReachRequired. Requires requiredItem.
onReachRequiredList<Ref<TriggerableEntry>>emptyTriggers executed when the required amount is reached
consumeOnReachBooleantrueIf true, deposited items are consumed when requiredAmount is reached
forceStorageBooleantrueIf true, non-stackable items (swords, tools) can be stored in this slot
onFillList<Ref<TriggerableEntry>>emptyTriggers executed when the slot becomes non-empty
onEmptyList<Ref<TriggerableEntry>>emptyTriggers executed when the slot becomes empty
mainLayoutIdString?—ID of the layout from layoutPool to use as the main layout. If null, an empty menu is shown.
audioGuiAudioData—Custom audio configuration for this menu (open, close, scroll, click sounds).
GuiAudioData (4)
FieldTypeDefaultDescription
onOpenSound?—Sound played when the GUI opens.
onCloseSound?—Sound played when the GUI closes.
onScrollSound?—Sound played when scrolling through pages or slots.
onClickSound?—Sound played when clicking any slot.
baseMenuIdString—Entry id of a template menu to inherit from: its layoutPool is merged under this one (same ids override), and mainLayoutId/size are used as fallbacks.
autoRefreshTicksLong0Re-render the menu every N ticks while open (0 = disabled). For live counters/timers.
viewsList<MenuViewData>emptyAddressable screens of this menu. Frames with layoutId '@view' and slots tagged 'view:<id>' resolve against the active one.
MenuViewData (7)
FieldTypeDefaultDescription
titleVar<String>?—Title for this view. Supports {breadcrumb}, {view} and {root} tokens. Empty = the menu title.PlaceholdersColors
parentIdString—Parent view. Builds the breadcrumb and keeps the parent's tab highlighted on sub-views.
framesMap<String, String>emptyExplicit frame id -> pool layout id mapping. Takes precedence over the '{viewId}_{frameId}' convention.
criteriaList<Criteria>emptyThe view is unreachable and its tab hidden when these do not match.
viewPermissionString?—Permission required to reach this view. Without it the tab is hidden.
activeStyleViewActiveStyle—How this view's tab is rendered while it is the active one.
ViewActiveStyle (5)
FieldTypeDefaultDescription
glintBooleantrueAdd the enchantment glint to the active tab.
materialMaterial?—Replace the active tab's material. Empty = keep the configured one.
customModelDataInt0custom_model_data forced on the active tab. 0 = leave untouched.
nameFormatString—Name of the active tab. '{name}' is replaced by the configured name. Empty = keep it.Colors
loreSuffixList<String>emptyLore lines appended to the active tab.Colors
editorIdString?—Internal web-editor id. Managed automatically — do not edit.
defaultViewIdString?—View opened first. Empty = the first declared view.
breadcrumbSeparatorString—MiniMessage separator inserted between breadcrumb segments by the {breadcrumb} title token.Colors
pushHistoryOnViewSwitchBooleanfalsePush the previous view onto the back stack when switching tabs.
extendToPlayerInventoryBooleanfalseWhen true, the player's own inventory (27 slots + 9 hotbar) is merged into the menu display. Purely visual — items stay in the real inventory. Only applicable to CUSTOM guiType with 6 rows.
Common TypeWriter fields (criteria, modifiers, triggers)
FieldTypeDefaultDescription
criteriaList<Criteria>empty—
modifiersList<Modifier>empty—
triggersList<Ref<TriggerableEntry>>empty—

How to use it​

Open GUI is the only entry you need for a menu. Work through its fields in this order:

  1. guiType, size and title. size only matters for CUSTOM. The title accepts MiniMessage and PlaceholderAPI.
  2. layoutPool and mainLayoutId. Each layout needs a unique id; mainLayoutId names the root one. If it is blank or does not match, the menu opens empty. Compose layouts with composite (layers), frame (rectangles), scrollable (a window on a bigger layout) or paginated (pages).
  3. Items inside layouts: item, displayName, lore, x, y, then interactionList. See Menus for every item field and Layouts, frames and slots.
  4. Optional: storagePool for storage slots, views and defaultViewId for tabs, baseMenuId to inherit a template, audio for sounds, autoRefreshTicks for live counters.
Layout types

The variants of layoutPool are simple, flex, composite, paginated, scrollable, frame, book, merchant, storage and leaderboard. A book or merchant layout must be the mainLayoutId, and it replaces the window type.

Pitfalls:

  • An item left without item shows what the player holds in their main hand.
  • A scrollable layout gets a default arrow for each direction without a buttons entry, unless showDefaultButtons is off. Menus written before default arrows existed gain them: set showDefaultButtons to false to keep such a menu as it was.
  • A sound left empty in audio is taken from the audioDefaults of GUI Settings, sound by sound; a sound set here wins.
  • extendToPlayerInventory needs guiType CUSTOM and size SIZE_54.
  • Menus created before schema version 2 are converted once at startup. The console then asks you to run /typewriter reload.

See also Interactions and navigation, Views, tabs and inheritance and the Cookbook.