Mercantile

Configuration

Every Mercantile setting, organized by section. Tune via the Mod Menu + Cloth Config GUI or by hand-editing the JSON file.

File Location & Reload

The config file is generated on first launch at:

.minecraft/config/mercantile.json

Server operators can apply changes without a restart with:

/mercantile reload

Missing keys are filled with defaults and saved. Unknown keys are ignored. All numeric values are clamped on load — out-of-range hand edits are silently corrected.

Server Config

Server-side settings that affect gameplay rules. Synced to clients via the ConfigSyncS2CPayload on join and after /mercantile reload.

Pickup

KeyTypeDefaultRangeDescription
enableVillagerPickupbooleantrueMaster toggle for villager pickup feature.
pickupXpCostint50+XP levels deducted per pickup (creative waived).

Names

KeyTypeDefaultRangeDescription
enableNamesbooleantrueAuto-assign biome-themed names on villager spawn.

Trade Cycling

KeyTypeDefaultRangeDescription
enableTradeCyclingbooleantrueShow the "Re-roll Trades" button in the merchant GUI.
tradeCycleEmeraldCostint60+Emeralds consumed per cycle (creative waived).

Reputation

KeyTypeDefaultRangeDescription
enableReputationbooleantrueMaster toggle for the reputation system (score, tiers, exclusive trades).
reputationTradeGainint10+Score gained per trade-gain pulse (every reputationTradesPerGain-th completed trade).
reputationCureGainint50+Score gained per cured zombie villager (one-time per UUID).
reputationAttackLossint150+Score lost per villager attack (absolute value).
reputationKillLossint400+Score lost per villager kill (absolute value).
reputationCycleGainint10+Score gained per trade cycle.
reputationDailyCapint51–50Maximum total reputation earnable per in-game day from trades and cycles combined. Daily counters reset at day rollover.
reputationTradesPerGainint51–20Completed trades required to trigger one trade-gain pulse.
reputationDailyMaxTradeRepint21–10Daily cap on reputation earned from trading.
reputationDailyMaxCycleRepint11–10Daily cap on reputation earned from trade cycling.
enableRaidReputationbooleantrueGrant reputation to players vanilla awards Hero of the Village for defending a raid.
reputationRaidWinGainint100+Reputation granted for winning a raid. Bypasses the daily cap, like the cure bonus.
enableWanderingTraderRepbooleantrueOffer a wandering trader a bonus trade at Trusted tier and above (one sticky offer per trader).
enableGiftingbooleantrueAllow villagers to accept profession-matched item gifts for reputation. Gated behind enableReputation.
reputationGiftGainint10+Score gained per accepted gift item.
reputationDailyMaxGiftRepint21–10Daily cap on reputation earned from gifting (also counts against reputationDailyCap).
reputationNegativeDecayPerDayint10+Points a negative reputation recovers toward 0 each in-game day. 0 disables decay; positive scores are never affected.
enableGratitudeGiftsbooleantrueHonored-tier players occasionally receive a thrown, profession-flavored gift from a nearby villager — the inverse of gifting. Gated behind enableReputation.
gratitudeGiftsPerDayint10–10Daily cap on gratitude gifts a player can receive. 0 disables gifts without turning off the feature flag.
enableNitwitRehabbooleantrueTrusted+ players can rehabilitate an adult nitwit into an unemployed villager with a golden apple plus an emerald fee. With enableReputation off the tier gate is skipped and only the cost applies.
nitwitRehabEmeraldCostint160+Emeralds drawn from the player's inventory per rehabilitation, on top of the golden apple (creative waived; 0 makes the apple the only cost).

Delivery Contracts

