# API Reference
Complete reference for the Lectern-API interfaces and classes. All classes reside in the `gg.lode.lecternapi` package.
---
## LecternAPI
Static accessor for the API singleton. Located in `gg.lode.lecternapi.LecternAPI`.
| Method | Return Type | Description |
|---|---|---|
| `getApi()` | `ILecternAPI` | Returns the API instance, or `null` if Lectern is not loaded. |
```java
ILecternAPI api = LecternAPI.getApi();
```
---
## ILecternAPI
Primary API interface. Provides access to all effect managers.
| Method | Return Type | Description |
|---|---|---|
| `getCameraManager()` | `ICameraManager` | Returns the camera effects manager. |
| `getHUDManager()` | `IHUDManager` | Returns the HUD rendering manager. |
| `getAudioManager()` | `IAudioManager` | Returns the audio effects manager. |
| `getEnvironmentManager()` | `IEnvironmentManager` | Returns the environment effects manager. |
| `getEntityManager()` | `IEntityManager` | Returns the entity effects manager. |
| `getInputManager()` | `IInputManager` | Returns the input effects manager. |
| `getScreenManager()` | `IScreenManager` | Returns the screen effects manager. |
| `getPacketMenuManager()` | `IPacketMenuManager` | Returns the packet menu manager. |
| `getPacketComponentManager()` | `IPacketComponentManager` | Returns the packet component manager. |
| `getEmoteManager()` | `IEmoteManager` | Returns the emote manager. |
| `getVoiceChatManager()` | `IVoiceChatManager` | Returns the voice chat manager. |
| `getCutsceneManager()` | `ICutsceneManager` | Returns the cutscene manager. |
| `getPingManager()` | `IPingManager` | Returns the ping effects manager. |
| `getShapeshiftManager()` | `IShapeshiftManager` | Returns the shapeshift (client-side disguise) manager. |
| `getSharedControlManager()` | `ISharedControlManager` | Returns the shared control (input splitting) manager. |
| `getNicknameManager()` | `INicknameManager` | Returns the client-rendered nickname manager. |
| `getLayoutManager()` | `ILayoutManager` | Returns the layout page manager. |
| `getUIManager()` | `IUIManager` | Returns the toast, scrollable screen and config screen manager. |
| `getTabListManager()` | `ITabListManager` | Returns the per-viewer tab list manager. |
| `getHiddenOverlayManager()` | `IHiddenOverlayManager` | Returns the capture-excluded overlay manager. |
| `getSkyboxManager()` | `ISkyboxManager` | Returns the custom skybox manager. |
| `getParticleManager()` | `IParticleManager` | Returns the custom particle manager. |
| `getEffekManager()` | `IEffekManager` | Returns the Effekseer effect manager. |
| `getAuraManager()` | `IAuraManager` | Returns the aura effect manager. |
| `getFlareManager()` | `IFlareManager` | Returns the flare projectile manager. |
| `getExplosionManager()` | `IExplosionManager` | Returns the explosion VFX manager. |
| `getImpactFrameManager()` | `IImpactFrameManager` | Returns the impact frame VFX manager. |
| `getInputTelemetryManager()` | `IInputTelemetryManager` | Returns the raw input reporting manager. |
| `resetAllEffects(Player)` | `void` | Clears every effect this API has applied to a player. |
| `disconnectPlayer(Player, ...)` | `void` | Disconnects a Lectern client with a custom screen. |
---
## Manager Interfaces
Each manager handles a specific domain of effects. See the individual API pages for full method documentation:
- [[ILecternAPI]]. Main API interface
- [[ICameraManager]]. Camera position, rotation, FOV, screenshake, perspective
- [[IHUDManager]]. Textures, heads, text, buttons, letterbox, GUI scale, progress bar, fade envelopes, move animations, vanilla HUD element hiding
- [[IAudioManager]]. Sound playback, block sounds
- [[IPingManager]]. World-space ping markers, sound pings
- [[IEnvironmentManager]]. Fog, sky, moon colors, true darkness, dense fog
- [[IEntityManager]]. Capes, skins, nametags, tints, visibility, emotes, model attachments, visual chains
- [[IInputManager]]. Keybind disabling, inverting, custom keybind registration, hitbox control, head locking
- [[IScreenManager]]. Flash, xray, shaders, modal prompts, prevent disconnect, swap hands
- [[IPacketMenuManager]]. Interactive screen menu lifecycle
- [[IPacketComponentManager]]. Composable HUD component lifecycle
- [[IEmoteManager]]. Emote playback with targeted, local, broadcast, and collection modes
- [[IVoiceChatManager]]. Voice chat mute/deafen control (suggestive and forced)
- [[ICutsceneManager]]. Cutscene playback, pause, resume, seek
- [[IShapeshiftManager]]. Client-side disguises: mobs (with variants) and blocks/blockstates, per viewer
- [[ISharedControlManager]]. Shared control: split move/jump/sneak/look/attack/use/craft across players
- [[INicknameManager]]. Per-viewer nicknames across tab, nametag, chat and suggestions, optional scrambled UUID
- [[ILayoutManager]]. Pages authored in the Lectern UI editor: loading, opening, and running what their elements are bound to
- [[IUIManager]]. Toasts, scrollable text screens, and config screens
- [[ITabListManager]]. Per-viewer tab list prefix, suffix and sort order
- [[IHiddenOverlayManager]]. Text and textures on an overlay the player sees but screen capture does not
- [[ISkyboxManager]]. OptiFine-style custom skyboxes
- [[IParticleManager]]. Lectern's own client-registered particles, with `/particle` semantics
- [[IEffekManager]]. Effekseer particle effects
- [[IAuraManager]]. Chronite, shockwave and locational auras
- [[IFlareManager]]. World-space flare projectiles with colour, physics and lifetime
- [[IExplosionManager]]. Layered explosion VFX, visual only
- [[IImpactFrameManager]]. Single-fire anime-style impact frames
- [[IInputTelemetryManager]]. Raw input reporting
---
## Cutscene Classes
- [[Cutscene]]. Builder and definition for scripted sequences
- [[CameraPath]]. Camera path with waypoints
- [[CameraWaypoint]]. Individual camera waypoint
- [[CameraInterpolation]]. Interpolation modes (linear, Catmull-Rom, cubic Bezier)
- [[Vec]]. Lightweight position record
- [[CutsceneAction]]. Sealed interface for cutscene actions
---
## Core Classes
- [[PacketMenu]]. Base class for custom interactive screen menus
- [[PacketComponent]]. Base class for composable, tickable HUD components
- [[MenuTransform]]. Immutable positioning record for elements
- [[ButtonListener]]. Button click/hover event handler
- [[ElementData]]. Sealed interface for component element data types
- [[ModalPromptButton]]. Button configuration for modal prompts
---
## Layout and HUD Classes
- [[LayoutPage]]. A page authored in the UI editor, with its behaviour and transitions
- [[LayoutBehavior]]. How and when a page opens, and what closes it
- [[LayoutAction]]. What an element does when it is triggered
- [[LayoutTransition]]. How a page enters and leaves
- [[HudLayout]]. A layout played straight from the server
- [[HudAnimation]]. Keyframed movement for a HUD element
- [[HudShape]]. Shape primitives drawn on the HUD
- [[HudElement]]. Which vanilla HUD elements can be hidden
- [[HudEasing]]. Easing curves for HUD movement
- [[WorldAnchor]]. A marker anchored to a world position
- [[AnnouncementBadge]]. Centre-screen banner. Deprecated, use a layout
- [[Toast]]. Corner toast notification
- [[ScreenButton]]. A button on a scrollable text screen
- [[ScreenContent]]. What a scrollable text screen shows
- [[ConfigWidget]]. A widget on a config screen
- [[EmoteWheelSlot]]. One slot on the emote wheel
- [[Skybox]]. Custom skybox definition
- [[Keybind]]. The keybind ids the client reports
- [[Perspective]]. First person, third person, and front-facing
- [[HorizontalAlignment]]. Left, centre, right
- [[VerticalAlignment]]. Top, middle, bottom
---
## Verity Classes
- [[VerityModel]]. A Verity model shown on a player's client
- [[VerityFace]]. Face expressions
- [[VerityFit]]. Outfits
- [[VerityClip]]. Animation clips
---
## Usage Examples
### Controlling Camera for a Cutscene
```java
ILecternAPI api = LecternAPI.getApi();
Player player = /* ... */;
// Move camera to a cinematic position
api.getCameraManager().moveCamera(player, 100.0, 80.0, 200.0, 45.0f, -30.0f, 0.0f, 60);
// Add screen shake for impact
api.getCameraManager().screenshake(player, 0.5f, 20);
// Return control after 5 seconds
Bukkit.getScheduler().runTaskLater(plugin, () -> {
api.getCameraManager().stopCamera(player);
}, 100L);
```
### Building a Tickable HUD Component
```java
public class CooldownBar extends PacketComponent {
private final Player player;
private int ticksRemaining;
public CooldownBar(Player player, int totalTicks) {
super("cooldown", player, MenuTransform.at(10, 60));
this.player = player;
this.ticksRemaining = totalTicks;
}
@Override
protected void build(Builder builder) {
builder.addTexture("bg", "mygame:hud/cooldown_bg", MenuTransform.at(0, 0), 100, 10);
builder.addTexture("fill", "mygame:hud/cooldown_fill", MenuTransform.at(1, 1), 98, 8)
.tickable();
}
@Override
protected void tick() {
ticksRemaining--;
if (ticksRemaining <= 0) {
hide();
return;
}
float pct = ticksRemaining / 100f;
update("fill", texture -> texture.width(98 * pct));
}
}
```
### Creating an Interactive Menu
```java
public class ConfirmMenu extends PacketMenu {
private final Runnable onConfirm;
public ConfirmMenu(Player player, Runnable onConfirm) {
super("confirm", player);
this.onConfirm = onConfirm;
setBlur(0.5f);
}
@Override
protected void build(Builder builder) {
builder.addTexture("bg", "myplugin:textures/gui/confirm_bg.png",
MenuTransform.at(0, 0).centered(), 200, 100);
builder.addText("prompt", "<white>Are you sure?</white>",
MenuTransform.at(0, -20).centered(), 1.5f);
builder.addButton("yes", "myplugin:textures/gui/yes.png",
MenuTransform.at(-40, 10).centered(), 48, 24,
ButtonListener.onClick(origin -> {
onConfirm.run();
origin.menu().close();
}));
builder.addButton("no", "myplugin:textures/gui/no.png",
MenuTransform.at(40, 10).centered(), 48, 24,
ButtonListener.onClick(origin -> origin.menu().close()));
}
}
```
### Environment for a Horror Map
```java
ILecternAPI api = LecternAPI.getApi();
// Enable true darkness
api.getEnvironmentManager().setTrueDarkness(player, true);
// Red fog
api.getEnvironmentManager().setFogColor(player, 0.3f, 0.0f, 0.0f);
// Flashlight effect
api.getScreenManager().setFlashlight(player, true);
```
### Emote Broadcast
```java
// Play an emote on a player, visible to everyone
api.getEmoteManager().broadcastEmote(target, "lodestone:celebrate", true, 1);
// Stop after a delay
Bukkit.getScheduler().runTaskLater(plugin, () -> {
api.getEmoteManager().broadcastStopAllEmotes(target);
}, 60L);
```
### Building a Cutscene
```java
ILecternAPI api = LecternAPI.getApi();
Player player = /* ... */;
Cutscene intro = Cutscene.builder("intro")
.at(0)
.letterbox(true)
.hideHud(true)
.disableInput(true)
.setCamera(100, 80, 200, 0, -15, 0)
.cameraPath(path -> path
.waypoint(Vec.of(100, 80, 200), 0, -15, 0, 0)
.waypoint(Vec.of(120, 85, 220), 30, -10, 0, 40)
.waypoint(Vec.of(140, 75, 200), 60, -5, 0, 80)
.interpolation(CameraInterpolation.CATMULL_ROM))
.then(20)
.showText("title", "<gold><bold>Welcome</bold></gold>", MenuTransform.at(0, 0).centered(), 3.0f)
.then(60)
.hideText("title")
.callback(() -> player.sendMessage("Reached midpoint!"))
.then(40)
.letterbox(false)
.hideHud(false)
.disableInput(false)
.releaseCamera()
.onComplete(() -> {
player.teleport(spawnLocation);
player.sendMessage("Intro complete!");
})
.build();
api.getCutsceneManager().play(player, intro);
```
### Voice Chat Control
```java
ILecternAPI api = LecternAPI.getApi();
// Force mute during a cutscene
api.getVoiceChatManager().forceMutePlayer(player);
api.getVoiceChatManager().forceDeafenPlayer(player);
// Release control after cutscene
api.getVoiceChatManager().stopForceMute(player);
api.getVoiceChatManager().stopForceDeafen(player);
// Suggestive (player can override)
api.getVoiceChatManager().mutePlayer(player);
```
### Modal Prompts
```java
ILecternAPI api = LecternAPI.getApi();
Player player = /* ... */;
// Show a prompt with all three button types
List<ModalPromptButton> buttons = List.of(
ModalPromptButton.consumer("Accept", "accept_rules", 0.2f, 0.7f, 0.2f),
ModalPromptButton.link("Website", "https://example.com", 0.2f, 0.4f, 0.8f),
ModalPromptButton.close("Dismiss", 0.7f, 0.2f, 0.2f)
);
api.getScreenManager().showModalPrompt(player, "rules", "Server Rules",
"# Welcome\n\nPlease read and accept our rules.\n\n" +
"## Rules\n\n- Be respectful\n- No griefing\n- Have fun",
buttons);
// Close programmatically (buttons auto-close on click)
api.getScreenManager().closeModalPrompt(player);
```
### Input Control
```java
ILecternAPI api = LecternAPI.getApi();
// Disable a keybind
api.getInputManager().disableKeybind(player, Keybind.ATTACK);
api.getInputManager().enableKeybind(player, Keybind.ATTACK);
// Lock the player's camera
api.getInputManager().setHeadLocked(player, true);
api.getInputManager().setHeadLocked(player, false);
// Register a custom keybind (appears in player's controls)
api.getInputManager().registerKeybind(player, "myplugin:ability", "Use Ability", 71, "My Plugin");
// Unregister when no longer needed
api.getInputManager().unregisterKeybind(player, "myplugin:ability");
```
---
## C2S Events
Lectern dispatches Bukkit events when the client sends data to the server. All events extend `LecternClientEvent` and include a `getPlayer()` method.
### KeybindPressedEvent
Fired when a player presses or releases a keybind.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player who triggered the event. |
| `getKey()` | `String` | The keybind identifier. |
| `isPressed()` | `boolean` | `true` if pressed, `false` if released. |
### ButtonClickEvent
Fired when a player clicks a HUD button.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player who clicked. |
| `getReference()` | `String` | The button reference ID. |
### ButtonHoverEvent
Fired when a player hovers over or stops hovering a button.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player. |
| `getReference()` | `String` | The button reference ID. |
| `isHovering()` | `boolean` | `true` if hovering, `false` if stopped. |
### MenuCloseEvent
Fired when a player closes a menu.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player who closed the menu. |
### ClientModsReportEvent
Fired when the client reports its installed mods.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player. |
| `getMods()` | `List<String>` | List of installed mod IDs. |
### ClientPacksReportEvent
Fired when the client reports its resource packs.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player. |
| `getPacks()` | `List<String>` | List of installed resource pack names. |
### PossibleInjectedClientEvent
Fired when the client detects a potentially injected mod.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player. |
| `getJarFile()` | `String` | The detected jar file name. |
### CutsceneCallbackEvent
Fired when a cutscene reaches a callback marker.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player. |
| `getCutsceneId()` | `String` | The cutscene ID. |
| `getCallbackId()` | `int` | The callback ID. |
### CutsceneCompleteEvent
Fired when a cutscene finishes playing.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player. |
| `getCutsceneId()` | `String` | The completed cutscene ID. |
### ModalPromptClickEvent
Fired when a player clicks a CONSUMER button on a modal prompt.
| Method | Return Type | Description |
|---|---|---|
| `getPlayer()` | `Player` | The player who clicked. |
| `getPromptId()` | `String` | The prompt identifier. |
| `getReference()` | `String` | The CONSUMER button's reference string. |
### Voice Chat Events
Events fired when players change their voice chat state (suggestive mode only):
- `PlayerMuteEvent`: Player muted themselves
- `PlayerUnmuteEvent`: Player unmuted themselves
- `PlayerDeafenEvent`: Player deafened themselves
- `PlayerUndeafenEvent`: Player undeafened themselves
---
## Related Pages
- [[Lectern/Developers/Overview]]. Developer overview and quick start
- [[Lectern/Server Owners/Overview]]. Plugin overview and installation