Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Links
Tags
Creators
Details
Mebahel's RPG: Villager Quests & Companions
Turn Minecraft villages into living RPG adventures. Discover story-driven villager quests, branching dialogue and meaningful choices, recruitable companions, repeatable bounty contracts, a quest journal, and a full in-game quest creator.
For Minecraft Java Edition 1.20.1 and 1.21.1
Mod loaders: Fabric / Quilt / Forge / NeoForge through Sinytra Connector where supported
Play style: Singleplayer, multiplayer, RPG and adventure modpacks
Content: 89 included quests, repeatable village contracts, 11 quest-book stories, 40 ambient villager dialogue scenes
Give Minecraft Villagers a Story Worth Following
Villagers shouldn't only be trading stations. Mebahel's RPG: Villager Quests & Companions is a Minecraft villager quest and companion mod that turns ordinary villages into places where characters have problems to solve, rumors to share, and stories that can change according to your decisions.
Meet named NPCs, investigate abandoned locations, protect villages, choose between fighting and showing mercy, and unlock new chapters as your adventure progresses. Some characters can even become permanent companions, with equipment, combat behavior, and orders of their own.
Unlike a quest framework that requires a separate modpack or custom quest files, this mod comes with ready-to-play adventures. Just install it, visit a village, and start exploring. For creators, the built-in Narrative Quest Studio and JSON datapack system make it possible to create entirely new storylines.
At a Glance
| Feature | What You Get |
|---|---|
| 89 included quests | Narrative questlines, investigations, village jobs, hidden adventures, and follow-up stories |
| Branching dialogue and choices | Decisions about trust, combat, or mercy that can affect later quests and dialogue |
| Recruitable NPC companions | Follow, wait, return home, guard, equip gear, and choose combat stances |
| Repeatable village quest boards | Hunts, deliveries, escorts, defense contracts, elite targets, and five difficulty tiers |
| RPG quest journal and HUD | Objectives, rewards, quest history, destination guidance, and an optional quest map |
| In-game quest creation | Build and publish custom quests using the Narrative Quest Studio |
| Custom datapack support | Create new dialogue, questlines, NPC encounters, rumors, and contracts with JSON |
| Multiplayer and modpacks | Individual or shared story progress, server configuration, and optional mod integrations |

Story-Driven Villager Quests with Choices and Consequences
A simple delivery can become an investigation. An enemy can become an ally. A decision you make in one village may change the next story you encounter.
The mod contains 89 included quests, including narrative quest chains, village activities, quest-book mysteries, and stories discovered through rumors or prerequisites. Your adventures can involve:
- Investigating mines, ruins, and unusual locations.
- Escorting NPCs and delivering resources to other settlements.
- Helping villages build, rebuild, and defend important locations.
- Hunting named enemies and confronting dangerous threats.
- Choosing to spare or attack certain characters.
- Discovering clues and entire adventures inside written quest books.
- Returning later for new dialogue, consequences, or follow-up quests.
Choices matter: selected decisions can alter dialogue, future quests, traits, and the direction of a storyline. Some follow-ups appear only after time has passed, so revisiting familiar characters can reveal more of their stories.
What Kinds of Quests Are Included?
| Quest content | Examples | Main gameplay |
|---|---|---|
| Major storylines | Ash Court, Armed Dead, False Hero, Blackthorn House, Mad Scientist, Most Important Cow, No Banner, Village Defense, Witch, Last Heat | Branching narratives, investigations, combat, and consequences |
| Village stories | Village Arrival, construction, deliveries, animal enclosures, and local threats | Building, collecting, protecting, and exploring |
| Quest-book stories | 11 discoverable stories, including delayed continuations | Exploration, clues, secrets, and unusual objectives |
| Village contracts | Hunts, deliveries, village protection, incursions, escorts, elite targets | Repeatable progression, scaling challenges, and rewards |
| Hidden discoveries | Rumors, prerequisites, and later quest chapters | Exploration and gradual storytelling |
Recruitable Companions: Turn Characters into Allies
Your choices can change more than a quest ending. Some characters who begin as enemies or important story NPCs can become permanent companions. Current recruitable companions include Rusk and Merrin.
Give your companion practical orders:
- Follow you on adventures or wait at a location.
- Return home or guard an assigned area, including while you are offline.
- Switch between passive, defensive, and aggressive combat behavior.
- Manage weapons and other equipment in a dedicated companion inventory.
- Fight hostile mobs and assist when you engage an enemy.
Their recruitment is tied to the stories you experience rather than being a separate, unrelated system.