KeyTypeDefaultRangeDescription
enableContractsbooleantrueEmployed villagers occasionally offer delivery contracts: sneak + use paper to sign, deliver the goods before the deadline, earn emeralds plus cap-bypassing reputation. Requires enableReputation.
contractOfferChanceint500–100Percent chance per eligible villager per in-game day of a new offer appearing (0 stops new offers; outstanding contracts still settle).
contractPaymentScaleint1000–1000Emerald payments as a percent of the data-driven pool values (100 = as authored).
contractRepGainint30+Reputation per completed delivery. Bypasses the daily cap and sub-caps, like curing and raid defense.
contractRepPerDayint30–50Deliveries per day that earn the reputation bonus — the bound that keeps the cap bypass from scaling with villager count. Later deliveries still pay emeralds; 0 disables contract rep entirely.
contractDeadlineDaysint21–30In-game days between signing a contract and its deadline. Expired contracts vanish from the inventory with no penalty.

Follow Mode

KeyTypeDefaultRangeDescription
enableFollowModebooleantrueSneak-right-click + emerald to recruit a villager to follow.
maxFollowingVillagersint31+Maximum villagers one player may have following at once.
enableSendHomebooleantrueWhen released, a villager walks back to its bed (or workstation) instead of stopping in place.

Pathfinding

KeyTypeDefaultRangeDescription
enablePathfindingFixesbooleantrueMaster toggle for all pathfinding improvements.
enablePathfindingDoorsbooleantrueFence gate + double door navigation.
enablePathfindingStairsbooleantrueMulti-step staircase + slab transitions.
enablePathfindingLaddersbooleantrueAllow villagers to climb ladders.
enablePathfindingWaterbooleantruePenalize water paths so villagers prefer dry routes.

Bulk Trading

KeyTypeDefaultRangeDescription
enableBulkTradingbooleantrueShift-click trade output to repeat the trade up to 64 times.

Profession Lock

KeyTypeDefaultRangeDescription
enableProfessionLockbooleantruePermanently lock profession after any completed trade.

Work Orders

KeyTypeDefaultRangeDescription
enableWorkOrdersbooleantrueSneak + right-click an unemployed adult villager with a workstation item to send it to claim the nearest unclaimed workstation of that type and take the profession.
workOrderEmeraldCostint10+Emeralds drawn from the player's inventory per accepted work order (creative waived; denied orders are free). The workstation item is never consumed.

Healing

KeyTypeDefaultRangeDescription
enableHealingbooleantrueMultiply splash/lingering heal + regen effects on villagers.
healingMultiplierfloat2.01.0 – 10.0Multiplier applied to heal amount and regen duration.

Trade GUI

KeyTypeDefaultRangeDescription
enableRestockIndicatorbooleantrueShow restock timer + counter in the merchant screen.
enableDemandTransparencybooleantrueShow hoverable price breakdown tooltip.

Trade Pinning

KeyTypeDefaultRangeDescription
enableTradePinningbooleantrueMaster toggle for pinning trades and restock notifications.
maxPinnedTradesPerPlayerint101–64Cap on pinned trades each player may hold.
pinRestockNotifyRangeint1288–256Max distance (blocks) between player and villager for a restock notification.

Breeding Tooltip

KeyTypeDefaultRangeDescription
enableBreedingTooltipbooleantrueSend breeding data to Jade/WTHIT tooltips.

Baby Feeding

KeyTypeDefaultRangeDescription
enableBabyFeedingbooleantrueFeed baby villagers villager food to speed up growth.
babyFeedPercentPerFeedint101 – 100Percent of remaining growth time removed per bread fed; lower-value foods scale down proportionally.
babyFeedMaxReductionPercentint500 – 100Cap on total growth time a single baby can have removed by feeding, as a percent of the full growth time.

State Indicators

KeyTypeDefaultRangeDescription
enableStateIndicatorsbooleantrueSend contextual state icons (needs workstation, panicking, trading) to Jade/WTHIT.

Mood

