Tags
Creators
Details
All versions
1.4.20+26.3
Release
Simple AutoPickup 1.4.20+26.36 days ago 1,030
Compatibility
Minecraft: Java Edition
26.3
Platform
Fabric
Supported environments
Server-side
Client and server
Required content
Any compatible version
Changes
1.4.20: Code-review overhaul; TreeHarvester 10.x support (#31); FTB Ultimine support; per-player preference files
Fixed
- TreeHarvester 10.x crashed on block break (#31): logs and leaves are credited again and saplings are replanted per tree type. 9.x is still supported, and the drop hooks are optional so a future change cannot crash the game.
- Drop contexts leaked when hooked methods returned early or threw: Level.destroyBlock and FallingTree's falling-block tick now close at RETURN, the shear hook closes what it opened, TreeHarvester hooks use try/finally, 1.21.1 brushing closes at RETURN, and a tick-end safety net clears anything left open.
- Players without the mod got mob XP pickup by default; a player's own preference now only counts once it is set, else the server value.
- Non-ops editing themselves wrote admin overrides that outlived the allow_* flags; they now set their own preference.
- 1.21.0-1 was missing the on-stack drop fallback.
- Nested compat scopes lost their player (blockBreaker is now a stack).
- /autopickup global printed success for unknown or mis-cased keys and saved nothing; keys are now case-insensitive and unknown keys fail.
- Malformed config JSON crashed startup; the bad file is now backed up and defaults are used.
- Block XP was lost if a toggle flipped or the player left within the 2-tick Mending delay.
- Split with zero participants threw ArithmeticException.
- FallingTree leaf drops: hook the public forceBreakDecayLeaves instead of a synthetic lambda whose parameters did not match on 1.20.1.
- 1.16.5 Forge dev client launched on Java 21 and crashed.
Added
- FTB Ultimine support: it breaks blocks through the player's own break path, so ultimined blocks, merged drops and right-click crop harvests are collected with no dedicated code (1.20.1 to 26.1.2).
- /autopickup shows each player the value that applies to them and its source (admin override, your setting, server default); the server column reads CLIENT DECIDE (default: ON/OFF). The console sees the server column only.
- Players' own preferences are saved one file per player, preferences/<uuid>.json (worlds/<world>/preferences/ in singleplayer), whether set by command or synced by the client. Loaded on first use, written atomically only on change. A client sync that replaces a stored value tells the player.
- Pickup handler registry in AutoPickupApi; Traveler's Backpack and TreeHarvester register at init instead of mixing into AutoPickupApi.
- CI fetches the optional-mod jars from Modrinth and Maven by SHA-1 (gradle/compat-libs.json, ./gradlew fetchLibs) and builds every version with --continue.
- JUnit tests for core/ (59), including tests that lock the config file and wire formats.
- ./gradlew driftCheck lists files identical across version folders.
Changed
- The seven settings are one Toggle enum; config files, the sync bitmask, command keys and the client file are unchanged.
- One home for defaults; logic for directly spawned items moved into a shared ItemSpawnHook; shared ClientSession for loader clients, which only sync with servers that have the mod.
- TreeHarvester natamus/serilum mixin pairs merged; leaf ownership kept in a tick-expired side map instead of a BlockPos subclass; the serilum modules compile against TreeHarvester 10.3.
- Packages unified to com.lukarbonite.autopickup (1.16.5, 1.20.1, 1.21.0-1); files identical in 26.1 to 26.3 moved to shared/26+; per-version build boilerplate moved to a buildSrc convention plugin.
- Java sources normalized to LF (.gitattributes).
- README commands, defaults and compatibility list match the code; CI installs JDK 8, 17, 21 and 25 and uploads every loader jar.
Removed
- Dead code: no-op AutoPickupMixinPlugin, FLAG_ALLOW_CLIENT, unused FLAG_* re-exports and tryPickupBlockExperience, unused locals.
Fixes #31
Optional dependencies
Any compatible version
Any compatible version
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:ycs4OjaI:rJGYF0zk"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:ycs4OjaI:rJGYF0zk"
}

