Tags
Creators
Details
2.0.0
Compatibility
Changes

Easy Announcements 2.0.0
The rewrite update
Overview
Easy Announcements 2.0.0 is a full rewrite for Paper 26.2 on Java 25. Announcements are now driven by presets, targeting understands LuckPerms groups and permissions, announcements can run on a schedule, and there is a proper developer API for other plugins to build on.
Your 1.x configs are converted automatically on first start and the originals are kept as config.v1-backup.yml and discord.v1-backup.yml. Old esa.* permissions still work.
Platform
- Updated to Minecraft 26.2 and the Paper 26.2 API
- Now requires Java 25 (Paper 26.2 requires it)
- Runs on Paper, Purpur and other Paper forks
- Updated PlaceholderAPI (2.12.3) and DiscordSRV (1.30.5) integrations
- Added LuckPerms (API 5.5) integration
Presets
A preset is a complete look: title, chat layout, action bar, boss bar, sound and Discord embed settings.
- Five presets included:
default,alert,restart,tip,event - Add unlimited presets, anything you leave out inherits from
default - Choose one per announcement with
-p <preset> - Lock a preset behind
easyannouncements.preset.<name> - Give a LuckPerms group its own default preset with meta
- Presets can be registered at runtime by other plugins
New display: action bar
- Text above the hotbar with a configurable duration
- Automatically re-sent so it does not fade after two seconds
- Toggle per preset like every other display
Text formatting
- MiniMessage support everywhere: gradients, hex colors, hover text, clickable links
- Classic
&codes and&#RRGGBBhex still work and can be mixed with MiniMessage in the same line - Chat announcements are now a plain list of lines, add or remove as many as you want
- Message formatting by the sender is permission gated (
easyannouncements.format) and can be forced on or off in the config - New
messages.yml, every message the plugin sends is editable
Targeting
@aall players<player>one player@w <world>one world@g <group>a LuckPerms group, inherited groups included (new)@p <permission>players holding a permission (new)@syourself (new)group:staffandworld:netherinline forms (new)- Per-selector permissions:
easyannouncements.target.<name> - Optional
targets.receive-permissionso only certain players receive announcements - Smarter tab completion for selectors, worlds, groups, presets and flags
Command options
New flags that go before the message:
-p <preset>pick a preset--silentskip the sound--no-discorddo not post to Discord--forcereach players who muted announcements--only title,chatuse only these displays--no bossbarskip these displays
New commands
/ea preview [-p preset] <message>show an announcement only to yourself/ea presetslist the presets you may use, click to insert/ea history [count]recent announcements with time, sender and target/ea lastsend the last announcement again/ea toggleplayers can hide announcements for themselves/ea schedules [run <id>]list schedules or fire one now/ea updatecheck Modrinth on demand/ea versionversion, Minecraft version and active hooks- All commands share one root:
/ea,/announce,/announcement,/esa,/easyannouncements /esareloadkept as a legacy alias
Scheduled announcements
- Any number of schedules, each with its own interval, preset, target and message list
- Sequential or random rotation
- Minimum online players before a schedule runs
- Optional Discord posting per schedule
%easyannouncements_schedule_next_<id>%shows the countdown
Update notifications
- Checks Modrinth on startup and on a configurable interval
- Only reports releases that list your Minecraft version, so you never get told about an update you cannot run
- Console notice plus a clickable in-game message for anyone with
easyannouncements.updatewhen they join - Configurable join delay, prerelease opt-in, and an
UpdateAvailableEventfor developers
LuckPerms integration
-
@g <group>targeting, including inherited groups -
Placeholders without PlaceholderAPI:
%sender_prefix%,%sender_suffix%,%sender_group%,%player_prefix%,%player_group% -
Meta keys per group or user:
easyannouncements.cooldownseconds between announcementseasyannouncements.max-lengthmessage length limiteasyannouncements.presetpreset used when none is given
-
Offline permission checks for Discord linked accounts
-
Reworked permission tree:
easyannouncements.announce,.admin,.target.<selector>,.preset.<name>,.format,.bypass.cooldown,.update,.discord,.toggle,.receive -
Legacy
esa.*nodes are mapped onto the new ones
PlaceholderAPI integration
-
Placeholders are parsed for the receiving player in every display
-
Relational placeholders (
%rel_...%) between sender and receiver -
New
%easyannouncements_*%expansion:_last_message%_last_sender%_last_preset%_last_target%_last_count%_last_time%_total%_presets%_preset_count%_muted%_cooldown%_update_available%_latest_version%_version%_hooks%_schedule_next_<id>%
Discord integration (DiscordSRV)
- Multiple channels, by channel ID or DiscordSRV channel name
- Three modes:
embed,textandwebhook - Message content above the embed, with role, user,
@everyoneand@herementions - Per-preset embed color, title and channel override
- Slash command with
message,targetandpresetoptions, presets offered as choices - Prefix command with
target:andpreset:tokens, optional command message deletion - Restrict commands to specific channels
- Permissions by role ID, user ID, Discord administrator, or a linked Minecraft account holding
easyannouncements.discord, checked through LuckPerms even when the player is offline - Linked users announce under their Minecraft name
- Sender avatars now use UUIDs, so name changes no longer break the head image
- Embed fields moved to a clean list, placeholders work in field names and values
- Announcements sent from Discord no longer echo back to Discord by default
Developer API
EasyAnnouncementsAPI api = EasyAnnouncementsProvider.get();
api.broadcast(Announcement.builder("Boss spawns in <yellow>2 minutes</yellow>")
.source(AnnouncementSource.api("MyBossPlugin"))
.preset("event")
.placeholder("boss", "Ender Dragon")
.disableDisplay("bossbar")
.build());
Announcementbuilder with preset, source, placeholders, metadata, display toggles and force deliveryAnnouncementResultwith recipients, displays used and Discord statusAnnouncementDisplayregister your own delivery channel (holograms, scoreboards, Bedrock forms), presets can carry your own keys throughPreset#customTargetResolverregister your own selectors such as@teamor@radiusPlaceholderProviderregister%your_placeholder%values with no PlaceholderAPI neededregisterPresetcreate presets at runtime- Events:
AnnouncementPreSendEvent(cancellable, can swap the announcement or edit recipients),AnnouncementSentEvent,UpdateAvailableEvent - Helpers:
render(),renderPlain(),resolveTargets(),history(),lastAnnouncement(),setMuted(),reload() - Also published through Bukkit's
ServicesManager
Configuration
config.ymlreorganised aroundgeneral,update-checker,targets,presetsandschedules- New
messages.yml discord.ymlrebuilt for multi-channel, modes and linked account permissions- Missing keys are added on start with their comments, your edits are preserved
- Automatic 1.x migration with backups
- Every file reloads with
/ea reload, including the Discord listener and schedules - Sounds accept modern keys (
minecraft:block.bell.use), resource pack keys and the old enum names - Boss bar styles accept both
PROGRESS/NOTCHED_10and the oldSOLID/SEGMENTED_10names - Title fade timings accept decimals
Fixes and internals
- Boss bars are removed correctly when a player leaves or the plugin reloads, no more stuck bars
- Boss bar and action bar tasks are cancelled per player instead of leaking
- Invalid colors, styles, animations and sounds warn once instead of spamming the console
- Player names are matched exactly first, so a partial name no longer hijacks a message
- Announcement history is capped and configurable
- Cooldowns per sender with a bypass permission
- Console, Discord, schedules and API calls are all treated as first class senders
- Discord and PlaceholderAPI classes are isolated so a missing plugin can never cause a class load error
- Plugin now shuts down cleanly, unregistering the expansion, listeners and service
Upgrading from 1.x
- Stop the server and replace the jar
- Start the server, your configs are converted and backed up automatically
- Check
config.yml, the oldtitle,chat,bossbarandsoundsections now live underpresets.default - Set
discord.channelsindiscord.ymlif you usedchannel-id - Optional: switch your LuckPerms groups from
esa.*to theeasyannouncements.*nodes
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:MRBgVYKT:BU0XkUUI"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:MRBgVYKT:BU0XkUUI"
}

