⏰ ScheduleService
ScheduleService lets addons read EventForge schedule information.
Use it for:
scoreboards
custom GUIs
Discord bots
admin dashboards
NPC menus
PlaceholderAPI-style integrations
event browser menus
Getting the service
ScheduleService scheduleService = EventForgeAPI.getScheduleService();
Always check the API is available first:
if (!EventForgeAPI.isAvailable()) {
return;
}
Scheduled event count
int count = scheduleService.getScheduledEventCount();
Example:
getLogger().info("Scheduled events: " + scheduleService.getScheduledEventCount());
Scheduled event IDs
Set<String> ids = scheduleService.getScheduledEventIds();
Example:
for (String eventId : scheduleService.getScheduledEventIds()) {
getLogger().info("Scheduled: " + eventId);
}
Scheduled events
Set<ScheduledEventInfo> scheduledEvents = scheduleService.getScheduledEvents();
Example:
for (ScheduledEventInfo schedule : scheduleService.getScheduledEvents()) {
String eventId = schedule.getEventId();
long seconds = schedule.getSecondsUntilNextStart();
getLogger().info(eventId + " starts in " + seconds + " seconds.");
}
Get a specific schedule
Optional<ScheduledEventInfo> schedule = scheduleService.getScheduledEvent("mining_rush");
Example:
scheduleService.getScheduledEvent("mining_rush").ifPresent(schedule -> {
long seconds = schedule.getSecondsUntilNextStart();
getLogger().info("Mining Rush starts in " + seconds + " seconds.");
});
Check if an event is scheduled
boolean scheduled = scheduleService.isScheduled("mining_rush");
Next scheduled event
Optional<ScheduledEventInfo> next = scheduleService.getNextScheduledEvent();
Example:
scheduleService.getNextScheduledEvent().ifPresent(next -> {
String eventId = next.getEventId();
long seconds = next.getSecondsUntilNextStart();
Bukkit.broadcastMessage("Next event: " + eventId + " in " + seconds + " seconds.");
});
Upcoming events
v1.0.1 added getUpcomingEvents(int limit).
List<ScheduledEventInfo> upcoming = scheduleService.getUpcomingEvents(5);
This returns upcoming scheduled events ordered by next start time.
Example:
List<ScheduledEventInfo> upcoming = scheduleService.getUpcomingEvents(3);
for (ScheduledEventInfo schedule : upcoming) {
getLogger().info(schedule.getEventId()
+ " starts in "
+ schedule.getSecondsUntilNextStart()
+ " seconds.");
}
Use this for:
upcoming event menus
Discord /events commands
scoreboard rotations
NPC event boards
web dashboards
Next start time
Get the next start epoch second:
long epochSecond = scheduleService
.getNextStartEpochSecond("mining_rush")
.orElse(0L);
Get seconds until next start:
long seconds = scheduleService
.getSecondsUntilNextStart("mining_rush")
.orElse(0L);
ScheduledEventInfo
ScheduledEventInfo contains public schedule information.
Common methods include:
getEventId();
getScheduleType();
getEverySeconds();
getNextStartEpochSecond();
getSecondsUntilNextStart();
Example:
scheduleService.getScheduledEvent("mining_rush").ifPresent(schedule -> {
String eventId = schedule.getEventId();
String type = schedule.getScheduleType();
long every = schedule.getEverySeconds();
long nextStart = schedule.getNextStartEpochSecond();
long secondsUntil = schedule.getSecondsUntilNextStart();
});
Example: simple upcoming event command
public void sendUpcoming(CommandSender sender) {
List<ScheduledEventInfo> upcoming = EventForgeAPI
.getScheduleService()
.getUpcomingEvents(5);
if (upcoming.isEmpty()) {
sender.sendMessage("No upcoming events.");
return;
}
sender.sendMessage("Upcoming events:");
for (ScheduledEventInfo schedule : upcoming) {
sender.sendMessage("- "
+ schedule.getEventId()
+ " in "
+ schedule.getSecondsUntilNextStart()
+ " seconds");
}
}
Example: next event scoreboard line
String nextLine = EventForgeAPI.getScheduleService()
.getNextScheduledEvent()
.map(schedule -> schedule.getEventId()
+ " in "
+ schedule.getSecondsUntilNextStart()
+ "s")
.orElse("No events scheduled");
Cooldowns and schedules
Schedules respect event cooldowns.
This means a scheduled event may not start if it is currently on cooldown.
To check cooldown state, use EventService:
EventService eventService = EventForgeAPI.getEventService();
boolean onCooldown = eventService.isEventOnCooldown("relic_hunt");
long remaining = eventService
.getEventCooldownRemainingSeconds("relic_hunt")
.orElse(0L);
Common mistakes
Assuming scheduled means startable
An event can be scheduled but still unable to start because of:
cooldown
minimum players
world conditions
time conditions
weather conditions
already active
Use EventService#getStartCheckResult(eventId) when you need to show whether it can actually start.
Showing only one upcoming event
For richer menus, use:
getUpcomingEvents(5);
instead of only:
getNextScheduledEvent();
Ignoring empty optionals
Many schedule methods return Optional.
Always handle the empty case:
long seconds = scheduleService
.getSecondsUntilNextStart("mining_rush")
.orElse(0L);