Skip to main content

🏆 Event Milestones API

EventForge v1.0.2 added public API support for event milestones.

Milestones are configured in event files and trigger when a player crosses a score threshold.


Useful classes

EventMilestoneInfo
EventForgePlayerMilestoneEvent

Reading milestones from an event

Use EventService#getEventInfo(...).

EventForgeAPI.getEventService()
.getEventInfo("mining_rush")
.ifPresent(eventInfo -> {
for (EventMilestoneInfo milestone : eventInfo.getMilestones()) {
String id = milestone.getId();
String displayName = milestone.getDisplayName();
int threshold = milestone.getThreshold();
boolean oncePerPlayer = milestone.isOncePerPlayer();
}
});

EventMilestoneInfo

EventMilestoneInfo contains public milestone data.

Useful methods:

milestone.getId();
milestone.getDisplayName();
milestone.getThreshold();
milestone.isOncePerPlayer();
milestone.getActions();
milestone.hasActions();

Checking if an event has milestones

EventForgeAPI.getEventService()
.getEventInfo("mining_rush")
.ifPresent(eventInfo -> {
if (eventInfo.hasMilestones()) {
// Event has configured milestones.
}
});

Listening for milestones

Use EventForgePlayerMilestoneEvent.

@EventHandler
public void onMilestone(EventForgePlayerMilestoneEvent event) {
Player player = event.getPlayer();

String eventId = event.getEventId();
String milestoneId = event.getMilestone().getId();
String milestoneName = event.getMilestone().getDisplayName();

player.sendMessage("Milestone reached: " + milestoneName);
}

Score information

The milestone event includes score information.

int oldScore = event.getOldScore();
int newScore = event.getNewScore();
int scoreChange = event.getScoreChange();

This is useful if your addon wants to react differently depending on how many points the player gained.


Cancelling milestone actions

EventForgePlayerMilestoneEvent is cancellable.

If you cancel it:

the milestone actions will not run
the milestone is not marked as triggered for that player

Example:

@EventHandler
public void onMilestone(EventForgePlayerMilestoneEvent event) {
if (event.getMilestone().getThreshold() >= 1000) {
event.setCancelled(true);
}
}

Only cancel milestone events when your addon has a clear reason to block the normal behaviour.


Running custom logic

Milestone events are useful for addon systems such as:

quest progress
battle pass progress
Discord logging
custom rewards
server analytics
NPC dialogue progression
external integrations

Example:

@EventHandler
public void onMilestone(EventForgePlayerMilestoneEvent event) {
if (!event.getEventId().equalsIgnoreCase("mining_rush")) {
return;
}

if (event.getMilestone().getThreshold() == 50) {
event.getPlayer().sendMessage("Your addon noticed the 50 point milestone.");
}
}

Milestone actions

Milestones can contain normal EventForge actions.

List<EventAction> actions = event.getMilestone().getActions();

Usually you do not need to execute these yourself. EventForge runs them automatically unless the milestone event is cancelled.


Related API

EventForgeAPI.getEventService();
EventForgeAPI.getActionService();
EventForgeAPI.getVariableService();
EventForgeAPI.getTextEffectService();

Summary

Use milestone API when your addon needs to:

read configured milestone thresholds
listen for milestone progress
cancel milestone actions
run addon-specific milestone logic

For most addons, listening to EventForgePlayerMilestoneEvent is enough.