Woodcutting (Harvest Lumber, Clean Cuts) and Excavation treasure drops previously spawned items directly via world.dropItem(), bypassing BlockDropItemEvent entirely. This made them invisible to Telekinesis-style enchant plugins (ExcellentEnchants, EcoEnchants, etc.).
Woodcutting fix: processBonusDropCheck() now calls BlockUtils.markDropsAsBonus() for normal breaks, routing bonus drops through the existing BlockDropItemEvent metadata pipeline. Tree Feller retains the direct-spawn path since it sets blocks to AIR without firing BlockDropItemEvent.
Excavation fix: treasure rolls are now performed inside onBlockDropItemEvent() via ExcavationManager.rollAndCollectTreasureDrops(). The returned ItemStacks are spawned and injected into event.getItems(), exposing them to the full Bukkit event pipeline. GigaDrillBreaker's 3x roll count is preserved. The old processExcavationBonusesOnBlock(treasure, location) path is kept as a deprecated fallback for external API callers. (commit: ce021db)
Fix Minecraft version detection failing on Spigot servers
The old regex required a trailing [-_] after the version digits, which worked for getBukkitVersion() strings (e.g. '1.21.4-R0.1-SNAPSHOT') but silently failed on Spigot's Bukkit.getVersion() format ('git-Spigot-12345-abcdef (MC: 1.21.4)') since '1.21.4)' has no trailing dash or underscore. Version resolved to 0.0.0, causing Tricky Trials potions (isAtLeast 1.21.0 check) to be incorrectly skipped on every Spigot server.
MinecraftGameVersionFactory now uses two patterns: - Primary: extracts from the '(MC: X.Y.Z)' segment that CraftBukkit always embeds in Bukkit.getVersion() — handles Spigot, old Paper, and Paper 26+ - Fallback: original regex for strings without '(MC: ...)' such as getBukkitVersion()-style strings
Tests updated with @Nested classes covering both paths, including explicit Spigot format cases and Paper 26+ versioning (26.1.2-60-b4682bf format). (commit: 11225a2)