HarvestPlus v1.5.0
2×2 Tree Replant Fix, Dark Oak Support, Sapling Improvements
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2×2 Tree Fix ◆ Dark Oak ◆ Jungle Replant ◆ Sapling Logic
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
What's New
◆ 2×2 Tree Auto-Replant Fix
- Large jungle trees (2×2) now correctly replant 4 saplings instead of just 1
- Dark oak trees now correctly replant all 4 saplings at the tree base
- Replant detection no longer depends on internal tree scan completeness
◆ Sapling Replant Reliability
- Force-clear logic ensures saplings always plant at correct positions
- Soil validation checks all 4 base positions independently
- Works with all tree-fall modes: FALL, DESTROY, and FALL_DESTROY
◆ Code Quality
- Refactored sapling spot computation into dedicated method
- Direct world-block checking for more reliable 2×2 detection
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Upgrade Notes
◆ Simple drag-and-drop update
- Replace HarvestPlus.jar in your plugins/ folder
- Delete HarvestPlus.jar from plugins/.paper-remapped/
- Restart your server
◆ No config or database changes needed
- Your existing config.yml, language files, and player data are fully compatible with v1.4.0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Summary
+1 critical bugfix - sapling logic overhaul - 2 files changed - 2×2 trees finally plant 4 saplings
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
HarvestPlus v1.4.0
Paper 1.21+ Fix, Quick Menu, Faster Harvesting
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Paper 1.21 Fix ◆ Quick Menu ◆ Performance ◆ New Crops
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
What's New
◆ Paper 1.21.11+ Compatibility
- Plugin now loads correctly on the latest Paper 1.21 builds
- JAR file renamed from Harvest+.jar to HarvestPlus.jar
◆ Quick Settings Menu
- Just type /hp to open your settings - no more /harvestplus settings
- Works with all aliases: /hp, /harvest, /harvestplus
◆ Faster & Smoother Harvesting
- Harvest processing has been streamlined - left and right click harvesting now share optimized logic
- Reduced lag when many players harvest at once
◆ Easier Crop Configuration
- Standard crops (WHEAT, CARROTS, POTATOES, etc.) are now auto-detected from your config.yml
- Adding new supported crops in the future will not require a plugin update
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Upgrade Notes
◆ Manual cleanup required on first install
- Delete the old Harvest+.jar from your plugins/ folder
- Delete Harvest+.jar and HarvestPlus.jar from plugins/.paper-remapped/
- Place the new HarvestPlus.jar in plugins/ and restart
◆ No config or database changes needed
- Your existing config.yml, language files, and player data are fully compatible
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Summary
+1 critical fix - +1 new feature - performance improvements - 8 files optimized
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Harvest+ v1.3.0
Sapling Replant Fixes, Tree-Fall Auto-Replant, Full Config Audit
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Sapling Replant ◆ Tree-Fall Fix ◆ Config Audit ◆ Anti-Dupe
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bug Fixes
◆ Sapling Auto-Plant from Leaves - Critical Fix
- Sapling is now properly removed from leaf drops before planting - no more item duplication
- require-inventory-sapling: true now correctly checks player inventory before removing drops
- When inventory check fails, drops remain intact and a no-sapling message is sent
- require-inventory-sapling: false now uses the dropped sapling as the planting cost - no more free dupes
- VIP nocost permission (harvestplus.vip.nocost) now properly bypasses inventory requirement
◆ Tree-Fall Auto-Replant - Fixed
- Sapling type was read AFTER handleTreeFall set the base log to AIR - always returned null
- Log material is now captured before the tree-fall handler removes blocks
- auto-replant-sapling: true now correctly plants the matching sapling on valid soil
◆ Sapling Message Null Safety
- sapling-no-inventory message now null-checked before sending to player
- Prevents potential NPE when message key is missing from language files
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Quality Assurance
◆ Full Configuration Audit
- All 16 config sections verified end-to-end against source code
- Every config key traced from ConfigManager getter through to listener/handler usage
- Confirmed: crops, boosters, bossbar, particles, sounds, bonemeal, farmers-dance, protect-immature, tree-fall, world-settings, database, performance, language - all operational
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Minor Changes
Area Change LeafBreakListener Rewritten sapling drop handling - removed from drops before planting, inventory check moved before drop removal TreeFallListener Log material captured before handleTreeFall mutates the block build.gradle.kts Version bumped to 1.3.0 HarvestPlus.java Javadoc version updated to 1.3.0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Upgrade Notes
Drop v1.3.0 into your plugins folder and restart.
◆ No manual config changes needed
- Config version remains at 4 - no new keys added
- All custom values, worlds, and crop settings preserved
◆ No database migration needed
- Schema unchanged from v1.2.0
◆ No permission changes
- All existing permission nodes unchanged
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Summary
+3 bug fixes - 1 quality pass - 2 files changed
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
