Overview
The Trigger API allows you to create custom event handlers that trigger popup displays and HUD updates. Triggers connect in-game events to BetterHud components.
HudTrigger Interface
The HudTrigger<T> interface represents a trigger that responds to events of type T.
Package
kr.toxicity.hud.api.trigger.HudTrigger
Type Parameters
The type of event this trigger handles (e.g., PlayerEvent, DamageEvent, etc.)
Methods
getKey
Gets a unique key for the given event instance.
@NotNull Object getKey(T t)
The event instance to get the key for
A unique identifier for this event (normally a random UUID or event-specific identifier)
registerEvent
Registers an event handler for this trigger.
void registerEvent(@NotNull BiConsumer<UUID, UpdateEvent> eventConsumer)
eventConsumer
BiConsumer<UUID, UpdateEvent>
required
A consumer that handles trigger events. Receives the player UUID and the update event.
UpdateEvent Interface
Represents the context for an update triggered by an event.
Package
kr.toxicity.hud.api.update.UpdateEvent
Methods
getType
Gets the reason for this update.
@NotNull UpdateReason getType()
The type of update that occurred
getKey
Gets the unique key for this event.
A unique identifier for this update event (normally a UUID)
source
Gets the source event that caused this update.
default @NotNull UpdateEvent source()
The original event that triggered this update (returns this by default)
Empty Event
A static empty event instance for cases where no specific trigger is needed.
Usage Examples
Creating a Custom Trigger
import kr.toxicity.hud.api.trigger.HudTrigger;
import kr.toxicity.hud.api.update.UpdateEvent;
import org.bukkit.event.player.PlayerEvent;
import java.util.UUID;
import java.util.function.BiConsumer;
public class CustomPlayerTrigger implements HudTrigger<PlayerEvent> {
@Override
public Object getKey(PlayerEvent event) {
// Use player UUID as the key
return event.getPlayer().getUniqueId();
}
@Override
public void registerEvent(BiConsumer<UUID, UpdateEvent> eventConsumer) {
// This would typically be called by BetterHud's internal systems
// to register the handler that shows popups/updates HUDs
}
}
Working with Bukkit Event Triggers
import kr.toxicity.hud.api.bukkit.trigger.HudBukkitEventTrigger;
import org.bukkit.event.Event;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.plugin.Plugin;
public class BukkitTriggerExample {
public void setupTrigger(Plugin plugin) {
// Create a trigger for player movement
HudBukkitEventTrigger<PlayerMoveEvent> moveTrigger =
new HudBukkitEventTrigger<>(plugin, PlayerMoveEvent.class);
// The trigger will automatically listen to the event
// and forward it to registered popup/HUD handlers
}
}
import kr.toxicity.hud.api.popup.Popup;
import kr.toxicity.hud.api.popup.PopupUpdater;
import kr.toxicity.hud.api.update.UpdateEvent;
import kr.toxicity.hud.api.player.HudPlayer;
import org.bukkit.entity.Player;
public void showPopupWithEvent(Player bukkitPlayer, Popup popup, UpdateEvent event) {
HudPlayer hudPlayer = BetterHud.inst().getBootstrap().player(bukkitPlayer.getUniqueId());
if (hudPlayer == null) return;
// Show popup with the update event context
PopupUpdater updater = popup.show(event, hudPlayer);
if (updater != null) {
bukkitPlayer.sendMessage("Popup triggered by: " + event.getType());
}
}
Creating a Damage Trigger
import kr.toxicity.hud.api.trigger.HudTrigger;
import kr.toxicity.hud.api.update.UpdateEvent;
import kr.toxicity.hud.api.update.UpdateReason;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageEvent;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
import java.util.function.BiConsumer;
public class DamageTrigger implements HudTrigger<EntityDamageEvent> {
private BiConsumer<UUID, UpdateEvent> handler;
@Override
public @NotNull Object getKey(EntityDamageEvent event) {
// Generate unique key for each damage event
return UUID.randomUUID();
}
@Override
public void registerEvent(@NotNull BiConsumer<UUID, UpdateEvent> eventConsumer) {
this.handler = eventConsumer;
}
public void onDamage(EntityDamageEvent event) {
if (!(event.getEntity() instanceof Player player)) return;
if (handler == null) return;
// Create update event
UpdateEvent updateEvent = new UpdateEvent() {
@Override
public @NotNull UpdateReason getType() {
return UpdateReason.EMPTY; // Or create custom reason
}
@Override
public @NotNull Object getKey() {
return getKey(event);
}
};
// Trigger the handler
handler.accept(player.getUniqueId(), updateEvent);
}
}
Trigger with Custom Variables
import kr.toxicity.hud.api.BetterHud;
import kr.toxicity.hud.api.player.HudPlayer;
import kr.toxicity.hud.api.popup.Popup;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLevelChangeEvent;
public class LevelUpTrigger implements Listener {
@EventHandler
public void onLevelUp(PlayerLevelChangeEvent event) {
Player player = event.getPlayer();
HudPlayer hudPlayer = BetterHud.inst().getBootstrap().player(player.getUniqueId());
if (hudPlayer == null) return;
// Set variables for the popup
hudPlayer.getVariableMap().put("old_level", String.valueOf(event.getOldLevel()));
hudPlayer.getVariableMap().put("new_level", String.valueOf(event.getNewLevel()));
// Get and show the level up popup
Popup levelPopup = BetterHud.inst().getPopupManager().getPopup("level_up");
if (levelPopup != null) {
levelPopup.show(UpdateEvent.EMPTY, hudPlayer);
}
}
}
Conditional Trigger System
import kr.toxicity.hud.api.trigger.HudTrigger;
import kr.toxicity.hud.api.update.UpdateEvent;
import org.bukkit.event.Event;
import java.util.UUID;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
public class ConditionalTrigger<T extends Event> implements HudTrigger<T> {
private final Predicate<T> condition;
private BiConsumer<UUID, UpdateEvent> handler;
public ConditionalTrigger(Predicate<T> condition) {
this.condition = condition;
}
@Override
public Object getKey(T event) {
return UUID.randomUUID();
}
@Override
public void registerEvent(BiConsumer<UUID, UpdateEvent> eventConsumer) {
this.handler = eventConsumer;
}
public void handleEvent(T event, UUID playerUuid, UpdateEvent updateEvent) {
// Only trigger if condition is met
if (condition.test(event) && handler != null) {
handler.accept(playerUuid, updateEvent);
}
}
}
// Usage:
// ConditionalTrigger<PlayerMoveEvent> trigger = new ConditionalTrigger<>(
// event -> event.getTo().getY() < 0 // Trigger when player falls below Y=0
// );
Multi-Event Trigger
import kr.toxicity.hud.api.popup.Popup;
import kr.toxicity.hud.api.player.HudPlayer;
import kr.toxicity.hud.api.BetterHud;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class MultiEventTrigger implements Listener {
private final String popupName;
public MultiEventTrigger(String popupName) {
this.popupName = popupName;
}
@EventHandler
public void onJoin(PlayerJoinEvent event) {
showPopup(event.getPlayer(), "join");
}
@EventHandler
public void onQuit(PlayerQuitEvent event) {
showPopup(event.getPlayer(), "quit");
}
private void showPopup(Player player, String eventType) {
HudPlayer hudPlayer = BetterHud.inst().getBootstrap().player(player.getUniqueId());
if (hudPlayer == null) return;
// Set event type variable
hudPlayer.getVariableMap().put("event_type", eventType);
Popup popup = BetterHud.inst().getPopupManager().getPopup(popupName);
if (popup != null) {
popup.show(UpdateEvent.EMPTY, hudPlayer);
}
}
}
- Popup API - Triggers are commonly used to show popups
- Placeholders - Use with triggers to display dynamic data
- Events - Bukkit event integration
See Also
- HudTrigger interface:
kr.toxicity.hud.api.trigger.HudTrigger
- UpdateEvent interface:
kr.toxicity.hud.api.update.UpdateEvent
- HudBukkitEventTrigger:
kr.toxicity.hud.api.bukkit.trigger.HudBukkitEventTrigger
- UpdateReason enum:
kr.toxicity.hud.api.update.UpdateReason