KeyTypeDefaultRangeDescription
enableMoodbooleantrueMaster toggle for the villager mood system — living conditions drive a 0–100 mood that nudges prices and restock speed.
moodPriceModifierPercentint50–50Price nudge as a percent of base price: Happy villagers discount by this much, Miserable ones mark up. 0 disables the price effect.
moodRestockSpeedPercentint200–80Restock interval change: Happy villagers restock this percent sooner, Miserable ones later. 0 disables the restock effect.
moodRecalcIntervalTicksint10020–24000Ticks between mood re-evaluations; mood drifts 2 points toward current conditions per interval.
moodAmbientParticlesbooleantrueHappy villagers occasionally emit happy particles; Miserable ones emit angry particles.

Market Day

KeyTypeDefaultRangeDescription
enableMarketDaybooleantrueMaster toggle for the recurring market day — a dawn-to-dusk window with discounted trades and an extra restock cycle.
marketDayIntervalDaysint71–1000In-game days between market days. The schedule is shared by the whole world; the first market day falls on this day number.
marketDayDiscountPercentint50–100Discount on every trade during market day, as a percent of base price. Stacks with reputation, mood, and gossip; shows as its own line in the price breakdown. 0 disables the discount.

Memorials & Fear

KeyTypeDefaultRangeDescription
enableMemorialsbooleantrueA named villager's death drops a memorial keepsake recording name, profession, level, and cause of death.
enableMourningbooleantrueVillagers near a villager death briefly stop, face the spot, and shed grief tears (cosmetic only).
enableFearMarkupbooleantrueA killing spree in one village marks up that village's prices for the killer, keyed to the village bell and decaying over time. Shows as a "Fear" line in the price breakdown.
fearKillThresholdint31–20Villager kills in the same village within the kill window needed to trigger the fear markup.
fearKillWindowMinutesint101–120Minutes (real time) in which the threshold kills must land to count as a spree.
fearMarkupPercentint250–200Price markup when fear is fresh, as a percent of base price; decays linearly to zero over the duration. 0 disables the price effect.
fearMarkupDurationDaysint31–30In-game days for a village's fear of the killer to fade completely.

Fear is tracked per player, per village — a village is identified by its nearest bell within 48 blocks. Kills in a bell-less cluster belong to no village and never trigger fear.

Sentry Pylon

KeyTypeDefaultRangeDescription
enableSentryPylonbooleantrueMaster toggle for the Sentry Pylon block + crafting recipe.
enablePylonBellAlarmbooleantrueOn detecting a threat, the pylon rings the nearest village bell within its radius (max once per 10s).
pylonDetectionRadiusint324 – 128Blocks within which the pylon detects hostile mobs.
pylonMaxFuelint81+Iron blocks the pylon can store at once.
pylonMaxGolemsint31+Maximum active sentry golems per pylon.
sentryDespawnSecondsint305+Seconds without hostiles before a sentry despawns.
pylonTribulationGolemBonusPerTierint10+Extra sentry golems allowed per Tribulation threat tier. Only active when Tribulation is installed.
pylonTribulationRadiusBonusPerTierint40+Extra detection radius in blocks per Tribulation threat tier. Only active when Tribulation is installed.
pylonTribulationMaxGolemsint6≥ pylonMaxGolemsHard cap on sentry golems per pylon under Tribulation scaling. Only active when Tribulation is installed.

Client Config

Client-side rendering and audio preferences. Stored in the same JSON file but never synced — every client owns its values independently.

KeyTypeDefaultRangeDescription
villagerSoundVolumefloat1.00.0 – 1.0Volume for all villager sound events (0.0 = mute, 1.0 = vanilla).
enableWorkstationVisbooleantrueRender workstation-link particles while holding a bell.
enableBellRadiusVisbooleantrueRender the 48-block bell radius circle while holding a bell — a gold circle around each nearby placed bell plus a dim-white placement preview around you — and outline adult villagers within it.
enableInfoPanelbooleantrueShow the villager info side panel in the merchant screen.
enableReputationHudbooleantrueShow the top-left reputation tier indicator near villagers.
enableTierChangeMessagesbooleantrueShow a chat notice when your reputation tier changes.
hudAnchorenumTOP_LEFTTOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHTScreen corner the reputation HUD is anchored to.
hudOffsetXint40 – 10000Horizontal distance in pixels from the anchored screen edge.
hudOffsetYint40 – 10000Vertical distance in pixels from the anchored screen edge.

