Refactor the parkour generator to improve jump accuracy, block placement, and lifecycle management.
- Improve jump calculation by normalizing heading vectors and adjusting height/distance constraints.
- Implement height overrides for tall materials (fences, trapdoors, glass panes) during block placement.
- Add difficulty-based special block generation (packed/blue ice).
- Fix block identity issues by using coordinate-based comparison instead of reference equality for scoring and cleanup.
- Optimize generation lead to reduce unnecessary block generation.
- Update leaderboard logic to only replace scores if the new score is strictly better (higher score or faster time).
- Add error handling for generator ticks to prevent session crashes.
build: update build configuration and dependencies
- Add `run-paper` plugin for easier local server testing.
- Update Gradle wrapper to version 8.14.3.
- Change WorldEdit dependencies to `compileOnly`.
- Configure `runServer` task with Minecraft 1.21.4 and PlaceholderAPI.
fix(ui): improve scoreboard placeholder handling
- Add check for PlaceholderAPI plugin enablement before attempting to use it.
- Add 4-phase implementation plan (8-12 days)
- Define architecture: adaptive/, statistics/, refactored generator/
- Specify metrics collection and skill analysis system
- Plan ElytraMode fix and RoguelikeMode addition
- Include SQL migration for player stats table
- Update gravity-shift: change material to POTION, update description to reflect random potion effects
- Update hardcore: update description to clarify reward loss on fall
- Apply changes to both English and Russian locales
Created missing classes for ElytraMode:
- ElytraConfig: loads settings from config.yml
- ElytraRing: ring model with center, radius, direction
- ElytraRingGenerator: generates rings along curved path
- ElytraPhysics: checks ring crossings, falls, firework boosts
- ElytraRenderer: renders rings with particles
ElytraGenerator now has all dependencies and should work.
- Fix locale 'true' bug with sanitization at all levels:
* ConfigAccessor.getString() - force String.valueOf()
* Option.java - sanitize LANG defaults from config
* PlayerSettingsManager - sanitize on settings load
* SQLDataMapper - sanitize on SQL load
* StorageDisk - sanitize on JSON load
* SQLMigrationManager - SQL migration to fix DB
- Fix parkour first block position:
* Island.java - spawn 6 blocks forward + 1 up from center
* GeneratorCleanup.java - same position after fall/reset
- Add spawn-location config option at top of config.yml
- Fix locale default value parsing (Boolean → String)
- Move first block 3 blocks ahead after fall to avoid platform overlap
- Reduce initial generation from 5 to 3 blocks for better spacing
1. Fixed locale loading - changed from async to sync
- Locales now load synchronously on startup
- Prevents GUI showing stone items before locales load
2. Fixed infinite falling bug
- Added player teleport to spawn in processFall()
- Players now respawn correctly after falling
3. Fixed parkour generation not working
- Added missing tick cycle in SessionStateManager
- Generator now ticks every server tick (50ms)
- Parkour blocks now generate continuously
All three major bugs fixed and tested.
SchematicCommandHandler:
- Add validation for schematic names to prevent path traversal
- Restrict names to alphanumeric, hyphens, and underscores only
- Add length limit (max 64 characters)
- Apply validation to both save and paste commands
- Prevent filesystem attacks via malicious schematic names
Security improvement: blocks names like "../../config" or "../../../etc/passwd"
All changes tested and verified with build + tests passing.
Leaderboard:
- Fix integer overflow in time comparison using Integer.compare()
- Add synchronization to put() method to prevent race conditions
- Fix potential concurrent modification between put() and sort()
Score:
- Add validation for time format in getTimeMillis()
- Handle invalid time strings ("?") gracefully
- Return Integer.MAX_VALUE for invalid times (sorts last)
- Add try-catch for NumberFormatException
All changes tested and verified with build + tests passing.
- Updated cooldown handling in AdminCommandHandler to use localized messages.
- Added new method in Locales class to retrieve strings based on CommandSender type.
- Introduced cooldown messages in English and Russian localization files.
- Removed outdated DuelMode section from TODO.md and updated the last modified date.
- Updated LoLib dependency to version 3.0.0 in build.gradle.kts
- Added HikariCP and MySQL connector dependencies for improved database handling
- Enhanced jar minimization process to exclude JDBC pool and driver
- Refactored configuration management by introducing ConfigAccessor and ConfigLoader for better file handling and validation
- Removed deprecated GenerationOptions class and integrated its functionality into the new structure
- Improved command error handling and added cooldown hints for admin commands
- Created ElytraMode class with leaderboard support
- Auto-gives elytra and fireworks on mode start
- Added elytra mode config options
- Added Russian and English localization
- Integrated into mode selection menu
- TODO: Ring generation, boost system, collision detection