- **New!** Added heads/tails selection feature - players can now choose heads or tails before creating a coinflip game (enable in config.yml: heads-tails.enabled)
- **New!** Customizable heads/tails selection GUI - fully customizable through heads-tails.yml config file
- **New!** Heads/tails selection works with both command (/cf create) and GUI create button
- **New!** Support for Minecraft 1.8.8 - 1.21.10 and Java 8+
- **New!** 4 animation types: default (left-to-right), slot-machine, circular, and vertical
- **New!** 8 border animation effects: rainbow, pulse, wave, gradient, fade, random, sequence, basic
- **New!** Customizable animation settings (speed, direction, colors, etc.)
- **New!** Auto-fix corrupted language files - plugin automatically restores broken language files from backup
- **Fix!** Mojang API warnings in console - reduced API calls when loading player heads
- **Fix!** Italian language file errors - automatically updates to working version
- **Fix!** Animation display issues - all animation types now show correctly
- **Fix!** Players taking items from GUI - all slots are now protected
- **Fix!** GUI not closing after animation - closes automatically when game ends
- **Fix!** Game state issues after reload - active games are properly cleaned up
- **Fix!** PlaceholderAPI currency detection
- **Fix!** Critical bug where currency was withdrawn before heads/tails selection - currency is now only withdrawn after player confirms their choice
- **Fix!** Added validation checks in heads/tails GUI to prevent issues when player changes world or balance changes
- **Fix!** Fixed NullPointerException in reloadLanguage() when config is null - added null check before accessing config.getString() to prevent crashes when config fails to load
- **Fix!** Fixed language not updating correctly - messages are now properly reset when language changes, ensuring the correct language file is loaded instead of using cached messages from previous language
- **Fix!** Fixed missing UUID validation in MySQLDatabaseManager.getAllBackups() - added try-catch to handle invalid UUIDs gracefully, preventing crashes when database contains corrupted UUID data
- **Fix!** Fixed potential memory leak in animation system - scheduledRollItems and cached heads are now properly cleared when animation stops or GUI closes
- **Fix!** Improved race condition handling in CoinFlipManager.getGame() - now attempts to retrieve another game if the first one was removed between check and get operations
- **Fix!** Fixed memory leak in animation tasks - animation tasks are now properly cancelled when GUI closes or players disconnect
- **Fix!** Fixed race condition in game creation - added synchronized block to ensure atomic validation and creation, preventing bypass of game limits
- **Fix!** Fixed potential NullPointerException in animation schedule - added null checks to prevent null items in scheduled animation list
- **Fix!** Optimized Gson instance creation - replaced repeated new Gson() calls with cached static final GSON instance in both SQLiteDatabaseManager and MySQLDatabaseManager, reducing object allocation overhead
- **Optimize!** Improved player head loading - faster and fewer API calls
- **Optimize!** Improved animation performance - each animation type works independently
- **Optimize!** Improved border effects - pulse, sequence, and fade now have unique visual styles (not rainbow)
- **Optimize!** Increased animation speeds - pulse, sequence, and fade are now 3x faster
- **Optimize!** Improved SQL query construction - replaced string concatenation with StringBuilder for complex leaderboard queries (getTopPlayersByProfitFromLogs and getTopPlayersByWorstProfitFromLogs), reducing intermediate string object creation
- **Optimize!** Cached additional config values in CoinFlipRollGUI.setupBorders() - eliminated redundant config reads for arrow slots, border display name, border material, and circular arrow slots
- **Optimize!** Reduced ItemStack cloning overhead - winner/loser heads are now cached and reused instead of being cloned repeatedly
- **Optimize!** Cached config values in HeadsTailsSelectionGUI - eliminated redundant config reads by caching values during construction
- **Optimize!** Improved animation task scheduling - tasks now check animationRunning flag before executing to prevent unnecessary execution after animation stops
- **Optimize!** Reduced memory usage in animation system - cached player heads reduce garbage collection pressure
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" }