
A simple and powerful library for creating customizable inventories on the Bukkit API.
Layout is a modern, modular library designed to simplify the creation and management of interactive inventories in Minecraft using the Bukkit API. It provides a fluid syntax and complete control over your menu's behavior, allowing you to build GUIs quickly and efficiently.
If you need help, join the discord server.
Create inventories of variable size (like chests) or fixed size (like crafting tables and anvils), adapting to your project's needs.
Control every aspect of your menus:
The library is divided into modules that facilitate organization and scalability:
layout: Contains the core logic for inventory construction and management.item: Handles the creation and manipulation of items used in inventories.plugin: Includes code examples that demonstrate the library's practical use. This module is ideal for learning the syntax and seeing how different concepts are applied.Click here for more usage examples and documentation.
final LayoutSizedInventory layoutSizedInventory = Layout.sized()
.title(Component.text("This is a sized example menu!", NamedTextColor.BLACK))
.size(5)
// Add a clickable item with multiple click handlers
.item(22, ClickableItemLayout.builder()
.material(Material.NETHERITE_PICKAXE)
.displayName(Component.text("Netherite Pickaxe", NamedTextColor.GREEN))
.lore(
Component.text("Line 1", NamedTextColor.GREEN),
Component.text("Line 2", NamedTextColor.LIGHT_PURPLE)
)
.onLeftClick(clickContext -> clickContext.player().sendMessage("Left click!"))
.onRightClick(clickContext -> clickContext.player().sendMessage("Right click!"))
.onMiddleClick(clickContext -> clickContext.player().sendMessage("Middle click!"))
.build()
)
// Fill specific rows and columns with items
.row(1, ItemLayout.display(Material.RED_STAINED_GLASS_PANE))
.row(3, ItemLayout.display(Material.GREEN_STAINED_GLASS_PANE))
.column(2, ItemLayout.display(Material.LIME_STAINED_GLASS_PANE).buil)
.column(6, ItemLayout.display(Material.LIGHT_BLUE_STAINED_GLASS_PANE))
// Define inventory behavior
.behavior(layoutBehaviorBuilder -> layoutBehaviorBuilder
.cancelAllClicks(false)
.cancelLayoutClicks(true)
.allowPlayerInventoryClicks(true)
.ignoreEmptySlots(true)
.onClick(context -> context.player().sendMessage("Clicked on inventory!"))
.onOpen(openContext -> openContext.player().sendMessage("Inventory opened!"))
.onClose(closeContext -> closeContext.player().sendMessage("Inventory closed!"))
)
.build();
layoutSizedInventory.open(player);