# PacketComponent
> Abstract base class for composable HUD components sent to Lectern clients.
`gg.lode.lecternapi.api.component.PacketComponent`
---
## Signature
```java
public abstract class PacketComponent
```
---
## Overview
Components group HUD elements (textures, text, heads, player busts, buttons) under a shared coordinate space with relative positioning. Elements marked as `tickable()` are monitored each server tick — only changed elements are re-sent to the client.
Subclass and override `build(Builder)` to define layout, and optionally override `tick()` for dynamic updates.
---
## Example
```java
public class HealthBar extends PacketComponent {
private final Player target;
public HealthBar(Player target) {
super("health_bar", target, MenuTransform.at(10, 10));
this.target = target;
}
@Override
protected void build(Builder builder) {
builder.addTexture("bg", "mygame:hud/bar_bg", MenuTransform.at(0, 0), 200, 20);
builder.addTexture("fill", "mygame:hud/bar_fill", MenuTransform.at(2, 2), 196, 16)
.tickable();
builder.addText("label", formatHealth(), MenuTransform.at(100, 10).centered(), 1.0f)
.tickable();
}
@Override
protected void tick() {
float pct = (float) target.getHealth() / 20f;
update("fill", texture -> texture.width(196 * pct));
update("label", text -> text.text(formatHealth()));
}
}
```
---
## Constructor
```java
public PacketComponent(String id, Player player, MenuTransform transform)
```
| Parameter | Type | Description |
|---|---|---|
| `id` | `String` | A unique identifier for this component. |
| `player` | `Player` | The player this component is shown to. |
| `transform` | `MenuTransform` | The base screen position for this component. Child elements use positions relative to this. |
---
## Abstract Methods
### build
```java
protected abstract void build(Builder builder)
```
Override to define the component's element layout. Called once during initialization.
---
## Overridable Methods
### tick
```java
protected void tick()
```
Override to update tickable elements each server tick. Use `update(reference, updater)` to modify element properties. Only called if the component has tickable elements.
---
## Public Methods
### show
```java
public void show()
```
Shows this component to the player. Delegates to `IPacketComponentManager.show()`.
---
### hide
```java
public void hide()
```
Hides this component from the player. Delegates to `IPacketComponentManager.hide()`.
---
### update
```java
protected <T extends ElementUpdater> void update(String reference, Consumer<T> updater)
```
Updates a tickable element's properties during `tick()`. The consumer receives an `ElementUpdater` appropriate for the element's type.
| Parameter | Type | Description |
|---|---|---|
| `reference` | `String` | The element reference (as passed to the builder). |
| `updater` | `Consumer<T>` | Consumer that modifies element properties. |
---
## Builder
The `Builder` is passed to `build()` and provides methods for adding elements.
### addTexture
```java
public ElementHandle addTexture(String reference, String textureId, MenuTransform relativeTransform, float width, float height)
```
Adds a texture element.
| Parameter | Type | Description |
|---|---|---|
| `reference` | `String` | Unique ID for this element within the component. |
| `textureId` | `String` | The texture identifier (e.g. `"namespace:path/to/texture.png"`). |
| `relativeTransform` | `MenuTransform` | Position relative to the component's base transform. |
| `width` | `float` | Texture width in pixels. |
| `height` | `float` | Texture height in pixels. |
---
### addHead
```java
public ElementHandle addHead(String reference, String headUuid, MenuTransform relativeTransform, 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. |
| `relativeTransform` | `MenuTransform` | Position relative to the component. |
| `width` | `float` | Head width in pixels. |
| `height` | `float` | Head height in pixels. |
---
### addPlayer
```java
public ElementHandle addPlayer(String reference, String identifier, MenuTransform relativeTransform, 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. |
| `relativeTransform` | `MenuTransform` | Position relative to the component. |
| `width` | `float` | Render width in pixels. |
| `height` | `float` | Render height in pixels. |
---
### addButton
```java
public ElementHandle addButton(String reference, String textureId, MenuTransform relativeTransform, 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. |
| `relativeTransform` | `MenuTransform` | Position relative to the component. |
| `width` | `int` | Button width in pixels. |
| `height` | `int` | Button height in pixels. |
| `listener` | `ButtonListener` | Click/hover handler. |
---
### addText
```java
public ElementHandle addText(String reference, String text, MenuTransform relativeTransform, 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>`). |
| `relativeTransform` | `MenuTransform` | Position relative to the component. |
| `scale` | `float` | Text scale multiplier. |
---
## ElementHandle
Returned by builder methods. Call `tickable()` to mark the element for per-tick dirty checking.
### tickable
```java
public ElementHandle tickable()
```
Marks this element as tickable — it will be monitored each tick and re-sent to the client only when its data changes.
---
## Element Updaters
Each element type has a corresponding updater class used inside `tick()`:
| Updater | Methods |
|---|---|
| `TextureUpdater` | `textureId(String)`, `transform(MenuTransform)`, `width(float)`, `height(float)` |
| `HeadUpdater` | `headUuid(String)`, `transform(MenuTransform)`, `width(float)`, `height(float)` |
| `PlayerUpdater` | `identifier(String)`, `transform(MenuTransform)`, `width(float)`, `height(float)` |
| `ButtonUpdater` | `textureId(String)`, `transform(MenuTransform)`, `width(int)`, `height(int)`, `listener(ButtonListener)` |
| `TextUpdater` | `text(String)`, `transform(MenuTransform)`, `scale(float)` |
---
## Related Pages
- [[IPacketComponentManager]] — Manager for showing/hiding components
- [[MenuTransform]] — Element positioning
- [[ButtonListener]] — Button event handler
- [[ElementData]] — Element data types