Sector Practice — 1.21.x+ Practice/Duels Plugin with Ranked/Unranked modes

Aethel

Feedback score
0
Posts
2
Reactions
0
Resources
0
A complete, self-built 1v1 practice plugin for competitive Minecraft PvP servers — kits, ranks, tags, ranked/unranked queues, parties, Elo + tiers, WorldEdit/FAWE-powered arena generation, staff tools, punishments, reports and private messaging, all in one jar.


⚠️ Sale terms: This build is sold for private use on a single server only. Several values (database driver, one gamemode/arena roster setup, message strings) are tuned to my own setup rather than fully generalized. If there's no interest in someone buying it for only their use, I'll follow up with a de-hardcoded, config-driven version sold as a general-use jar for multiple servers/buyers.



Overview​

Sector Practice is a from-scratch 1v1 duel/practice plugin built for Paper 1.21.x +, written entirely in Java with no leaked/decompiled base — every manager, command, and GUI is custom. It covers the full loop of a practice server: join the lobby → pick a kit → queue ranked or unranked → get auto-matched into a freshly generated arena → fight → Elo & stats update → back to lobby. On top of that it ships a full staff suite (punishments, reports, staff mode) and social features (parties, tags, private messages).


1783892076850.png

Spawn world is from a free resource on this forum you can find it free or use any other that you like without any problems.



Core Gameplay Systems​

🗡️ Kits & Gamemodes​

  • 12 built-in gamemodes: SUMO, SWORD, AXE, POTION, NETHERITEPOT, MACE, SPEAR, UHC, SMP, DIAMONDSMP, CART, CRYSTAL, MANHUNT
  • Kits are captured directly from a player's inventory (/kit save <mode>) — armor and contents are serialized separately and persisted to kits.yml on disk
  • In-game Kit Editor GUI to browse, edit, and delete kits without touching config files
  • /kit <save|edit|list|delete> command with full kit lifecycle management

1783892148146.png



