PLANTATIONS
grower@plntns:~/docs$ cat BLACK_MARKET.md

Black Market

2685 words·~12 min read

1. Goal

The black market turns the mod's final produce into basic resources and materials. A player who specializes in cultivation can then progress in the rest of a modpack without mining everything.

Design goals:

  1. Complexity pays. The more processing steps, time and skill a product needs, the more it's worth. A cured bud is worth twice a dried one, and a concentrate several iron ingots.
  2. Quality pays. Better soil and genetics raise the price. Living soil (quality cap 100 %) outsells mineral fertilizer (cap ~80 %) per item, while mineral wins on volume.
  3. No infinite money. Market saturation, a buy/sell spread and the absence of buy-back loops keep it from replacing every other way of getting resources.
  4. Modpack-friendly. Every price and offer is data-driven, modded resources come in through conventional tags, and the currency can be swapped for Numismatics, Lightman's Currency or emeralds.
  5. Server-ready. One shared market per world, per-player reputation, nothing client-authoritative.

2. How players use it

grow → process → (cure / extract) ──sell──▶ Dealer ──cash──▶ buy basic resources & materials
                                         ▲                    (iron, coal, redstone, glass, …)
                     reputation ─────────┘──▶ unlocks better offers, prices, contracts
Access pointHow it worksWhen
Dealer (NPC)Hooded trader who appears at night near villages, similar to the Wandering Trader, and leaves at dawn. Opens the black market screen.Early game
Burner Phone (item)Calls a Dealer to your location after 30–90 s. Cooldown of one in-game day; each call raises heat slightly.After the first sale
Dead Drop (block)Automation endpoint: insert produce by hand, hopper or pipe; it sells everything overnight at 85 % of the Dealer price and outputs cash. Can also hold up to 3 standing orders: sneak-use it with an item the Dealer sells to order one more bundle a day (past the daily stock, the order is cancelled), or sneak-use it with an empty hand to list them. Each morning it sells first, then pays the orders from the takings and any cash in the box, and puts the goods and the change in the box. Works with Create, AE2 and the like.Reputation tier 2
Hideout (optional structure)Rare worldgen structure with a permanent Dealer and some loot.Exploration

The black market screen has three tabs:

  • Sell: put produce in the slot and see the live price (value × quality × demand × daily factor × reputation). It shows the reason for the price ("market flooded", "hot today").
  • Buy: the offer list, filtered by your reputation tier, with stock and restock timer.
  • Contracts: the Dealer's current requests (see §7).

3. Value model

All prices use one unit, credits (₡). 1 ₡ ≈ 1/10 iron ingot.

3.1 Produce value from complexity

Every sellable item has a market value, derived automatically from the recipe graph, like an EMC mapper:

value(product) = (Σ value(inputs) + minutes_of_processing × 0.5 ₡) × tier_markup
TierMeaningMarkupExamples
T0Raw harvest×1.00fresh buds, coca leaves, khat bundle, fresh mushrooms
T1Basic processing×1.15dried buds/leaves/mushrooms, joints, latex
T2Refined×1.30cured buds, teas, edibles, poppy resin
T3Concentrate×1.60resin, rosin, extracts
  • Raw harvest values are set per plant and reflect how hard the plant is to grow: altitude for coca, cuttings and shade for salvia, the sterile chain for mushrooms, foraging for semilanceata.
  • Processing time is real time at 20 TPS. A curing jar holds 16 buds for ~60 minutes, which is 3.75 minutes per bud.
  • Pack devs can override any value with a datapack. Derived values update automatically.

3.2 Quality

sale price × (0.5 + quality), so 0 % pays ×0.5, 50 % pays ×1.0, 80 % (mineral cap) pays ×1.3 and 100 % (living soil) pays ×1.5. Khat additionally scales with freshness (wilted khat pays ~25 %).

3.3 Produce values (base, before market effects)

Only products that exist in the mod are listed:

