
Replenish++
Auto-replant crops on Paper/Purpur servers, inspired by Hypixel SkyBlock's Replenish enchantment. Break a crop and it replants itself. Supports wheat, carrots, potatoes, nether wart, cocoa and beetroot, with direct pickup and lag-friendly replanting.
Tags
Creators
Details
7.0.0-26.3
Compatibility
Changes
ReplenishPlusPlus v7.0.0 - "Rebuilt From the Soil Up"
Release Date: 2026-09-24
This is not a normal update, it's a ground-up rewrite of the entire plugin: new harvest engine, new queue, new config system, new commands, plus a brand-new Teleport Pad feature. The biggest release Replenish has ever had.
⚠️ Before You Upgrade
- Paper/Purpur on Minecraft 26.3 only: Spigot and older server versions are no longer supported.
- Remove Replenish 6.x completely first: the plugin was rebuilt and renamed, so nothing carries over. Delete the old Replenish jar and the whole
plugins/Replenish/folder, old config.yml included, before installing this one. Running both at the same time would replant crops twice. - Permissions renamed:
replenish.*is nowreplenishplusplus.*(op defaults are unchanged, so most servers need to do nothing). - Messages moved: the old
messages:section in config.yml is gone, player messages now live inplugins/ReplenishPlusPlus/en_us.ymland reload live with/rpp reload. replantDelayTickschanged: default is now 3 with a maximum of 10, and it means "a random tick between 1 and this number" so big farms replant smoothly.- New license: CC BY-NC-SA 4.0, credit and share forks, no reselling, commercial use possible with permission.
🎵 What's New
- Teleport Pads (work in progress): place a pad, link it to another, step on it, warp across your base, Hypixel SkyBlock style, with 56 icons, custom names, arrival directions, and a sneak-right-click config menu. Still being polished, so it's op-only for now, but it already plays great: hand the permission to players you trust if you want base warp pads.
- Per-player toggle:
/rpp togglelets each player switch auto-replant off for themselves without touching the server config. - Sneak to bypass: sneaking while breaking now plays the vanilla way, and the new
sneakToBypasssetting controls it. - Action bar messages: the new
messageStylesetting shows notifications in chat, on the action bar, or not at all. - Admin diagnostics:
/rpp debugshows TPS, tick times, heap, uptime, and replant queue health, and adds long-window MSPT and CPU stats when spark is installed. - Update notices: ops get an in-game heads-up with a clickable download link the moment a new release is out.
- Vanilla-exact drops: mature crops drop exactly what Minecraft drops, Fortune included, with the numbers taken straight from vanilla's loot tables.
- Hidden dev sandbox: op-only
/rpp devfor testing farms (instant crops, no trample, spark harvest reports), documented in DEV_MODE.md.
⚡ Performance
- Measured under load: a live 5-minute capture of non-stop farming (about 20 crops per second, Fortune III netherite hoe) kept TPS at a flat 20.00 with a median tick of 9.62ms, while the entire plugin cost 0.16% of one server thread. Full numbers live in BENCHMARK.md.
- Drop math, precomputed: mature drops come from drop tables transcribed out of vanilla's loot files, so the old per-harvest loot-table and enchantment-map machinery is gone entirely; reading Fortune is now one direct call on the tool.
- Spread-out replants: replants land on a random tick inside the delay window instead of piling into one tick, so per-tick cost stays flat no matter how you tune the delay.
- A real safety valve: the per-tick cap plus the new
maxReplantsQueuedlimit (default 4096) turn a farm rush into deferred replants and loud warnings instead of lag, with a hard ceiling of roughly 20,480 crops/sec. - Smarter chunk checks: a small chunk cache stops multi-chunk farms from re-asking the server the same question on every replant.
- Cheaper replant writes: replanted crops skip redundant physics updates while still appearing for players instantly.
- Lighter seed handling: each player's seed slot is cached and consumed by editing the item in place, so the common path is one map lookup and the client gets one batched inventory sync instead of a packet per seed.
- Linear scaling, with headroom: ~30 players farming flat-out is around 5% of a thread, ~150 players around 24%.
🛠️ Fixes & Tweaks
- Dupe-proof harvesting: a break cancelled by another plugin no longer eats your seed or pays drops twice, guarded by a two-phase listener.
- Seeds come back: a replant that fails (missing anchor, unloaded chunk) refunds your seed instead of silently swallowing it.
- Clearer reloads:
/rpp reloadnow names every invalid config value instead of quietly ignoring it, and a broken config.yml can't be clobbered by/rpp toggle global. - Version mismatch warnings: running on a newer or older Minecraft line now warns on startup in both directions, while Paper build patches stay silent.
- Forgiving sound names:
ENTITY_ITEM_PICKUP,entity.item.pickup, andminecraft:entity.item.pickupall work in the config now. - Old habits keep working:
/replenishand/rppare aliases of/replenishplusplus, so command blocks and muscle memory survive the rename.
📚 Docs
- DEV_MODE.md: everything the hidden dev sandbox does, in one place.
- BENCHMARK.md: real measured numbers for harvest rate and server-thread cost from a live spark capture.
Full Changelog: https://github.com/Mitra-88/ReplenishPlusPlus/compare/6.1.0...7.0.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:9rWJrVZX:xK4Zb31a"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:9rWJrVZX:xK4Zb31a"
}
