Better_Admin_Commands
One administration plugin for a Paper / Spigot 1.21+ server: moderation, teleporting and homes,
warps, jail, an auction house, a shop, trading, reports, an economy with Vault support, social
commands and a pile of item, world and admin tools. Everything player-related is stored in
MySQL/MariaDB and mirrored into local safe files, so the server keeps running even while the
database is down.
Every part of it is a module that can be switched off in config.yml, and every dialog a player
has to answer (a price, a permission, a search term, a report description) is a real window rather
than a line typed into chat.
The first half of this file is the user manual for server owners — what it does, how to install
it, how to configure it and how to switch parts off. The second half is for developers:
how the project is laid out and how to add to it.
Table of contents
For server owners
For developers
For server owners
What this plugin is for
Running a server usually means stacking up a dozen small plugins: one for moderation, one for
homes and warps, one for the shop, one for the auction house, one for the economy, one for
nicknames, one for the jail. They each have their own config, their own database story and their
own idea of what a menu looks like.
This plugin is the alternative: one jar that covers the day-to-day administration of a survival
or community server, stores all of it in one database, and looks and behaves the same everywhere.
It is built for two kinds of server in particular:
- small and medium servers that would rather run one plugin than fifteen, and that want a
working setup with sensible defaults and no permission plugin required,
- servers that already have a permission plugin (LuckPerms) and a database (or a hosting panel
that hands out a connection string), and want everything driven from
config.yml.
What it is not: it is not a lightweight, do-one-thing plugin, and it is not a region-claim or
anti-grief system. It is the "staff toolbox + economy + shop" layer of a server.
Two deliberate design choices are worth knowing before you install it:
- Every feature can be switched off. If you already have a shop you are happy with, turn the
shop module off and use the rest. See
Turning features on and off.
- The database is optional at runtime. If MySQL cannot be reached, the plugin still starts,
keeps working from the local safe files in
data/, and pushes everything into the database once
the connection comes back. See How storage works.
What you get
| Area |
What it covers |
| Admin |
gamemode, fly, god, vanish, heal, feed, speed, repair, give, clear, enchant, exp, broadcast, hat, craft, enderchest, invsee, sudo, near, time/weather (personal too), world tools, spawner/mob tools |
| Moderation |
kick, kickall, ban, tempban, IP ban, unban, unbanip, banlist, mute/unmute with timers, vanish with a tab-list cue for staff, mobs ignoring vanished players and containers opening silently |
| Teleporting |
spawn, warps, homes, /tp, /tphere, /tpall, /tppos, /tpa and /tpahere with clickable accept/deny, /tptoggle, /tpaall, /back, /rtp, /top, /bottom, /descend, /jump |
| Economy |
balances, /pay (online and offline players), /baltop, /eco, /worth, /sell with a drop-in sell window, exposed to other plugins through Vault |
| Trading |
/trade with a two-sided window, items and money, dual confirmation, full rollback, and a searchable history |
| Auction house |
/ah as a GUI: browse, sort, search, sell, my listings, claims, taxes and fees |
| Shop |
/shop, imported from EconomyShopGUI, with per-shop permissions and an in-game editor |
| Reports |
/report tickets between players and staff, with categories, threads, participants and unread markers |
| Social |
/msg, /reply, /socialspy, /ignore, /ignorelist, /me, /mail (offline messages) |
| Info |
/whois, /seen, /list, /ping, /gc, /playtime, /realname, /reveal, /afk, /depth, /getpos, /motd, /rules |
| Items |
/more, /rename, /lore, /skull, /book, /sort, /stack, /condense, /powertool, /unlimited, /disposal |
| Jail |
named cells, /jail, /unjail, /togglejail, automatic release when the timer runs out |
| Nick & skin |
/nick (tab list, chat, rank prefix, borrowed ranks), /skinchange (Mojang skin lookup) |
| Menus |
/warps, /homes, /kit, /balance, /baltop, /mail, /ignorelist, /jails, /ptime, /pweather, /unlimited, /realname, /ah, /shop, /report, /sell (drop-in window) |
Everything player-related — balances, homes, mutes, settings, mail, listings, shops, trades — lives
in MySQL, with an always-updated local YAML copy in plugins/Better_Admin_Commands/data/.
Requirements
- Paper (or Spigot) 1.21+ —
plugin.yml declares api-version: '1.21'.
The dialog windows need 1.21.6+ clients; see Menus and dialogs.
- Java 21 (the project targets Java 21).
- MySQL 5.7+ / MariaDB 10.x+ — optional. Without it the plugin runs from the local safe files.
PostgreSQL and SQLite are detected but not usable; the plugin says so plainly instead of failing
with a driver error.
- Vault — optional, only so other plugins can use this plugin's economy.
- LuckPerms — optional, for rank prefixes in the tab list and for borrowed ranks in
/nick.
- PlaceholderAPI — optional, publishes the nickname so TAB (or another tab-list plugin) can
render it.
- TAB — optional, used through its API for tab-list names, rank prefixes, sorting and hiding
the name tags above players' heads.
The MySQL/MariaDB JDBC driver is bundled inside the plugin jar and relocated, so nothing extra has
to be installed on the server.
Installation
- Drop
Better_Admin_Commands.jar into your server's plugins/ folder.
- Start the server once. A default
plugins/Better_Admin_Commands/config.yml is generated.
- Turn the server off, configure the database, and start it again.
- Optional: install Vault if other plugins should use this plugin's economy, LuckPerms for
ranks, TAB for the tab list and name tags.
config.yml is re-read on a restart, and /betteradmincommands reload re-reads the config,
spawn.yml, warps.yml and jails.yml and re-applies the modules (listeners, commands and
tasks). Database and economy settings need a full restart.
Connecting a database
The easy way: paste the connection string
Nearly every hosting panel hands out a ready-made connection string. Paste it into
database.connection-string and the plugin does the rest — it works out the database type, the
address, the database name and the login, and it decodes escapes such as %2B (a plus) and %40
(an at sign) that panels put in passwords:
database:
connection-string: "jdbc:mysql://bac_user:Str0ng%2BPass%40word@db.example.com:3306/better_admin_commands"
That single line carries the user bac_user, the password Str0ng+Pass@word, the host
db.example.com, port 3306 and the database better_admin_commands. These forms all work:
| You paste |
The plugin reads |
jdbc:mysql://user:pass@host:3306/db |
MySQL |
mysql://user:pass@host/db |
MySQL, default port |
mariadb://user:pass@host/db |
MariaDB |
postgresql://user:pass@host:5432/db |
PostgreSQL — detected but not usable |
sqlite:/path/to/file.db |
SQLite — detected but not usable |
127.0.0.1:3306/db |
MySQL, no credentials in the string |
Anything the string leaves out is filled in from the host/port/name/user/password fields
below it, so a string with only an address is fine. Query parameters in the string
(?useSSL=false&…) are passed on to the driver.
Or create the database yourself
The plugin creates its own tables, and it also creates the database when it is missing and
database.create-if-missing is on (the default). If your account may not run CREATE DATABASE:
CREATE DATABASE better_admin_commands
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
CREATE USER 'bac_user'@'%' IDENTIFIED BY 'a_strong_password';
GRANT ALL PRIVILEGES ON better_admin_commands.* TO 'bac_user'@'%';
FLUSH PRIVILEGES;
Notes:
utf8mb4 matters — nicknames, chat and mail can contain emoji.
- Use
'bac_user'@'localhost' when the database runs on the same machine and you never connect
from elsewhere.
- Prefer a dedicated user limited to this one database over
root.
Configure config.yml
Either paste a connection string (above), or fill in the fields:
database:
connection-string: "" # paste a full connection string here, or leave empty
create-if-missing: true # create the database when it does not exist yet
host: "127.0.0.1" # database host or IP
port: 3306 # 3306 is the MySQL/MariaDB default
name: "better_admin_commands"
user: "bac_user"
password: "a_strong_password"
table-prefix: "bac_" # every table the plugin creates starts with this
pool-size: 4 # pooled connections, 2-8 is fine for one server
use-ssl: false # enable for remote/cloud databases
reconnect-interval-minutes: 30
connection-parameters: "useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
Restart and verify
Restart the server and check the console. On a successful connection you should see:
[Better_Admin_Commands] Connected to the MySQL database.
[Better_Admin_Commands] Registered the MySQL economy with Vault.
The plugin then creates the tables (with your prefix) automatically:
| Table |
Contents |
<prefix>players |
UUID, name, balance, last seen, mute state |
<prefix>homes |
one row per home (uuid + home primary key) |
<prefix>player_settings |
per-player key/value settings (nickname, social spy, ignore list, tptoggle, afk) |
<prefix>mail |
offline messages, with read flag |
<prefix>ah_listings |
auction listings (item, price, seller, state, expiry) |
<prefix>shops, <prefix>shop_items |
the imported shop |
<prefix>trades |
finished trades |
<prefix>reports, <prefix>report_messages, <prefix>report_participants |
report tickets |
Check the live state in-game at any time with:
/betteradmincommands info
It reports whether the database is connected or unavailable (using local safe files), which
table prefix is in use and how many modules are switched off. For a step-by-step connection check:
/betteradmincommands database
The plugin does not refuse to start when the database is unreachable. It logs a warning, keeps
running from the local safe files, and retries every reconnect-interval-minutes. You do not have
to restart once the database is back — force an attempt immediately with
/betteradmincommands reconnect.
| Symptom |
Likely cause |
Access denied for user ... |
Wrong user/password, or the user is not allowed from this host ('user'@'%' vs 'user'@'localhost') |
Unknown database 'better_admin_commands' |
The database does not exist and create-if-missing is off, or your account may not run CREATE DATABASE — create it yourself |
| "… points at PostgreSQL/SQLite, which this plugin cannot talk to" |
The string names an engine the plugin does not support; use MySQL/MariaDB |
Communications link failure / timeout |
Wrong host/port, firewall, or MySQL not listening on an external interface |
Public Key Retrieval is not allowed |
Leave allowPublicKeyRetrieval in place (the plugin adds it) or enable use-ssl |
| Tables not created |
The user lacks CREATE permission on the database |
Turning features on and off (modules)
Every command of the plugin belongs to exactly one module, and each module can be switched off
in config.yml:
modules:
shop:
enabled: false
trade:
enabled: false
# a single command, on top of its module
disabled-commands:
- "sell"
What switching a module off does:
- its commands are not registered at all, so their names are free for other plugins. A server
that runs its own shop plugin can set
modules.shop.enabled: false and keep /shop — the plugin
stops claiming the name, so whoever asks for it can take it;
- its listeners are not registered and its repeating tasks do not run, so a switched-off
feature costs nothing while the server runs;
- the management command always works, whatever else is off.
Changes are applied by /betteradmincommands reload or a restart; a reload takes the names out of
the command map (or puts them back) right away, without a restart. /betteradmincommands modules
prints the state of every module and which of its commands are not registered right now:
[BetterAdmin] Feature modules (config.yml » modules)
&aON &7admin &8(Administration, 36 command(s))
&cOFF &7shop &8(Shop, 1 command(s))
&cNot registered (feature off): &f/shop
...
The modules are:
| Module |
Commands |
admin |
enchant, gm, fly, smite, heal, feed, god, speed, repair, vanish, near, give, clear, broadcast, hat, craft, enderchest, ecsee, invsee, sudo, exp, time, weather, ptime, pweather, world, break, tree, bigtree, spawner, spawnmob, nuke, fireball, potion, burn, ext, recipe, killall, butcher, remove |
moderation |
kick, ban, tempban, ipban, unban, unbanip, kickall, banlist, mute, unmute, kill, suicide |
economy |
balance, baltop, pay, eco, worth, sell (+ the Vault economy and the autosave) |
trade |
trade |
auction |
ah |
shop |
shop |
report |
report, reports |
teleport |
back, tp, tppos, tphere, tpall, tpa, tpahere, tpaaccept, tpadeny, tptoggle, tpaall, rtp, jump, top, bottom, descend |
spawn |
spawn, setspawn (+ the join rules and respawning at spawn) |
homes |
home, sethome, delhome, homes |
warps |
warp, setwarp, delwarp, warps |
social |
msg, reply, socialspy, ignore, ignorelist, me, mail |
info |
whois, seen, list, ping, gc, depth, getpos, playtime, realname, reveal, motd, rules, notify |
items |
more, rename, lore, skull, book, condense, stack, sort, unlimited, disposal, powertool |
jail |
jail, setjail, deljail, jails, unjail, togglejail (+ the jail rules and the automatic release) |
kits |
kit |
nick |
nick, nametags (+ rank prefixes, hidden name tags, the PlaceholderAPI expansion) |
skin |
skinchange |
afk |
afk (+ activity tracking and auto-away) |
disabled-commands takes a command name or one of its aliases, so sell, money or ah all
work. A command switched off this way is not registered either, so another plugin can take its
name; everything else in those modules keeps working.
Four modules have an older switch of their own. economy.enabled, trade.enabled,
auction.enabled and shop.enabled already existed before modules did, and they still count:
such a module runs only while both switches are on. A server that turned its shop off long
ago therefore stays off after updating.
There is also a plugin-wide switch that does not touch config.yml:
/betteradmincommands disable unregisters every listener, stops every task and makes every command
answer with a notice — useful for a maintenance window. /betteradmincommands enable brings it all
back. Because the plugin stays loaded, replacing the jar still needs a restart.
Menus and dialogs
Almost every browsable command has a menu: /warps, /homes, /kit, /balance, /baltop,
/mail, /ignorelist, /jails, /ptime, /pweather, /unlimited, /realname, /ah, /shop,
/report and the bare /sell window. Every window shares one theme — a dark border, a lighter background, consistent
headings and a navigation row — so they feel like one piece instead of a pile of screens. Text
forms stay available where they existed (/warps list, /homes list, /baltop list, …), which is
also what the console gets.
Whenever a menu needs a value from you, it opens a real window (Paper's dialog API) instead of
asking you to type into chat: a price in the auction house, a custom amount in the shop, a search
term, a shop permission, the money in a trade, a report description, your personal time. Pressing
Cancel, or closing the window with escape, answers nothing: the value stays as it was, and you are
put back on the screen you came from (or the command simply stops, when there was no screen).
The same question is also printed in chat, because a client that cannot show a dialog — anything
older than 1.21.6 — never opens one. The first answer wins, and a question that nobody answers is
forgotten after two minutes, so a window you close can never swallow a later chat message.
Commands
/betteradmincommands (aliases /bac, /betteradmin, both changeable) manages the plugin:
| Subcommand |
Description |
reload |
Re-read config.yml (adding new options), spawn.yml, warps.yml, jails.yml and re-apply the modules |
modules |
List every feature module with its state |
backup |
Dump every table to backups/<timestamp>/ |
reconnect |
Retry MySQL now and sync local data back up |
database |
Walk through the connection step by step and report what fails |
info |
Show state, economy, Vault, database, warps, your nickname, module count and any commands another plugin took over |
disable / enable |
Switch the plugin's features off and on again without unloading it |
The name and aliases of the management command are configurable (commands.root-name,
commands.root-aliases); set root-name: staff and /staff reload takes over. Names may only
contain a-z, 0-9, _ and -; invalid or taken names fall back to /betteradmincommands with a
console warning. The permission stays betteradmincommands.command.
Admin — module admin
| Command |
Usage |
Permission |
/enchant |
/enchant <enchantment> [level] |
betteradmincommands.enchant |
/gm |
/gm <mode> [player] |
betteradmincommands.gamemode (or .survival, .creative, .adventure, .spectator for a single mode; .others to change another player) |
/fly |
/fly [player] |
betteradmincommands.fly |
/smite |
/smite [player] |
betteradmincommands.smite |
/heal |
/heal [player] |
betteradmincommands.heal |
/feed |
/feed [player] |
betteradmincommands.feed |
/god |
/god [player] |
betteradmincommands.god |
/speed |
/speed <walk|fly> <0-10> |
betteradmincommands.speed |
/repair |
/repair [hand|all] |
betteradmincommands.repair |
/vanish |
/vanish [player] |
betteradmincommands.vanish |
/near |
/near [radius] |
betteradmincommands.near |
/give |
/give <player> <item> [amount] |
betteradmincommands.give |
/clear |
/clear [player] |
betteradmincommands.clear |
/broadcast |
/broadcast <message> |
betteradmincommands.broadcast |
/hat |
/hat |
betteradmincommands.hat |
/craft |
/craft |
betteradmincommands.craft |
/enderchest |
/enderchest [player] |
betteradmincommands.enderchest (.enderchest.others for another player) |
/ecsee |
/ecsee <player> |
betteradmincommands.enderchest.others |
/invsee |
/invsee <player> |
betteradmincommands.invsee |
/sudo |
/sudo <player> <command> |
betteradmincommands.sudo |
/exp |
/exp <show|give|set> [player] [amount] |
betteradmincommands.exp |
/time |
/time <set|add> <value> [world] |
betteradmincommands.time |
/weather |
/weather <sun|rain|thunder> [world] |
betteradmincommands.weather |
/ptime |
/ptime [value] |
betteradmincommands.ptime |
/pweather |
/pweather [value] |
betteradmincommands.pweather |
/world |
/world [name] |
betteradmincommands.world (.world.manage to create/remove) |
World and mob tools — module admin
| Command |
Usage |
Permission |
/break |
/break |
betteradmincommands.break |
/tree / /bigtree |
/tree [type] |
betteradmincommands.tree |
/spawner |
/spawner <type> |
betteradmincommands.spawner |
/spawnmob |
/spawnmob <type> [amount] [player] |
betteradmincommands.spawnmob |
/nuke |
/nuke [player] |
betteradmincommands.nuke |
/fireball |
/fireball [small] [power] |
betteradmincommands.fireball |
/potion |
/potion <type> [player] [duration] [amplifier] |
betteradmincommands.potion |
/burn |
/burn <player> [seconds] |
betteradmincommands.burn |
/ext |
/ext [player] |
betteradmincommands.ext |
/recipe |
/recipe [item] |
betteradmincommands.recipe |
/killall |
/killall [type] |
betteradmincommands.killall |
/butcher |
/butcher [radius] |
betteradmincommands.butcher |
/remove |
/remove <type> [radius] |
betteradmincommands.remove |
Moderation — module moderation
| Command |
Usage |
Permission |
/kick |
/kick <player> [reason] |
betteradmincommands.kick |
/kickall |
/kickall [reason] |
betteradmincommands.kickall |
/ban |
/ban <player> [reason] |
betteradmincommands.ban |
/tempban |
/tempban <player> <duration> [reason] |
betteradmincommands.tempban |
/ipban |
/ipban <player> [reason] |
betteradmincommands.ipban |
/unban |
/unban <player> |
betteradmincommands.unban |
/unbanip |
/unbanip <address|player> |
betteradmincommands.unbanip |
/banlist |
/banlist |
betteradmincommands.banlist |
/mute |
/mute <player> [duration] [reason] |
betteradmincommands.mute |
/unmute |
/unmute <player> |
betteradmincommands.unmute |
/kill |
/kill [player] |
betteradmincommands.kill |
/suicide |
/suicide |
betteradmincommands.suicide |
Vanishing. /vanish hides a player from everyone who is not allowed to see them. With
betteradmincommands.vanish.see the player stays visible in the world and in the tab list, where
they carry the cue from moderation.vanish-tab-cue (default [V]) in front of their rank prefix —
with TAB installed the cue is drawn through TAB's API. Vanish state is in memory only: a restart
brings everyone back visible.
A vanished player is also made not to give themselves away: mobs stop targeting them (and any mob
already chasing them forgets them), and containers open silently — a chest, barrel, shulker box,
hopper, ender chest and the like no longer swing open or play a sound, so nobody nearby notices.
Turn either off with moderation.vanish-mobs-ignore / moderation.vanish-silent-containers.
Economy — module economy
| Command |
Usage |
Permission |
/balance |
/balance [player] |
betteradmincommands.balance |
/baltop |
/baltop [page|list] |
betteradmincommands.baltop |
/pay |
/pay <player> <amount> |
betteradmincommands.pay |
/eco |
/eco <give|take|set|reset|resetall|balance|top> <player> [amount] |
betteradmincommands.eco (or .eco.<action>) |
/worth |
/worth [item] |
betteradmincommands.worth |
/sell |
/sell [hand|all|amount] (no argument opens the sell window) |
betteradmincommands.sell |
/balance prints the amount and opens the balance menu, where Send money picks the receiver
from the online players (or from an offline player, typed in by name) and then asks for the amount
in a window. /baltop is a paged grid of heads with the viewer's own rank highlighted. Every
transfer through the menu goes through the same code as /pay, so the rules cannot differ between
the two.
/pay <player> <amount> works whether the receiver is online or not — an offline payment simply
waits in their balance until they are back, and tab completion offers the names of players who have
played here before as well.
/sell without an argument opens a sell window: drop in whatever should go, close it, and
everything the server buys (the worth section) is sold at once and paid into your balance. Anything
without a price is handed straight back, so nothing can be lost by dropping it in. The text forms
/sell hand, /sell all and /sell <amount> still work. The window is sized by sell.gui-rows
(default 6), and because every slot is usable there is no navigation row — nothing but your own
items is ever in it.
Trading — module trade
/trade <player> asks the other side first (they get a clickable accept/deny message, unless
trade.require-accept: false) and then opens a two-sided window. Each player puts items into their
own half and can offer money with the gold button; when both sides confirm, the offers are
swapped. Closing the window, disconnecting or a balance that dropped in the meantime cancels the
trade and hands everything back, so an item can never be lost.
/trade <player> ask for a trade
/trade accept [player] accept a request
/trade deny [player] decline a request
/trade log [player] the last trades (your own, or everyone's for staff)
Every finished trade is written to the trades table and mirrored into data/trades.yml.
Records older than trade.log.retention-hours (48 by default) are deleted from both, and only the
newest trade.log.max-cached records are held in memory.
Auction house — module auction
/ah opens the whole auction house as a menu:
- Browse — a paged grid of every active listing. Click one to see the item, the price and how
long it still runs, then confirm the purchase. A sort button cycles through newest, oldest,
cheapest, most expensive and item name A-Z, and a search button filters by item name and
seller; both stick until cleared.
- Sell held item — hold an item, press the button and pick the price with +/- buttons
(1 / 10 / 100 / 1000 / 100000) or an exact price in a dialog window. The stack is taken out of
your hand once the listing exists.
- My listings — everything you listed; click a listing to cancel it.
- Claims — items from cancelled or expired listings wait here until collected.
The buyer pays the listed price; the seller receives it minus auction.tax-percent. An optional
up-front auction.listing-fee-percent and the price window (auction.min-price /
auction.max-price) are enforced. Listings live in MySQL (<prefix>ah_listings) and are mirrored
into data/auction.yml.
Reports — module report
/report is the whole report system as a menu:
- Create a report — pick a category, then the player it is about (categories that need no player
skip that step), then describe it in a window.
- My tickets — every ticket you opened, open and closed, with an unread marker.
- Staff with
betteradmincommands.report.staff also get All open and All closed, and
/reports jumps straight to the open ones.
A ticket is a two-way thread: the player and any number of staff reply into it, everybody who
took part is a participant, and when a message arrives the other online participants are told in
chat with a clickable button — and again when they join if they still have unread messages.
Categories live in report.presets; the menu pages itself automatically.
Reports are stored in MySQL (<prefix>reports, report_messages, report_participants). Unlike the
economy, homes and mail they have no local safe file, so reports need the database to be
reachable.
Teleporting — modules teleport and spawn
| Command |
Usage |
Permission |
/spawn |
/spawn |
betteradmincommands.spawn |
/setspawn |
/setspawn |
betteradmincommands.setspawn |
/tp |
/tp <player> | /tp <x> <y> <z> | /tp <player> <target> |
betteradmincommands.tp |
/tphere |
/tphere <player> |
betteradmincommands.tphere |
/tpall |
/tpall |
betteradmincommands.tpall |
/tppos |
/tppos <x> <y> <z> [world] |
betteradmincommands.tppos |
/tpa |
/tpa <player> |
betteradmincommands.tpa |
/tpahere |
/tpahere <player> |
betteradmincommands.tpahere |
/tpaall |
/tpaall |
betteradmincommands.tpaall |
/tpaaccept |
/tpaaccept [player] (aliases /tpaccept, /tpyes) |
betteradmincommands.tpaccept |
/tpadeny |
/tpadeny [player] (aliases /tpdeny, /tpno) |
betteradmincommands.tpdeny |
/tptoggle |
/tptoggle |
betteradmincommands.tptoggle |
/back |
/back |
betteradmincommands.back |
/rtp |
/rtp |
betteradmincommands.rtp |
/jump |
/jump |
betteradmincommands.jump |
/top |
/top |
betteradmincommands.top |
/bottom |
/bottom |
betteradmincommands.bottom |
/descend |
/descend |
betteradmincommands.descend |
A /tpa request shows the player who has to answer it a notice with two clickable buttons:
[BetterAdmin] Steve wants to teleport to you. [Accept] [Deny]
Accept runs /tpaaccept Steve and Deny runs /tpadeny Steve for whoever clicked. Teleports
are instant for staff holding betteradmincommands.teleport.bypass — no warm-up countdown and no
/back cooldown.
Homes and warps — modules homes and warps
| Command |
Usage |
Permission |
/home |
/home [name] |
betteradmincommands.home |
/sethome |
/sethome [name] |
betteradmincommands.sethome |
/delhome |
/delhome <name> |
betteradmincommands.delhome |
/homes |
/homes |
betteradmincommands.homes |
/warp |
/warp <name> |
betteradmincommands.warp (and .warp.<name>) |
/warps |
/warps |
betteradmincommands.warps |
/setwarp |
/setwarp <name> |
betteradmincommands.setwarp |
/delwarp |
/delwarp <name> |
betteradmincommands.delwarp |
/homes shows your homes — left-click teleports, right-click opens a confirmation before a
home is deleted. /warps shows every warp as a button; warps a player may not use are greyed out
with the reason, so they can see a warp exists without being able to jump there. Both keep a text
form (/homes list, /warps list).
Items — module items
| Command |
Usage |
Permission |
/more |
/more |
betteradmincommands.more |
/rename |
/rename <name|off> |
betteradmincommands.rename |
/lore |
/lore <add|set|clear> [line] [text] |
betteradmincommands.lore |
/skull |
/skull [player] |
betteradmincommands.skull |
/book |
/book <give|author|title|unlock> [args] |
betteradmincommands.book |
/condense |
/condense |
betteradmincommands.condense |
/stack |
/stack |
betteradmincommands.stack |
/sort |
/sort |
betteradmincommands.sort |
/unlimited |
/unlimited [toggle|on|off|list|clear] |
betteradmincommands.unlimited |
/disposal |
/disposal |
betteradmincommands.disposal |
/powertool |
/powertool <command|clear|list> |
betteradmincommands.powertool |
Kits — module kits
/kit [name] gives a configured kit; without an argument it opens the kit menu, where every kit
shows its contents, its cooldown and whether it is for you. Cooldown and permission states are greyed
out with the reason, so "not yet" and "not for me" look different. Kit entries are re-read on every
use, so editing them does not need a restart. Each kit can have its own permission: and icon:.
Jail — module jail
| Command |
Usage |
Permission |
/jail |
/jail <player> [cell] [duration] |
betteradmincommands.jail |
/setjail |
/setjail <name> |
betteradmincommands.setjail |
/deljail |
/deljail <name> |
betteradmincommands.deljail |
/jails |
/jails [list] |
betteradmincommands.jails |
/unjail |
/unjail <player> |
betteradmincommands.unjail |
/togglejail |
/togglejail <player> [cell] |
betteradmincommands.togglejail |
/jails lists every cell with its world and coordinates; clicking one teleports you to it, which
is what the list is for. Deleting a cell is deliberately not in the menu — /deljail stays the
only way, so a misclick cannot empty a cell someone is sitting in.
Social, info and the rest
| Command |
Usage |
Permission |
/msg |
/msg <player> <message> |
betteradmincommands.msg |
/reply |
/reply <message> |
betteradmincommands.reply |
/socialspy |
/socialspy |
betteradmincommands.socialspy |
/ignore |
/ignore <player> |
betteradmincommands.ignore |
/ignorelist |
/ignorelist [list] |
betteradmincommands.ignorelist |
/me |
/me <action> |
betteradmincommands.me |
/mail |
/mail [send|read|clear] [player] [message] |
betteradmincommands.mail |
/whois |
/whois [player] |
betteradmincommands.whois |
/seen |
/seen <player> |
betteradmincommands.seen |
/list |
/list |
betteradmincommands.list |
/ping |
/ping [player] |
betteradmincommands.ping |
/gc |
/gc |
betteradmincommands.gc |
/afk |
/afk [reason] |
betteradmincommands.afk |
/playtime |
/playtime [player] |
betteradmincommands.playtime |
/realname |
/realname [nickname] |
betteradmincommands.realname |
/reveal |
/reveal <name|nickname> |
betteradmincommands.reveal |
/depth |
/depth |
betteradmincommands.depth |
/getpos |
/getpos [player] |
betteradmincommands.getpos |
/motd |
/motd |
betteradmincommands.motd |
/rules |
/rules |
betteradmincommands.rules |
/notify |
/notify [<name> [on|off]|all on|off|reset] |
betteradmincommands.notify |
/nick |
/nick <nickname|off> [luckperms-group] |
betteradmincommands.nick |
/skinchange |
/skinchange <username|uuid|value <texture> <signature>|off> |
betteradmincommands.skinchange |
/mail is the mailbox: the inbox newest first, one head per sender, with the date, a preview and a
New message marker. Opening a message marks it read and offers Reply and Delete, and the
menu can also Write a message, Mark all as read and Clear mailbox behind a
confirmation. /ignorelist shows every ignored name as a head; clicking one stops ignoring that
player.
Shop: taking over EconomyShopGUI
/shop opens the server shop, which is imported from EconomyShopGUI rather than written by
hand. On the first start the plugin reads every YAML file it finds in plugins/EconomyShopGUI*/,
turns the entries into its own shops, and then switches EconomyShopGUI off
(shop.import.disable-plugin, on by default) so the two cannot both answer to /shop.
The importer is deliberately version-proof: instead of relying on one edition's layout it walks the
whole file and treats anything that names a material as a shop entry, which covers the free and the
premium edition, pages: and sections: layouts, and shop files written by hand.
One file becomes one shop. The shop is named after the file, unless the file names itself with
shop-name / title / display-name. An icon: (or display-item:) sets the button in the shop
list, and rows: / size: sets the window height.
| What |
Accepted keys |
| Item |
material, item, type |
| Buy price |
buy, buy-price, price, cost, money, or a nested price: { … } section |
| Sell price |
sell, sell-price, sell-amount |
| Amount |
amount, quantity, give-amount |
| Looks |
display-name/name, lore, enchantments, custom-model-data, skull-owner |
| Place |
slot, page |
Slots and pages are used where they fit; an entry whose slot collides or falls outside the window is
moved to the next free slot instead of disappearing, so nothing is ever lost in the import. Entries
can also be written as a plain list of material names, or as a list of maps.
Migrating
- Make sure EconomyShopGUI is installed and working as usual.
- Update this plugin and restart once. Watch the console for
Imported <n> shop(s) with <m> item(s) from EconomyShopGUI.
- Run
/shop. Shops, pages, prices and displays should match what you had.
- Keep the
plugins/EconomyShopGUI*/ folder for a while as a backup.
Editing the shop in game
/shop edit (or the Edit shop button, both for betteradmincommands.shop.admin) changes the
shop without touching a file: shop list → shop view → entry editor (set buy price, set sell price,
off removes it, set the amount one purchase hands out, take it off sale, delete behind a
confirmation) plus a shop settings page that writes shop.access.permissions into config.yml for
you. Everything is entered in a window.
Edits go into memory, the local safe file and MySQL, so they survive a restart. A re-import with
/shop import (or shop.import.force) rebuilds the shop from the EconomyShopGUI files and therefore
discards in-game edits — the import button says so.
Shop access
Every shop can be locked behind its own permission. Three ways, checked in this order:
shop.access.permissions.<shop-id> — an explicit permission for one shop.
shop.access.free — a list of shop ids that stay open whatever the prefix says (* = all).
shop.access.permission-prefix — the permission every other shop needs, with the shop id
appended. The id is the file path without the extension, with anything outside a-z, 0-9, _,
- and . turned into a ., so blocks/mob_drops.yml becomes blocks.mob_drops.
The default prefix is empty, which leaves every shop open. A locked shop is handled in three
places so it cannot be worked around: it shows greyed out in the list (or hidden, with
shop.access.hide-locked: true), direct openings — including from search results — are refused, and
buying/selling re-checks server side. betteradmincommands.shop.admin bypasses every check.
What is not carried over
- EconomyShopGUI's own commands (
/sellall, its reload, …) go away with the plugin. /sell,
/worth and /balance cover the common cases.
- Its permission nodes (
economyshopgui.shop.<name>, …) are replaced by shop.access.
- Player heads by name are imported without a skin when the owning account is not already
cached, because looking a name up over the network during the import would freeze the start-up.
Economy and Vault
The built-in economy is stored in the players table and offered to Vault, so any Vault-aware
plugin can read and modify balances.
- If Vault is missing, the plugin logs a warning and the economy still works in-game — it just is not
shared with other plugins.
- If another economy plugin is registered with Vault, this plugin registers itself with the highest
priority and logs a warning. Run one economy at a time.
- Balances are cached in memory and written back to MySQL asynchronously every
economy.save-interval-seconds (and on shutdown), so the main thread never waits on the database.
- Switching the
economy module off (or economy.enabled: false) disables the economy, its commands
and its Vault registration together.
Trading, reports and notifications
The plugin tells staff about things that happen (a trade, a new report, a kick, a ban, an unban) and
reminds players about unread mail. Each of those is a category with its own permission, listed
under notifications.categories. A player receives a notification only when they hold its
permission and have not switched it off:
/notify list every notification with its state
/notify <name> flip one on or off
/notify <name> on|off set one outright
/notify all on|off set every one at once
/notify reset back to the server defaults
Add or remove categories in config.yml and the command picks them up automatically.
Nicknames, ranks and skins
/nick
/nick <nickname> changes your own name in the tab list and in chat. The nickname is
stored in the database, so it survives restarts, and /realname <nick> finds the player behind it.
Only your own name can be changed.
/nick <nickname> your nickname
/nick <nickname> <group> borrow the prefix of a LuckPerms group
/nick <nickname> off drop the group prefix, keep the nickname
/nick off remove the nickname entirely
The group argument does not change permissions or the real LuckPerms group — it only takes that
group's prefix and shows it in front of the nickname. TAB completion for the group comes from
LuckPerms, and with a borrowed group TAB is told to treat the player as if they really held that rank
(setTemporaryGroup), so an owner who nicks as player is sorted as a player.
Ranks. With LuckPerms installed, /nick <nickname> shows your own rank prefix in front of
the nickname. A rank prefix is shown in front of every player's name — nick or not — in the tab
list, in chat and in the commands that name players (/msg, /reply, /me, /list, the social
spy line). nick.show-rank-prefix: false turns the automatic prefix off.
Name tags. There is no name tag above a player's head at all (nick.hide-nametag, on by
default), so the tab list is the only place a name shows up. With TAB installed the plugin drives it
through TAB's API (tab list name, rank prefix, borrowed rank, hidden name tag); without TAB the
same is done through Bukkit and one scoreboard team per player. The teams are removed again when the
plugin is disabled, and hide-nametag: false turns the scoreboard part off for servers where
another plugin relies on the teams. A server owner can flip this for the whole server at any time
with /nametags <enable|disable> (see below) instead of editing the file.
Colour in chat. Players holding betteradmincommands.chat.color can use & colour codes in
their chat messages; betteradmincommands.nick.color does the same for a nickname.
Showing the nickname in TAB (or another tab-list plugin) works through PlaceholderAPI instead of
fighting over the same packets:
| Placeholder |
Value |
%betteradmincommands_nickname% |
group prefix + nickname, or the real name when none is set |
%betteradmincommands_nickname_raw% |
only the nickname, or the real name when none is set |
%betteradmincommands_nick_prefix% |
the borrowed LuckPerms group prefix, or empty |
For TAB, set customtabname in groups.yml/users.yml to %betteradmincommands_nickname%, and
replace %essentials_nickname% with the same placeholder in the nick condition in config.yml.
/nametags
/nametags turns the name tags above every player's head on or off for the whole server. It is
the in-game form of nick.hide-nametag and is aimed at server owners rather than players.
/nametags show the current state
/nametags enable show the name tags above every player again
/nametags disable hide the name tags for every player
/nametags toggle flip the current state
The choice is written back into config.yml (nick.hide-nametag), so it survives a restart, and it
is applied to everyone online right away — hiding is on by default (disable), so a server owner
only has to run /nametags enable to bring the tags back. It needs
betteradmincommands.nametags.
/skinchange
/skinchange <username|uuid> puts the skin of a premium account on you; only your own skin can
be changed.
/skinchange <username> use the skin of that premium account
/skinchange <uuid> the same, naming the account by its UUID
/skinchange value <texture> <signature> use a pasted texture
/skinchange off back to your own skin
There is no NameMC API — NameMC is a viewer for Mojang's own data — so the plugin asks Mojang
directly: api.minecraftservices.com resolves the name to a UUID (api.mojang.com as a fallback),
then sessionserver.mojang.com returns the skin as a texture with its Mojang signature (clients
refuse to render unsigned textures, which is why this works on an offline-mode server too).
- The lookup runs asynchronously, never on the server thread.
- Results are cached for
skin.cache-minutes (default 60) and identical requests at the same time
only send one request, so the server is not rate limited.
- The borrowed skin is stored and applied again on every join;
/skinchange off drops it and asks
Mojang for the player's own skin.
The server needs outbound HTTPS access to api.mojang.com and sessionserver.mojang.com; no API key
is required.
Permissions
The permission tree is defined in plugin.yml:
| Permission |
Default |
Grants |
betteradmincommands.* |
op |
Everything below |
betteradmincommands.player |
true |
Every command a normal player may use |
betteradmincommands.mod |
op |
Moderation, jail, vanish, invsee, sudo |
betteradmincommands.admin |
op |
Full administrative access |
Extra permissions used for finer control:
betteradmincommands.vanish.see — see vanished players in the world and in the tab list
betteradmincommands.getpos.others, .playtime.others, .balance.others — target other players
betteradmincommands.nick.color, .chat.color — use colour codes in a nickname / in chat
betteradmincommands.realname, .reveal — look up the real name and rank behind a nickname
betteradmincommands.auction / .auction.sell — open the auction house / list items (default true)
betteradmincommands.shop / .shop.sell (default true), .shop.admin (default op) — open the
shop, sell to it, and import/bypass shop.access
betteradmincommands.shop.<shop-id> — access to a single shop when shop.access.permission-prefix
is set
betteradmincommands.report (default true), .report.staff (default op) — open tickets / see
and answer every ticket
betteradmincommands.trade (default true), .trade.log.others, .trade.notify
betteradmincommands.kick.notify, .ban.notify, .unban.notify, .admin.notify — staff
notifications (each can be switched off per player with /notify)
betteradmincommands.enderchest.others, .broadcast.receive, .unlimited.list
betteradmincommands.world.manage — create and remove worlds
betteradmincommands.teleport.bypass — skips the teleport warm-up and the /back cooldown
betteradmincommands.homes.limit.<amount> — per-player home limit override
betteradmincommands.kit.<name> — access to one kit
betteradmincommands.warp.public (default true), .warp.<name> — warp access
better_admin_commands.permissionall — one node that unlocks everything (left of the classic
betteradmincommands.* wildcard, both are accepted)
Handing out a hundred nodes is tedious, so that single node unlocks the whole plugin wherever a
specific node is checked. On a server without a permission plugin, the permissions section of
config.yml decides what everyone gets from the start:
permissions:
default-access: default # default | all | none
groups:
player: true # /home, /pay, /ah, /shop, /trade, ...
mod: false # /ban, /kick, /mute, ...
admin: false # /gm, /give, /eco, ...
default-access: all gives every command to everyone, none gives nothing. The group switches apply
in default mode. They are applied when a player joins and after /betteradmincommands reload.
Configuration reference
All settings live in config.yml (generated on first start).
Updating config.yml safely
The file starts with a version marker:
config-version: 15
On every start (and on /betteradmincommands reload) the plugin compares your file with the template
shipped inside the jar and adds options that are missing. Options that already exist are never
touched, so your values survive plugin updates. When the version marker changes, a copy of the
previous file is written next to it as config-backup-v<old>-<timestamp>.yml first. The file is only
rewritten when something actually changed, and comments for newly added options are copied over.
Do not edit config-version by hand — that is what tells the plugin which migration is outstanding.
modules
See Turning features on and off. One enabled: true/false
per module, plus disabled-commands for single commands.
database
See Connecting a database. Additional keys:
| Key |
Default |
Description |
connection-string |
empty |
A full connection string; when set it wins over the fields below |
create-if-missing |
true |
Create the database itself when it does not exist yet |
table-prefix |
bac_ |
Prefix for every table, useful when sharing a database |
pool-size |
4 |
Number of pooled JDBC connections |
use-ssl |
false |
Enable SSL for the connection |
reconnect-interval-minutes |
30 |
How often a down database is retried |
connection-parameters |
— |
Extra JDBC parameters appended to the URL |
commands
| Key |
Default |
Description |
root-name |
betteradmincommands |
Name of the plugin management command |
root-aliases |
bac, betteradmin |
Aliases for the management command |
permissions
| Key |
Default |
Description |
default-access |
default |
default, all or none — what everyone may use out of the box |
groups.player / .mod / .admin |
true / false / false |
Which bundles every player gets in default mode |
wildcards |
better_admin_commands.permissionall, betteradmincommands.* |
Nodes that unlock everything |
auction
| Key |
Default |
Description |
enabled |
true |
Enable the auction house and its expiry task (the module must be on too) |
gui-rows |
6 |
Chest rows per window (3-6); the bottom row is navigation |
listing-hours |
48 |
How long a listing stays up, 0 never expires |
max-listings-per-player |
10 |
Active listings a player may have at once |
tax-percent |
5.0 |
Share of the sale price the server keeps |
listing-fee-percent |
0.0 |
Up-front fee when listing, as a % of the price |
min-price / max-price |
1.0 / 1000000000.0 |
Allowed price window |
shop
| Key |
Default |
Description |
enabled |
true |
Enable /shop (the module must be on too) |
gui-rows |
6 |
Chest rows per window (3-6); the bottom row is navigation |
selling-enabled |
true |
Let players sell items back where the import has a sell price |
search-enabled |
true |
Show the search button that filters every shop |
access.permission-prefix |
"" (open) |
Permission every shop needs, with the shop id appended |
access.free |
[] |
Shop ids that stay open, or * for all of them |
access.permissions.<shop-id> |
— |
Per-shop permission; wins over the prefix |
access.hide-locked |
false |
Hide shops a player cannot use instead of greying them out |
import.enabled |
true |
Import the EconomyShopGUI files on start-up when no shop is stored yet |
import.force |
false |
Re-import and overwrite on every start-up |
import.disable-plugin |
true |
Switch EconomyShopGUI off once its shops are imported |
import.max-items |
5000 |
Stop after this many imported items |
import.folders |
EconomyShopGUI, EconomyShopGUI-Premium |
Folders inside plugins/ to read |
Any folder in plugins/ whose name starts with EconomyShopGUI is read as well, so the free and the
premium edition are both found without editing the list.
trade
| Key |
Default |
Description |
enabled |
true |
Enable /trade (the module must be on too) |
require-accept |
true |
Ask the other player first (they get a clickable accept/deny) |
request-expire-seconds |
60 |
Lifetime of a trade request |
log.enabled |
true |
Keep a history of finished trades |
log.retention-hours |
48 |
How long a record is kept before it is deleted |
log.max-cached |
2000 |
Records held in memory for /trade log |
log.notify-permission |
betteradmincommands.trade.notify |
Who is told about a finished trade |
economy
| Key |
Default |
Description |
enabled |
true |
Enable the built-in economy and Vault registration (the module must be on too) |
currency-name-singular / -plural |
Dollar / Dollars |
Currency names shown by Vault |
currency-symbol |
$ |
Symbol used when formatting amounts |
starting-balance |
100.0 |
Balance a player gets the first time they are seen |
max-balance |
1000000000.0 |
Hard ceiling for balances |
save-interval-seconds |
300 |
How often dirty balances are written to MySQL |
allow-payments |
true |
Allow /pay between players |
minimum-payment |
0.01 |
Smallest accepted payment |
report
| Key |
Default |
Description |
report.presets.<id>.display |
— |
Name shown on the category button |
report.presets.<id>.icon |
— |
Material used as the button |
report.presets.<id>.description |
— |
Short line under the name |
report.presets.<id>.target-required |
true |
Whether a player is picked before the description |
nick, skin
| Key |
Default |
Description |
nick.restricted |
dev, owner |
Nicks and LuckPerms groups only server operators may use |
nick.show-rank-prefix |
true |
Show the player's own LuckPerms rank prefix with /nick <nick> |
nick.hide-nametag |
true |
Hide the name tag above every player's head (also /nametags <enable|disable>) |
nick.chat-format |
&f<%nickname%>&r %message% |
The chat line, used while no other plugin formats chat |
skin.cache-minutes |
60 |
How long a skin fetched from Mojang is cached |
skin.timeout-seconds |
10 |
How long to wait for an answer from Mojang |
spawn, homes, warps, teleport
| Key |
Default |
Description |
spawn.teleport-on-join |
false |
Teleport every player to spawn on join |
spawn.teleport-on-first-join |
false |
Teleport only on a player's first join |
spawn.respawn-at-spawn |
false |
Respawn players at spawn |
homes.max |
3 |
Default homes per player (override with betteradmincommands.homes.limit.<amount>) |
homes.gui-rows / homes.gui-icon |
6 / RED_BED |
Layout of the /homes menu |
warps.gui-rows / warps.gui-icon |
6 / COMPASS |
Layout of the /warps menu |
warps.gui-icons.<name> |
— |
Optional icon for one warp, e.g. spawn: NETHER_STAR |
teleport.warmup-seconds |
3 |
Time a player must stand still before a delayed teleport |
teleport.request-expire-seconds |
60 |
Lifetime of a /tpa request |
teleport.back-cooldown-seconds |
0 |
Cooldown before /back can be used again |
teleport.back-enabled |
true |
Remember previous teleport locations for /back |
moderation, afk, jail, rtp
| Key |
Default |
Description |
moderation.default-mute-seconds |
-1 |
Default mute length; -1 means permanent |
moderation.mute-message |
see file |
Message muted players see when they chat (%reason%) |
moderation.vanish-tab-cue |
&7[&8V&7] &r |
Marker shown in front of a vanished player in the tab list |
moderation.vanish-mobs-ignore |
true |
Mobs stop targeting a vanished player (and forget them) |
moderation.vanish-silent-containers |
true |
Containers a vanished player opens make no sound and no animation |
afk.auto-afk-enabled |
true |
Mark players as away automatically |
afk.auto-afk-minutes |
10 |
Idle minutes before auto-afk kicks in |
jail.radius |
8.0 |
How far a jailed player may move before being pulled back |
rtp.max-radius / min-radius |
2000 / 200 |
Ring used by /rtp |
rtp.max-attempts |
30 |
Attempts to find a safe spot |
rtp.disabled-worlds |
nether/end |
Worlds where /rtp is not allowed |
Menu layouts
| Key |
Default |
Description |
baltop.gui-rows |
6 |
Rows of the leaderboard menu (3-6) |
mail.gui-rows |
6 |
Rows of the mailbox menu (3-6) |
ignorelist.gui-rows |
6 |
Rows of the ignore menu (3-6) |
jails.gui-rows / jails.gui-icon |
6 / IRON_BARS |
Layout of the jail list |
ptime.gui-rows / pweather.gui-rows |
3 |
Rows of the personal time and weather menus |
unlimited.gui-rows |
4 |
Rows of the unlimited-items menu |
realname.gui-rows |
6 |
Rows of the nickname overview |
kit-gui.rows / kit-gui.icon |
3 / CHEST |
Layout of the /kit menu; a single kit can set its own icon: |
sell.gui-rows |
6 |
Rows of the /sell window (1-6) |
notifications, worth, kits, messages
notifications.categories.<id> — display, permission and default for each notification a
player can toggle with /notify. The shipped ids are trade, report, kick, ban, unban,
mail and admin; add your own and they show up in the command automatically.
worth — map of MATERIAL: price used by /worth and /sell. Only listed items can be sold.
kits — kit definitions. Item format: "MATERIAL[:AMOUNT]" or
"MATERIAL:AMOUNT:ENCHANTMENT:LEVEL". A cooldown of -1 disables the cooldown. Kit entries are
re-read on every use, so editing them does not need a restart.
messages — prefix, motd and rules lists. Colour codes use & (e.g. &6).
How storage works
The plugin runs in one of two modes, switched automatically:
- Database available — MySQL is the source of truth. Reads come from the database; writes are
applied in memory immediately and flushed asynchronously (balances every
economy.save-interval-seconds, other services per operation). Every write is also mirrored into
the local safe files, so they stay current.
- Database unavailable — the plugin starts anyway and falls back to the local safe files in
plugins/Better_Admin_Commands/data/. Players can keep playing, nothing errors out, and every write
is stored locally.
When the connection comes back (periodic retry or /betteradmincommands reconnect), the local safe
files are synced into MySQL so no data is lost. This makes the database optional: you can run the
plugin entirely from the local files and add MySQL later without losing what players already did.
Reports are the one exception — they have no local safe file and need the database.
Backups and data files
/betteradmincommands backup dumps every table into
plugins/Better_Admin_Commands/backups/<yyyy-MM-dd_HH-mm-ss>/
├── players.yml
├── homes.yml
├── player_settings.yml
├── mail.yml
└── meta.yml
The dump reads its columns from the result set, so it keeps working if a table gains a column, and it
falls back to the local safe files when the database is unavailable. It runs asynchronously, but on a
large server it is still worth running during low traffic.
Everything the plugin generates lives in plugins/Better_Admin_Commands/:
config.yml main configuration
config-backup-v<n>-<stamp>.yml copy of config.yml taken before a version migration
spawn.yml spawn location (written by /setspawn)
warps.yml warp list (written by /setwarp)
jails.yml jail cells (written by /setjail)
data/players.yml local mirror of the players table
data/homes.yml local mirror of the homes table
data/player_settings.yml local mirror of the player_settings table
data/mail.yml local mirror of the mail table
data/auction.yml local mirror of the ah_listings table
data/shops.yml local mirror of the shops table
data/shop_items.yml local mirror of the shop_items table
data/trades.yml local mirror of the trades table
backups/<timestamp>/ table dumps created by /betteradmincommands backup
The data/ files are written on every change. They are the fallback source of truth while MySQL is
down and are pushed back into the database once the connection returns — so do not delete them while
the database is unreachable, and keep them if you migrate servers.
Troubleshooting
| Symptom |
What to do |
| A command answers "this feature is switched off" |
Check modules.<id>.enabled (and for economy, trade, auction and shop also their own enabled key) — /betteradmincommands modules shows the state |
| Nothing works at all, every command answers with a notice |
The plugin was switched off with /betteradmincommands disable; use /betteradmincommands enable |
| A command does nothing at all |
Another plugin declares the same name — /betteradmincommands info lists the commands this plugin could not bind |
| No dialogues open |
The client is older than 1.21.6; the same question is printed in chat and the answer is read from there |
| Shop is empty after installing EconomyShopGUI |
/shop import, or check shop.import.folders and the console line naming the files that were read |
| Shop prices look wrong |
Entries the import could not read get buy_price = -1; the editor marks them, /shop edit fixes them |
| Report system "unavailable" |
Reports need MySQL; there is no local safe file for tickets |
| Name tags are back |
nick.hide-nametag is off, or another plugin (scoreboard/TAB) took the teams over |
| Rank prefix missing in chat |
Another chat plugin formats chat; make it use the display name or the %betteradmincommands_nickname% placeholder |
| Database wrote nothing |
/betteradmincommands database walks the connection and names the failing step |
License
This Project is Published under the MIT License