Companion Equipment and Recovery
Give companions weapons and equipment through their dedicated inventory screen. They also gradually recover health after 10 seconds outside combat.

Village Quest Boards, Bounties and Repeatable Contracts
When you want an adventure between story chapters, look for a quest board in a village. Boards offer repeatable jobs with objectives, destinations, rewards, and progressively tougher challenges.
Contracts include monster hunts, spawned group hunts, deliveries, village defense, incursions, escorts, and elite targets.
Each board has its own level and reputation. Completing its contracts improves progression, increases the chance of tougher offers, and reduces refresh time.
| Difficulty | Rating |
|---|---|
| Common | โ |
| Dangerous | โ โ |
| Deadly | โ โ โ |
| Nightmare | โ โ โ โ |
| Legendary | โ โ โ โ โ |
Harder contracts can scale enemy groups, elite encounters, equipment, effects, and rewards. Accepted contracts appear directly in your quest journal and HUD; no contract item needs to occupy an inventory slot.
By default, board offers are personal to each player, while board reputation and level are shared. Server owners can adjust this behavior.

Create Your Own Minecraft Quests In-Game
Narrative Quest Studio lets server operators build new story quests without writing every JSON file by hand.
Open it with /mebahelquestcreator to create and edit quest identities, opening dialogue, stages, objectives, rewards, and advanced behaviors. The editor supports branching choices, named encounters, equipment, and reward configuration.
You can save a local draft, preview your quest, publish it to the server, or import a complete quest JSON from the clipboard. If you prefer full file-based control, the JSON datapack system remains available; see the complete creator reference near the bottom of this page.

Quest Journal, HUD Tracker and Branching Quest Map
Your adventures are organized in a dedicated RPG interface instead of being scattered across chat messages.
Quest Journal (J)
Press J to open the configurable journal and browse active, completed, and failed quests, plus objectives, rewards, progress, and destinations. Your tracked objective also appears on a configurable HUD overlay.
Server owners can disable clickable journal coordinates if they want to preserve exploration and discovery.

Quest Map (K)
Press K to see a branching overview of connected stories, including choices, prerequisites, rumors, quest chains, delayed continuations, and chance-based follow-ups.
The map helps you understand how your adventure has developed without showing every possible path upfront. Both shortcuts are configurable, and servers can disable the quest map if preferred.

Living Villages: Rumors, Conversations and Couriers
Villages are designed to feel more alive even when you are not actively completing a quest. Some conversations point toward new adventures, while others reflect everyday village life or the consequences of your decisions.
Villager Rumors and Hidden Quest Books
Villagers can share rumors that reveal leads and unlock hidden quests. Exploring the world can also uncover eleven quest-book stories, including standalone mysteries and adventures with delayed follow-ups. Not every quest is offered immediately, giving players reasons to revisit familiar places and continue exploring.

Ambient Villager Conversations and Reactions
The mod includes 40 ambient dialogue scenes about work, crops, books, iron golems, village gossip, and everyday life. Conversations use text above the speaker, dialogue sounds, and speaking animations. Villagers can also react to major events from your completed stories.
Ambient conversations and supported in-game narrative text use the player's selected available language.

Courier Deliveries and Delayed Storylines
Some quests continue only after enough in-game time has passed. A courier can find you outdoors in the Overworld during daytime and deliver letters leading to follow-up stories. If several letters are waiting, a single courier can bring them together.
Receiving a delivered quest book does not automatically begin the next quest; you choose when to continue.

