EzSeasons is a standalone season reset scheduler for Minecraft servers.
It runs timed season resets, sends reminder broadcasts, and provides /season so players can check the time until the next reset.
This README is written for server owners first. API details are included near the end for plugin developers.
EzSeasons >= 2.0.0 is build for Minecraft 26.1 & Java 25 EzSeasons < 2.0.0 is build for Minecraft 1.8-26.1 & Java 17
- Download EzSeasons from Modrinth: https://modrinth.com/plugin/ezseasons
- Optional companion plugin: EzLifesteal
- Supported server software: Paper / Bukkit-compatible server
- Requires: Java 25, Minecraft 26.1+
- Plugin version: 2.1.2
- Stop your server.
- Put
EzSeasons-<version>.jarin yourplugins/folder. - (Optional) Install
EzLifestealif you want Lifesteal-specific behavior. - Start the server once to generate config files.
- Edit
plugins/EzSeasons/config.yml. - Restart the server.
- Schedules automatic season resets
- Supports either explicit
start/endwindows or duration-based scheduling (length-days) - Supports one-time or recurring explicit windows (
recurring) - Broadcasts a reset message when a reset occurs
- Sends reminder messages before reset (
reminder-minutes) - Provides
/season(and/season admin ...) for status and runtime admin controls
/season- Permissions accepted:
lifesteal.season,lifesteal.season.admin, orlifesteal.admin
- Permissions accepted:
/season admin <reload|reset [reason]|setnext <unixMillis>|clear-next|status>- Permission required:
lifesteal.season.adminorlifesteal.admin
- Permission required:
File: plugins/EzSeasons/config.yml
messages:
language: "en"
prefix: "&c[EzSeasons]&r "
season:
enabled: false
start: 0
end: 0
recurring: false
length-days: 30
check-interval-minutes: 60
broadcast-message: "&7A new season has begun! Hearts have been reset."
reminder-minutes: []
reminder-message: "&7The season will reset in &c%time%&7."
last-reset: 0
next-reset: 0- Set
season.enabled: trueto activate scheduling. season.startandseason.endare Unix epoch milliseconds.season.recurringapplies to valid explicitstart/endwindows.reminder-minutesdefines countdown offsets in minutes.- Language files are in
plugins/EzSeasons/messages/. messages.languagesupports:en,es,fr,zh,ru,nl.
- Documentation index
- Getting started
- Configuration reference
- Command reference
- Permissions reference
- API overview
- Security policy
- Plugin loads but nothing happens: ensure
season.enabledistrue. - No reminders: ensure
season.reminder-minutesis not empty. - Command says no permission: grant
lifesteal.seasonfor status, andlifesteal.season.admin(or legacylifesteal.admin) for admin subcommands. - Integration not active: verify the companion plugin registers against the
SeasonsApiBukkit service.
EzSeasons exposes a Bukkit service API (SeasonsApi) for integrations. The API artifact is pure Java — it has no Bukkit/Paper dependency, so it stays compatible regardless of server version.
Integrated plugins receive lifecycle callbacks (onRegister, onUnregister, onSeasonReset) via the SeasonsIntegration interface, and can also listen to Bukkit events (SeasonResetEvent, etc.) which are included in the plugin JAR.
You can consume the API artifact in two ways:
- GitHub Packages (official)
- JitPack (fallback)
<repositories>
<repository>
<id>github-ezseasons</id>
<url>https://maven.pkg.github.com/ez-plugins/EzSeasons</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.skyblockexp.lifesteal</groupId>
<artifactId>ezseasons-api</artifactId>
<version>2.1.2</version>
<scope>provided</scope>
</dependency>
</dependencies><repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.ez-plugins.EzSeasons</groupId>
<artifactId>ezseasons-api</artifactId>
<version>v2.1.2</version>
<scope>provided</scope>
</dependency>
</dependencies>RegisteredServiceProvider<SeasonsApi> registration =
Bukkit.getServicesManager().getRegistration(SeasonsApi.class);
if (registration != null) {
SeasonsApi api = registration.getProvider();
api.registerIntegration(new MyIntegration());
}