Skip to main content

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​

  1. Multiple Announcement Channels: Each announcement can send via chat, title/subtitle, actionbar, bossbar, or any combination.
  2. Announcement Pools: Define independent pools (tips, rules, new-player) with their own intervals, running simultaneously.
  3. Rich Message Format: Every announcement supports multi-line chat, titles, subtitles, action bar, sounds and fade timing.
  4. BossBar Announcements: Show announcements as temporary boss bars with configurable color, style, and duration.
  5. Sequential or Random Order: Each pool can cycle through announcements in order or pick randomly.
  6. Per-World Restrictions: Restrict pools to specific worlds (e.g., mining tips only in the resource world).
  7. Permission-Based Viewing: Show certain pools only to players with a specific permission node.
  8. Player Toggle: Players can opt out with /announcements toggle (or just /announcements). Revoke nexalannouncements.toggle from a group to keep announcements on for it: without the permission, a player always receives them, whatever they toggled before.
  9. Admin GUI: /announcements admin opens 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.
  10. 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 (done to save, cancel to abort); titles, sounds and boss bars stay in messages.yml. Pool Settings edits the pool's running state, interval, order, worlds and permission, and Back returns to the pool.
  11. 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).
  12. Manual Broadcast & Pause: Trigger specific announcements on demand. Pause and resume pools; a paused pool stays paused after a restart.
  13. Dual JSON / SQL Storage: Player preferences stored in data.json by default; migrate to MySQL/MariaDB any time with export/import.
  14. Hot-Reload: Edit config.yml or messages.yml and they reload automatically. Pools pick up the new settings; paused pools stay paused and rotations keep their place.
  15. Full Message Customization: Every plugin message (toggle confirmations, admin feedback, errors) is customizable in messages.yml with 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​

CommandDescriptionPermission
/announcementsToggle announcements (players); help menu for admins and the consolenexalannouncements.toggle
/announcements help [page]Show help menuNone
/announcements toggleToggle receiving announcementsnexalannouncements.toggle

Admin Commands​

CommandDescriptionPermission
/announcements admin listList all poolsnexalannouncements.list
/announcements adminOpen the admin menu (console: admin help)nexalannouncements.admin
/announcements admin help [page]Show the admin commandsnexalannouncements.admin
/announcements admin reloadReload configurationnexalannouncements.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 privatelynexalannouncements.admin
/announcements admin pause \<pool>Pause a poolnexalannouncements.admin
/announcements admin resume \<pool>Resume a paused poolnexalannouncements.admin
/announcements admin exportExport player data to JSONnexalannouncements.admin
/announcements admin importImport player data from JSONnexalannouncements.admin

Aliases: /announce, /ann

Permissions​

PermissionDescriptionDefault
nexalannouncements.*All permissionsop
nexalannouncements.toggleToggle announcements on/off. Without it, announcements are always ontrue
nexalannouncements.receiveReceive announcementstrue
nexalannouncements.listList all poolsop
nexalannouncements.adminAll admin commandsop
nexalannouncements.newplayerReceive the default new-player pooltrue

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.

PlaceholderDescription
%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)​

  1. Run /announcements admin export (saves to plugins/NexalAnnouncements/export/)
  2. Change storage.type: sql in config.yml and set SQL credentials
  3. Restart the server (storage is chosen at startup; /announcements admin reload does not switch it)
  4. Run /announcements admin import

Database Schema​

When using SQL storage, the plugin creates:

announcements_preferences​

ColumnTypeKeyDescription
idVARCHAR(36)PKPlayer UUID
player_nameVARCHAR(16)Last known player name
announcements_enabledTINYINT1 = enabled, 0 = disabled
created_atBIGINTFirst seen timestamp
updated_atBIGINTLast updated timestamp

Installation​

  1. Download the latest NexalAnnouncements jar
  2. Place in your /plugins folder
  3. Start/restart server
  4. Edit plugins/NexalAnnouncements/config.yml to configure your pools
  5. Edit plugins/NexalAnnouncements/messages.yml to write your announcements
  6. Run /announcements admin reload or restart to apply changes