Start Playing: Your First Village Adventure
No external quest pack or custom datapack is required. The included quests work out of the box.
- Visit a Minecraft village and talk to villagers. Not every villager is a quest giver; some offer rumors instead.
- Find a quest board to browse repeatable contracts and rewards.
- Explore the world to discover quest books, clues, and hidden adventures.
- Press J to track quests in your journal and on the HUD.
- Press K to explore story connections on the quest map.
Minecraft Versions, Mod Loaders and Installation
| Requirement | Details |
|---|---|
| Minecraft versions | 1.20.1 and 1.21.1 |
| Fabric | Fabric version with the matching Fabric API |
| Quilt | Listed as supported; use the appropriate Fabric API-compatible setup |
| Forge / NeoForge | Uses the Fabric build through Sinytra Connector and Forgified Fabric API, only where those components support the selected version and loader |
| Game modes | Singleplayer and multiplayer |
| Quest content | Built in; extra datapacks are optional |
Fabric / Quilt: Fabric API is required.
Forge / NeoForge (Connector-based): Sinytra Connector and Forgified Fabric API are required. Check Connector's version-specific compatibility before installing. This is not a claim that native Forge/NeoForge builds exist for every Minecraft version.
Always download the version of Villager Quests & Companions and all dependencies that match your Minecraft version.
Compatibility with Other Minecraft Mods
Mebahel's RPG is designed for adventure, fantasy, village overhaul, and RPG modpacks. It integrates with several village and creature mods to make quest content more varied.
| Mod | Compatibility or optional integration |
|---|---|
| MCA Reborn | Dedicated interaction handling returns control to MCA after quest interactions. |
| Ice and Fire CE | Optional elite contracts involving fire, ice, and lightning dragons, with difficulty scaling and rewards. |
| Saint's Dragons | Configurable dragon-related village attack contracts, including Varasuchus, Volitans, Nulljaw, Atroxiia, Raevyx, Ignivorus, and Draconian Swarm. |
| Guard Villagers | Dedicated configuration controls which quests guards may offer. |
| Villagers Reborn | Supports the mod's villager models and interaction changes. |
| Epic Villages | Tested with the quest system. |
| Luki's Grand Capitals | Tested with the quest system. |
Quest objectives can target vanilla and modded locations. Exact compatibility can vary depending on Minecraft version, loader, and changes made by another mod.

