Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
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/
Platforms
Paper
1.20–26.1.2