Tags
Creators
Details
2.0.0
Compatibility
Changes
v2.0.0 — Party System, Lobby Hardening & Stability
Date: May 2026 Minecraft: Paper 1.21.1+ Java: 21
Major Feature — Party System
EpicDuels now supports group play through a full party system. Create a
party with /party create, invite friends with /party invite <player>, and
launch a game with /party start. The party owner selects a kit once at the
start; the arena is picked randomly per match. Supports 2–8 players.
Mode 1 — Team Duel (2v2 / 3v3 / 4v4)
- Teams are shuffled randomly at match start.
- All teammates spawn at the same arena spawn point with small circular offsets so nobody overlaps.
- Friendly fire is disabled — team members cannot damage each other.
- Eliminated players automatically spectate the ongoing battle until their team is wiped.
- The last team with a surviving member wins.
Mode 2 — Single-Elimination Tournament
- All party members compete in 1v1 bracket matches using the existing duel system.
- Byes are inserted automatically for party sizes that are not a power of 2.
- Eliminated players are auto-routed to spectate a random live tournament match so nobody is left waiting in the lobby. When their spectated match ends they are re-routed to another live match if one is still running.
- The final winner is announced only to party members — no server-wide broadcast.
Party Commands
| Command | Alias | Description | Permission |
|---|---|---|---|
/party create |
/p create |
Create a party | epicduels.party |
/party invite <player> |
/p invite <player> |
Invite a player | epicduels.party |
/party accept [player] |
/p accept |
Accept an invite | epicduels.party |
/party deny [player] |
/p deny |
Deny an invite | epicduels.party |
/party leave |
/p leave |
Leave your party | epicduels.party |
/party disband |
/p disband |
Disband (owner only) | epicduels.party |
/party list |
/p list |
Show members | epicduels.party |
/party start |
/p start |
Open mode-select GUI (owner only) | epicduels.party |
New Permission
| Permission | Description | Default |
|---|---|---|
epicduels.party |
Use all party commands | Everyone |
New Files
| File | Purpose |
|---|---|
Party.java / PartyInvite.java / PartyMode.java / TeamSize.java |
Party model layer |
TeamDuelInstance.java / Tournament.java / BattleInstance.java |
Match model layer |
PartyManager.java |
Invite, party lifecycle, member management |
TeamDuelManager.java |
Team composition, arena spawn offsets, friendly fire, winner detection |
TournamentManager.java |
Bracket generation, match scheduling, spectator routing |
FriendlyFireListener.java |
Cancels damage between teammates during team duels |
PartyCommand.java / PartyTabCompleter.java |
Command handling |
Major Change — Adventure Mode in Lobby
All players now join and stay in Adventure mode inside the lobby world. This prevents them from breaking or placing blocks — which is especially important for servers running external plugins like ImageFrame whose maps/images would otherwise be destroyed by any player in Survival/Creative.
- Players are set to
ADVENTUREon join and on return from a duel. - Spectators are also returned to
ADVENTUREwhen they stop spectating. - Admins with
epicduels.adminare unaffected — see "Per-Admin Bypass" below.
Major Feature — Item Frame & Armor Stand Protection
A new PlayerInteractEntityEvent handler prevents non-admin players from
interacting with item frames and armor stands in the lobby, closing the last
bypass that Adventure mode alone did not cover (right-clicking an item frame
still works in Adventure mode without a tool).
Major Feature — Per-Admin Lobby Bypass
Admins can now switch their own lobby protections off temporarily for building without touching the global config or affecting other players.
| Command | Description |
|---|---|
/duel lobby off |
Puts you in Creative mode and suspends all lobby protections for your session |
/duel lobby on |
Restores your Adventure mode and re-enables all lobby protections for you |
The bypass is per-player — every other player keeps full protections while an admin is in build mode.
Bug Fixes
Memory Leaks
-
BukkitTask references —
DuelManager's request-expiration repeating task andQueueManager's matchmaking loop both lacked storedBukkitTaskreferences. On plugin reload, these tasks kept running in the background, slowly eating RAM. Both now store theirBukkitTaskand cancel it oncleanupAll()/cleanup(). -
Leftover instance worlds — Arena instance worlds (
arena_instance_*) left behind by a previous crash or hard shutdown were never cleaned up. The plugin now scans for and deletes them on the first server tick after startup. -
Ghost queue entries — Players who disconnected while in the matchmaking queue were previously skipped on the action-bar update but kept in the queue maps indefinitely. They are now removed immediately when the next tick detects they are offline.
Supabase Sync
- The plugin now runs a connection test on startup so misconfiguration (wrong URL or key) is caught immediately rather than silently failing on the first win.
- PostgREST returns HTTP 204 No Content on a successful upsert; this was previously treated as an error and the push was silently dropped. Now accepted.
- HTTP 401 / 403 responses print an actionable hint:
"Check your Row-Level Security policy in the Supabase dashboard". StatsManager.pushAllToRemote()duringonDisablenow properly awaits all async futures (up to 15 s) so no stats are lost on shutdown.
Performance Improvements — Hologram Efficiency Rewrite
The HologramManager was re-written to eliminate the biggest source of entity
churn on leaderboard servers:
| Metric | Before | After |
|---|---|---|
| Update strategy | Delete all ArmorStands, re-spawn | Update text in-place |
| Refresh interval | 200 ticks (10 s) | 1 200 ticks (60 s) |
| Orphan scan scope | All loaded worlds | Hologram worlds only |
| Player name lookups | Bukkit.getOfflinePlayer() per line every tick |
Cached per refresh cycle |
| Line spacing | 0.28 blocks (causes overlap at small fonts) | 0.30 blocks |
The old approach spawned and killed 20 ArmorStand entities every 10 seconds per hologram. On a server with two holograms this meant 240 entity-create/destroy operations per minute — causing noticeable lag spikes. The new approach touches only existing entities' metadata.
Upgrade Notes
- Replace
EpicDuels-1.0.0.jarwithEpicDuels-2.0.0.jar. All existing config, arenas, kits, stats, and.ymlfiles remain fully compatible. - No config changes are required — new features work out of the box.
- The new
epicduels.partypermission defaults totrue(all players). If you want to restrict party creation, add it to your permissions plugin. - Admins who had custom lobby protections toggled off in
config.ymlshould review whether the per-player bypass (/duel lobby off) is a better fit.
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:rbuwx07J"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:o53wtqgv:rbuwx07J"
}

