Framework
XCore
FreeThe shared framework. Database, cache, cross-server sync, menus and economy — written once instead of five times.
What it does
Every X plugin needs the same things: somewhere to put data, a cache in front of it, a way to reach the other servers in the network, menus, and money. XCore does all of that once. Addons drop into plugins/XCore/addons/ and inherit a three-layer cache, MySQL, PostgreSQL or SQLite with pooling, Redis pub/sub synchronisation, YAML-defined GUIs, and a multi-currency economy that registers itself with Vault. Free.
Worth knowing
- Three cache layers
- Caffeine in memory, Redis shared across servers, database underneath. Addons get all three for free.
- One database connection
- MySQL, PostgreSQL or SQLite through HikariCP — configured once, used by every addon.
- Cross-server sync
- Redis pub/sub where available, database polling where it isn't. Addons register channels; XCore multiplexes them.
- GUIs defined in YAML
- Menus, pagination, click actions and sounds, editable without touching Java.
- Multi-currency economy
- Define as many currencies as you like; one of them becomes the Vault provider that other plugins see.
- Web dashboard
- An HTTP panel each addon extends with its own pages. Login is a one-click link from in-game, no token to configure.
The full list — 18 entries
- Three-layer caching system (Caffeine, Redis, Database)
- Multi-database support (MySQL, PostgreSQL, SQLite with HikariCP)
- Cross-server synchronization via Redis Pub/Sub or DB polling
- YAML-driven GUI framework with pagination and click actions
- Multi-currency economy system with Vault integration
- Language system using MiniMessage formatting
- Built-in web dashboard with REST API and metrics
- Addon loading system with full lifecycle management
- Table and query builder with upserts, transactions and schema migrations
- Delivery service — items and money reach a player who was offline
- Leaderboards declared once, served as placeholders
- Network registry — which servers are up, and where a player is
- One Discord webhook queue for every addon, with rate-limit handling
- Play time tracked per player across sessions
- PlaceholderAPI expansion support
- Folia compatibility for region threading
- Bedrock player detection via Geyser/Floodgate
- Custom model data and item models support in GUIs
What changed in 1.0.9
- Fixed the plugin refusing to start when PlaceholderAPI loads after it
- Fixed player data staying stale on the other servers after a change, balances included
- Fixed the currency list coming back after a rename, and any other section you name yourself
- Fixed teleports loading their chunk on the main thread outside Folia
- Fixed obsolete keys never being removed from a language file
- Fixed last login and last logout never reaching the cache
31 more
- Fixed the update builder throwing away the number of rows it touched
- Added the database API to XCoreApi, api().query() and api().tableManager() now exist
- Added transactions, upserts, unique indexes and versioned migrations
- Added a delivery service, an addon can give an item or money to an offline player
- Added play time tracking, with %xcore_playtime%
- Added leaderboards, declared once and served as placeholders and on the dashboard
- Added a network registry, which servers are up and where each player is
- Added a shared Discord sender with a queue, retries and rate limit handling
- Added PagedGui, the paginated screen every addon was writing by hand
- Added cooldowns, item serialisation, rank lookups and placeholder registration to the API
- Added duration parsing to Formats, 1d12h and the like
- XCore registers its own placeholders, which it never did
- Column writes are grouped, one statement per player instead of one per column
- Database work runs on its own pool, so a query can no longer starve the one waiting for it
- Redis holds one copy of a player instead of two
- Sync messages travel in batches
- /xcore diag measures the width of the players table and names the heavy columns
- Removed around 2 200 lines of framework no addon ever used
- The dashboard no longer counts the whole players table on every overview refresh
- Indexed players.last_login, which the dashboard sorts on
- The last_login column check is resolved once instead of on every request
- Added an XCore addons section to /plugins, they were invisible to it, in Paper's own layout
- /bukkit:plugins and /bukkit:pl answer the same way, so the two forms cannot disagree
- Added synchronous query methods, for code already off the main thread
- Added database-side paging to PagedGui, for a list too big to hold in memory
- PagedGui only redraws the navigation bar between blinks, not the whole page
- orderBy can be called several times, one clause per column
- A cooldown longer than an hour is no longer cut short at an hour
- A list no longer reopens itself a few ticks after you closed it
- A paginated screen can re-read its list on a timer, for a list other people change while you watch
- The UUID migration setting is held instead of read from the config on every join