All versions
1.4.0
Release
Advanced TreeCapitator 1.4.05 months ago 148
Compatibility
Minecraft: Java Edition
1.21.x
Platforms
Bukkit
Paper
Purpur
Spigot
Changes
[1.4.0] — 2026-05-14
Fixed
- [CRITICAL] Forced Java 21 requirement — The
pom.xmlcompile target has been lowered from Java 21 to Java 17. Previously the plugin threwUnsupportedClassVersionErroron any server running Java 17 (Paper 1.20.x, Purpur, Pufferfish, most shared hosting providers). No source changes were needed because the code does not use any Java 21-specific APIs. - [CRITICAL] Protection plugin bypass — Extra log blocks (every block other than the
origin) were broken with
breakNaturally()without first firing aBlockBreakEvent, meaning WorldGuard, GriefPrevention, Lands, and Residence had no opportunity to intervene. A dedicatedBlockBreakEventis now fired for each extra block before it is broken; if any protection plugin cancels that event, the block is silently skipped. - [CRITICAL] Missing anti-recursion guard — The protection-plugin fix above fires
BlockBreakEventprogrammatically, which caused the plugin's own listener to trigger again for each block, creating an infinite loop. AbreakingTreesSet<UUID>now marks any player whose felling session is currently in progress; the listener returns immediately if the player's UUID is already present. The set is always cleared inside afinallyblock so a player can never get permanently stuck. - [MEDIUM] BFS linking two nearby trees — The 26-direction BFS could follow diagonal
log connections to merge two adjacent trees into one oversized fell. A new
MAX_HORIZONTAL_DISTANCE = 8constant (Manhattan X+Z distance from the origin block) causes BFS to skip any candidate block beyond that threshold. The value of 8 is wide enough to accommodate Big Oak and Dark Oak canopies without bridging two separate trunks. - [MEDIUM] No config value validation — Values such as
max-blocks: -1ordamage-multiplier: -100were loaded directly into fields, producing undefined behaviour (negative BFS limits, inverted durability).clamp()andclampDouble()helpers have been added toConfig.reload(); all numeric values are now constrained to a valid range (e.g.max-blocks→[1, 1000],damage-multiplier→[0.1, 10.0]).
Clarified (not a bug)
- Double durability damage (analyst report #2) — The audit report claimed that
breakNaturally(tool)automatically reduces the tool's durability in the player's inventory, causing damage to be applied twice alongsideDurabilityHandler. After reviewing the Paper API source:Block.breakNaturally(ItemStack)uses theItemStackonly to determine drop calculations (Fortune, Silk Touch) and does not modify the item in the player's inventory.DurabilityHandlerremains the sole source of durability loss. No double damage occurs.
Changed
- Lowered the supported
api-versionfrom Paper 1.21 to Paper 1.20.4+, broadening compatibility without requiring any 1.21-specific API. - Added Javadoc to
TreeFinder,TreeCapitatorTask, andConfig.
Not Fixed (planned v1.5.0)
- Folia incompatibility — The plugin schedules work with
BukkitScheduler.runTask(), which is incompatible with Folia's region-based threading model. A proper fix requires migrating toRegionScheduler/GlobalRegionSchedulerand is planned for v1.5.0.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:8li9wnIm:YJ2i6LZf"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:8li9wnIm:YJ2i6LZf"
}

