# 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