Multiplayer, Servers and Modpacks
Yes, you can use Villager Quests & Companions in a modpack or multiplayer server. The mod supports individual quest progress by default, or configurable shared progress, outcomes, rewards, and story traits.
Quest boards can offer contracts individually or collectively. Board reputation and progression are shared. Server and pack creators can configure quest generation, board placement, rumors, HUD navigation, contracts, dialogue frequency, and supported integrations.
For custom modpacks, datapacks can add missions involving vanilla or modded mobs, items, structures, dialogue, objectives, and rewards without replacing the included stories.
Configuration
Main configuration file:
config/mebahelrpgrquest/mebahelrpgrquest_config.json
The configuration covers quest and rumor assignment, quest-board generation, quest tracking, shared multiplayer settings, and ambient dialogue. Additional files handle ignored quests, Guard Villagers, and contract generation.
Main configuration defaults
| Option | Default value | Purpose |
|---|---|---|
villagerQuestChance | 0.15 | Story quest assignment weight |
villagerRumorChance | 0.15 | Rumor assignment weight |
disableQuestCoordinateClick | false | Disables clickable journal coordinates |
disableQuestMap | false | Disables the quest map |
shareQuestsBetweenPlayers | false | Shares story progress, outcomes, rewards, and traits |
inventoryJournalButtonPosition | left | Inventory journal button position |
hideInventoryJournalButton | false | Hides the inventory journal button |
questTrackerPosition | top_left | HUD tracker corner |
questTrackerScale | 1.0 | HUD tracker size |
questBoardVillageChance | 1.0 | Quest-board generation chance |
individualBoardOffers | true | Personal board offers |
questBoardStructures | minecraft:village_plains, minecraft:village_desert, minecraft:village_savanna, minecraft:village_snowy, minecraft:village_taiga | Eligible villages |
questBoardPreferMeetingPoint | true | Placement near meeting point |
questBoardPlacementSearchRadius | 24 | Placement search radius |
questBoardDropsOnBreak | true | Quest-board item drop behavior |
questBoardMinimumPlacementDistance | 48 | Minimum distance between boards |
ambientDialoguesEnabled | true | Ambient conversations on/off |
ambientDialogueCheckIntervalTicks | 100 | Dialogue check interval |
ambientDialogueChance | 0.08 | Dialogue chance per eligible check |
ambientDialogueActivityRadius | 24.0 | Dialogue activity radius |
Languages and Localization
The mod includes localization for English, French, German, Polish, Japanese, Korean, Russian, Simplified Chinese, Brazilian Portuguese, Spanish, and Mexican Spanish.
The game uses your selected language for supported quest text and villager ambient conversations. The available languages are part of the mod; no separate translation mod is required.
Frequently Asked Questions
Does this mod add quests to Minecraft villagers automatically?
Yes. It includes ready-to-play quests and villager rumors, so you can discover storylines simply by visiting villages. Quest assignment and rumor chances are configurable.
Is this a quest mod or just a quest framework for modpacks?
Both playable content and creator tools. It includes 89 quests and repeatable contracts while also supporting custom quests through an in-game editor and JSON datapacks.
Can I recruit NPCs as companions in Minecraft?
Yes. Certain quest outcomes allow you to recruit Rusk and Merrin, then give them follow, wait, home, guard, and combat stance commands. They can also equip gear.
Are the quest choices actually consequential?
In selected stories, yes. Your decisions can change follow-up quests, story traits, and dialogue. Not every quest branches, and some continuations appear later.
Does it work in multiplayer or with a Minecraft modpack?
Yes. Quest progression is individual by default, with optional shared story progression. Quest boards, difficulty, world generation, and interface behavior have server configuration options.
Can I create custom quests without editing JSON?
Yes. Server operators can use Narrative Quest Studio (/mebahelquestcreator) for in-game creation and publishing. JSON datapacks are also supported for advanced customization.
Does it work with Ice and Fire, MCA Reborn or other village mods?
It has specific integrations and tested compatibility with the mods shown in the compatibility table above. Availability and behavior may depend on the installed versions.
Does it support Forge and NeoForge?
Through Sinytra Connector where compatible, using the Fabric version plus Forgified Fabric API. Verify that Connector supports your chosen Minecraft version and loader before installation.
Do I need another Mebahel mod to play?
No. Draugr Invasion and Dwarven Automatons are separate, optional projects, not required dependencies of Villager Quests & Companions.
Continue the Adventure: More Mods by Mebahel
If you enjoy RPG adventures, these separate Minecraft mods may also interest you:
Mebahel's Creatures: Draugr Invasion
Explore Nordic ruins, fight intelligent Draugr, solve dungeon challenges, recover the Golden Claw, and challenge the Draugr Overlord.
Mebahel's Creatures: Dwarven Automatons
Explore ancient Dwemer-inspired ruins, battle mechanical constructs, recover Dwarven technology, and summon mechanical allies.
All Mebahel Minecraft mods on CurseForge
Join the Community and Support Development
Join the Mebahel Discord to suggest quest ideas, vote on upcoming features, share screenshots, report bugs, discuss companions and stories, or follow development previews.
For bug reports, include your Minecraft version, loader, mod version, reproduction steps, and a log or screenshot when relevant.
You can support future updates and independent mod development through Patreon or Ko-fi using the banners above, or the direct links below.
Support is completely optional. Following the project, creating datapacks, reporting issues and sharing your adventures also helps. Direct links: Patreon ยท Ko-fi.
If you want to see future updates, use Follow on CurseForge.
Creator Documentation: JSON Datapack Reference
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.





