Events & services
The synchronous EventBus, lifecycle/payment events, and Bukkit services.
EventBus
Bridge.bridge().eventBus() is a synchronous, typed utility bus. Listeners
register for an event class and receive events in priority order. Subscriptions
can be removed explicitly; the plugin also releases all bridge-owned
subscriptions when it disables.
var bus = Bridge.bridge().eventBus();
var subscription =
bus.subscribe(JobLevelEvent.class, event -> {
// event.getPlayerId(), event.getJob(), event.getNewLevel()
});
bus.post(new JobLevelEvent(/* constructor arguments */));
subscription.unsubscribe();Use postAsync(event) only for events whose listeners are safe to run away
from the Bukkit thread. Bukkit wrapper events are still fired synchronously
at the Paper boundary.
Lifecycle events
| Event | Payload | Mutable? |
|---|---|---|
JobJoinEvent | getPlayerId(), getJob(), getPlayerJobState(), isRejoin() | no |
JobLeaveEvent | getPlayerId(), getJob(), getPlayerJobState() | no |
JobLevelEvent | getPlayerId(), getJob(), getPlayerJobState(), getOldLevel(), getNewLevel(), getReason() (EXPERIENCE / ADMIN_COMMAND / OTHER) | no |
Experience & payment events
| Event | Payload | Mutable? |
|---|---|---|
JobExperienceGainEvent | getPlayerId(), getJob(), getPlayerJobState(), getExperienceGained() / setExperienceGained(...) | yes — veto or alter the gain |
JobsPrePaymentEvent | getPlayerId(), getJob(), getJobTask(), getPayable() | yes — pre-payment veto hook |
JobsPaymentEvent | getPlayerId(), getBase() | yes — delivered-payment notification |
All three implement Cancellable (isCancelled() / setCancelled(boolean)).
The XP and pre-payment hooks are the main behavioral integration points.
Bukkit services
The plugin registers Bukkit services available to dependent plugins:
| Service | Registered | Notes |
|---|---|---|
ProfessionService | always | Core catalog/player-state facade |
RecipeService | profession-apis.register-bukkit-services: true | Learned recipes (knows, learn, recipes) |
BuffService | same flag | Food/combat consumable buffs (BuffSlot.FOOD/COMBAT) |
StationService | same flag | Station-level crafting/gathering gates |
NodeHarvestService | same flag | Resource-node harvest integration |
var svc = Bukkit.getServicesManager().load(ProfessionService.class);ProfessionService: tracks(), resolve(String), level(UUID, String),
experience(UUID, String), and ensureTrack(UUID, String).
Service facade (api)
The Bridge also exposes the plain interfaces integrators use directly:
| Interface | Purpose |
|---|---|
JobService | Complete job trees, node-inherited tasks, player states, and join/leave operations |
PreferencesService | Player page-size preference (getPageSize / setPageSize) |
ExploitProtectionStore | Protections tracked per object (timers) |
TimedBoostDataService | Sealed Target (GlobalTarget / PlayerTarget) + ActiveBoostData find/add/remove |