PlantProductTierInputsBase value ₡at 80 % qualityat 100 % quality
Cannabisfresh_cannabis_budT0harvest2.503.253.75
Cannabishemp_seed_oilT18× cannabis_seeds + 0.75 min1.351.762.03
Cannabisdried_cannabis_budT11× fresh_cannabis_bud + 1 min3.454.495.18
CannabisjointT11× dried_cannabis_bud + 1× rolling_paper + 0.1 min4.205.466.30
Cannabiscannabis_brownieT21× cocoa_beans + 1× egg + 1× sugar + 2× wheat + 1× dried_cannabis_bud + 0.1 min → 23.514.565.27
Cannabiscured_cannabis_budT21× dried_cannabis_bud + 3.75 min6.929.0010.4
Cannabiscannabis_resinT34× dried_cannabis_bud + 0.5 min22.529.233.7
Cannabiscannabis_rosinT34× cured_cannabis_bud + 0.5 min44.758.167.1
Opium poppypoppy_latexT0harvest4.005.206.00
Opium poppypoppy_seed_cakeT21× egg + 1× sugar + 2× wheat + 1× opium_poppy_seeds + 0.1 min → 21.071.391.61
Opium poppypoppy_resinT21× poppy_latex + 1 min5.857.618.78
Cocafresh_coca_leavesT0harvest1.201.561.80
Cocadried_coca_leavesT11× fresh_coca_leaves + 1 min1.962.542.93
Cocacoca_teaT21× potion + 2× dried_coca_leaves + 0.1 min5.346.958.01
Cocacoca_extractT38× dried_coca_leaves + 2 min26.634.639.9
Khatkhat_bundleT0harvest2.002.603.00
Salviafresh_salvia_leafT0harvest1.501.952.25
Salviadried_salvia_leafT11× fresh_salvia_leaf + 1 min2.302.993.45
Salviasalvia_extract_5xT35× dried_salvia_leaf + 1 min19.225.028.8
Salviasalvia_extract_10xT310× dried_salvia_leaf + 2 min38.449.957.6
Salviasalvia_extract_20xT320× dried_salvia_leaf + 4 min76.899.8115.2
Daturadatura_poisonT21× potion + 1× datura_leaf + 2× datura_seeds + 0.1 min0.650.850.98
Psilocybe cubensisfresh_cubensisT0harvest1.501.952.25
Psilocybe cubensisdried_cubensisT11× fresh_cubensis + 1 min2.302.993.45
Psilocybe cyanescensfresh_cyanescensT0harvest2.503.253.75
Psilocybe cyanescensdried_cyanescensT11× fresh_cyanescens + 1 min3.454.495.18
Psilocybe semilanceatafresh_semilanceataT0harvest2.002.603.00
Psilocybe semilanceatadried_semilanceataT11× fresh_semilanceata + 1 min2.883.744.31
Othermushroom_teaT21× potion + 2× dried_cubensis + 0.1 min6.248.119.36

