🏆 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.