Announcements & automatic messages addon for XCore — cycling BossBar, Title, ActionBar, Chat and Scheduled messages, a tab-list and scoreboards, reusable display conditions, text animations, and fully customizable join / first-join / quit messages with conditional variants.
- BossBar — cycling titles with color, style, progressive animation (fill/drain), per-entry display time, optional time-range
- Title — main title + subtitle with configurable fade-in / display time / fade-out per entry
- ActionBar — cycling messages with configurable display duration per entry
- Chat — cycling messages with MiniMessage formatting (including click/hover events)
- Scheduled — messages that fire once per day at a specific real-world time (HH:mm); supports chat, title and actionbar
- Live tab-list — one header/footer refreshed continuously; any PlaceholderAPI placeholder works
- Live scoreboards — define multiple sidebars; for each player the first one whose condition (and permission/worlds) matches is shown (config order = priority)
- Packet-based (FastBoard) — works on Folia
- Anti-flicker — optimized scoreboard with anti-flickering system
- Conditional lines — a line that resolves to an empty string is hidden, so
%xannounce_condition_<name>%makes a line appear/disappear on its own - Up to 15 lines per scoreboard; configurable global refresh rate (
display.refresh-ticks)
- Define named conditions under
conditions:once, then reference them everywhere withcondition: <name> - Each condition combines its sub-conditions with
ANDorOR - Operators:
===!=>=<=><contains!contains(numeric when both sides are numbers, otherwise case-insensitive text) - Usable as a value too:
%xannounce_condition_<name>%prints the condition'syes/nooutput - Gates auto-messages, scoreboards, tab-list, individual scoreboard lines, and join/quit variants
- Define animated text under
animations:(a list of frames + an interval in ms) - Insert
%animation:<name>%in any text — tab-list, scoreboard, bossbar, title, chat, join/quit… - Frames may themselves contain placeholders; the current frame is derived from the wall clock (every player sees the same frame at the same moment)
- Custom join, first-join and quit broadcasts (replace or hide the vanilla messages)
- Multiple conditional variants per group under
variants:— the first variant whoseconditionpasses is used (e.g. a different join message for VIPs); a variant with no condition is the fallback. Omitvariants:for a single message. first-joinfires the very first time a player connects (falls back tojoinwhen no first-join variant matches)- On join, additionally give the player: a sound, a title/subtitle, an action bar, a temporary boss bar, and a private chat message
- Each effect is independently toggleable; quit uses the broadcast only
%player%works without PlaceholderAPI; PAPI, built-ins and animations are also supported
condition— show only when a named condition (or an inline expression like%player_level% >= 10) passes. Legacy alias:placeholder-condition.permission— restrict to players with a permission (e.g. VIP-only announcements)worlds— restrict to specific worldsdisabled-worlds— hide in specific worlds; a per-message list overrides the globaldisabled-worldsfor that message (full per-message control)time-range(bossbars) — only display during a window, e.g.20:00-06:00(supports cross-midnight)
- Players toggle each type with
/xannounce toggle <type>(bossbars, titles, actionbars, chats, tablists, sidebars) - Preferences are stored in XCore's database and persist (per-server, or shared via cross-server sync)
- BossBars are dynamically loaded/unloaded when toggled
- Any cycling group can use
mode: randominstead of sequential cycling - Optional
weightslist for weighted probability (e.g.[3, 1, 1]makes the first message 3× more likely)
%xannounce_bossbar_enabled%/%xannounce_title_enabled%/%xannounce_actionbar_enabled%/%xannounce_chat_enabled%— the player's toggle states%xannounce_condition_<name>%— the named condition'syes/nooutput for the player
- Full config editor — a "Config" page that loads, validates and saves the entire
config.yml, then reloads the addon. Invalid YAML is rejected before anything is written, so a syntax error can never break the live config. GET /api/xannounce/config/raw— rawconfig.ymltext ·POST— validate + write + reloadGET /api/xannounce/messages— list configured messages ·GET /api/xannounce/status— counts, scheduler state, PAPI, display statsGET /api/xannounce/player/<name>— a player's toggles ·POST /api/xannounce/player/togglePOST /api/xannounce/reload— reload ·POST /api/xannounce/toggle— enable/disable a configured message
- Single async refresh clock drives the tab-list + scoreboards; all per-player work runs on the player's own region thread (Folia-safe)
- Static lines/titles/header/footer are resolved and parsed once and shared — PlaceholderAPI and MiniMessage only run for lines that actually change
- Pre-joined tab-list text, pre-compiled patterns, and allocation-free condition evaluation keep the hot path light
- Uses XCore's SchedulerAdapter throughout; player-specific work (titles, action bars, bossbars, placeholder resolution) runs on the player's region thread
- Packet-based scoreboards instead of the Folia-incompatible Bukkit Scoreboard API
| Command | Description | Permission |
|---|---|---|
/xannounce |
Show plugin version (alias /xan) |
None |
/xannounce reload |
Reload the full configuration (config, conditions, animations, tab-list, scoreboards, join/quit) and restart schedulers | xannounce.admin |
/xannounce test <name> |
Preview a configured message on yourself | xannounce.admin |
/xannounce toggle bossbars |
Toggle BossBar messages | None |
/xannounce toggle titles |
Toggle Title messages | None |
/xannounce toggle actionbars |
Toggle ActionBar messages | None |
/xannounce toggle chats |
Toggle Chat messages | None |
/xannounce toggle tablists |
Toggle the tab-list | None |
/xannounce toggle sidebars |
Toggle the scoreboard | None |
The config.yml is organized top-to-bottom as: general → conditions → animations →
display → tablist → scoreboards → auto-messages → join-quit.
conditions— reusable named display conditionsanimations— named animated text fragments (%animation:<name>%)display.refresh-ticks— how often the tab-list / scoreboards refreshtablist— the live tab-list header/footerscoreboards— one or more live, condition-selected sidebarsdisabled-worlds— global default for worlds where auto-messages are disabled (each section can override)auto-messages.bossbars/.titles/.actionbars/.chats/.scheduledjoin-quit.join/.first-join/.quit— with optionalvariants:
condition— named condition or inline expression (alias:placeholder-condition)permission— only show to players with this permissionworlds— restrict to specific worldsdisabled-worlds— hide in these worlds (overrides the global list)mode—sequential(default) orrandomweights— weighted random probabilities (only withmode: random)time-range(bossbars) — only display during a time window (e.g.20:00-06:00)
15s (seconds), 5m (minutes), 1h (hours), 1d (days) — combinable, e.g. 1m30s.
BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW
SEGMENTED_6, SEGMENTED_10, SEGMENTED_12, SEGMENTED_20, SOLID
- Required: XCore
- Optional: PlaceholderAPI (for placeholder support in messages, conditions and animations)