Notes:

  • Datura is deliberately nearly worthless ("nobody wants that"). The Dealer buys only the poison, cheaply.
  • Fresh produce sells (it's T0) but loses the T1+ markup, so drying is always worth it.
  • Rough feel at Tier 0 reputation: one cannabis plant (~3 buds, dried, 50 % quality) ≈ 0.7 iron ingot. Cured at 80 % quality ≈ 1.8 iron ingots per plant. A 20× salvia extract ≈ 7 iron ingots.

4. Offers: basic resources

4.1 Pricing anchor

Basic resource values blend two references:

  • ProjectE default EMC for scarcity: cobblestone 1, iron ingot 256, gold ingot 2048, diamond 8192, emerald 16384 (ModdedMC wiki).
  • Vanilla villager exchange rates for everyday value: e.g. 20 wheat, 4 iron ingots, 3 gold ingots, 15 coal or 1 diamond buy one emerald (Minecraft Wiki: Trading).

Where they disagree, the value sits in between:

  • Gold: ProjectE says 8 iron, villagers say 1.3 iron → 1.5 iron, because gold farms are common in modern packs.
  • Diamond: ProjectE says 32 iron, villagers say 4 → 12 iron.
  • Wheat: villagers overpay for it; it's renewable → 1/25 iron.

4.2 Default offer list

The Dealer sells at value × (1.25 − 0.05 × reputation tier), so the spread is 25 % at tier 0 and 5 % at tier 4. Prices below are at tier 0. Bundles keep prices round.

CategoryItemValue ₡/itemBundlePrice (tier 0)Min. tier
BuildingCobblestone0.05644 ₡0
BuildingDirt0.05644 ₡0
BuildingSand0.06645 ₡0
BuildingGravel0.08323 ₡0
BuildingOak log (any #minecraft:logs the pack prefers)0.61612 ₡0
BuildingGlass0.15163 ₡0
BuildingClay ball0.4168 ₡0
BuildingObsidian2.5413 ₡1
FarmingWheat seeds0.1324 ₡0
FarmingBone meal0.25165 ₡0
FarmingBone0.686 ₡0
FarmingSugar cane0.4168 ₡0
FarmingPaper0.4168 ₡0
FarmingString0.51610 ₡0
FarmingLeather1.5815 ₡0
MineralsCoal0.751615 ₡0
MineralsCopper ingot3830 ₡0
MineralsIron ingot10450 ₡0
MineralsRedstone dust2820 ₡0
MineralsLapis lazuli3830 ₡1
MineralsNether quartz2820 ₡1
MineralsAmethyst shard2820 ₡1
MineralsGold ingot15238 ₡1
MineralsEmerald60175 ₡2
MineralsDiamond1201150 ₡2
MineralsNetherite scrap4001500 ₡4
Mob dropsGunpowder2820 ₡0
Mob dropsSlime ball1.5815 ₡1
Mob dropsGlowstone dust2.5825 ₡1
Mob dropsEnder pearl12230 ₡1
Mob dropsBlaze rod15238 ₡2
PlantationsRolling paper0.15163 ₡0
PlantationsSaltpeter / potash / sulfur1.5815 ₡1
PlantationsApatite2820 ₡1
PlantationsBrown sugar0.51610 ₡0
PlantationsPoppy seeds0.1162 ₡1
PlantationsCoca drupes4420 ₡1
PlantationsKhat cutting / salvia cutting20125 ₡2
PlantationsSpore print (cubensis)24130 ₡2
PlantationsRare strain seeds (random landrace)48160 ₡3

Modded resources: the default datapack also ships tag offers. They stay hidden while the conventional tag is empty; once a mod fills it, the Dealer sells the first item of the tag. A modpack with tin, lead, silver, nickel, zinc, osmium, uranium or aluminium gets those offers automatically. (NeoForge does not allow tag conditions in datapack registries, which load before tags, so the check happens at runtime.)

TagValue ₡BundleMin. tier
c:ingots/tin, c:ingots/zinc, c:ingots/lead, c:ingots/aluminum641
c:ingots/silver, c:ingots/nickel, c:ingots/osmium1041
c:ingots/uranium2023
c:gems/certus_quartz (AE2), c:dusts/sulfur281
c:rubber / c:slimeballs alternatives1.581

Pack devs change everything through data/<ns>/plantations/black_market/offer/*.json or KubeJS.

4.3 Stock

Each offer has a stock per restock (e.g. iron: 4 bundles) that refills every in-game morning. Stock is per player by default (config: shared on a server).

5. Market dynamics

MechanicRuleWhy
SaturationEach product has a demand factor d (1.0 = normal). Selling value v lowers it by v / capacity (capacity ≈ 200 ₡ per in-game day per product; minimum 0.25). d recovers toward 1.0 with a half-life of one in-game day.Flooding the market with one product makes it worthless. Diversifying plants pays.
Daily fluctuationEach product's price moves ±15 % per day (seeded by world seed and day).Small reason to stockpile and pick the moment.
Hot productOne product per day pays ×1.5, announced by the Dealer and on the Burner Phone.Variety and a reason to grow other plants.
SpreadDealer buys at value × (0.85 + 0.05 × tier), sells at value × (1.25 − 0.05 × tier).No buy/sell loops, reputation feels rewarding.
ScopeSaturation is per world (shared market) by default; config: per player.Server economies share one market.

Anti-exploit rules (checked by tests):

  • The Dealer never buys anything it sells, and never sells processed produce.
  • No offer plus processing chain may produce sellable value faster than growing does. In particular, bone meal on drug plants only advances one stage (config), so "buy bone meal → instant buds → sell" can't outrun saturation.
  • Prices floor at 25 % of value, so nothing hits zero, and saturation recovers on its own.

6. Reputation

Every ₡ of value sold earns reputation XP. Reputation is per player (data attachment).

TierNameXP neededUnlocks
0Newcomer0Basic resource offers, selling T0–T1, one contract a day
1Regular250Selling T2, more offers (gold, lapis, ender pearls, mod minerals), Burner Phone recipe
2Trusted1 000Selling T3, Dead Drop, diamonds and emeralds, cuttings and spore prints, two contracts a day and premium dried-bud contracts
3Connected4 000Rare strain seeds, larger stock, bulk joint contracts
4Kingpin12 000Netherite scrap, best spread (5 %), three contracts a day, exclusive cosmetic (Dealer coat)

Failing contracts or getting caught in a raid (see §8) costs reputation.

Each tier has an advancement in the Black Market tab, with the first sale as its root. They use the criterion plantations:reputation_tier ({"tier": 0-4}), which packs and quest mods can use too. It is checked whenever reputation changes and on login.

7. Contracts

The Dealer offers 1–3 contracts per in-game day (one, two from Trusted, three at Kingpin); each template has a minimum tier:

"Bring me 16 cured buds, quality ≥ 70 %, within 3 days." → reward ₡ × 1.4 + reputation, sometimes an item (strain seeds, a rare offer unlock).

Contracts are generated from data (plantations:black_market/contract_template) and give goals beyond "sell more". They also reward the quality systems and work as quest hooks for FTB Quests.

8. Heat (optional)

Config blackMarket.heat: off / light (default) / full.

  • Heat rises with sales, phone calls and large produce stashes near your base. It decays over time.
  • light: high heat only means the Dealer avoids you (the phone fails) and prices drop by up to 20 %.
  • full: at maximum heat an enforcer patrol (pillager-style mobs) can raid. They target drying racks, curing jars and stashes. Beating them clears heat; losing costs reputation and some produce.

9. Currency

Physical cash, so it works with storage, automation and player trading:

ItemValueNotes
Banknote1 ₡Stack of 64
Cash Roll10 ₡Crafts into 10 banknotes
Cash Brick100 ₡Crafts into 10 rolls
  • Payouts always use the largest notes, so there's no need to craft notes up (10 items don't fit a crafting grid anyway).
  • Fractional amounts (sales are not whole numbers) go onto the player's ledger balance at the Dealer and are paid out once they add up to whole banknotes.
  • Config blackMarket.currency:
    • plantations (default): the cash items above
    • emerald: 1 emerald = 40 ₡, the villager-rate anchor
    • numismatics: Create: Numismatics coins, 1 spur = 1 ₡ (bevel 8, sprocket 16, cog 64, crown 512, sun 4096)
    • lightmans: Lightman's Currency coins, 1 copper coin = 1 ₡ (×10 per step up to netherite)
    • custom: any items with credit values from customCurrency
    • Coins are plain items, so none of this needs a compile-time dependency. The two coin modes fall back to plantations while their mod is missing.

10. Integration

ModIntegration
JEI / EMI"Black Market" category: offers (cost → item) and sell values per product
JadeDealer: your reputation tier and today's hot product
CreateDead Drop accepts items from funnels and belts; cash output by chute
Numismatics / Lightman's CurrencyCurrency modes numismatics and lightmans (see §9)
ProjectEMarket values exported as EMC (25.6 EMC per ₡), so both systems agree
FTB QuestsReputation tiers (advancements) and contracts (statistic plantations:contracts_completed) as quest tasks; example chapter in docs/examples/ftbquests
KubeJSOffers, values and contract templates are plain datapack JSON (examples in docs/examples/kubejs/data)

Details and tests: INTEGRATIONS.md.