FF Expanded Biome Tint
Give your stone a little local color! This mod blends selected block textures with the local biome's grass, foliage, or water color. It works on blocks whose models normally have no tint, and supports Sodium 0.8.12.

Getting started
The bundled rules tint stone, overworld base stone, deepslate ores, the regular stone variants of those ores, plus clay, gravel, andesite, granite, tuff, calcite, and diorite. They also use regex to cover common modded ore IDs ending in _ore or beginning with ore_. The default grass tint is 25% strength for deepslate and deepslate ores, and 45% for the other listed blocks.
- Minecraft: 1.21.1
- Loader: NeoForge 21.1.244 or newer for Minecraft 1.21.1
- Java: 21
- Sodium: optional; 0.8.12 for Minecraft 1.21.1 is supported.
- Also works with Iris! (Note: Disable any "glow" effects on ore to prevent issues)
Colors multiply the original texture, so its detail remains visible. Block-breaking particles use the same biome color and strength as the block. Inventory previews have no world biome to sample.
For datapack makers
Place JSON rule files at data/<namespace>/ffexpandedbiometint/tint_rules/<name>.json in a datapack. The server resolves rules and sends the resulting block tints to clients when they join or the datapacks reload. Use /reload after changing a datapack. Players need this mod on both sides to see server datapack rules.
Each rule selects blocks by exactly one of block (exact block ID), tag (block tag ID without #), or regex (Java regular expression matched against the complete block ID, such as minecraft:stone). Assign tint to grass, foliage, or water, and an optional strength from 0.0 (original texture) to 1.0 (full biome color). The default strength for a rule without that field is 1.0.
{
"rules": [
{ "block": "minecraft:clay", "tint": "water", "strength": 0.35 },
{ "tag": "minecraft:base_stone_overworld", "tint": "grass", "strength": 0.45 },
{ "regex": "examplemod:.*_leaves", "tint": "foliage", "strength": 0.75 }
]
}
The bundled defaults live at data/ffexpandedbiometint/ffexpandedbiometint/tint_rules/default.json. A datapack file at the same path replaces all bundled defaults. Otherwise, rule files add to them: the bundled default file is applied first, then other files in resource ID order. Within a file, rules run top to bottom. The last matching rule sets that block's tint and strength. This lets you override a broad tag or regex with an exact block entry.
The built-in ore regex rules cover IDs such as examplemod:tin_ore and examplemod:ore_tin at 45% strength, and names containing deepslate, such as examplemod:deepslate_tin_ore and examplemod:ore_deepslate_tin, at 25%. They skip the minecraft namespace and IDs containing common Nether or End material names (nether, netherrack, end_stone, endstone, the_end, basalt, or blackstone). Block IDs alone cannot identify every ore's dimension, so add a later datapack rule or replace the defaults if a mod uses a different naming scheme.
For integration details and examples, click the Wiki link in the Modrinth sidebar when available.
For mod developers
Mods can register default tint rules for exact block IDs, tags, or regular expressions through the public BiomeTintAPI during mod construction. Server datapacks can override those registrations. For the Java API and integration examples, click the Wiki link in the Modrinth sidebar when available.
What's with the FF prefix?
It stands for Fyxe's Features! Its a clean way to easily find all of my mods when changing configs or creating packs. Mods that are a part of the "FF" system are usually smaller and unintrusive.
Feedback
If you have any ideas for improvements, questions, or concerns, I am open to communicating through email: FyxeINCFeedback@gmail.com

