Wiki:
https://github.com/castledking/Allium/wiki
Highlights
- Glow command — New /glow command 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. and allium.quit_message.. Set custom formats with LuckPerms metadata.
- Chat system rewrite — ChatMessageManager, FormatChatListener, and PacketChatTrackerImpl significantly reworked for better PacketEvents integration and staff moderation features.
- Flight restoration refactor — FlightRestoration rewritten for improved Folia compatibility and reliability.
- Command management — CommandManager now caches the server's known commands map with a 2-second TTL, eliminating repeated reflection calls. Help command caches available commands per-player with a 3-second TTL.
- TP companion teleportation — Pet/entity teleport-on-TP moved from TP listener to dedicated TeleportBackListener for cleaner separation.
- Inventory snapshot optimization — InventoryManager.saveSnapshot() simplified to run directly on the calling thread instead of through SchedulerAdapter.run().
New Commands
| /glow [player] |
Set glow color (e.g. /glow red, /glow dark_aqua) |
allium.glow + allium.glow. |
| /glow rainbow [player] |
Enable rainbow cycling glow |
allium.glow.rainbow |
| /glow off [player] |
Remove glow effect |
allium.glow / allium.glow.others |
New Permissions
| allium.glow |
Base glow permission (grants all 16 color sub-permissions) |
op |
| allium.glow. |
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. |
Custom join message format (value from LP metadata) |
— |
| allium.quit_message. |
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
Code (Text):
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:
Code (Text):
/lp user meta set allium.join_message.vip.a "rift in the universe has spawned %player%"
/lp user 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
WrapperPlayServerTeams with
TeamMode.CREATE (includes both team info and player entries in one packet)
-
TeamMode.UPDATE for rainbow color changes,
TeamMode.REMOVE for 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
-
ChatMessageManager rewritten with improved message storage and retrieval
-
PacketChatTrackerImpl updated for better PacketEvents 2.11.1 compatibility
-
FormatChatListener significantly expanded with new formatting options
SchedulerAdapter
- All scheduled tasks route through
SchedulerAdapter which auto-detects Folia
- Folia path: uses
EntityScheduler for entity-specific tasks,
GlobalRegionScheduler for global tasks
- Bukkit path: uses standard
BukkitScheduler
- No raw
Bukkit.getScheduler() calls in new code
Files Changed (22)
| 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/