## 1.6.0 - 2026-08-17
### Added
- Dependabot configuration for automatic Gradle and GitHub Actions updates
- Code quality workflow (Checkstyle, SpotBugs, Tests) running on PR/Push
- Checkstyle and SpotBugs plugins with default configurations
- Preview notifications feature fully integrated (scheduled unlock/lock previews)
- Sound effect configuration reload on `/reload`
- AsyncLogger properly restarted on config reload to avoid resource leaks
- Updated Gradle wrapper to 9.7
- Updated Java target version to 25 (while maintaining compatibility)
- **Lock reasons**: Customizable reason displayed when blocking (e.g., "Maintenance", "Event in progress") - can be configured in `config.yml` and used in broadcast messages
- **Grace period**: Temporary unlock after locking to allow players to exit safely - configurable duration in seconds
- **Player/entity whitelists**: Whitelisted players/entities can bypass the lock - configured in `config.yml` with `/whitelist add` command
- **Preview notifications**: Warn players X seconds before automatic lock/unlock - configurable in `config.yml`
- **Sound effects**: Play custom sounds when attempting to access locked End - configurable in `config.yml`
- **Attempt rate limiting**: Prevent log spam from rapid attempts - configurable in `config.yml`
- **Detailed attempt logging**: Log player name, source world, method used (portal/command/teleport) - fully configurable in `config.yml`
- **Countdown timers**: Visible countdown before scheduled lock/unlock - visible in chat during scheduled events
- **Pause/resume schedules**: Temporarily override scheduled events with `/endlock pause` and `/endlock resume` (permission: `endlock.admin`)
- **Lock history**: View recent lock/unlock actions with `/endlock history` (permission: `endlock.history`) - shows last 10 entries with timestamps
- **Undo last action**: Quickly reverse the most recent lock/unlock command with `/endlock undo` (permission: `endlock.undo`) - reverses last recorded action
- **Configuration validator**: Check `config.yml` for errors with `/endlock validateconfig` (permission: `endlock.validate`) - validates YAML syntax and required settings
- **Cached permission lookups**: Optimize permission and configuration checks - uses PermissionCache for faster lookups
- **Asynchronous logging**: Move file I/O off main thread to prevent lag - async logger prevents server performance impact
- **Mobile-friendly alias**: `/el` as short alias for `/endlock`
### Fixed
- NullPointerException in LockReasonManager.getReasons() when lock-reasons section missing
- Case-sensitive player name comparison in WhitelistChecker (now case-insensitive)
- GracePeriodTask active flag made volatile for correct visibility between threads
- AsyncLogger thread leak on reload (previous instances now shut down)
- Missing preview notification scheduling for scheduled lock/unlock events
### Changed
- GracePeriodTask logic unchanged (still unlocks after lock; behavior confirmed as intended)
- Updated build.gradle to include gradlePluginPortal() for plugin resolution
- Updated checkstyle config to minimal rule set
- Updated SpotBugs version to 6.5.10 (compatible with Gradle 9+)
- Updated `config.yml` with new v1.6 options (preview-notifications, sound-effects, lock-reasons, grace-period, whitelists, logging.rate-limit-seconds, scheduled-unlock.countdown)
- Updated `messages_en.yml` and `messages_de.yml` with new message keys
- Updated `plugin.yml` with new commands and permissions
- Consolidated all subcommands (history, undo, validateconfig) to be accessible only via `/endlock`, `/lock`, and `/el` aliases to avoid command conflicts with other plugins
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }