ModsJava
DreamFarm — Auto Collect, Virtual Warehouse & One-Click Selling [1.12-1.21 |
Java mod listed for Minecraft 1.12–1.21. Download on the author's site.
⬇ Download on Spigot
DreamFarm
Automatic crop collection · Virtual warehouse · One-click selling
1.12 – 26.x ▪ Folia ready ▪ Java 8+ ▪ Only Vault required
Automatic crop collection · Virtual warehouse · One-click selling
1.12 – 26.x ▪ Folia ready ▪ Java 8+ ▪ Only Vault required
[HR][/HR]
Stop chasing dropped items across your farm.
DreamFarm turns harvesting into a single action: break a mature crop and it goes straight into the player's virtual warehouse. No item entities, no lost drops, no lag from hundreds of stacked items on the ground.
Players open one menu to browse their warehouse, withdraw what they need, and sell the rest for money — while the server keeps a hard limit on how much can be sold per crop each day.
[HR][/HR]
[HEADING=2]Feature Highlights[/HEADING]
| Automatic collection | Mature crops are stored the moment they are broken; vanilla drops are suppressed. Immature crops are left alone. |
| Virtual warehouse | One unlimited warehouse per player, paginated, with three withdraw granularities. |
| One-click selling | Sell everything at once. Price = unit price × amount, no tax. Per-crop daily limits. |
| Anti-abuse by design | Crops grown with bone meal never enter the warehouse, so the "bone meal → instant growth → sell" loop is closed. |
| Four storage backends | YAML, SQLite, MySQL and Redis — switch by editing one line and running
Code (Text):
/df reload
|
| Fully configurable GUI | Titles, materials, lore, slots and placeholders all live in YAML. |
| Built-in localisation | English (default) and Simplified Chinese, with automatic fallback for missing keys. |
| Folia support | Detects Folia and switches to region scheduling automatically. The same jar runs on Spigot/Paper. |
| No extra libraries | Only Vault is required. The GUI is native, no third-party GUI library to install. |
[HR][/HR]
[HEADING=2]1. Automatic Collection[/HEADING]
How it behaves
- Breaking a mature crop stores the produce instantly and cancels the vanilla drops.
- Breaking an immature crop collects nothing and shows a title: Not mature yet.
- Crops grown with bone meal are excluded — they drop normally, with an action bar hint.
- Creative mode, players without the permission and players who disabled auto collection are skipped.
Four harvest mechanisms
| Type | Crops | Behaviour |
|
Code (Text):
ageable
|
Wheat, Carrot, Potato, Beetroot, Nether Wart, Cocoa | Reads the block age; only fully grown blocks are collected. |
|
Code (Text):
stacking
|
Sugar Cane, Cactus, Bamboo | Breaking any part walks up the column and stores the whole column, so nothing scatters on the ground. |
|
Code (Text):
right-click
|
Sweet Berries | Right-click harvesting stores the berries without breaking the bush. |
|
Code (Text):
fruit
|
Melon, Pumpkin | The fruit block has no growth stage, so the adjacent stem is checked instead (see below). |
How melon and pumpkin are handled
A melon or pumpkin block is only farm produce when a stem produced it. DreamFarm verifies this:
Code (Text):
Break a pumpkin / melon block
├─ adjacent ATTACHED_*_STEM (fruit attached) → mature, collect
├─ adjacent *_STEM with maximum age → mature, collect
└─ no stem at all (decorative block) → ignore, vanilla drops
├─ adjacent ATTACHED_*_STEM (fruit attached) → mature, collect
├─ adjacent *_STEM with maximum age → mature, collect
└─ no stem at all (decorative block) → ignore, vanilla drops
Code (Text):
MELON_BLOCK
[HR][/HR]
[HEADING=2]2. Virtual Warehouse[/HEADING]
- One warehouse per player, unlimited capacity.
- One-way flow: produce only flows in automatically; withdrawing and selling always require a deliberate player action. It cannot be used as an infinite backpack.
- Data lives in memory while online and is persisted on quit.
- The warehouse menu is paginated — a stack per slot, arrows show
and grey out at the boundaries.Code (Text):[current/total]
- Paging and withdrawing redraw the same inventory in place, so rapid clicking never loses a click.
Withdraw rules
| Action | Amount |
| Left click | One stack |
| Right click | One item |
| Shift + click | Everything (limited by free inventory space) |
The amount is clamped to the free space in the player's inventory. If giving items partially fails, the remainder is returned to the warehouse — nothing is ever swallowed.
[HR][/HR]
[HEADING=2]3. One-Click Selling[/HEADING]
- Sell amount =
.Code (Text):min(stock, remaining daily allowance)
- Income = unit price × amount. No tax, no fee.
- Daily limits are per crop;
means unlimited.Code (Text):daily-limit: 0
- When the limit is exhausted the button reports Daily limit reached for <crop>.
Crash-safe by ordering
Code (Text):
Main thread : validate stock and limit → deduct in memory → take a snapshot
Async thread: persist snapshot + write the sale log
Main thread : deposit money → update statistics → message and sound
Async thread: persist snapshot + write the sale log
Main thread : deposit money → update statistics → message and sound
[HEADING=2]4. Daily Reset[/HEADING]
Clock format or cron, your choice:
Code (Text):
daily-reset-time: "00:00" # every day at 00:00
daily-reset-time: "04:30:00" # every day at 04:30:00
daily-reset-time: "0 0 4 * * ?" # cron: every day at 04:00
daily-reset-time: "0 0 4 * * 1" # cron: every Monday at 04:00
daily-reset-time: "0 0 0 1 * *" # cron: monthly, 1st at 00:00
daily-reset-time: "04:30:00" # every day at 04:30:00
daily-reset-time: "0 0 4 * * ?" # cron: every day at 04:00
daily-reset-time: "0 0 4 * * 1" # cron: every Monday at 04:00
daily-reset-time: "0 0 0 1 * *" # cron: monthly, 1st at 00:00
- Any space switches the parser to cron (5 fields = min hour day month weekday; 6 fields = sec min hour day month weekday).
- Supports
,Code (Text):*, ranges, steps and comma lists; weekdayCode (Text):?andCode (Text):0both mean Sunday.Code (Text):7
- An invalid expression falls back to daily 00:00 with a console warning.
- Uses the server's local time zone.
[HR][/HR]
[HEADING=2]5. Storage Backends[/HEADING]
Code (Text):
storage:
type: sqlite # yaml | sqlite | mysql | redis
flush-interval-seconds: 30
type: sqlite # yaml | sqlite | mysql | redis
flush-interval-seconds: 30
| Type | Data location | Good for |
|
Code (Text):
yaml
|
Code (Text):
plugins/DreamFarm/playerdata/<UUID>.yml
|
Small servers, hand editing |
|
Code (Text):
sqlite
|
Code (Text):
plugins/DreamFarm/data.db
|
Single server, balanced |
|
Code (Text):
mysql
|
Tables
Code (Text):
<table-name>_warehouse
Code (Text):
_player
Code (Text):
_daily_limit
Code (Text):
_log
|
Multi-server, central backup |
|
Code (Text):
redis
|
Keys prefixed with
Code (Text):
dreamfarm:
|
Very high throughput, multi-server |
- Hot switch: change
, runCode (Text):storage.type; the old backend is flushed, the new one initialised, the cache cleared and re-read.Code (Text):/df reload
- Data is not migrated automatically — back up and import manually.
- SQL saves run
+ batchCode (Text):DELETEinside one transaction, so stale rows cannot resurrect old amounts.Code (Text):INSERT
- YAML writes use a temp file plus atomic move, so a half-written file is impossible.
[HR][/HR]
[HEADING=2]6. GUI and Placeholders[/HEADING]
The main menu and the warehouse menu are entirely YAML-driven. Titles, glass pane decorations, crop card slots, materials, custom model data and lore are all configurable, and the sell button is placed automatically on the row below its crop card (
Code (Text):
slot + 9
Available placeholders
| Placeholder | Meaning |
|
Code (Text):
{crop_name}
|
Display name of the crop |
|
Code (Text):
{amount}
|
Amount stored in the warehouse |
|
Code (Text):
{daily_sold}
|
Amount sold today |
|
Code (Text):
{daily_limit}
|
Daily limit (
Code (Text):
∞
|
|
Code (Text):
{can_sell}
|
Amount that can be sold right now |
|
Code (Text):
{total_value}
|
Total value of the sellable amount |
|
Code (Text):
{status}
|
Auto-collect status (toggle button only) |
Example crop entry
Code (Text):
crops:
WHEAT:
name: "&2Wheat"
price: 3.0
daily-limit: 10000
slot: 15
lore:
- "&aType: &f{crop_name}"
- "&aAmount: &e{amount} &fitems"
- "&aSold today: &e{daily_sold} &7/ &f{daily_limit}"
sell:
material: GOLD_NUGGET
name: "&dSell all {crop_name}"
lore:
- "&aSellable now: &f{can_sell} &fitems"
- "&aTotal value: &e{total_value} &fcoins"
WHEAT:
name: "&2Wheat"
price: 3.0
daily-limit: 10000
slot: 15
lore:
- "&aType: &f{crop_name}"
- "&aAmount: &e{amount} &fitems"
- "&aSold today: &e{daily_sold} &7/ &f{daily_limit}"
sell:
material: GOLD_NUGGET
name: "&dSell all {crop_name}"
lore:
- "&aSellable now: &f{can_sell} &fitems"
- "&aTotal value: &e{total_value} &fcoins"
[HEADING=2]7. Commands[/HEADING]
| Command | Description | Permission |
|
Code (Text):
/df
|
Open the main menu |
Code (Text):
dreamfarm.use
|
|
Code (Text):
/df reload
|
Reload config and player data; hot-switch storage if changed | OP or
Code (Text):
dreamfarm.admin
|
|
Code (Text):
/df crops <crop> <amount> [player]
|
Grant crops into a warehouse | OP or
Code (Text):
dreamfarm.admin
|
Crop names accept the config key, an English alias or the display name, for example:
Code (Text):
/df crops WHEAT 1000 give yourself 1000 wheat
/df crops carrot 500 Steve give an online player
/df crops POTATO 500 Notch offline players work too
/df crops carrot 500 Steve give an online player
/df crops POTATO 500 Notch offline players work too
[HEADING=2]8. Permissions[/HEADING]
| Node | Description | Default |
|
Code (Text):
dreamfarm.use
|
Use the main command | true |
|
Code (Text):
dreamfarm.autocollect
|
Use automatic collection | true |
|
Code (Text):
dreamfarm.admin
|
Reload and grant crops | op |
|
Code (Text):
dreamfarm.reload
|
Reload (child of admin) | op |
[HR][/HR]
[HEADING=2]9. Multi-Language[/HEADING]
- English is the default and also the fallback layer; Simplified Chinese ships with the plugin.
- Every bundled language file is released into
at startup, so you can edit and switch freely.Code (Text):plugins/DreamFarm/lang/
- Fallback chain: current language →
→ built-in default. A partially translated file never shows blank text.Code (Text):en_us
- Adding a language: copy
, translate it, then setCode (Text):en_us.ymlinCode (Text):language:.Code (Text):config.yml
- Language files are covered by auto reload.
[HR][/HR]
[HEADING=2]10. Compatibility and Performance[/HEADING]
| Server | Spigot / Paper / Purpur 1.12 – 26.x, and Folia |
| Java | 8 or newer |
| Dependencies | Vault + any economy plugin |
| Optional hooks | Residence / GriefPrevention / WorldGuard / Towny |
Zero IO on the main thread
| Stage | Thread | Work |
| Pre-login | Async | Database read only, into cache |
| Harvest / open menu | Main | Memory only; loads asynchronously if not ready |
| Selling | Main → async → player region | Deduct → persist → pay and update stats |
| Quit | Main → async | Snapshot and drop cache, persist asynchronously |
| Periodic flush | Async | Persistence only, never touches game objects |
Measured hot-path cost
-
per harvest ≈ 25 ns (about 39 million ops/s)Code (Text):add()
-
≈ 5.9 nsCode (Text):getAmount()
- 4 threads × 1,000,000 concurrent adds = exactly 4,000,000, nothing lost
- Concurrent take: the millionth request correctly fails — no over-withdrawal
At 10,000 harvests per minute the hot path uses roughly 0.0004% of a single core.
Folia
DreamFarm declares
Code (Text):
folia-supported: true
[HR][/HR]
[HEADING=2]11. Installation[/HEADING]
- Install Vault and an economy plugin (EssentialsX, CMI, …).
- Drop DreamFarm.jar into
.Code (Text):plugins/
- Start the server to generate
.Code (Text):plugins/DreamFarm/
- Adjust
,Code (Text):config.ymlandCode (Text):Inventory/*.yml.Code (Text):lang/*.yml
- Save — it reloads automatically within 2 seconds, or run
.Code (Text):/df reload
[HR][/HR]
[HEADING=2]12. FAQ[/HEADING]
Players say crops are not stored. What should I check?
Check in order: is the crop listed under
Code (Text):
crops:
Code (Text):
dreamfarm.autocollect
Do I need to restart after editing the config?
No. Changes apply within 2 seconds, or run
Code (Text):
/df reload
Does switching the storage backend migrate my data?
No.
Code (Text):
/df reload
Hand-editing a player data file has no effect.
Take the player offline first. Online warehouses live in memory and the periodic flush will overwrite your edit.
Why is the melon config key
Code (Text):
MELON_SLICE
Storage keys are drop types, and a melon block drops slices. The block name is resolved through a built-in mapping.
Does it run on 1.12?
Yes. Every 1.13+-only API lives in a modern adapter that is never loaded on 1.12.
Do I need to install any extra library?
No. Only Vault is required; the GUI is native.
[HR][/HR]
[HEADING=2]13. Changelog[/HEADING]
1.0.1
- Added melon and pumpkin support with stem-based verification and built-in block mapping.
- Added Simplified Chinese; all bundled language files are released at startup.
- Fixed the money format showing
instead ofCode (Text):.00when the value is zero.Code (Text):0.00
- Removed the redundant
placeholder andCode (Text):{currency}setting.Code (Text):currency-name
- Removed dead config keys (
).Code (Text):particle
- YAML anchors are no longer used in shipped configs — each crop is self-contained.
- A broken YAML file now falls back to the built-in defaults instead of emptying the crop list.
- GUI configs are no longer auto-filled with defaults, so commenting a crop out really disables it.
- Added
and region-aware player feedback.Code (Text):folia-supported
- Moved loading, saving, logging and config hashing off the main thread.
[HR][/HR]
Questions, bug reports and feature requests are welcome in the discussion tab.
Quick facts
- Edition: Minecraft Java
- File type: .jar
- Minecraft versions listed: 1.12, 1.13, 1.14
- How to install: Install the matching mod loader (Forge, Fabric or NeoForge) for your Minecraft version. → Download the .jar. → Put it in the .minecraft/mods folder and launch that loader profile.
- Where to get it: Opens on Spigot — not every file is mirrored on our own servers.
Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.
DreamFarm — Auto Collect, Virtual Warehouse & One-Click Selling [1.12-1.21 | is a free Minecraft Java mod. Compatible with Minecraft 1.12, 1.13, 1.14, 1.15 and newer. Available via Spigot. Download it and open it directly in the game.