Tags
Creators
Details
0.2.2a
Compatibility
Changes
Wiki: https://github.com/castledking/Allium/wiki
Highlights
- Glow command — New
/glowcommand for per-player colored glow outlines using PacketEvents virtual team packets. Supports all 16 vanilla colors, rainbow cycling, and per-color permissions. No scoreboard pollution — teams are sent directly to viewers and never registered on any Bukkit scoreboard. - Join/Quit message permissions — Permission-based join/quit message formats via
allium.join_message.<id>andallium.quit_message.<id>. Set custom formats with LuckPerms metadata. - Chat system rewrite —
ChatMessageManager,FormatChatListener, andPacketChatTrackerImplsignificantly reworked for better PacketEvents integration and staff moderation features. - Flight restoration refactor —
FlightRestorationrewritten for improved Folia compatibility and reliability. - Command management —
CommandManagernow caches the server's known commands map with a 2-second TTL, eliminating repeated reflection calls.Helpcommand caches available commands per-player with a 3-second TTL. - TP companion teleportation — Pet/entity teleport-on-TP moved from
TPlistener to dedicatedTeleportBackListenerfor cleaner separation. - Inventory snapshot optimization —
InventoryManager.saveSnapshot()simplified to run directly on the calling thread instead of throughSchedulerAdapter.run().
New Commands
| Command | Description | Permission |
|---|---|---|
/glow <color> [player] |
Set glow color (e.g. /glow red, /glow dark_aqua) |
allium.glow + allium.glow.<color> |
/glow rainbow [player] |
Enable rainbow cycling glow | allium.glow.rainbow |
/glow off [player] |
Remove glow effect | allium.glow / allium.glow.others |
New Permissions
| Permission | Description | Default |
|---|---|---|
allium.glow |
Base glow permission (grants all 16 color sub-permissions) | op |
allium.glow.<color> |
Per-color (e.g. allium.glow.red, allium.glow.blue) |
via parent |
allium.glow.rainbow |
Rainbow glow mode | op |
allium.glow.others |
Target other players | op |
allium.join_message.<id> |
Custom join message format (value from LP metadata) | — |
allium.quit_message.<id> |
Custom quit message format (value from LP metadata) | — |
allium.join_message.* |
Wildcard — grants all join message formats | staff |
allium.quit_message.* |
Wildcard — grants all quit message formats | staff |
New Config
join-and-quit-messages:
join:
enabled: true
format: "&e%name% &7has joined the server"
quit:
enabled: true
format: "&e%name% &7has left the server"
broadcast-scope: server # server, world, or global
Setting Custom Join/Quit Messages with LuckPerms
Set a permission with a metadata value on a player:
/lp user <player> meta set allium.join_message.vip.a "rift in the universe has spawned %player%"
/lp user <player> meta set allium.quit_message.vip.a "%player% has left through a rift"
Supported placeholders: %name% (display name, respects /nick), %player% (real name), %prefix% (Vault prefix), %suffix% (Vault suffix).
The first matching permission (alphabetical by suffix) is used. If no permission metadata is found, the default config format is used.
Technical Details
Glow
- Uses PacketEvents
WrapperPlayServerTeamswithTeamMode.CREATE(includes both team info and player entries in one packet) TeamMode.UPDATEfor rainbow color changes,TeamMode.REMOVEfor cleanup- Packets sent to all online players including the target (the client needs to receive the team packet to render the colored outline)
- No
Bukkit.getScoreboardManager()usage — completely virtual - Folia-safe: no region-scheduled tasks needed
Join/Quit Messages
- Handled via standard
PlayerJoinEvent/PlayerQuitEvent(main thread on both Bukkit and Folia) - Permission metadata read through Vault Chat's
getPlayerInfoString() - Falls back to default config format if no permission match found
- Vanish check: vanished players don't show join/quit messages
Chat System
ChatMessageManagerrewritten with improved message storage and retrievalPacketChatTrackerImplupdated for better PacketEvents 2.11.1 compatibilityFormatChatListenersignificantly expanded with new formatting options
SchedulerAdapter
- All scheduled tasks route through
SchedulerAdapterwhich auto-detects Folia - Folia path: uses
EntitySchedulerfor entity-specific tasks,GlobalRegionSchedulerfor global tasks - Bukkit path: uses standard
BukkitScheduler - No raw
Bukkit.getScheduler()calls in new code
Files Changed (22)
| File | Change |
|---|---|
PluginStart.java |
Glow command + listener registration, glow field |
Glow.java |
New — /glow command with PacketEvents team packets |
GlowListener.java |
New — cleanup on player quit |
JoinQuitMessages.java |
New — permission-based join/quit messages |
ChatMessageManager.java |
Rewritten — message storage, tracking, moderation |
FormatChatListener.java |
Major rewrite — chat formatting, hover, click events |
PacketChatTrackerImpl.java |
Major rewrite — PacketEvents 2.11.1 integration |
FlightRestoration.java |
Major rewrite — Folia-safe flight state management |
CommandManager.java |
Known commands caching, getCachedKnownCommands() API |
Help.java |
Available commands caching, uses CommandManager cache |
| `TeleportBackListener.java** | Extracted from TP — pet/entity companion teleport |
TP.java |
Removed inline teleport listener, now delegates |
InventoryManager.java |
Simplified snapshot saving, removed SchedulerAdapter wrapper |
AlliumPlaceholder.java |
Import cleanup |
GeneralPlaceholder.java |
Import cleanup |
TFlyManager.java |
Import cleanup, formatting |
SpawnerChangerManager.java |
Minor cleanup |
config.yml |
New join-and-quit-messages section |
lang.yml |
New glow.* message keys |
plugin.yml |
New glow command, permission definitions |
pom.xml |
Paper version 1.21.8 |
Support and Feedback
Issues: https://github.com/castledking/Allium/issues Wiki: https://github.com/castledking/Allium/wiki Discord: https://discord.com/invite/pCKdCX6nYr Website: https://castled.codes/
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:ygnk0YMD:3Q6ksXDM"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:ygnk0YMD:3Q6ksXDM"
}

