Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
ZDiscord bridges Minecraft and Discord: two-way chat with webhook avatars, live server status (players/TPS) and more!
Added
- Halloween seasonal event — A configurable seasonal mob hunt with customizable date window (halloween.window-start / halloween.window-end), mob kill tracking, point scoring, and finale rewards. PvP kills are excluded.
- In-game /zdiscord halloween [status|top] displays event dates, personal points, and standings with the default player permission zdiscord.halloween.
- Discord /halloween slash command displays event state, standings, and countdown.
- Daily countdown announcements in Discord and Minecraft broadcasts leading up to the event opening.
- Live standings embed panel auto-updating during the event window.
- Milestone announcements when players reach configured point thresholds, with boss multiplier bonuses for dragons, withers, and elder guardians.
- Configurable event timezone, eligible worlds and mob types, excluded game modes, and spawner-mob filtering.
- Optional Halloween join titles, ambient sounds, and milestone particles with separate appearance controls (cosmetics require explicit opt-in).
- Independent switches for opening announcements and public Minecraft broadcasts.
- Automatic ticket inactivity closure, persistent exclusive staff claims, and complete paginated transcripts with chronological attachments and embed records.
Changed
- Configuration schema version bumped to 16; existing settings are preserved while new defaults are materialized.
- Startup banner counts 17 modules, including the seasonal event.
- Halloween messages and displays use concise text, orange accents, and numbered standings; all in-game text customizable via messages.yml.
- Seasonal progress is described as points to reflect boss bonuses; Discord standings capped at 25 entries.
- Removed empty internal lifecycle hooks, unused message templates and status fields, obsolete ticket-count writes, and decorative emoji.
Fixed
- Setup dropdowns and modals check administrator permissions in the configured guild; category IDs, colors, and limits are validated.
- Reloads unregister command-log listeners, cancel console and lockdown timers, and reconcile public API settings.
- Shutdown drains Discord callbacks before closing storage and prevents late bot reconnects.
- Paper staff-chat toggles relay each message once, namespaced sensitive commands redact arguments, and Discord console works when the chat channel is unset.
- Shaded SLF4J providers are discovered through the plugin classloader, and turning off log suppression restores normal library logging.
- Text conversion preserves literal ampersands and strips hex colors correctly. Slash profile, seen, and following titles honor message settings; update checks avoid duplicate notices and tolerate oversized version numbers.
- Ticket controls validate the configured guild and tracked channel; failed interaction acknowledgements or deletion requests release the closing guard for retry.
- Required account linking supplies a code in the rejected login message. Each Minecraft account has one pending code, and relinking keeps both account directions consistent.
- Concurrent playtime flushes claim each interval once, preserving fractional seconds. Leaderboard updates persist in the same order as accepted changes.
- Stored follows are available before a player joins; reloads and the public follower API preserve accepted buffered writes.
- Configuration reloads and Discord setup reconcile enabled modules, refresh channel settings, and replace repeating panel timers. Local linking and statistics also initialize without Discord.
- Discord panels serialize creation, ignore stale callbacks, and replace messages only when Discord confirms deletion.
- Ticket interactions defer before channel creation. Atomic reservations enforce linked-account limits, private channels explicitly grant bot access, and slots are released only after confirmed deletion.
- MySQL schema failures close the connection pool and select YAML fallback instead of reporting a working database.
- Discord REST/callback workers drain before Paper closes the plugin classloader. Disabled-plugin database cleanup avoids rejected scheduler tasks, and concurrent ticket welcomes display their own ticket number.
- Link/follow event threading matches the caller. Join/follower database lookups run off the game thread, and delayed welcome messages use the player scheduler.
- Update notifications use Spigot-compatible clickable components. Advancement embeds use display titles, and quit embeds show the correct online-player count.
- Discord attachments carry clickable Minecraft URLs using the Spigot component API.
- Minecraft seasonal scoring and commands remain available without a connected Discord bot.
- Creative, Spectator, passive-mob, and spawner kills are excluded from the default hunt.
- Actual mob deaths and boss bonuses contribute to the hunt, including milestones crossed by a multi-point kill.
- Event reloads retire old panel loops, preserve in-flight panel creation, and retain scores and reward claims across the master switch.
- Late and offline finale checks recover the recorded event, and winner rewards apply to first place only.
- MySQL write ordering prevents stale score writes from replacing newer values; shutdown drains pending writes before closing the pool.
Platforms
Paper
1.20–26.3