# 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