Overview

Soil quality varies across the land in smooth patches, speeding up or slowing down crop growth and tinting grass to match.

A hillside of grass showing a washed-out low quality patch, normal grass, and a vivid high quality patch side by side.

Features

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.

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.

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

MinecraftFabricNeoForgeForge
1.21.121.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.