# 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. |
---
## 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, buttons, letterbox, GUI scale, progress bar
- [[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
---
## 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
---
## 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