🏟️ Arena Generation (WorldEdit / FastAsyncWorldEdit)​

  • Arenas are pasted live from .schem schematics using FAWE, into a dedicated void arenas world
  • Roster system: each gamemode is mapped to a named "roster" (a pool of one or more maps); a random map from the roster is chosen every time a new arena is generated for a match — adding a new map to rotation is just adding a line to config.yml, no code changes needed
  • Per-map configurable spawn offsets, auto-calculated facing (players automatically look at their opponent's spawn at match start, with optional manual yaw/pitch override), and configurable arena spacing so concurrent matches never overlap
  • Sumo maps support a per-map kill-Y-offset — fall below the platform's Y level and you instantly lose the match (handled via GameModeRulesListener)
  • Arenas are cleanly torn down after every match (async chunk loading + configurable ready-delay to avoid the "black screen" relighting flicker on teleport)

1783892387205.png


1783892249019.png

Example of sumo map which is also free downloaded from community you can also use any and as many maps for sumo roaster
There is also roaster of maps for other game modes since Sumo needs special map because of gameplay type

⚔️ Matches & Elo​

  • MatchManager runs the full match lifecycle: STARTING → PLAYING → ENDING, with a configurable countdown before kits are handed out and PvP unlocks
  • Live per-match kill tracking, duration tracking, and an Elo snapshot taken at match start (so mid-match Elo changes elsewhere never affect that match's calculation)
  • Configurable Elo K-factor for ranked matches
  • 5-tier ranking ladder driven entirely by Elo thresholds, fully re-tunable from config.yml with zero code changes:

TierMin Elo
Bronze0
Silver1000
Gold1150
Diamond1300
Prestige1500

1783892337782.png


1783892355334.png

1783892365753.png

🎯 Queueing​

  • Separate ranked and unranked queue pools, split per-kit
  • Dynamic Elo matching range: the longer you wait in a ranked queue, the wider the acceptable Elo gap becomes (tight match early, any opponent after ~30s), so ranked queues stay competitive without leaving players waiting forever
  • Queue state is fully synced with player state (lobby / queue / fight) and the scoreboard updates live

1783892435759.png
1783892447956.png
1783892467475.png



👥 Parties​

  • Full party system: create, invite (with automatic 60s invite expiry), accept/deny, join, leave, disband, and leadership transfer
  • Configurable max party size, open/closed join toggle, and party state tracking (idle / queued / in-match) so party-vs-party queueing logic always knows what state the group is in
  • Dedicated Party Menu and Party Invite Menu GUIs

1783892490595.png
1783892510914.png
1783892525090.png
1783892539394.png





Progression & Identity​

🏆 Ranks​

7-tier staff/donor rank ladder (Member → VIP → MVP → ACE → Moderator → Admin → Owner), each with its own MiniMessage-formatted chat prefix and permission node set (including wildcard .* support). Fully settable in-game via /rank set <player> <rank>.


🏷️ Tags​

12 built-in cosmetic tags (Cheater, God, Crucifix, Bot, One Tap, Ghost, Tryhard, GOAT, Sus, Skill Issue, Down Bad, W Key) that players unlock and equip through a dedicated Tags Menu. Staff can grant/revoke access to individual tags per player, list who has what, and force-set a player's active tag — with automatic cleanup (a revoked tag is instantly unequipped if it was active).


1783892574865.png



📊 Stats​

Per-player win count, kill count, death count, match count, and a live-calculated K/D ratio, all viewable through a Stats Menu and backed by the same profile row used for rank/tier/tag data.


1783892603949.png





Moderation & Staff Tools​


🛡️ Staff Mode​

/staff toggles a dedicated staff mode (vanish-aware via StaffData) for moderating without disrupting the live server population.


🔨 Punishment System​

A full punishment suite backed by its own database table, entirely separate from match/profile data:
  • Kick, Mute/Unmute, Ban/Unban, Blacklist/Unblacklist — each with its own color, icon, and past-tense verb baked into PunishmentType for consistent, auto-generated broadcast/staff messages
  • Mutes and bans support a duration (parsed via a custom DurationUtils) or permanent application; blacklist is a harsher, permanent-only variant
  • Every punishment records issuing staff (or console), reason, issued timestamp, and expiry — active state (mute/ban/blacklist) is tracked separately from the historical log, so lookups for "is this player currently muted" are O(1) against active rows, not a full history scan
  • /mute, /unmute, /ban, /unban, /blacklist, /unblacklist, /kick, each with reason (and duration where relevant) arguments

1783892645855.png
1783892656718.png
1783892687553.png



🚩 Reports​

Players can report opponents mid-match or in lobby via /report <player>, choosing from 7 fixed report reasons in a dedicated GUI (Hacking/Cheating, Teaming, Spamming, Harassment/Toxicity, Inappropriate Name/Skin, Bug Abuse/Exploiting, Other) — each with its own icon, color, and description shown on hover. Reports are pushed to online staff in real time.


1783892725219.png



💬 Messaging​

Private messaging between players via /msg (aliases: m, tell, w, whisper) and /r//reply to respond to the last sender — fully mute-aware, so a muted player can't route around chat restrictions through DMs.




UI / UX Polish​

  • Custom scoreboard (FastBoard-backed) that live-renders per player state — different board for lobby, queue (with live queue timer), and in-match (opponent, kit, Elo, kill count)
  • Custom boss bar system for match countdowns and status messages
  • Custom tab list (TabManager) with formatted headers/footers and rank-aware name formatting
  • MiniMessage formatting throughout (rank prefixes, tier prefixes, tag prefixes, punishment messages) — modern hex/gradient color support out of the box
  • PacketEvents integration for packet-level features/anti-exploit groundwork
  • Physical lobby items (queue join items, leave-queue items) that swap automatically based on player state
  • Every GUI (Kit Editor, Party, Party Invite, Tags, Stats, Report, Ranked, Unranked, Players list) is built on a shared GuiHolder/GuiListener framework, so clicks are routed cleanly and new menus are cheap to add

1783892756941.png
1783892772316.png
1783892782112.png





Data & Persistence​


SystemStorage
Player profiles (Elo, tier, rank, tag, stats)PostgreSQL / Supabase (via HikariCP connection pool)
Punishment history + active punishmentsPostgreSQL / Supabase, dedicated table
Kitskits.yml (serialized ItemStacks, disk-based)
Arenas / maps.schem schematics loaded from plugins/SectorPractice/schematics/, configured through config.yml
Parties, queues, active matches, reportsIn-memory, live server state (session-scoped by design)

Database credentials are not hardcoded — they're pulled from config.yml (database.url / database.user / database.password) on boot, and the plugin refuses to enable if they're left blank, so nobody accidentally ships live credentials inside the jar.


YAML:
database:
  url: ""
  user: ""
  password: ""

arena:
  rosters:
    sumo:
      maps:
        - schematic: "jungle.schem"
          spawn1-offset: "-5,0,2"
          spawn2-offset: "5,0,12"
          kill-y-offset: -1
          # Primjer rucnog override-a (obicno nepotrebno, auto-facing vec gleda u protivnika):
          # spawn1-yaw: 180.0
          # spawn1-pitch: 0.0
          # spawn2-yaw: 0.0
          # spawn2-pitch: 0.0
        - schematic: "olympic.schem"
          spawn1-offset: "21,11,21"
          spawn2-offset: "29,11,29"
          kill-y-offset: 10
    default:
      maps:
        - schematic: "arena.schem"
          spawn1-offset: "80,3,85"
          spawn2-offset: "110,3,115"
  gamemode-rosters:
    SUMO: "sumo"

match:
  elo-k-factor: 32




Full Command List​


CommandDescriptionAliases
/kit <save|edit|list|delete>Kit management
/staffToggle staff mode
/rank <set|get> <player> [rank]View/set a player's rank
/tag <set|get|grant|revoke|list> <player> [tag]View/manage a player's tag
/tagsBrowse & equip available tags
/tier <set|get> <player> [tier]View/set a player's tier
/elo <set|get> <player> [elo]View/set a player's Elo
/kick <player> <reason>Kick a player
/mute <player> <duration> <reason>Mute a player
/unmute <player> [reason]Lift a mute
/ban <player> <duration> <reason>Ban a player
/unban <player> [reason]Lift a ban
/blacklist <player> <reason>Permanently blacklist a player
/unblacklist <player> [reason]Lift a blacklist
/report <player>Report a player to online staff
/msg <player> <message>Private messagem, tell, w, whisper
/r <message>Reply to last DMreply



Technical Details​


  • Platform: Paper 1.21.x (api-version: 1.21.11)
  • Language: Java, built with Maven (shaded jar)
  • Hard dependency: PacketEvents
  • Soft dependency: FastAsyncWorldEdit (arena pasting; falls back to WorldEdit)
  • Database: PostgreSQL (tested against Supabase) via HikariCP pooling
  • Libraries: Lombok, FastBoard (Adventure), Kyori Adventure/MiniMessage
  • 100% original codebase — custom managers, listeners, GUI framework, and data models, no cracked/leaked base

1783892899582.png





What You're Buying (Private / Single-Server License)​


  • The compiled plugin jar, ready to drop into a Paper 1.21.x server
  • Config files (config.yml — arena rosters, database connection, arena timing/spacing)
  • Setup support to get schematics, roster mapping, and database connected on your one licensed server
  • Not included in this tier: multi-server/reseller rights — Only for your use on your server

Requirements Before Buying​

  • A Paper 1.21.x+ server
  • PacketEvents installed
  • A PostgreSQL/Supabase database you control (credentials go in config.yml, never shared or included)
  • FastAsyncWorldEdit installed (recommended) and .schem files ready for your arena maps



Interested / have questions about features, setup, or any questions in general? Drop a comment or DM me.
 
Type
Offering
Provided by
Individual

Attachments

  • 1783892710100.png
    1783892710100.png
    58 KB · Views: 0
Top