1. Command permissions (PR #1 — merged)
/dh toggle and /dh status were default: true, so every player could use them. Changed to default: op.
Added donuthopper.help permission so non-staff can't see the admin command list.
Tab-complete now only suggests subcommands the player actually has permission to use.
2. Brewing stand (potion stand) wrong slots
Hoppers above a brewing stand were inserting items into any free slot.
New BrewingStandTransfer enforces vanilla slot rules:
Slots 0–2: only bottles / potions
Slot 3: only valid ingredients (nether wart, blaze powder, glowstone, redstone, etc.)
Slot 4: only blaze powder (fuel)
3. Slow / missing transfers with chest minecart and hopper minecart
Block hoppers, droppers and hopper minecarts now detect StorageMinecart and HopperMinecart sitting on the rail block and transfer into them.
minecart_scan_interval lowered to 1 (every tick) by default.
New hopper minecarts are registered immediately on VehicleCreateEvent and entity cache TTL was shortened.
4. Hoppers sucking items through solid blocks above (acting like minecart hoppers)
Solid blocks above the hopper (chest, brewing stand, regular blocks) were being treated as "traversable" — so the pickup zone extended several blocks up and items behind the upper block were vacuumed in.
Now only fluids and thin blocks (slabs, carpets, fences, panes) extend the pickup zone.
Solid block above → pickup limited to inside the hopper block only.
Line-of-sight ray trace enabled by default.
Default pi
DonutHopper — Changelog
[Bug fixes]
- Fixed: items floating inside water (and other traversable blocks) above
hoppers were never picked up. The pickup BoundingBox now extends up to
2+ blocks above the hopper when the block above is traversable
(WATER, LAVA, BUBBLE_COLUMN, KELP/KELP_PLANT, SEAGRASS, TALL_SEAGRASS,
COBWEB, POWDER_SNOW, slabs, carpets, waterlogged blocks).
Vertical chained traversables (e.g. water column) extend the zone
further (up to 4 extra blocks).
- Fixed: items resting on top of a hopper (Y between hopper.y and
hopper.y + 0.5) were skipped by the periodic scan. The varredura
BoundingBox is now aligned with the pickup-zone filter
(isItemInHopperPickupZone), so any item that passes the filter is now
guaranteed to be found.
- Fixed: items streaming in fast water/ice currents could pass over a
hopper between ticks. Added ItemSpawnEvent + PlayerDropItemEvent
listeners that trigger an immediate pickup if the item spawns/drops
inside a hopper's pickup zone.
- Fixed: hopper minecarts could not catch items floating in water above
them. Replaced the symmetric world.getNearbyEntities(loc, r, r, r)
with an asymmetric BoundingBox extended ~2 blocks upward, while
keeping the horizontal radius unchanged.
- Fixed: TickThread crash on Folia in runFastPickupPass(). All chunk /
block / entity access is now dispatched through
FoliaLib.runAtLocation, so the work happens on the correct region
thread. scanAllLoadedHoppers() seed pass was also moved inside the
per-chunk runAtLocation in Folia.
[Performance]
- runFastPickupPass: hoppers are now grouped by chunk and one job is
dispatched per chunk (instead of one per hopper), drastically
reducing scheduler overhead on Folia.
- Removed the previous chunk-presence gate that was skipping pickup
when items lived in neighboring chunks (caused items in water
currents to be ignored). Pickup now always runs, but each call still
exits early if the hopper inventory is full.
[License]
- LicenseValidator: rewrote with a proper Status enum
(VALID / INVALID / MISSING_KEY / NETWORK_ERROR), added
wasEverValidated(), 3 retries with backoff on IOException,
try-with-resources on streams and JSON-escaped payloads.
[Refactor]
- DonutHopper.java: renamed deobfuscated members to readable names
(initializeManagers, runLicenseValidation, applyConfigChanges, …)
while keeping legacy aliases (d(), b(), etc.) intact for binary
compatibility with the obfuscated manager classes.
- Added isPickupTraversable() helper used by both the pickup scan and
the pickup-zone filter so the two paths stay in sync.
Added support for Foila 1.21.11
Fixed crafter bug
Fixed dispenser bug
Improved performance