Full Default JSON

For reference, the complete mercantile.json with every field set to its default value:

{
  "enableVillagerPickup": true,
  "pickupXpCost": 5,
  "enableNames": true,
  "enableTradeCycling": true,
  "tradeCycleEmeraldCost": 6,
  "enableReputation": true,
  "reputationTradeGain": 1,
  "reputationCureGain": 5,
  "reputationAttackLoss": 15,
  "reputationKillLoss": 40,
  "reputationCycleGain": 1,
  "reputationDailyCap": 5,
  "reputationTradesPerGain": 5,
  "reputationDailyMaxTradeRep": 2,
  "reputationDailyMaxCycleRep": 1,
  "enableRaidReputation": true,
  "reputationRaidWinGain": 10,
  "enableWanderingTraderRep": true,
  "enableGifting": true,
  "reputationGiftGain": 1,
  "reputationDailyMaxGiftRep": 2,
  "reputationNegativeDecayPerDay": 1,
  "enableGratitudeGifts": true,
  "gratitudeGiftsPerDay": 1,
  "enableNitwitRehab": true,
  "nitwitRehabEmeraldCost": 16,
  "enableWorkOrders": true,
  "workOrderEmeraldCost": 1,
  "enableContracts": true,
  "contractOfferChance": 50,
  "contractPaymentScale": 100,
  "contractRepGain": 3,
  "contractRepPerDay": 3,
  "contractDeadlineDays": 2,
  "enableMemorials": true,
  "enableMourning": true,
  "enableFearMarkup": true,
  "fearKillThreshold": 3,
  "fearKillWindowMinutes": 10,
  "fearMarkupPercent": 25,
  "fearMarkupDurationDays": 3,
  "enableFollowMode": true,
  "maxFollowingVillagers": 3,
  "enableSendHome": true,
  "enablePathfindingFixes": true,
  "enablePathfindingDoors": true,
  "enablePathfindingStairs": true,
  "enablePathfindingLadders": true,
  "enablePathfindingWater": true,
  "enableBulkTrading": true,
  "enableProfessionLock": true,
  "enableHealing": true,
  "healingMultiplier": 2.0,
  "enableRestockIndicator": true,
  "enableDemandTransparency": true,
  "enableTradePinning": true,
  "maxPinnedTradesPerPlayer": 10,
  "pinRestockNotifyRange": 128,
  "enableBreedingTooltip": true,
  "enableBabyFeeding": true,
  "babyFeedPercentPerFeed": 10,
  "babyFeedMaxReductionPercent": 50,
  "enableStateIndicators": true,
  "enableMood": true,
  "moodPriceModifierPercent": 5,
  "moodRestockSpeedPercent": 20,
  "moodRecalcIntervalTicks": 100,
  "moodAmbientParticles": true,
  "enableMarketDay": true,
  "marketDayIntervalDays": 7,
  "marketDayDiscountPercent": 5,
  "enableSentryPylon": true,
  "enablePylonBellAlarm": true,
  "pylonDetectionRadius": 32,
  "pylonMaxFuel": 8,
  "pylonMaxGolems": 3,
  "sentryDespawnSeconds": 30,
  "pylonTribulationGolemBonusPerTier": 1,
  "pylonTribulationRadiusBonusPerTier": 4,
  "pylonTribulationMaxGolems": 6,
  "villagerSoundVolume": 1.0,
  "enableWorkstationVis": true,
  "enableBellRadiusVis": true,
  "enableInfoPanel": true,
  "enableReputationHud": true,
  "enableTierChangeMessages": true,
  "hudAnchor": "TOP_LEFT",
  "hudOffsetX": 4,
  "hudOffsetY": 4
}