FAQ
Search by question or keyword.
Which modloader do I need?
What is Architectury API and why is it required?
Why do I need Fabric API when using Fabric?
What happens if a required API is missing?
Which Minecraft versions are supported?
Do I need other dependencies?
Is there a config file?
Can I use Let’s Do in my modpack?
How do I install Let’s Do mods?
Where can I download Let’s Do mods?
Where do I get Fabric or NeoForge?
Are Let’s Do mods compatible with worldgen mods?
Do Let’s Do mods work with performance mods?
Why do I see “No data fixer registered” in the logs?
What are resource packs?
How does Let’s Do use resource packs?
Can I create my own resource pack for Let’s Do?
What are datapacks and how do they work?
How do I create a datapack?
How can datapacks be loaded?
What can I change using datapacks?
Datapack tutorial and example pack
- Create a folder in: saves/<world>/datapacks/
- Add a pack.mcmeta file
- Add the files you want to override using the exact same path
- Run /reload and verify with /datapack list
{
"pack": {
"pack_format": 48,
"description": "Let’s Do Datapack"
}
} pack_format
This defines which Minecraft version the datapack targets. For Minecraft 1.21.1 the correct pack format is 48. If this number does not match your Minecraft version, the pack will show as incompatible.
description
This is the display name shown in the datapack menu inside Minecraft. It does not affect functionality and can be anything you like.
How do I change recipes?
Let’s say we want to override a normal Farm & Charm crafting recipe. This is how the original recipe looks:
{
"type": "minecraft:crafting_shaped",
"pattern": [
"###",
"###",
"###"
],
"key": {
"#": {
"item": "farm_and_charm:barley"
}
},
"result": {
"id": "farm_and_charm:barley_ball",
"count": 1
}
} If we want to change the output, we only modify the result section:
{
"type": "minecraft:crafting_shaped",
"pattern": [
"###",
"###",
"###"
],
"key": {
"#": {
"item": "farm_and_charm:barley"
}
},
"result": {
"id": "minecraft:diamond",
"count": 1
}
} Now crafting nine barley will produce a diamond instead of a barley ball.
If we instead want to change the required ingredient, we modify the key section:
{
"type": "minecraft:crafting_shaped",
"pattern": [
"###",
"###",
"###"
],
"key": {
"#": {
"item": "minecraft:diamond"
}
},
"result": {
"id": "farm_and_charm:barley_ball",
"count": 1
}
} Now the recipe requires diamonds instead of barley.
In shaped recipes every row in the pattern must have the exact same length. Spaces matter. Each string represents one full row of the crafting grid.
"pattern": [
"b ",
" ",
" "
] "pattern": [
"b",
" ",
" "
] Not all recipes use minecraft:crafting_shaped. Custom crafting blocks use their own recipe types.
Example: A Cooking Pot recipe in Farm & Charm:
{
"type": "farm_and_charm:pot_cooking",
"ingredients": [
{ "tag": "farm_and_charm:corn" },
{ "tag": "farm_and_charm:corn" },
{ "tag": "farm_and_charm:flour" }
],
"requireContainer": true,
"container": {
"id": "minecraft:bowl",
"count": 1
},
"result": {
"id": "farm_and_charm:corn_grits",
"count": 1
},
"requiresLearning": false
} Notice the type is different. Each custom crafting system defines its own structure and required fields. Always check the original recipe to understand which keys are required.
How do I extend or change tags?
Tags are one of the cleanest ways to tweak behavior. In most cases you want to extend an existing tag, not replace it. Use "replace": false to keep the original entries and only add your own.
Example: Let’s say we want the diamond block to be considered a valid heat source for the Cooking Pot. We look for the heat source tag and add minecraft:diamond_block to the list.
{
"replace": false,
"values": [
"farm_and_charm:stove",
"minecraft:redstone_block",
"minecraft:magma_block",
"#minecraft:campfires",
"minecraft:diamond_block",
{
"id": "farmersdelight:stove",
"required": false
},
{
"id": "meadow:stove_tiles_wood",
"required": false
}
]
} Tags can also reference other tags. When you want to include another tag, the # prefix is required:
{
"replace": false,
"values": [
"#c:grains/barleys"
]
} How do I change loot tables?
Loot tables control what blocks, chests, mobs, or other sources drop. To change a drop, override the loot table JSON in your datapack using the exact same file path and name.
Here is a simple block loot table example:
{
"type": "minecraft:block",
"pools": [
{
"bonus_rolls": 0.0,
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
],
"entries": [
{
"type": "minecraft:item",
"name": "farm_and_charm:fertilized_soil"
}
],
"rolls": 1
}
]
} pools: A loot table can have multiple pools. Each pool is rolled separately.
rolls: How many times this pool is rolled. If rolls is 1, the pool runs once.
bonus_rolls: Extra rolls added on top of rolls.
conditions: Rules that decide if the pool is allowed to run.
entries: The actual things that can drop.
Example: We want farm_and_charm:fertilized_soil to drop a diamond instead. We override the block loot table and change the item entry.
Example path: data/farm_and_charm/loot_tables/blocks/fertilized_soil.json
{
"type": "minecraft:block",
"pools": [
{
"bonus_rolls": 0.0,
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
],
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:diamond"
}
],
"rolls": 1
}
]
} That’s it. Reload your datapacks and test the drop.
How do I change world generation?
World generation is fully data-driven. Most features consist of two parts: configured features and placed features.
World generation changes only apply to new chunks. Existing terrain will not be retroactively updated.
1. Configured Feature
The configured feature defines what is generated and how it behaves. Example: wild barley patch from Farm & Charm.
{
"type": "minecraft:random_patch",
"config": {
"feature": {
"feature": {
"type": "minecraft:simple_block",
"config": {
"to_place": {
"type": "minecraft:simple_state_provider",
"state": {
"Name": "farm_and_charm:wild_barley"
}
}
}
}
},
"tries": 11,
"xz_spread": 7,
"y_spread": 2
}
} type: Defines the feature logic. Here: random patch.
Name: The block that gets placed.
tries: How many placement attempts per patch.
xz_spread: Horizontal spread size.
y_spread: Vertical variation.
2. Placed Feature
The placed feature defines where and how often the configured feature appears.
{
"feature": "farm_and_charm:wild_barley_chance",
"placement": [
{
"type": "minecraft:rarity_filter",
"chance": 40
},
{ "type": "minecraft:in_square" },
{
"type": "minecraft:heightmap",
"heightmap": "WORLD_SURFACE_WG"
},
{ "type": "minecraft:biome" }
]
} feature: Links to the configured feature.
rarity_filter: Controls how rare the feature is.
chance: 1 in X chunks. Lower number means more common.
heightmap: Controls vertical placement logic.
biome: Restricts to matching biomes.
Example: Make Wild Barley Rarer
If the current rarity is "chance": 40 it means roughly 1 in 40 chunks. To make it rarer, increase the value:
{
"feature": "farm_and_charm:wild_barley_chance",
"placement": [
{
"type": "minecraft:rarity_filter",
"chance": 120
},
{ "type": "minecraft:in_square" },
{
"type": "minecraft:heightmap",
"heightmap": "WORLD_SURFACE_WG"
},
{ "type": "minecraft:biome" }
]
} If you want fewer plants per patch, reduce tries in the configured feature.
If you want fewer patches overall, increase chance in the placed feature.
Where can I learn more about datapacks?
https://misode.github.io/
Interactive JSON generators for recipes, loot tables, worldgen and more.
https://minecraft.wiki/w/Data_pack
Detailed explanations of datapack structure, pack formats and file paths.
What license do the mods use?
Can I ask about asset usage?
Where should I report bugs or issues?
How should I report an issue?
Why is direct feedback important?
Let’s Do is built with a lot of personal dedication. I constantly revisit older systems, refactor them, improve performance, and try to raise the overall quality of the projects.
If you encounter bugs, performance issues, compatibility problems, or design flaws, please tell me directly. Open an issue, share logs, describe the steps to reproduce it. I genuinely want to improve things.
Public criticism without direct communication makes it harder to fix real problems. Constructive feedback shared directly helps the project grow.
If something is wrong, tell me. I will listen.