# PacketMenu > Abstract base class for building custom screen menus sent to Lectern clients. `gg.lode.lecternapi.api.menu.PacketMenu` --- ## Signature ```java public abstract class PacketMenu ``` --- ## Overview PacketMenu provides a way to create full-screen interactive menus with textures, text, player heads, player busts, and clickable buttons. Menus automatically manage the button overlay layer and background blur. Subclass and override `build(Builder)` to define your menu's layout. --- ## Example ```java public class ShopMenu extends PacketMenu { public ShopMenu(Player player) { super("shop_menu", player); setBlur(0.7f); onClose(() -> player.sendMessage("Shop closed!")); } @Override protected void build(Builder builder) { builder.addTexture("bg", "myplugin:textures/gui/shop_bg.png", MenuTransform.at(0, 0).layer(0), 256, 256); builder.addButton("buy_sword", "myplugin:textures/gui/buy_btn.png", MenuTransform.at(50, 80).layer(5), 64, 32, ButtonListener.onClick(origin -> { origin.player().sendMessage("Sword purchased!"); origin.menu().close(); })); builder.addText("title", "<gold>Item Shop</gold>", MenuTransform.at(0, 20).layer(10).centered(), 2.0f); } } // Open the menu LecternAPI.getApi().getPacketMenuManager().open(player, new ShopMenu(player)); ``` --- ## Constructor ```java public PacketMenu(String id, Player player) ``` | Parameter | Type | Description | |---|---|---| | `id` | `String` | A unique identifier for this menu. | | `player` | `Player` | The player this menu is shown to. | --- ## Abstract Methods ### build ```java protected abstract void build(Builder builder) ``` Override to define the menu layout. Called once when the menu is opened. --- ## Protected Methods ### setBlur ```java protected void setBlur(float blur) ``` Sets the background blur amount when the button overlay is active. Default is `0.5f`. Set to `0` for no blur. Call this in the constructor. | Parameter | Type | Description | |---|---|---| | `blur` | `float` | The blur amount. | --- ### onClose ```java protected void onClose(Runnable action) ``` Sets an action to run when the menu is closed (either by the player or programmatically). Call this in the constructor. | Parameter | Type | Description | |---|---|---| | `action` | `Runnable` | The close callback. | --- ## Public Methods ### close ```java public void close() ``` Closes this menu, removing all elements and the button overlay. Delegates to `IPacketMenuManager.close()`. --- ## Builder The `Builder` is passed to `build()` and provides methods for composing menu elements. ### addTexture ```java public Builder addTexture(String reference, String textureId, MenuTransform transform, float width, float height) ``` Adds a texture element. | Parameter | Type | Description | |---|---|---| | `reference` | `String` | Unique ID for this element within the menu. | | `textureId` | `String` | The texture identifier (e.g. `"namespace:textures/gui/bg.png"`). | | `transform` | `MenuTransform` | Positioning data. | | `width` | `float` | Texture width in pixels. | | `height` | `float` | Texture height in pixels. | --- ### addHead ```java public Builder addHead(String reference, String headUuid, MenuTransform transform, float width, float height) ``` Adds a player head element. | Parameter | Type | Description | |---|---|---| | `reference` | `String` | Unique ID for this element. | | `headUuid` | `String` | The UUID of the player whose head to render. | | `transform` | `MenuTransform` | Positioning data. | | `width` | `float` | Head width in pixels. | | `height` | `float` | Head height in pixels. | --- ### addPlayer ```java public Builder addPlayer(String reference, String identifier, MenuTransform transform, float width, float height) ``` Adds a player bust render. | Parameter | Type | Description | |---|---|---| | `reference` | `String` | Unique ID for this element. | | `identifier` | `String` | The username or UUID of the player to render. | | `transform` | `MenuTransform` | Positioning data. | | `width` | `float` | Render width in pixels. | | `height` | `float` | Render height in pixels. | --- ### addButton ```java public Builder addButton(String reference, String textureId, MenuTransform transform, int width, int height, ButtonListener listener) ``` Adds a clickable/hoverable button element. | Parameter | Type | Description | |---|---|---| | `reference` | `String` | Unique ID for this button. | | `textureId` | `String` | The button texture identifier. | | `transform` | `MenuTransform` | Positioning data. | | `width` | `int` | Button width in pixels. | | `height` | `int` | Button height in pixels. | | `listener` | `ButtonListener` | Click/hover handler. | --- ### addText ```java public Builder addText(String reference, String text, MenuTransform transform, float scale) ``` Adds a text element using MiniMessage format. | Parameter | Type | Description | |---|---|---| | `reference` | `String` | Unique ID for this element. | | `text` | `String` | The text content (supports MiniMessage tags like `<gold>Hello</gold>`). | | `transform` | `MenuTransform` | Positioning data. | | `scale` | `float` | Text scale multiplier. | --- ### addComponent ```java public Builder addComponent(PacketComponent component) ``` Flattens a `PacketComponent`'s elements into this menu as static elements. The component is initialized if not already built. Tickable elements are treated as static within menus — no tick loop runs for embedded components. | Parameter | Type | Description | |---|---|---| | `component` | `PacketComponent` | The component to embed. | --- ## Element Types Menu elements are represented as sealed records: | Record | Fields | |---|---| | `TextureElement` | `reference`, `textureId`, `transform`, `width`, `height` | | `HeadElement` | `reference`, `headUuid`, `transform`, `width`, `height` | | `PlayerElement` | `reference`, `identifier`, `transform`, `width`, `height` | | `ButtonElement` | `reference`, `textureId`, `transform`, `width`, `height` | | `TextElement` | `reference`, `text`, `transform`, `scale` | --- ## Related Pages - [[IPacketMenuManager]] — Manager for opening/closing menus - [[MenuTransform]] — Element positioning - [[ButtonListener]] — Button event handler - [[PacketComponent]] — Embeddable HUD components