# 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