Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Links
Tags
Creators
Details
Mebahel's RPG: Villager Quests & Companions
Turn Minecraft villages into living RPG adventures with branching quests, meaningful choices, repeatable contracts, recruitable companions, rumors, dialogue, and a complete quest journal.
Minecraft: 1.20.1 and 1.21.1
Loaders: Fabric, Quilt, Forge, and NeoForge (with Syntra Connector & Forgified Fabric API)

Minecraft villages have always felt like places worth protecting. This mod gives you reasons to know the people living in them.
Mebahel's RPG: Villager Quests & Companions transforms villages into hubs for stories, decisions, contracts, rumors, and long-term adventures. Discover 89 included quests, meet named characters, investigate strange events, choose who to trust, spare or fight enemies, recruit companions, and watch some of your decisions return later in unexpected ways.
Between story quests, village quest boards generate repeatable contracts with their own reputation and difficulty progression. Everything you accept is tracked through a dedicated quest journal, HUD tracker, and branching quest map.
The mod is ready to play out of the box and includes full English, French, Russian, and Simplified Chinese localization.
If you enjoy the mod, use the Follow button on CurseForge to be notified when new stories, systems, integrations, and major updates are released.
Why Play Villager Quests & Companions?
- 89 included quests: Storylines, village jobs, investigations, quest books, hidden adventures, and multi-part quest chains.
- Choices with consequences: Decide who to trust, when to fight, and when to show mercy. Some decisions alter later quests and dialogue.
- Recruitable companions: Selected characters can become permanent allies with commands, equipment, guard behavior, and configurable combat stances.
- Repeatable quest-board contracts: Hunts, deliveries, protection jobs, incursions, escorts, and elite targets with five difficulty levels.
- A complete quest interface: Journal, HUD tracker, quest map, objectives, rewards, destinations, completed quests, and failed quests.
- Villager rumors and discovery: Some quests are unlocked gradually through rumors, books, prerequisites, and exploration.
- Living villages: Ambient conversations and reactions make villagers feel more connected to what happens around them.
- Multiplayer support: Story progress can remain individual or be shared across the server.
- Datapack-friendly: Build your own quests, branching stories, rumors, objectives, named threats, rewards, and board contracts.
- Built for modpacks: Extensive configuration and integrations with several popular village, creature, and RPG mods.
Story Quests, Choices, and Consequences
A simple village job can become an investigation, a confrontation, or the beginning of a story that returns much later.
Talk to named characters, ask questions, investigate locations, and make choices that can change what happens next.
The included adventures mix branching stories with everyday village life:
- Defend settlements.
- Escort characters to safety.
- Deliver supplies between locations.
- Help villagers construct and restore parts of their settlement.
- Investigate mines and unusual structures.
- Hunt dangerous enemies.
- Discover stories hidden inside quest books.
- Decide whether certain threats deserve death or mercy.
Consequences can continue after the reward screen.
Selected decisions affect follow-up quests and village dialogue, while some continuations only appear after time has passed. The result is a quest system designed to make returning to familiar villages and characters matter.
Included Adventures
The mod currently includes 85 quests covering several styles of content.
| Category | Included content | Gameplay focus |
|---|---|---|
| Major storylines | Ash Court, Armed Dead, False Hero, Blackthorn House, Mad Scientist, Most Important Cow, No Banner, Village Defense, Witch, Last Heat | Branching choices, investigations, combat, mercy paths, consequences, and multi-part progression |
| Village stories | Village Arrival, village construction, animal enclosure, deliveries, mine incidents, and local threats | Building, collecting, defending, escorting, and restoring village life |
| Quest-book stories | Eleven quest-book stories with standalone or delayed follow-ups | Exploration, reading clues, hidden encounters, unusual objectives, and long-form mysteries |
| Repeatable contracts | Hunts, spawned groups, deliveries, village protection, incursions, escorts, and elite targets | Board reputation, five difficulty levels, scaling danger, and randomized rewards |
| Discovery content | Villager rumors and hidden prerequisites | Gradual unlocking instead of presenting every adventure immediately |
Quest Journal and HUD Tracking
Every accepted story quest and board contract is collected in one dedicated journal.
Check:
- Current objectives.
- Quest progress.
- Rewards.
- Destinations.
- Active quests.
- Completed quests.
- Failed quests.
Press J to open the journal. The key is configurable.
Your currently tracked objective also appears on a dedicated HUD. Its scale and screen position can be configured, and server owners can disable clickable journal coordinates if they prefer a more exploration-focused experience.

See How Your Story Branches
Press K to open the quest map.
The map visualizes relationships between stories, including:
- Choices.
- Prerequisites.
- Rumor discoveries.
- Quest chains.
- Delayed continuations.
- Chance-based follow-ups.
This makes it possible to understand how your adventure has developed without revealing every path in advance.
The key is configurable, and server owners can disable the map entirely.

Quest Boards and Repeatable Contracts
Story quests are only one part of village life.
Quest boards generate repeatable work that gives you something useful to do between larger adventures.
Available contract types include:
- Hunts
- Spawned group hunts
- Deliveries
- Village protection
- Incursions
- Escorts
- Elite targets
Each board has its own reputation and level. Completing contracts improves the board over time, makes more difficult offers increasingly likely, and shortens its refresh time.
Five difficulty levels scale danger and rewards:
| Difficulty | Tier |
|---|---|
| Common | 1 star |
| Dangerous | 2 stars |
| Deadly | 3 stars |
| Nightmare | 4 stars |
| Legendary | 5 stars |
Accepted contracts are automatically added to the normal journal and HUD. There is no contract item you need to carry.
Board offers are personal to each player by default, while board reputation and level are shared. Servers can configure different multiplayer behavior.

