# Events Source: https://tehoclient.dev/developers/events SDK: 1.0.0 Every platform delivers the same moments. On Bukkit you also get dedicated events for keybinds, UI, the inspector and staff actions; elsewhere those arrive through `TehoListener`. ## What fires when | Moment | `TehoListener` | Bukkit event | |---|---|---| | The handshake finished and sends will work | `onReady` | `TehoPlayerReadyEvent` | | The player left | `onLeave` | | | The player accepted or declined staff tools or a data request | `onConsent` | `TehoConsentEvent` | | A staff tool was switched on or off | `onStaffTool` | `TehoStaffToolEvent` | | A generic client event, such as a hologram click | `onEvent` | `TehoClientEvent` | | A server keybind was pressed or released | `onKey` | `TehoKeyEvent` | | A server screen was clicked, changed, submitted or closed | `onUi` | `TehoUiEvent` | | A moderator looked at something with the inspector | `onInspect` | `TehoInspectEvent` | | A moderator picked an action on the wheel or a card | `onStaffAction` | `TehoStaffActionEvent` (cancellable) | | A hologram marked `clickable` was clicked | `onHologramClick` | `TehoClientEvent` with kind `hologram.click` | | A cutscene finished or was skipped | `onCutsceneEnded` | | | A resource pack prefetch finished | `onPackStatus` | | | Your private grant was checked | `onPrivileges` | | ## Platform event classes ### Bukkit ```java @EventHandler public void onReady(TehoPlayerReadyEvent event) { Player player = event.getPlayer(); TehoPlayer teho = event.getTehoPlayer(); } @EventHandler public void onTool(TehoStaffToolEvent event) { if (event.getTool() == StaffTool.FREECAM && event.isActive()) { vanish(event.getPlayer()); } } ``` ### Velocity ```java @Subscribe public void onReady(TehoPlayerReadyEvent event) { Player player = event.getPlayer(); TehoPlayer teho = event.getTehoPlayer(); } ``` Package `dev.tehoclient.api.velocity.event`: `TehoPlayerReadyEvent`, `TehoConsentEvent`, `TehoStaffToolEvent`, `TehoClientEvent`. ### BungeeCord ```java @EventHandler public void onReady(TehoPlayerReadyEvent event) { ProxiedPlayer player = event.getPlayer(); TehoPlayer teho = event.getTehoPlayer(); } ``` Package `dev.tehoclient.api.bungee.event`: `TehoPlayerReadyEvent`, `TehoConsentEvent`, `TehoStaffToolEvent`, `TehoClientEvent`. ### Minestom ```java MinecraftServer.getGlobalEventHandler().addListener(TehoPlayerReadyEvent.class, event -> { Player player = event.getPlayer(); TehoPlayer teho = event.getTehoPlayer(); }); ``` Package `dev.tehoclient.api.minestom.event`. The events implement `PlayerEvent`. ### Fabric ```java TehoFabricEvents.READY.register((teho, player) -> greet(teho, player)); TehoFabricEvents.CONSENT.register((teho, player, scope, items, granted) -> audit(player, scope, granted)); ``` `READY`, `CLIENT_EVENT`, `CONSENT`, `STAFF_TOOL`. ### NeoForge ```java NeoForge.EVENT_BUS.addListener(TehoNeoForgeEvent.Ready.class, event -> greet(event.getTehoPlayer(), event.getPlayer())); ``` `TehoNeoForgeEvent.Ready`, `ClientEvent`, `Consent`, `StaffToolChanged`. ### Sponge ```java @Listener public void onReady(TehoSpongeEvent.Ready event) { greet(event.tehoPlayer(), event.player()); } ``` `TehoSpongeEvent.Ready`, `ClientEvent`, `Consent`, `StaffToolChanged`. ## Consent results `TehoConsentEvent` tells you how a player answered a prompt. `getScope()` says what was asked, `getItems()` lists what the answer covers, such as tool ids or info fields, and `isGranted()` says whether they agreed. ```java @EventHandler public void onConsent(TehoConsentEvent event) { if (!event.isGranted()) { getLogger().info(event.getPlayer().getName() + " declined " + event.getScope() + " " + event.getItems()); } } ``` ## Cancelling staff actions `TehoStaffActionEvent` fires on Bukkit before any action from the wheel or an inspector card runs, whether it is built in or a configured command. Cancel it to stop that behaviour and handle the action yourself. ```java @EventHandler public void onAction(TehoStaffActionEvent event) { if (event.getAction().equals("freeze") && event.getTarget().kind() == Target.Kind.PLAYER) { Player suspect = Bukkit.getPlayer(event.getTarget().id()); if (suspect != null && suspect.hasPermission("skyline.freeze.exempt")) { event.setCancelled(true); event.getPlayer().sendMessage("That player cannot be frozen."); } } } ``` ## Through a proxy When a proxy plugin owns the session, client replies such as consent, staff tool state and client events are relayed to the current backend, so these events fire on both the proxy and the backend. See [Networks & proxies](https://tehoclient.dev/install/networks#client-replies-still-reach-backends).