Compatibility
Minecraft: Java Edition
Platforms
Tags
Creators
Details
A GUI-first team plugin for Paper 1.21+. Built from scratch, no code borrowed from older team plugins.
It covers most of what I'd want from a team system on a survival or SMP server: teams with ranks, invites, team chat, a shared home, a bank, an actual shared enderchest, allies, stats, and a leaderboard. All data is UUID-based and saved the moment it changes, so nothing gets lost on restart.
Requirements: Paper 1.21 or newer (Purpur works too since it still runs the Paper API), Java 21. Not Folia compatible — the plugin uses the Bukkit scheduler and the plain Inventory API, and I didn't write a Folia variant. Sorry.

How the GUIs work
Most team plugins I looked at resolve menu clicks by checking the display name of the item you clicked. That stops working the moment somebody renames a button, or when the client and server inventory get out of sync. So I did it differently:
- Every open menu is tracked as a
GuiSession. - Clicks are resolved by session ID + slot number. The item name and lore on a button are only there for looks. They are never read to decide what the button does.
- Every click is checked against the player's permissions and their team role, every time. Not just when the menu opens.
- Shift-clicks, number-key swaps, and drags into menus are blocked, and empty slots do nothing. No duplication tricks, no ghost interactions.
There are 21 menus in total, driven by a small framework: GuiManager creates a GuiSession per player, each session owns GuiButton objects per slot, and the inventory uses a custom RGGuiHolder — the code never relies on inventory titles. The shared enderchest uses a separate holder (RGTeamStorageHolder) because it behaves like real storage instead of a menu.
The menus, for reference:
MAIN— hub menu; shows different options depending on whether you're in a teamCONFIRM_LEAVE,CONFIRM_DISBAND,CONFIRM_KICK,CONFIRM_TRANSFER— confirmation screens for destructive actionsMEMBERS— paginated member list, ordered by roleMEMBER_ACTIONS— promote/demote/kick/transfer for a single memberINVITES_RECEIVED,INVITES_OUTGOING— invites in both directionsONLINE_PLAYER_PICKER— pick an online player to inviteSETTINGS— friendly fire, open join, chat default, renameBANK— deposit/withdraw with preset amounts or custom inputTEAM_STORAGE— the shared enderchestHOME— teleport / set / deleteALLIES,ALLY_REQUESTS— alliance managementTEAM_BROWSER— two modes: browse teams, or pick one to ally withLEADERBOARD— top teams by weighted scoreTEAM_INFO— public info screen for any teamSTATS— kills / deaths / blocks / playtimeADMIN_INSPECT— admin-only control panel for a team
Features
- Teams — create, disband, join, leave, rename, transfer ownership. Names are checked against a regex in config.
- Roles —
OWNER→ADMIN→MEMBER. What each role may do is configurable. - Invites — expire after a set time, have cooldowns and caps per team/per player. Recipients get a clickable
[ACCEPT]/[DENY]in chat. - Open join — teams can toggle this so anyone can
/team join <name>without an invite. - Team chat — can be enabled server-wide, per player, or used one-off with
/team chat <message>. - Team home — teleport has a warmup and cooldown, cancels if you move or take damage. One home per team.
- Team bank — needs Vault + an economy plugin. Deposit/withdraw, role-gated withdrawals, and a per-transaction cap in config.
- Shared enderchest — this is a real inventory, not a menu styled like a chest. Items you put in are actually stored. Several members can have it open at once, it autosaves, and contents survive restarts (serialized with native Bukkit item serialization, so NBT and custom items survive too).
- Allies — ally requests work like invites with clickable prompts, allies don't damage each other, and there's a cap on allies per team.
- Stats & leaderboard — tracks kills, deaths, mob kills, blocks placed/broken, and aggregated playtime. The leaderboard score is a weighted sum you configure (bank, kills, deaths, blocks, playtime).
- Admin side — a GUI inspect tool plus the full command suite below. Every admin action gets appended to
plugins/RG_Team/admin-actions.logwith a timestamp, the actor's UUID, and details. - On startup the plugin prints a colored console banner showing version, team count, and whether Vault and PlaceholderAPI are hooked in. It's cosmetic but handy.
One design note: the GUI and the commands are not separate feature sets. Both call the same service layer, so a button click and its equivalent command go through identical validation. You can run the whole plugin from chat if you hate menus.
Installation
- Grab
RG_Team-1.0.2.jarfrom the releases page, or build it yourself (see below). - Put it in
plugins/. - Optional: install Vault plus an economy plugin if you want the team bank, and PlaceholderAPI if you want team placeholders.
- Start the server. Config files are generated in
plugins/RG_Team/on first run.
Building from source
JDK 21 and Maven 3.9+:
git clone <repo>
cd RG_Team
mvn -DskipTests package
The jar ends up at target/RG_Team-1.0.2.jar.
Commands
Base command is /team, with /rgteam as an alias.
General
/team— open the main GUI/team gui— same as above/team help— command help
Team lifecycle
/team create <name>— create a team (name validated against the regex in config)/team disband confirm— owner only; permanently deletes the team/team leave— leave your team (owners have to transfer first)/team rename <newName>— owner only; has a cooldown/team info [team]— info about your team, or another team if specified/team list [page]— team browser GUI/team join <team>— join a team that's open, or one that invited you
Invites
/team invite <player>— send an invite (the target sees[ACCEPT]/[DENY]in chat)/team accept <team>— accept a pending invite/team deny <team>— deny a pending invite/team invites— open the invites-received GUI
Members
/team members— members GUI/team kick <player>— remove a member (subject to role config)/team promote <player>— member to admin (owner only)/team demote <player>— admin to member (owner only)/team transfer <player>— give someone ownership; you become admin
Settings
/team settings— settings GUI/team ff— toggle friendly fire/team open//team close— toggle open join
Chat
/team chat— toggle team chat mode/team chat on|off— force it on or off/team chat <message>— send one message to the team
Home
/team home— teleport to the team home (warmup + cooldown apply)/team sethome— set the home to where you stand (owner/admin)/team delhome— remove the home (owner/admin)
Bank (needs Vault)
/team bank— bank GUI/team bank balance— print the balance/team bank deposit <amount|all>— put money in/team bank withdraw <amount|all>— take money out (role-gated)
Storage
/team enderchest(alias/team ec) — open the shared enderchest
Allies
/team ally— allies GUI/team ally add <team>— send an ally request (clickable prompt for the target)/team ally accept <team>— accept an incoming request/team ally deny <team>— deny an incoming request/team ally remove <team>— break an alliance
Leaderboard
/team leaderboard— scored top-teams GUI
Admin (needs rgteam.admin.*)
/team admin reload— reload config/team admin inspect <team>— admin inspect GUI for a team/team admin disband <team>— force-disband/team admin setowner <team> <player>— change owner without the current owner's consent/team admin forcejoin <player> <team>— force a player into a team/team admin forceremove <player>— take a player out of their team/team admin setbank <team> <amount>— set a team's balance directly/team admin resetstats <team>— zero out a team's stats/team admin renameteam <old> <new>— rename without the cooldown
Permissions
| Node | Default | What it does |
|---|---|---|
rgteam.use |
true | base access to /team |
rgteam.create |
true | create a team |
rgteam.join |
true | join an open team |
rgteam.invite |
true | send invites (role config still applies) |
rgteam.kick |
true | kick members (role config still applies) |
rgteam.promote |
true | promote / demote members |
rgteam.sethome |
true | set / delete the team home |
rgteam.bank.use |
true | deposit to the team bank |
rgteam.bank.withdraw |
false | bypass the role requirement for withdrawals |
rgteam.admin.* |
op | all admin commands + the inspect GUI |
To be clear: permissions do not override role checks unless the docs above say they do. Someone with rgteam.kick still can't kick anybody if their role doesn't allow kicking.
Configuration
Everything is generated on first launch in plugins/RG_Team/. There are three files:
- config.yml — the main one. Notable sections:
team.*(max size, name regex and length, friendly-fire/open-join defaults, rename cooldown, per-role capabilities),invites.*(expiry, cooldown, pending caps, offline-invite policy),home.*(warmup, cooldown, cancel-on-move/damage),bank.*(max transaction, minimum role to withdraw, logging),enderchest.*(size from 9 to 54, minimum role to open, autosave interval),allies.*(cap, request expiry, friendly-fire protection),leaderboard.weights.*(what counts toward score), andgui.*(glass borders, refresh-after-click). - messages.yml — every user-facing message. Nothing is hard-coded, so you can translate or reword without touching code.
- gui.yml — all GUI titles. Change
"Team Bank: %team%"to whatever fits your server.
PlaceholderAPI
If PAPI is present the plugin registers the rgteam expansion on its own:
%rgteam_name%— team name%rgteam_role%— OWNER / ADMIN / MEMBER%rgteam_members_total%— member count%rgteam_members_online%— online member count%rgteam_bank%— formatted bank balance%rgteam_score%— computed leaderboard score%rgteam_kills%— team kills%rgteam_deaths%— team deaths
Players without a team get a configurable fallback (placeholders.emptyValue in config, default None).
Data files
All data keys off player UUIDs; names are only cached for display, so a name change doesn't break anything.
| File | Contents |
|---|---|
teams.yml |
teams, their members and roles, settings, home, bank, stats, enderchest contents |
invites.yml |
pending invites with expiry timestamps |
allyrequests.yml |
pending ally requests |
admin-actions.log |
append-only log of admin actions |
Changelog
1.0.2 — premium console banner. Adds a bordered ANSI banner on enable showing version, author, server, team count, and Vault/PAPI status.
1.0.1 — clickable prompts and an ally selector fix. Invites and ally requests now include clickable [ACCEPT] / [DENY] in chat. Also fixed the ally flow: the browser now runs in a selector mode when you're adding an ally, so clicking a team sends the request instead of opening its details.
1.0.0 — initial release, full feature set as documented above.
License
Original work by RishavTheOG. No license has been picked yet, so treat it as all rights reserved — ask before redistributing.
If the plugin works for you, a star on the repo (or a review on Modrinth) is appreciated. Found a bug? Open an issue on GitHub.


