Nexal Announcements
Scheduled announcements plugin for Minecraft servers. Rotate tips, rules, store links, and Discord invites to players at configurable intervals through chat, titles, actionbar, and boss bars. Free forever, by Nexal Studios.
Features
- Multiple Announcement Channels: Each announcement can send via chat, title/subtitle, actionbar, bossbar, or any combination.
- Announcement Pools: Define independent pools (tips, rules, new-player) with their own intervals, running simultaneously.
- Rich Message Format: Every announcement supports multi-line chat, titles, subtitles, action bar, sounds and fade timing.
- BossBar Announcements: Show announcements as temporary boss bars with configurable color, style, and duration.
- Sequential or Random Order: Each pool can cycle through announcements in order or pick randomly.
- Per-World Restrictions: Restrict pools to specific worlds (e.g., mining tips only in the resource world).
- Permission-Based Viewing: Show certain pools only to players with a specific permission node.
- Player Toggle: Players can opt out with
/announcements toggle(or just/announcements). Revokenexalannouncements.togglefrom a group to keep announcements on for it: without the permission, a player always receives them, whatever they toggled before. - Admin GUI:
/announcements adminopens a menu with Pools, Export, Import and Reload. Pools lists every pool with its status: left-click opens the pool, right-click pauses or resumes it, and New Pool creates one from a name typed in chat. - Pool Screen: Each pool's screen lists its announcements with their full message: left-click previews to yourself, right-click broadcasts to all, shift+right-click deletes after a confirmation. New Announcement writes one line by line in chat (
doneto save,cancelto abort); titles, sounds and boss bars stay inmessages.yml. Pool Settings edits the pool's running state, interval, order, worlds and permission, and Back returns to the pool. - PlaceholderAPI Support: Use any PlaceholderAPI placeholder in chat, title and action bar text, resolved for each player (boss bar text is shared, so it takes none).
- Manual Broadcast & Pause: Trigger specific announcements on demand. Pause and resume pools; a paused pool stays paused after a restart.
- Dual JSON / SQL Storage: Player preferences stored in
data.jsonby default; migrate to MySQL/MariaDB any time with export/import. - Hot-Reload: Edit
config.ymlormessages.ymland they reload automatically. Pools pick up the new settings; paused pools stay paused and rotations keep their place. - Full Message Customization: Every plugin message (toggle confirmations, admin feedback, errors) is customizable in
messages.ymlwith sounds and colors.
Technologies
- Paper API 1.20.1+: Minecraft server API
- Utilizer: Configuration, messages, items, tasks
- ACF: Command framework
- nexal-core: SQL persistence (MariaDB/MySQL)
- PlaceholderAPI: Placeholder integration (optional)
Commands
Player Commands
| Command | Description | Permission |
|---|---|---|
/announcements | Toggle announcements (players); help menu for admins and the console | nexalannouncements.toggle |
/announcements help [page] | Show help menu | None |
/announcements toggle | Toggle receiving announcements | nexalannouncements.toggle |
Admin Commands
| Command | Description | Permission |
|---|---|---|
/announcements admin list | List all pools | nexalannouncements.list |
/announcements admin | Open the admin menu (console: admin help) | nexalannouncements.admin |
/announcements admin help [page] | Show the admin commands | nexalannouncements.admin |
/announcements admin reload | Reload configuration | nexalannouncements.admin |
/announcements admin broadcast \<pool> [index] | Broadcast the next announcement, or the one at index (1 = first) | nexalannouncements.admin |
/announcements admin preview \<pool> \<index> | Preview announcement privately | nexalannouncements.admin |
/announcements admin pause \<pool> | Pause a pool | nexalannouncements.admin |
/announcements admin resume \<pool> | Resume a paused pool | nexalannouncements.admin |
/announcements admin export | Export player data to JSON | nexalannouncements.admin |
/announcements admin import | Import player data from JSON | nexalannouncements.admin |
Aliases: /announce, /ann
Permissions
| Permission | Description | Default |
|---|---|---|
nexalannouncements.* | All permissions | op |
nexalannouncements.toggle | Toggle announcements on/off. Without it, announcements are always on | true |
nexalannouncements.receive | Receive announcements | true |
nexalannouncements.list | List all pools | op |
nexalannouncements.admin | All admin commands | op |
nexalannouncements.newplayer | Receive the default new-player pool | true |
The default new-player pool uses permission: nexalannouncements.newplayer. Everyone has it out of
the box; negate it for your ranked groups so the tips reach new players only.
Placeholders
Requires PlaceholderAPI.
| Placeholder | Description |
|---|---|
%nexalannouncements_enabled% | Whether player has announcements enabled |
%nexalannouncements_pool_count% | Total number of configured pools |
%nexalannouncements_active_pools% | Number of non-paused pools |
%nexalannouncements_next_\<pool>% | The pool's interval, e.g. 300s (not a countdown); paused or unknown |
%nexalannouncements_pool_paused_\<pool>% | Whether a pool is paused (enabled: false) |
%nexalannouncements_pool_size_\<pool>% | Number of announcements in a pool |
Configuration
config.yml
# Storage type: "json" or "sql"
storage:
type: json
sql:
host: localhost
port: 3306
database: minecraft
username: root
password: ""
# Announcement pools
pools:
tips:
enabled: true
interval: 300 # seconds between announcements
order: sequential # sequential or random
worlds: [] # empty = all worlds
permission: "" # empty = all players
announcements:
- announcement-tip-1
- announcement-tip-2
rules:
enabled: true
interval: 900
order: sequential
worlds: []
permission: ""
announcements:
- announcement-rule-1
- announcement-rule-2
new-player:
enabled: true
interval: 180
order: random
worlds: []
permission: "nexalannouncements.newplayer"
announcements:
- announcement-newplayer-1
messages.yml: Chat Announcement
announcement-tip-1:
message:
- ""
- " <gradient:#FF69B4:#FF85C8>\<bold>💡 TIP\</bold>\</gradient>"
- ""
- " \<gray>Visit our store for exclusive items!\</gray>"
- " <gradient:#FF9DCE:#FFB8DC>store.example.com\</gradient>"
- ""
sound: "BLOCK_NOTE_BLOCK_PLING"
messages.yml: Title Announcement
announcement-event-1:
message:
- ""
- " <gradient:#FFC107:#FFCD38>\<bold>⚡ EVENT ACTIVE\</bold>\</gradient>"
- ""
- " \<gray>Double XP event is live! Go grind!\</gray>"
- ""
title: "<gradient:#FFC107:#FFCD38>\<bold>DOUBLE XP!\</bold>\</gradient>"
subtitle: "\<gray>Event ends in 1 hour\</gray>"
sound: "ENTITY_PLAYER_LEVELUP"
fade-in: 10
stay: 60
fade-out: 20
messages.yml: Action Bar Announcement
announcement-vote-1:
actionbar: "<gradient:#FF9DCE:#FFB8DC>Vote with /vote for daily rewards!\</gradient>"
sound: "BLOCK_NOTE_BLOCK_PLING"
messages.yml: BossBar Announcement
announcement-bossbar-1:
bossbar:
text: "<gradient:#FF69B4:#FF85C8>⚡ Join our Discord! discord.gg/example ⚡\</gradient>"
color: PINK
style: SOLID
duration: 15
messages.yml: Combined Channels
announcement-sale-1:
message:
- ""
- " <gradient:#FF69B4:#FF85C8>\<bold>🛒 STORE SALE\</bold>\</gradient>"
- " \<gray>50% off all ranks this weekend!\</gray>"
- ""
bossbar:
text: "<gradient:#FF69B4:#FF85C8>🛒 50% OFF ALL RANKS: store.example.com\</gradient>"
color: PINK
style: SOLID
duration: 20
sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
Editing in-game
Everything under pools can be edited from /announcements admin without touching YAML. Changes are
written to config.yml (new announcements to messages.yml, under keys like
announcement-\<pool>-1) and apply immediately. Reloading, from the menu, the command or by editing a
file, keeps paused pools paused and each rotation at its place.
A pool is either running or paused, and that is its enabled setting in config.yml. Pausing it with
/announcements admin pause, on the Pools screen or with the Running toggle in Pool Settings all
save enabled: false, so a paused pool stays paused after a restart until it is resumed.
Intervals below 5 seconds are raised to 5, with a warning in the console.
Storage Migration (JSON → SQL)
- Run
/announcements admin export(saves toplugins/NexalAnnouncements/export/) - Change
storage.type: sqlinconfig.ymland set SQL credentials - Restart the server (storage is chosen at startup;
/announcements admin reloaddoes not switch it) - Run
/announcements admin import
Database Schema
When using SQL storage, the plugin creates:
announcements_preferences
| Column | Type | Key | Description |
|---|---|---|---|
id | VARCHAR(36) | PK | Player UUID |
player_name | VARCHAR(16) | Last known player name | |
announcements_enabled | TINYINT | 1 = enabled, 0 = disabled | |
created_at | BIGINT | First seen timestamp | |
updated_at | BIGINT | Last updated timestamp |
Installation
- Download the latest
NexalAnnouncementsjar - Place in your
/pluginsfolder - Start/restart server
- Edit
plugins/NexalAnnouncements/config.ymlto configure your pools - Edit
plugins/NexalAnnouncements/messages.ymlto write your announcements - Run
/announcements admin reloador restart to apply changes