Recruitable Companions
Some stories can end with more than a reward.
Characters you first meet as threats may eventually become permanent companions depending on your choices. Current recruitable characters include Rusk and Merrin.
Companions can be ordered to:
- Follow you.
- Wait.
- Return home.
- Guard an area.
- Use passive, defensive, or aggressive combat behavior.
They can help fight hostile enemies and can join combat when you attack a target. Guards continue protecting their assigned area while you are offline.
Companions gradually heal after 10 seconds out of combat, and their equipment can be managed through a dedicated inventory screen.

Rumors, Quest Books, and Hidden Adventures
Not every story is handed to you immediately.
Villager rumors can gradually reveal new problems and unlock hidden quests, while discoverable quest books introduce additional stories during exploration.
The mod includes eleven quest-book stories, with both standalone adventures and delayed follow-ups.
This keeps exploration relevant and prevents every piece of content from appearing in a single menu at the beginning of a world.
Courier Deliveries
Some stories continue after time has passed.
When a later quest event is ready, a courier can find you outdoors in the Overworld during the day and deliver a letter.
If several letters are waiting, one courier can deliver them together in a single visit.
Each delivery comes with its own Quest Book. Receiving the book does not automatically begin the next quest, so you can choose when you are ready to continue.
Villager Conversations and Reactions
Villagers do more than wait for you to click on them.
Walk through a settlement and you can hear conversations about work, crops, books, golems, local gossip, and other parts of village life.
The mod includes 40 ambient dialogue scenes using text above the speaker, dialogue sounds, and speaking animations.
Villagers can also react to important events from your adventures, making completed stories feel more connected to the world around them.
Conversations account for nearby danger and active quest dialogue, and every player sees them in their selected supported language.

