Tags
Creators
Details
0.3.0
Compatibility
Changes
v0.3.0 — Multi-Server Stats (Supabase & Firebase)
Date: April 2026 Minecraft: Paper 1.21.1+ Java: 21
Major Feature: Remote Stats Backends
EpicDuels can now sync player statistics across multiple servers using Supabase (PostgreSQL) or Firebase Realtime Database. Configure the backend in config.yml:
stats:
backend: "supabase" # or "firebase" or "local" (default)
Supabase Setup
- Create a
player_statstable in your Supabase SQL editor:CREATE TABLE IF NOT EXISTS player_stats ( uuid TEXT PRIMARY KEY, wins INTEGER NOT NULL DEFAULT 0, losses INTEGER NOT NULL DEFAULT 0 ); - Fill in
config.yml:stats: backend: "supabase" supabase: url: "https://your-project.supabase.co" api-key: "your-anon-key" table: "player_stats"
Firebase Setup
- Create a Firebase project and enable Realtime Database.
- Fill in
config.yml:stats: backend: "firebase" firebase: database-url: "https://your-project-default-rtdb.firebaseio.com" auth-token: "" # optional database secret
How It Works
- Local cache is always active —
stats.ymlremains the primary cache. The plugin works normally even when the remote is unreachable. - Async sync — All remote reads/writes happen asynchronously and never block the main server thread.
- Merge on fetch — When a player's stats are loaded from remote, the higher value for wins and losses is kept (local vs. remote), so no data is lost if two servers wrote different values.
- Push on change — Every win/loss is pushed to the remote immediately after updating the local cache.
- Push on shutdown — All cached stats are pushed to the remote during
onDisableto ensure nothing is lost.
Architecture
StatsProvider (interface)
├── SupabaseProvider — PostgREST upsert via java.net.http
└── FirebaseProvider — Realtime Database REST via java.net.http
No external libraries required — uses Java 21's built-in HttpClient.
Other (included from v0.2.3)
- Redesigned 27-slot main menu with Duels / Stats / Matchmaking sub-menus
- Pagination for all list GUIs (28 items per page)
- Dedicated Stats menu
/duel spectate <player>command- Configurable lobby PvP protection
- Duel item cleanup on rejoin
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:o53wtqgv:EVIfbZEp"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:o53wtqgv:EVIfbZEp"
}

