Overview
Soil quality varies across the land in smooth patches, speeding up or slowing down crop growth and tinting grass to match.
Features
- Every spot in the world has a soil quality: Low, Normal or High.
- Low quality soil slows crop growth; High quality soil speeds it up.
- Bone meal can be capped per soil quality: by default Low soil gets one growth stage per use, while Normal and High soil behave like vanilla.
- Grass is tinted to show the quality: washed out, yellower and darker on Low soil, more vivid, slightly bluer-green and brighter on High soil.
- Crops give off growth particles by soil quality (smoke, composter or happy villager by default; only Normal is off by default).
- Hold a hoe (an item extending the vanilla hoe class or in the
minecraft:hoesitem tag; on Minecraft 26.3 only the tag) and look at a block to see its soil quality, drawn with the HUD 80 px above the bottom of the screen (client optiontint.hoeReadout). - No commands and no items: it works on its own.
How it works
Quality comes from the block's X and Z position and the biome there. It is built from smooth, two-octave simplex noise seeded by the world seed plus the seedSalt option, which makes soil form large patches rather than a speckle, optionally shifted by the biome's climate (off by default, see below). The Low and High percentages describe the share where the climate is neutral or ignored, so they are approximate shares of the world, not exact.
- Each quality has a growth multiplier (
lowGrowthMultiplier,normalGrowthMultiplier,highGrowthMultiplier). - Below 1: random ticks of affected blocks are skipped with probability
1 - multiplier. - Above 1: the random tick repeats. That adds
multiplier - 1extra ticks, and a fractional part counts as a chance of one more. - 1: vanilla behaviour, which is the default for Normal soil.
Which blocks are affected is set by the block tag ffsoilfertility:affected_blocks (see Datapacks): crops, sweet berry bushes, cocoa, sugar cane, cactus and bamboo by default (turn them off with growth.affectCrops). Saplings are covered by a separate tag, ffsoilfertility:affected_saplings, and are off by default: enable growth.affectSaplings to include them. With affectAllCropBlocks on, any modded block built on vanilla's crop or stem block is affected too. All options are on the Configuration page.
Bone meal
The bonemeal.low, bonemeal.normal and bonemeal.high server options can limit how many growth stages one use of bone meal advances an affected crop on that soil quality. Each quality has limitStages and maxStages (1 to 16): while the limit is on, one use advances at most maxStages stages. The defaults limit only Low soil, to 1 stage; Normal (2) and High (3) have the limit off and behave like vanilla.
- It applies only to affected blocks (see above) and only while
enabledis true. - The cap applies to the stages vanilla rolls for crops (wheat, carrots, potatoes, beetroots and modded crops that use vanilla's crop growth) and for melon and pumpkin stems. Vanilla bone meal normally advances wheat, carrots, potatoes and stems by 2 to 5 stages.
- It works for bone meal from players and dispensers alike, because the limit is applied inside the blocks.
- A capped stem does not place its fruit early: the fruit check only runs if the capped growth actually reaches the final stage.
- Other plants already advance one stage per use in vanilla (sweet berries, cocoa, saplings, torchflower and pitcher crops), so the limit does not change them. Bamboo (1 to 2 blocks per use) is not limited, and neither are modded plants that replace vanilla's bone meal code entirely.
Climate
Optionally, the biome's temperature and downfall can shift soil quality. Both factors are off by default, so soil is pure noise until you turn on climate.temperatureEnabled and/or climate.downfallEnabled. When on, each factor adds influence * score to the normalised soil noise, where the score is +1 at the ideal value and -1 at one tolerance away or more. Only temperature and downfall are read, never biome ids, so modded biomes work. With the default ideals, forest and plains-like climates have fertile soil and deserts and frozen biomes poorer soil. A factor that is switched off, or has influence 0, is ignored. See the climate options on Configuration.
Grass tint
A mixin on the biome grass colour adjusts it in HSB. Saturation is multiplied by 1 + highSaturation or 1 - lowDesaturation, the hue is rotated by highHueShift or lowHueShift degrees, and brightness is multiplied by 1 + highBrightness or 1 + lowBrightness. Normal soil is left unchanged. It applies to every tint that goes through the biome grass colour: grass blocks, short grass, ferns, tall grass, large ferns, grass-tinted blocks from other mods and the colour caches of Sodium and Embeddium. The client option grassVisuals is a master switch: off shows vanilla grass (the hoe readout still works). Changing the client config re-renders the world automatically.
Growth particles
When an affected block grows, the server sends particles above it, chosen by soil quality through the particles.low, particles.normal and particles.high server options (enabled, particle id and count). This includes growth from the extra ticks on faster soil. Only simple particles without extra data work. See Configuration.
Multiplayer
The gameplay config is a common config that clients do not read. The server sends the seed, scale, percentages and climate settings to clients on login and whenever the config reloads. That packet is an optional channel on every loader: players without the mod can join a server that has it and just see vanilla grass, and a client with the mod on a vanilla server gets no tint and no readout. Growth effects happen on the server either way.
On Minecraft 26.3 the simplex noise class changed, so the soil pattern for a given seed may differ slightly from other versions. The noise is normalised, so the proportions hold.
Compatibility
The grass tint hooks the biome grass colour instead of replacing block colour handlers, so it also applies to other mods' grass-tinted blocks and to Sodium and Embeddium colour caches. A mod that bypasses the biome grass colour is not tinted. The bone meal limits use plain Mixin redirects, so the mod needs no MixinExtras. Fabric needs Fabric API installed separately; FFUtilities 0.2.17 is bundled in every jar. Fabric and Forge use Forge Config API Port (bundled through FFUtilities on Fabric). The in-game config screen comes from FFUtilities on NeoForge 1.21+ and from Mod Menu on Fabric 1.21.1+; Forge 1.20.1 and 1.20.6 have none, so edit the toml files.
Modding API
Other mods can read soil quality, adjust it on the server and listen to growth, bone meal and particle events. See the Modding API page.
Requirements and source version
| Minecraft | Fabric | NeoForge | Forge |
|---|---|---|---|
| 1.21.1 | 21.1.211 or newer |
Source version: 0.4.0. NeoForge 26.1, 26.1.1 and 26.3 are not supported because only beta NeoForge builds exist. Java 17 is needed for 1.20.1, Java 21 for 1.20.6 to 1.21.11 and Java 25 for 26.x. FFUtilities is bundled in the jar, so it needs no separate download. The Modrinth and CurseForge buttons are enabled only when a published project link is configured.