Your First Adventure
Getting started does not require a guide or a datapack.
- Visit a village and interact with villagers to discover stories and rumors. Not every villager offers a quest.
- Find a quest board and browse its repeatable contracts.
- Discover quest books while exploring.
- Open your journal with J to follow objectives and rewards.
- Open the quest map with K when you want to understand how your stories connect.
The included quests are ready to play immediately. Datapacks are optional and are only needed if you want to create additional content.
Compatibility
Villager Quests & Companions is designed to work alongside village overhauls, creature mods, and other RPG systems.
| Mod | What to Expect |
|---|---|
| MCA Reborn | Dedicated interaction handling returns control to MCA after quest interactions. |
| Ice and Fire CE | Optional elite contracts for fire, ice, and lightning dragons, with scaled stages and dedicated rewards. |
| Saint's Dragons | Configurable village-attack contracts featuring Varasuchus, Volitans, Nulljaw, Atroxiia, Raevyx, and Ignivorus, plus a separate Draconian Swarm contract. Each contract type has its own enable toggle, selection weight, and star range. |
| Guard Villagers | Choose which quests guards may offer through a dedicated configuration. |
| Villagers Reborn | Compatible villager models and interaction changes. |
| Epic Villages | Tested with the quest system. |
| Luki's Grand Capitals | Tested with the quest system. |
Quest assignments support vanilla and modded locations, so village and structure overhauls are generally compatible. Specific combinations can still depend on how another mod changes structures and interactions.
Multiplayer
Story progress is individual by default.
Servers can enable shared quest progress, outcomes, rewards, and story traits if they want players to experience the same stories together.
Quest boards have their own multiplayer behavior:
- Offers can remain personal to each player.
- Servers can configure shared offers.
- Board reputation and progression are shared.
This allows the mod to work for both personal RPG progression and more cooperative server setups.
Extensive Customization
Quest assignment, rumors, ambient conversations, board generation, HUD placement, navigation aids, multiplayer behavior, and contract generation can all be configured.
Additional files also control ignored quests, Guard Villager assignments, and board-contract generation.
Configuration reference
Main server/world configuration:
config/mebahelrpgrquest/mebahelrpgrquest_config.json| Option | Default value | Purpose |
|---|---|---|
villagerQuestChance | 0.15 | Weight for assigning a story quest to a newly loaded villager |
villagerRumorChance | 0.15 | Weight for assigning a rumor |
disableQuestCoordinateClick | false | Disables clickable journal coordinates |
disableQuestMap | false | Disables access to the quest map |
shareQuestsBetweenPlayers | false | Shares progress, outcomes, rewards, and story traits server-wide |
inventoryJournalButtonPosition | left | Places the inventory journal button on the left or right |
hideInventoryJournalButton | false | Hides the inventory journal shortcut |
questTrackerPosition | top_left | Chooses one of four tracker corners |
questTrackerScale | 1.0 | Resizes the HUD tracker |
questBoardVillageChance | 1.0 | Controls village quest-board generation chance |
individualBoardOffers | true | Gives each player personal board offers |
questBoardStructures | minecraft:village_plainsminecraft:village_desertminecraft:village_savannaminecraft:village_snowyminecraft:village_taiga | Lists the structure IDs eligible for quest-board generation |
questBoardPreferMeetingPoint | true | Prefers the village meeting point when placing a quest board |
questBoardPlacementSearchRadius | 24 | Sets the search radius for a suitable quest-board placement position |
questBoardDropsOnBreak | true | Controls whether a quest board drops as an item when broken |
questBoardMinimumPlacementDistance | 48 | Sets the minimum spacing between generated quest boards |
ambientDialoguesEnabled | true | Enables ambient villager conversations |
ambientDialogueCheckIntervalTicks | 100 | Sets ambient-dialogue check frequency |
ambientDialogueChance | 0.08 | Sets chance per eligible ambient-dialogue check |
ambientDialogueActivityRadius | 24.0 | Sets activity radius around each player |
Additional files manage ignored quest IDs, Guard Villager assignments, and contract generation.
Installation and Dependencies
Always use dependency versions that match the Minecraft version of the Villager Quests & Companions file you download.
Minecraft: 1.20.1 and 1.21.1
Loaders: Fabric, Quilt, Forge, and NeoForge
Fabric / Quilt
Required:
Forge / NeoForge
Forge and NeoForge run the Fabric version through Sinytra Connector and require:
Check that the Connector version you install supports your chosen Minecraft and loader version.
Modpack Information
Yes, Villager Quests & Companions can be included in modpacks.
The mod is particularly suited to RPG, adventure, village, exploration, and progression-focused packs because it provides:
- Included story content ready to play.
- Repeatable village contracts.
- Individual or shared multiplayer progression.
- Compatibility with vanilla and modded locations.
- Configurable quest-board generation.
- Configurable HUD and navigation aids.
- Optional integrations with other creature and village mods.
- A fully data-driven system for adding custom quests and contracts.
Datapacks can extend the mod without replacing its built-in stories, allowing pack creators to connect their own mobs, items, structures, rewards, dialogue, and progression directly to the quest system.
Create Your Own Adventures
Villager Quests & Companions is not limited to its included content.
Using JSON datapacks, creators can build their own:
- Dialogue.
- Branching questlines.
- Player choices.
- Rumors.
- Named threats.
- Kill, collect, escort, build, defend, delivery, and exploration objectives.
- Ambushes and raids.
- Rewards.
- Quest books.
- Repeatable board contracts.
- Custom contract reward and equipment tables.
The complete creator reference is included below.
Continue the Adventure
Villager Quests & Companions is part of a growing collection of RPG and Elder Scrolls-inspired Minecraft mods.
Mebahel's Creatures: Draugr Invasion
Explore Nordic ruins, fight intelligent Draugr, solve dungeon challenges, recover the Golden Claw, defeat the Draugr Overlord, and trigger a repeatable invasion that hunts the player.
View Draugr Invasion on CurseForge
Mebahel's Creatures: Dwarven Automatons
Explore ancient Dwemer-inspired ruins, battle mechanical constructs, recover Dwarven technology, and summon mechanical companions.
View Dwarven Automatons on CurseForge
These are separate projects and are not required dependencies for Villager Quests & Companions.
Join the Mebahel Community
Villager Quests & Companions is actively developed.
Join the Discord to:
- Suggest new quests and village stories.
- Discuss choices and quest outcomes.
- Share screenshots and adventures.
- Report issues.
- Give feedback on dialogue, difficulty, integrations, and translations.
- Follow upcoming features and development.
Join the Mebahel Discord
For bug reports, include your Minecraft version, loader, mod version, and steps to reproduce the issue. A log or screenshot is useful when it helps explain the problem.
Support Development
Villager Quests & Companions and the other Mebahel projects continue to receive new stories, systems, integrations, compatibility work, and improvements.
If you would like to directly support future development:
Support is completely optional. Playing the mod, following the project, reporting issues, leaving feedback, creating datapacks, and sharing the mod with other players already helps a lot.
Creator documentation
Build your own stories with JSON datapacks. Add dialogue, branching choices, rumors, objectives, named enemies, rewards, and repeatable contracts. Use vanilla or modded content to tailor adventures to your world or modpack.
The reference sections below include quest and contract examples. Expand the section closest to what you want to create.
Story quests and rumors: setup
Anyone can create new quests for the mod with JSON files in a datapack or mod. You can add dialogue, objectives, rumors, named enemies, rewards, choices, ambushes, raids, deliveries, escorts, and complete branching questlines.
File Locations
Place quest and rumor files in your own namespace:
data/<namespace>/quests/<quest_file>.json
data/<namespace>/rumors/<rumor_file>.jsonFor example:
data/my_quests/quests/old_well.jsonThis creates the quest id:
my_quests:old_wellQuest subfolders are allowed, but they do not become part of the quest id. Keep every quest filename unique inside your namespace.
Quick Start
- Choose the example below that is closest to the quest you want to make.
- Copy its JSON into a new file under
data/<namespace>/quests/ordata/<namespace>/rumors/. - Replace the
exampleormodidnamespace with your own namespace. - Change the dialogue, entities, structures, objectives, rewards, and linked quest ids.
- Reload the datapack and test the quest in a development or backup world.
JSON does not allow comments or trailing commas. Always use full identifiers such as minecraft:zombie, and use full quest ids such as my_quests:old_well when one file references another.
Player-facing text can use a translation object:
{
"translate": "quest.my_quests.old_well.title",
"fallback": "The Old Well"
}The fallback value is displayed when no matching translation is available, so a separate language file is optional.
Named Threat with Attack or Spare Branches
Spawn a named enemy, let the player speak to it, then continue into a different quest depending on whether the target is attacked or spared.
First Quest
{
"title": "QUEST TITLE",
"summary": "Villager-facing summary shown before acceptance.",
"flow": {
"on_kill": "modid:kill_branch_2",
"on_spare": "modid:spare_branch_2"
},
"goals": [
{
"id": "talk_to_threat",
"talk": "minecraft:zombie",
"amount": 1,
"name": "NAMED THREAT"
},
{
"id": "kill_threat",
"kill": "minecraft:zombie",
"amount": 1,
"attack_only": true,
"from_threats": true
}
],
"threat": {
"entity": "minecraft:zombie",
"name": "NAMED THREAT",
"structure": "minecraft:ruined_portal",
"search_radius": 4000,
"spawn_on_accept": true,
"spawn_min_radius": 3,
"spawn_max_radius": 6,
"spare": true,
"glow": false,
"max_health": 150,
"equipment": {
"mainhand": "minecraft:diamond_sword",
"helmet": {
"item": "minecraft:iron_helmet",
"enchants": {
"minecraft:unbreaking": 3
}
}
},
"line": "Quest giver line that describes the threat.",
"target": "Initial line spoken by the threat.",
"talk": [
[
"Player question one?",
"Threat answer one."
],
[
"Player question two?",
"Threat answer two."
]
]
},
"choice": {
"attack": {
"label": "Attack choice label.",
"traits": [
"trait_from_attack"
],
"return": "Quest giver line after the target is killed."
},
"spare": {
"label": "Spare choice label.",
"line": "Immediate line after sparing the target.",
"post": "Follow-up line shown after the spare.",
"villager": "Quest giver line after spare.",
"traits": [
"trait_from_spare"
],
"rewards_from_giver": true,
"rewards": {
"xp": 160,
"items": {
"minecraft:iron_ingot": 4
}
},
"after": {
"offer_chance": 70,
"ambush_chance": 30,
"nothing_chance": 0,
"ambush": "minecraft:zombie",
"ambush_name": "Fallback Ambush Name",
"count": 5,
"ambush_max_health": 50,
"ambush_equipment": {
"helmet": "minecraft:leather_helmet"
},
"line": "Line used when the spared target offers the next quest.",
"ambush_line": "Line used if mercy triggers an ambush.",
"nothing": "Line used if no follow-up happens."
}
}
},
"dialogue": {
"return": "Quest giver line after kill.",
"reward": "Quest giver reward line.",
"done": "Quest giver already-completed line."
},
"rewards": {
"xp": 260,
"items": {
"minecraft:emerald": 10
}
}
}For spare-enabled threat confrontations, prefer the talk plus attack_only kill pattern shown above. The first interaction opens dialogue without completing the stage; the stage completes only after the player explicitly chooses attack or spare.
Kill Branch
{
"title": "KILL BRANCH TITLE",
"summary": "Follow-up summary after the player chose attack.",
"dialogue": {
"intro": "Intro line.",
"offer": [
[
"Player question?",
"Quest giver answer."
]
],
"return": "Return line.",
"reward": "Reward line.",
"done": "Already completed line."
},
"goals": [
"kill 3 minecraft:zombified_piglin"
],
"threats": [
{
"entity": "minecraft:zombified_piglin",
"name": "Branch Threat",
"structure": "minecraft:ruined_portal",
"search_radius": 4000,
"spawn_on_accept": true,
"spare": false,
"max_health": 70,
"equipment": {
"mainhand": "minecraft:golden_sword"
}
}
],
"rewards": {
"xp": 360,
"items": {
"minecraft:emerald": 14
}
}
}Spare Branch
{
"title": "SPARE BRANCH TITLE",
"summary": "Follow-up summary after the player chose spare.",
"flow": {
"next": "modid:spare_branch_3"
},
"dialogue": {
"intro": "Intro line from the spared target or quest giver.",
"offer": [
[
"Player question?",
"Answer."
]
],
"return": "Return line.",
"reward": "Reward line.",
"done": "Already completed line."
},
"goals": [
{
"collect": "minecraft:iron_ingot",
"amount": 4
}
],
"rewards": {
"xp": 240,
"items": {
"minecraft:emerald": 6
}
}
}Staged Building and Defense
Ask the player to build or gather supplies first, then begin a second stage that spawns attackers around the quest giver.
Based on questlines/village_build/village_pig_enclosure.json.
Key points:
sequential_objectives: truemakes stage0finish before stage1starts.- Build objectives use
place,bring,collect, or other normal objective shortcuts. - Threats can be assigned to
stage: 1and spawned around the quest giver withspawn_origin: "quest_giver". - Use
from_threats: trueon kill goals when the spawned named/custom threats should count. - Add one
threatsentry per mob to spawn.amountis not read on threat entries.
{
"title": {
"translate": "quest.example.first_pen_defense.title",
"fallback": "A Pen Worth Defending"
},
"summary": {
"translate": "quest.example.first_pen_defense.summary",
"fallback": "Build a small animal pen, bring livestock inside, then defend it from raiders."
},
"sequential_objectives": true,
"dialogue": {
"intro": {
"translate": "quest.example.first_pen_defense.dialogue.intro",
"fallback": "The villager points to a bare patch of grass near the farm."
},
"offer": [
[
{
"translate": "quest.example.first_pen_defense.dialogue.offer.0.0",
"fallback": "What do you need built?"
},
{
"translate": "quest.example.first_pen_defense.dialogue.offer.0.1",
"fallback": "A fence, a gate, two torches, and enough room for the first herd."
}
]
],
"return": {
"translate": "quest.example.first_pen_defense.dialogue.return",
"fallback": "The pen held. So did you."
},
"reward": {
"translate": "quest.example.first_pen_defense.dialogue.reward",
"fallback": "Take this. A defended farm feeds more than one house."
},
"done": {
"translate": "quest.example.first_pen_defense.dialogue.done",
"fallback": "The animals are still inside, and the raiders are gone."
}
},
"goals": [
{
"id": "place_fences",
"place": "minecraft:oak_fence",
"amount": 12,
"stage": 0,
"range": 60
},
{
"id": "place_gate",
"place": "minecraft:oak_fence_gate",
"amount": 1,
"stage": 0,
"range": 60
},
{
"id": "place_torches",
"place": "minecraft:torch",
"amount": 2,
"stage": 0,
"range": 60,
"say": {
"translate": "quest.example.first_pen_defense.goals.place_torches.say",
"fallback": "The pen is lit. Stay close."
}
},
{
"id": "bring_animals",
"bring": "minecraft:pig",
"amount": 2,
"stage": 0,
"range": 60
},
{
"id": "kill_raiders",
"kill": "minecraft:pillager",
"amount": 3,
"stage": 1,
"from_threats": true
},
{
"id": "kill_raider_captain",
"kill": "minecraft:vindicator",
"amount": 1,
"stage": 1,
"from_threats": true
}
],
"threats": [
{
"entity": "minecraft:pillager",
"name": {
"translate": "quest.example.first_pen_defense.threats.0.name",
"fallback": "Hungry Raider"
},
"stage": 1,
"spawn_origin": "quest_giver",
"spawn_min_radius": 18,
"spawn_max_radius": 30,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true
},
{
"entity": "minecraft:pillager",
"name": {
"translate": "quest.example.first_pen_defense.threats.1.name",
"fallback": "Fence-Cutting Raider"
},
"stage": 1,
"spawn_origin": "quest_giver",
"spawn_min_radius": 18,
"spawn_max_radius": 30,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true
},
{
"entity": "minecraft:pillager",
"name": {
"translate": "quest.example.first_pen_defense.threats.2.name",
"fallback": "Torch-Kicking Raider"
},
"stage": 1,
"spawn_origin": "quest_giver",
"spawn_min_radius": 18,
"spawn_max_radius": 30,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true
},
{
"entity": "minecraft:vindicator",
"name": {
"translate": "quest.example.first_pen_defense.threats.3.name",
"fallback": "Fence Breaker"
},
"stage": 1,
"spawn_origin": "quest_giver",
"spawn_min_radius": 22,
"spawn_max_radius": 34,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true,
"max_health": 40.0
}
],
"rewards": {
"xp": 180,
"items": {
"minecraft:emerald": 6,
"minecraft:wheat": 12
}
},
"traits": {
"complete": [
"farm_defender"
]
}
}Generated Container, Written Book, and TNT
Place quest items inside a structure container, make the player read a written clue, then complete a demolition objective and spawn enemies.
Based on questlines/sculk/sculk_mineshaft_investigation.json.
Key points:
read_bookobjectives must includeitem: "minecraft:written_book".quest_book.title,quest_book.author, andquest_book.pagescan be translation objects.- Use
in_chest: truewithcontainerto spawn the objective item inside a generated container. - Generated chest/container items are placed into random empty slots by the quest item spawner.
detonate_tntshould useblockfor the target block near the explosion, not the TNT block itself.force_place_block: truecan prepare the target block when the structure does not reliably contain one.
{
"title": {
"translate": "quest.example.mine_demolition.title",
"fallback": "Notes Under the Mine"
},
"summary": {
"translate": "quest.example.mine_demolition.summary",
"fallback": "Find a sealed mineshaft, recover the foreman's notes, and destroy the marked spawner."
},
"sequential_objectives": true,
"goals": [
{
"id": "reach_old_mine",
"reach": "minecraft:mineshaft",
"structure": "minecraft:mineshaft",
"radius": 3200,
"range": 80,
"stage": 0,
"auto_advance": true
},
{
"id": "read_foreman_notes",
"type": "read_book",
"item": "minecraft:written_book",
"amount": 1,
"structure": "minecraft:mineshaft",
"container": "minecraft:barrel",
"stage": 1,
"radius": 3200,
"in_chest": true,
"auto_advance": true,
"tag": "example_foreman_notes",
"quest_book": {
"title": {
"translate": "quest.example.mine_demolition.book.title",
"fallback": "Foreman's Notes"
},
"author": {
"translate": "quest.example.mine_demolition.book.author",
"fallback": "Mine Foreman"
},
"pages": [
{
"translate": "quest.example.mine_demolition.book.page.0",
"fallback": "We sealed the lower drift after the spawner woke again. If anyone returns, place charges near the cage, not in the tunnel mouth."
}
]
},
"block_patch": {
"radius": 4,
"palette": [
"minecraft:sculk",
"minecraft:deepslate"
]
}
},
{
"id": "take_tnt_from_barrel",
"collect": "minecraft:tnt",
"amount": 3,
"mandatory": false,
"sequential": true,
"stage": 1,
"in_chest": true,
"structure": "minecraft:mineshaft",
"container": "minecraft:barrel"
},
{
"id": "place_demolition_charges",
"place": "minecraft:tnt",
"amount": 3,
"structure": "minecraft:mineshaft",
"stage": 2,
"range": 12
},
{
"id": "detonate_spawner",
"type": "detonate_tnt",
"block": "minecraft:spawner",
"required_mob": "minecraft:skeleton",
"structure": "minecraft:mineshaft",
"force_place_block": true,
"amount": 3,
"stage": 2,
"radius": 3200,
"range": 14,
"auto_advance": true,
"block_patch": {
"radius": 3,
"palette": [
"minecraft:sculk",
"minecraft:deepslate"
]
}
},
{
"id": "kill_what_crawls_out",
"kill": "minecraft:zombie",
"amount": 4,
"stage": 3,
"from_threats": true
}
],
"threats": [
{
"entity": "minecraft:zombie",
"name": {
"translate": "quest.example.mine_demolition.threats.0.name",
"fallback": "Sculk-Crowned Dead"
},
"stage": 3,
"spawn_origin": "player",
"spawn_min_radius": 8,
"spawn_max_radius": 16,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true,
"equipment": {
"head": "minecraft:sculk"
}
},
{
"entity": "minecraft:zombie",
"name": {
"translate": "quest.example.mine_demolition.threats.1.name",
"fallback": "Sculk-Marked Dead"
},
"stage": 3,
"spawn_origin": "player",
"spawn_min_radius": 8,
"spawn_max_radius": 16,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true,
"equipment": {
"head": "minecraft:sculk"
}
},
{
"entity": "minecraft:zombie",
"name": {
"translate": "quest.example.mine_demolition.threats.2.name",
"fallback": "Sculk-Marked Dead"
},
"stage": 3,
"spawn_origin": "player",
"spawn_min_radius": 8,
"spawn_max_radius": 16,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true,
"equipment": {
"head": "minecraft:sculk"
}
},
{
"entity": "minecraft:zombie",
"name": {
"translate": "quest.example.mine_demolition.threats.3.name",
"fallback": "Sculk-Marked Dead"
},
"stage": 3,
"spawn_origin": "player",
"spawn_min_radius": 8,
"spawn_max_radius": 16,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": true,
"equipment": {
"head": "minecraft:sculk"
}
}
],
"rewards": {
"xp": 320,
"items": {
"minecraft:emerald": 10,
"minecraft:echo_shard": 1
}
}
}Delivery to Another Structure or Village
Collect supplies, travel to another structure or village, hand the items to a generated target, and return to the original quest giver.
Based on delivery_cobblestone_oak_log_other_village.json.
Key points:
- The delivery target is configured in
threat. delivery_objectivesmust list the objective ids that should be handed over.- The target talk objective should usually use
auto_advance: true. - Add a final
return: trueobjective in the next stage if the player must report back. min_structure_distanceis useful when the target should not spawn in the same village.
{
"title": {
"translate": "quest.example.remote_delivery.title",
"fallback": "Stone for the Next Village"
},
"summary": {
"translate": "quest.example.remote_delivery.summary",
"fallback": "Carry supplies to a messenger waiting in another village."
},
"sequential_objectives": true,
"goals": [
{
"id": "delivery_cobblestone",
"collect": "minecraft:cobblestone",
"amount": 32,
"mandatory": true,
"stage": 0
},
{
"id": "delivery_oak_logs",
"collect": "minecraft:oak_log",
"amount": 16,
"mandatory": true,
"stage": 0
},
{
"id": "deliver_to_messenger",
"talk": "minecraft:villager",
"amount": 1,
"mandatory": true,
"stage": 0,
"auto_advance": true,
"name": {
"translate": "quest.example.remote_delivery.goals.deliver_to_messenger.name",
"fallback": "Village Messenger"
},
"say": {
"translate": "quest.example.remote_delivery.goals.deliver_to_messenger.say",
"fallback": "The messenger takes the supplies. Return to the villager who sent you."
}
},
{
"id": "return_to_sender",
"return": true,
"amount": 1,
"mandatory": true,
"stage": 1
}
],
"threat": {
"entity": "minecraft:villager",
"name": {
"translate": "quest.example.remote_delivery.threat.name",
"fallback": "Village Messenger"
},
"structure": "minecraft:villages",
"search_radius": 4200,
"spawn_radius": 10,
"spawn_on_accept": true,
"spare_enabled": false,
"glow": false,
"target_line": {
"translate": "quest.example.remote_delivery.threat.target_line",
"fallback": "If you have the stone and oak, hand them over before the wall gives way."
},
"delivery_objectives": [
"delivery_cobblestone",
"delivery_oak_logs"
],
"delivery_choice_label": {
"translate": "quest.example.remote_delivery.threat.delivery_choice_label",
"fallback": "Hand over supplies"
},
"delivered_line": {
"translate": "quest.example.remote_delivery.threat.delivered_line",
"fallback": "That will hold. Tell them the road between our villages is still worth keeping open."
},
"depart_after_delivery": false,
"min_structure_distance": 700
},
"rewards": {
"xp": 180,
"items": {
"minecraft:emerald": 7,
"minecraft:bread": 6
}
}
}Village Raid Defense
Start a normal Minecraft raid when the quest is accepted and complete the objective when the village survives.
Based on questlines/village_defense/village_defense_chain_3_the_bell_and_the_raid.json.
Key points:
- Use
type: "defend_raid". amount: 1is the normal value for a single raid defense objective.- This objective depends on the normal Minecraft raid flow, so it should be offered from a villager in or near the village being defended.
- Use rewards with enchanted items when the raid reward should feel unique.
{
"title": {
"translate": "quest.example.bell_raid.title",
"fallback": "The Bell and the Raid"
},
"summary": {
"translate": "quest.example.bell_raid.summary",
"fallback": "Stand with the village and survive the raid."
},
"dialogue": {
"intro": {
"translate": "quest.example.bell_raid.dialogue.intro",
"fallback": "The villager stands beside the bell, one hand on the rope."
},
"offer": [
[
{
"translate": "quest.example.bell_raid.dialogue.offer.0.0",
"fallback": "You think they are coming now?"
},
{
"translate": "quest.example.bell_raid.dialogue.offer.0.1",
"fallback": "If we ring the bell, they will know we are ready to fight."
}
]
],
"return": {
"translate": "quest.example.bell_raid.dialogue.return",
"fallback": "The horn is silent. The village still stands."
},
"reward": {
"translate": "quest.example.bell_raid.dialogue.reward",
"fallback": "This was taken from the raid leader. By right of battle, it is yours."
},
"done": {
"translate": "quest.example.bell_raid.dialogue.done",
"fallback": "The bell rings for warning again, not fear."
}
},
"goals": [
{
"id": "defend_the_village",
"type": "defend_raid",
"amount": 1
}
],
"rewards": {
"xp": 650,
"items": {
"minecraft:emerald": 20,
"minecraft:crossbow": {
"count": 1,
"enchantments": [
{
"id": "minecraft:power",
"level": 3
},
{
"id": "minecraft:unbreaking",
"level": 2
},
{
"id": "minecraft:piercing",
"level": 1
}
]
}
}
},
"traits": {
"complete": [
"village_defender"
]
}
}Rumor That Unlocks a Hidden Quest
Keep a quest unavailable until the player hears the correct rumor from a villager.
Based on rumors/mine_smoke_below.json and blaze_mineshaft_threat.json.
Key points:
- The rumor file lives under
data/<namespace>/rumors/<rumor_id>.json. unlock_questshould be the full quest id.- When the rumor is discovered, the player receives the trait
quest_discovered:<full quest id>. - The hidden quest should require that trait.
- Use
conditions.not_completed_questsso the rumor stops being useful after the quest is complete. - Rumor
lineanddiscovered_lineare currently plain strings.
Rumor file
{
"id": "example_smoke_below",
"weight": 15,
"line": "Miners swear smoke is rising from shafts sealed for years.",
"unlock_quest": "example:hidden_mineshaft_fire",
"conditions": {
"not_completed_quests": [
"example:hidden_mineshaft_fire"
]
},
"discovered_line": "Rumor discovered: something hot and hostile is moving in an old mineshaft."
}Hidden quest file
{
"title": {
"translate": "quest.example.hidden_mineshaft_fire.title",
"fallback": "Flame in the Mineshaft"
},
"summary": {
"translate": "quest.example.hidden_mineshaft_fire.summary",
"fallback": "A villager reports a blaze burning through an abandoned mineshaft."
},
"requires": {
"traits": [
"quest_discovered:example:hidden_mineshaft_fire"
]
},
"goals": [
{
"id": "kill_mine_blaze",
"kill": "minecraft:blaze",
"amount": 1
}
],
"threat": {
"entity": "minecraft:blaze",
"name": {
"translate": "quest.example.hidden_mineshaft_fire.threat.name",
"fallback": "Ignivar the Mineflame"
},
"structure": "minecraft:mineshaft",
"search_radius": 4000,
"spawn_on_accept": true,
"spare_enabled": false,
"max_health": 150.0,
"offer_line": {
"translate": "quest.example.hidden_mineshaft_fire.threat.offer_line",
"fallback": "Something from the Nether is burning through an old mineshaft."
},
"target_line": {
"translate": "quest.example.hidden_mineshaft_fire.threat.target_line",
"fallback": "The blaze crackles with hostile heat. There is no sign it understands mercy."
}
},
"rewards": {
"xp": 260,
"items": {
"minecraft:emerald": 12,
"minecraft:blaze_rod": 2
}
}
}Escort to a Structure
Escort a quest entity to a searched structure, with configurable search distance and completion range.
Based on questlines/armed_zombie/armed_zombie_chain_spare_2_forgotten_road.json.
Key points:
- Use the
escortshortcut with a structure id. The parser converts it toescort_entity. radiuscontrols how far the structure search can go.rangecontrols how close the escorted entity must be to the target structure.- This works well as a follow-up after a spare/recruit branch.
{
"title": {
"translate": "quest.example.forgotten_road.title",
"fallback": "The Forgotten Road"
},
"summary": {
"translate": "quest.example.forgotten_road.summary",
"fallback": "Escort a spared enemy toward the village road it remembers."
},
"flow": {
"next": "example:remembered_name"
},
"dialogue": {
"intro": {
"translate": "quest.example.forgotten_road.dialogue.intro",
"fallback": "The spared creature keeps its weapon low and looks toward the road."
},
"offer": [
[
{
"translate": "quest.example.forgotten_road.dialogue.offer.0.0",
"fallback": "You remember a village?"
},
{
"translate": "quest.example.forgotten_road.dialogue.offer.0.1",
"fallback": "A bell. Smoke. A well with cracked stone. Take me there."
}
]
],
"return": {
"translate": "quest.example.forgotten_road.dialogue.return",
"fallback": "The bell. I know that sound."
},
"reward": {
"translate": "quest.example.forgotten_road.dialogue.reward",
"fallback": "I found this under the well stones. It was mine once."
},
"done": {
"translate": "quest.example.forgotten_road.dialogue.done",
"fallback": "The village road remembers me."
}
},
"goals": [
{
"id": "escort_to_village",
"escort": "minecraft:village_plains",
"radius": 3500,
"range": 40
}
],
"rewards": {
"xp": 220,
"items": {
"minecraft:iron_ingot": 6,
"minecraft:emerald": 4
}
},
"traits": {
"complete": [
"escort_memory"
]
}
}Quest-board contracts: progression and datapack setup
Quest boards can appear in configured village structures and generate repeatable contracts independently from the included story quests. Their offers refresh over time and can include hunts, deliveries, village protection, and elite targets.
Open a board to browse its current contracts, inspect each objective and reward, and accept the one you want. Accepted contracts are added directly to the normal quest journal and HUD: there is no contract item to keep in the inventory. Each board has its own shared reputation and level. Completing contracts for that board makes harder offers more likely and shortens its refresh time. In multiplayer, offers can be configured as individual per player or claimed globally.
Contracts use five difficulty levels:
| Difficulty | Scaling applied |
|---|---|
| Common (1 star) | Group mobs: +0; health per group mob: +0 HP; elite count: x1.00; health per elite: +0 HP. |
| Dangerous (2 stars) | Group mobs: +1; health per group mob: +5 HP; elite count: x1.15; health per elite: +20 HP. |
| Deadly (3 stars) | Group mobs: +2; health per group mob: +10 HP; elite count: x1.35; health per elite: +50 HP. |
| Nightmare (4 stars) | Group mobs: +4; health per group mob: +20 HP; elite count: x1.60; health per elite: +75 HP. |
| Legendary (5 stars) | Group mobs: +6; health per group mob: +40 HP; elite count: x2.00; health per elite: +150 HP. |
Elite counts are rounded up after applying the multiplier. A specific elite can opt out of count scaling with "scale_count_with_difficulty": false; health bonuses still apply when it has a configured max_health.
Difficulty also affects equipment, status effects, rewards, and the amount of reputation earned with the board.
Datapack Configuration
Quest-board contracts are fully data-driven. A datapack or mod can add vanilla or modded entities, items, structures, equipment, and rewards without replacing the built-in files.
Use the normal datapack layout:
<datapack>/
pack.mcmeta
data/
<your_namespace>/
quest_board_contracts/Do not place custom files inside the mebahelrpgrquest namespace unless you deliberately want to override data with the same resource path. Contract definitions from different namespaces are discovered and merged. References such as example:raider_rewards resolve inside the referenced namespace.
Each contract family has its own definition file and optional tables:
quest_board_contracts/kill/mobs.json
quest_board_contracts/kill/reward_tables/
quest_board_contracts/spawn_groups/groups.json
quest_board_contracts/spawn_groups/equipment_tables/
quest_board_contracts/spawn_groups/reward_tables/
quest_board_contracts/deliveries/deliveries.json
quest_board_contracts/deliveries/reward_tables/
quest_board_contracts/protection/protection.json
quest_board_contracts/protection/reward_tables/
quest_board_contracts/elites/elites.json
quest_board_contracts/elites/equipment_tables/
quest_board_contracts/elites/reward_tables/Definitions whose required modded entity, item, or structure is unavailable are ignored safely. Invalid entries produce a warning in the log without preventing other valid contracts from loading. Missing custom reward tables fall back to the built-in global table for that contract family; missing equipment tables leave the mob's normal equipment unchanged.
Regular Hunts
kill/mobs.json contains a mobs array. These contracts count ordinary kills of the selected entity:
{
"mobs": [
{
"id": "examplemod:mutant_zombie",
"min": 2,
"max": 5,
"reward_table": "example:mutant_hunt"
}
]
}The optional reward table above belongs at:
data/example/quest_board_contracts/kill/reward_tables/mutant_hunt.jsonSpawned Group Hunts
spawn_groups/groups.json contains a groups array. Every accepted group contract locates one of its configured structures, generates the group there, and tracks only those generated targets.
A minimal group entry follows this format:
{
"groups": [
{
"entities": [
{
"id": "minecraft:zombie",
"weight": 10
}
],
"min": 1,
"max": 2,
"structures": [
"minecraft:villages"
],
"equipment_table": "example:group_enemies",
"reward_table": "example:group_rewards",
"search_radius": 3000,
"ignore_current_structure": true,
"min_structure_distance": 128,
"spawn_min_radius": 8,
"spawn_max_radius": 32
}
]
}entities is a weighted pool rolled separately for every group member. structures is also a pool: one destination is selected when the contract is generated. ignore_current_structure searches outside the board's village, while min_structure_distance sets the exclusion distance.
Deliveries
deliveries/deliveries.json contains a deliveries array. When accepted, the contract locates the destination and generates a named recipient. The player must carry the items to that recipient; interacting consumes the required items and completes the contract.
{
"deliveries": [
{
"item": "examplemod:medical_supplies",
"min": 8,
"max": 20,
"structures": [
"minecraft:villages"
],
"reward_table": "example:medical_delivery",
"search_radius": 3000,
"ignore_current_structure": true,
"min_structure_distance": 128,
"spawn_min_radius": 0,
"spawn_max_radius": 24,
"recipient_name": "Village Quartermaster"
}
]
}Village Protection
protection/protection.json contains a contracts array. Supported built-in protection types are iron_golem and lighting.
{
"contracts": [
{
"type": "lighting",
"target": "minecraft:torch",
"min": 6,
"max": 12,
"structures": [
"minecraft:villages"
],
"search_radius": 5000,
"ignore_current_structure": false,
"completion_range": 96
}
]
}Set ignore_current_structure to false to protect the board's village, or to true with min_structure_distance to send the player to another village.
Elite Contracts
elites/elites.json contains a contracts array. Each contract may contain several elite entries, each with its own count, name, health, effects, and equipment table.
{
"contracts": [
{
"structures": [
"minecraft:pillager_outpost"
],
"reward_table": "example:elite_rewards",
"search_radius": 3000,
"spawn_min_radius": 0,
"spawn_max_radius": 24,
"elites": [
{
"entity": "minecraft:vindicator",
"min": 1,
"max": 1,
"name": "The Iron Captain",
"max_health": 80,
"equipment_table": "example:elite_raiders",
"effects": [
{
"id": "minecraft:strength",
"duration_seconds": 3600,
"amplifier": 1
}
]
}
]
}
]
}Reward Tables
Reward tables live in the reward_tables folder of their contract family:
{
"rolls": {
"min": 1,
"max": 2
},
"rewards": [
{
"type": "item",
"id": "minecraft:emerald",
"weight": 4,
"base_min": 1,
"base_max": 3,
"per_kill_min": 0.2,
"per_kill_max": 0.5
},
{
"type": "xp",
"weight": 2,
"base_min": 20,
"base_max": 40,
"per_kill_min": 8,
"per_kill_max": 12
}
]
}rolls controls how many weighted entries are selected. Delivery tables may use per_item_min and per_item_max as aliases for per_kill_min and per_kill_max.
Equipment Tables
Equipment tables use the same weighted slot format as group hunts. For example:
{
"slots": {
"right_hand": [
{
"id": "minecraft:iron_hoe",
"weight": 1,
"enchantments": [
{
"id": "minecraft:knockback",
"min_level": 3,
"max_level": 3
}
]
}
],
"helmet": [
{
"id": "minecraft:sculk",
"weight": 1
}
]
}
}Supported slot names are right_hand, left_hand, mainhand, offhand, helmet, chestplate, leggings, and boots. Every configured slot is rolled independently. Use minecraft:air as a weighted entry when a slot should sometimes be explicitly empty.
Contract generation settings
The generated server configuration file is:
config/mebahelrpgrquest/quest_board_contracts.json
Its contractTypeWeightsByBoardLevel section controls how frequently each kind of contract appears at every board level.
Created by Mebahel. Join the community or explore the full mod collection.







