Harvest+ v1.2.0
Tree Fall 2.0, Crop Protection Rebuilt, Pale Oak Support
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Tree Fall 2.0 ◆ Crop Protection ◆ Config Auto-Update ◆ Thread Safety ◆ Pale Oak
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
New Features
◆ Tree Fall 2.0
- Realistic hinged-rotation physics: base blocks stay near the pivot, top blocks arc outward and down
- Attached blocks destroyed automatically: vines, cocoa pods, glow lichen, moss carpet
- Leaves scatter with random directional variance for a natural look
- Euclidean foliage range detection - big jungle canopies are now fully captured
◆ Config Auto-Update System
- Missing keys from newer versions automatically merged into existing config.yml
- Works on startup and on /harvestplus reload
- Version-tracked - only adds genuinely missing keys, never overwrites your values
◆ Pale Oak Support
- Pale Oak logs, wood, leaves, and saplings added to all internal lists
- Pale Moss Block recognized as valid sapling soil
- Pale Moss Carpet destroyed with tree fall
◆ Farmer's Dance Expanded
- Now boosts tree saplings of all types
- Wild plants supported: bamboo, kelp, sugar cane, cactus, chorus, vines, sea pickle, pink petals
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bug Fixes
◆ Crop Protection Rebuilt
- Completely rewritten with direct inline logic - no more unreachable code paths
- Now correctly blocks breaking of all immature crops including ones with auto-replant disabled
- Works independently of harvest mode and auto-replant settings
◆ Memory Leaks Resolved
- Debounce tracking maps cleaned on player quit
- BossBar instances removed when player disconnects
◆ Runtime Crashes Eliminated
- ConcurrentHashMap null-value NPE: replaced null sentinel with Material.AIR
- ConcurrentModificationException in tree attached-block detection: replaced with work-queue pattern
- IllegalPluginAccessException during shutdown: added synchronous save path for onDisable
◆ Thread Safety
- TreeFallHandler internal maps: HashMap to ConcurrentHashMap
- Debounce maps in both harvest listeners: HashMap to ConcurrentHashMap
◆ Gameplay Fixes
- Hoe no longer destroys freshly replanted crops: added 1-tick delay before replant on right-click
- Bonemeal consumption properly updates inventory via setItemInMainHand/OffHand
- Tree fall unified null-handling: disabled when player data not loaded
- Polish language file typo: nistczenie to niszczenie
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Performance
◆ Cached Material Sets
- Log and leaf material sets computed once and cached
◆ Sapling Spot Search
- Limited to 20 blocks downward instead of scanning to bedrock
◆ Faster Random
- Tree fall direction uses Math.random() instead of new Random()
◆ Async Config Save
- Debug toggle save moved off the main thread
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Code Quality
◆ Deduplication
- HarvestUtils utility class: shared debounce and crop name logic
- Removed ~80 duplicate lines across harvest listeners
◆ Cleanup
- Removed unused fields from ParticleManager, SoundManager, XPCalculator, SettingsGUIListener, LeafBreakListener, BonemealListener, FarmersDanceListener
- Removed unused imports across all modified files
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Database
◆ MySQL Schema
- CREATE TABLE includes all 8 player columns from the start
- Column migrations check metadata before ALTER: no warnings on restart
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Minor Changes
Area Change plugin.yml Command usage includes 'debug' subcommand config.yml default-player-settings now lists all 7 toggles Language files Added sapling-pale-oak key, fixed pl_PL typo Settings GUI Removed debug holder mismatch messages from chat
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Upgrade Notes
Drop v1.2.0 into your plugins folder and restart.
◆ No manual config changes needed
- Auto-update merges any missing keys from the new config
- All custom values, worlds, and crop settings preserved
◆ No database migration needed
- Schema unchanged from v1.1.0
◆ No permission changes
- All existing permission nodes unchanged
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Summary
+4 features - 12 bug fixes - 4 performance improvements - 2 code quality passes
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Harvest+ v1.1.0
Stability, Performance, and Smart Config Updates
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Config Auto-Update ◆ Memory Leaks Fixed ◆ Thread Safety ◆ Performance ◆ Code Quality
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
New Features
◆ Config Auto-Update System
- Missing keys from newer versions are now automatically merged into your existing config.yml
- Works both on server startup and on /harvestplus reload
- Uses config-version tracking to detect when an update is needed
- Your custom values are preserved - only genuinely missing keys are added
- All added keys are logged to console for transparency
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bug Fixes
◆ Memory Leaks Resolved
- Debounce tracking maps in harvest listeners now properly cleaned on player quit
- BossBar instances now removed when a player disconnects - no more orphaned bars
◆ Thread Safety
- TreeFallHandler internal maps upgraded from HashMap to ConcurrentHashMap
- Eliminates rare race condition between falling block cleanup and landing events
- Debounce maps in both harvest listeners also upgraded to ConcurrentHashMap
◆ Logic Fixes
- Tree fall null-handling unified with other listeners - disabled when player data not yet loaded
- Bonemeal consumption now properly updates inventory via setItemInMainHand/OffHand
- Polish language file typo fixed: nistczenie -> niszczenie
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Performance
◆ Cached Material Sets
- Log and leaf material sets computed once and cached - no more EnumSet allocation per tree detection
◆ Sapling Spot Search
- Sapling planting search limited to 20 blocks downward instead of scanning to bedrock
- Significant reduction in getBlockAt() calls on tall trees
◆ Faster Random Generation
- Tree fall direction uses Math.random() (ThreadLocalRandom-equivalent) instead of new Random()
◆ Async Config Save
- setDebugEnabled config save moved off the main thread
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Code Quality
◆ Deduplication
- HarvestUtils utility class extracted - shared debounce, crop name, and immature crop check logic
- Removed ~80 lines of duplicate code across BlockBreakListener and PlayerInteractListener
◆ Dead Code Removal
- Deprecated ReplantHandler.replantCrop() - seed consumption now handled directly in listeners
- Removed unused plugin fields from ParticleManager, SoundManager, XPCalculator, SettingsGUIListener
- Removed unused imports across 5 files
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Database
◆ MySQL Schema
- CREATE TABLE now includes all 8 player columns - fresh installs skip 4 unnecessary ALTER TABLE calls
- Column migrations now check metadata before attempting ALTER - no more warnings on every restart
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Minor Fixes
File Change plugin.yml Command usage now includes 'debug' subcommand pl_PL.yml Fixed typo in crop protection lore text BlockPlaceListener Corrected misleading comment about PDC key coordinate scope
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Upgrade Notes
Drop v1.1.0 into your plugins folder and restart.
◆ No manual config changes needed
- The auto-update system will merge any missing keys from the new config into your existing file
- All your custom values, worlds, and crop settings are preserved
◆ No database migration needed
- MySQL schema unchanged - v1.1.0 uses the same tables
- YAML playerdata files are fully compatible
◆ No permission changes
- All existing permission nodes unchanged
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Full Changelog Summary
+1 new feature - 4 bug fixes - 4 performance improvements - 5 code quality improvements
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
