# 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