Black Market
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:
- 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.
- 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.
- 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.
- 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.
- 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 point | How it works | When |
|---|---|---|
| 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 |
| 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 | |
| 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
| Tier | Meaning | Markup | Examples |
|---|---|---|---|
| T0 | Raw harvest | ×1.00 | fresh buds, coca leaves, khat bundle, fresh mushrooms |
| T1 | Basic processing | ×1.15 | dried buds/leaves/mushrooms, joints, latex |
| T2 | Refined | ×1.30 | cured buds, teas, edibles, poppy resin |
| T3 | Concentrate | ×1.60 | resin, 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:
| Plant | Product | Tier | Inputs | Base value ₡ | at 80 % quality | at 100 % quality |
|---|---|---|---|---|---|---|
| Cannabis | fresh_cannabis_bud | T0 | harvest | 2.50 | 3.25 | 3.75 |
| Cannabis | hemp_seed_oil | T1 | 8× cannabis_seeds + 0.75 min | 1.35 | 1.76 | 2.03 |
| Cannabis | dried_cannabis_bud | T1 | 1× fresh_cannabis_bud + 1 min | 3.45 | 4.49 | 5.18 |
| Cannabis | joint | T1 | 1× dried_cannabis_bud + 1× rolling_paper + 0.1 min | 4.20 | 5.46 | 6.30 |
| Cannabis | cannabis_brownie | T2 | 1× cocoa_beans + 1× egg + 1× sugar + 2× wheat + 1× dried_cannabis_bud + 0.1 min → 2 | 3.51 | 4.56 | 5.27 |
| Cannabis | cured_cannabis_bud | T2 | 1× dried_cannabis_bud + 3.75 min | 6.92 | 9.00 | 10.4 |
| Cannabis | cannabis_resin | T3 | 4× dried_cannabis_bud + 0.5 min | 22.5 | 29.2 | 33.7 |
| Cannabis | cannabis_rosin | T3 | 4× cured_cannabis_bud + 0.5 min | 44.7 | 58.1 | 67.1 |
| Opium poppy | poppy_latex | T0 | harvest | 4.00 | 5.20 | 6.00 |
| Opium poppy | poppy_seed_cake | T2 | 1× egg + 1× sugar + 2× wheat + 1× opium_poppy_seeds + 0.1 min → 2 | 1.07 | 1.39 | 1.61 |
| Opium poppy | poppy_resin | T2 | 1× poppy_latex + 1 min | 5.85 | 7.61 | 8.78 |
| Coca | fresh_coca_leaves | T0 | harvest | 1.20 | 1.56 | 1.80 |
| Coca | dried_coca_leaves | T1 | 1× fresh_coca_leaves + 1 min | 1.96 | 2.54 | 2.93 |
| Coca | coca_tea | T2 | 1× potion + 2× dried_coca_leaves + 0.1 min | 5.34 | 6.95 | 8.01 |
| Coca | coca_extract | T3 | 8× dried_coca_leaves + 2 min | 26.6 | 34.6 | 39.9 |
| Khat | khat_bundle | T0 | harvest | 2.00 | 2.60 | 3.00 |
| Salvia | fresh_salvia_leaf | T0 | harvest | 1.50 | 1.95 | 2.25 |
| Salvia | dried_salvia_leaf | T1 | 1× fresh_salvia_leaf + 1 min | 2.30 | 2.99 | 3.45 |
| Salvia | salvia_extract_5x | T3 | 5× dried_salvia_leaf + 1 min | 19.2 | 25.0 | 28.8 |
| Salvia | salvia_extract_10x | T3 | 10× dried_salvia_leaf + 2 min | 38.4 | 49.9 | 57.6 |
| Salvia | salvia_extract_20x | T3 | 20× dried_salvia_leaf + 4 min | 76.8 | 99.8 | 115.2 |
| Datura | datura_poison | T2 | 1× potion + 1× datura_leaf + 2× datura_seeds + 0.1 min | 0.65 | 0.85 | 0.98 |
| Psilocybe cubensis | fresh_cubensis | T0 | harvest | 1.50 | 1.95 | 2.25 |
| Psilocybe cubensis | dried_cubensis | T1 | 1× fresh_cubensis + 1 min | 2.30 | 2.99 | 3.45 |
| Psilocybe cyanescens | fresh_cyanescens | T0 | harvest | 2.50 | 3.25 | 3.75 |
| Psilocybe cyanescens | dried_cyanescens | T1 | 1× fresh_cyanescens + 1 min | 3.45 | 4.49 | 5.18 |
| Psilocybe semilanceata | fresh_semilanceata | T0 | harvest | 2.00 | 2.60 | 3.00 |
| Psilocybe semilanceata | dried_semilanceata | T1 | 1× fresh_semilanceata + 1 min | 2.88 | 3.74 | 4.31 |
| Other | mushroom_tea | T2 | 1× potion + 2× dried_cubensis + 0.1 min | 6.24 | 8.11 | 9.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.
| Category | Item | Value ₡/item | Bundle | Price (tier 0) | Min. tier |
|---|---|---|---|---|---|
| Building | Cobblestone | 0.05 | 64 | 4 ₡ | 0 |
| Building | Dirt | 0.05 | 64 | 4 ₡ | 0 |
| Building | Sand | 0.06 | 64 | 5 ₡ | 0 |
| Building | Gravel | 0.08 | 32 | 3 ₡ | 0 |
| Building | Oak log (any #minecraft:logs the pack prefers) | 0.6 | 16 | 12 ₡ | 0 |
| Building | Glass | 0.15 | 16 | 3 ₡ | 0 |
| Building | Clay ball | 0.4 | 16 | 8 ₡ | 0 |
| Building | Obsidian | 2.5 | 4 | 13 ₡ | 1 |
| Farming | Wheat seeds | 0.1 | 32 | 4 ₡ | 0 |
| Farming | Bone meal | 0.25 | 16 | 5 ₡ | 0 |
| Farming | Bone | 0.6 | 8 | 6 ₡ | 0 |
| Farming | Sugar cane | 0.4 | 16 | 8 ₡ | 0 |
| Farming | Paper | 0.4 | 16 | 8 ₡ | 0 |
| Farming | String | 0.5 | 16 | 10 ₡ | 0 |
| Farming | Leather | 1.5 | 8 | 15 ₡ | 0 |
| Minerals | Coal | 0.75 | 16 | 15 ₡ | 0 |
| Minerals | Copper ingot | 3 | 8 | 30 ₡ | 0 |
| Minerals | Iron ingot | 10 | 4 | 50 ₡ | 0 |
| Minerals | Redstone dust | 2 | 8 | 20 ₡ | 0 |
| Minerals | Lapis lazuli | 3 | 8 | 30 ₡ | 1 |
| Minerals | Nether quartz | 2 | 8 | 20 ₡ | 1 |
| Minerals | Amethyst shard | 2 | 8 | 20 ₡ | 1 |
| Minerals | Gold ingot | 15 | 2 | 38 ₡ | 1 |
| Minerals | Emerald | 60 | 1 | 75 ₡ | 2 |
| Minerals | Diamond | 120 | 1 | 150 ₡ | 2 |
| Minerals | Netherite scrap | 400 | 1 | 500 ₡ | 4 |
| Mob drops | Gunpowder | 2 | 8 | 20 ₡ | 0 |
| Mob drops | Slime ball | 1.5 | 8 | 15 ₡ | 1 |
| Mob drops | Glowstone dust | 2.5 | 8 | 25 ₡ | 1 |
| Mob drops | Ender pearl | 12 | 2 | 30 ₡ | 1 |
| Mob drops | Blaze rod | 15 | 2 | 38 ₡ | 2 |
| Plantations | Rolling paper | 0.15 | 16 | 3 ₡ | 0 |
| Plantations | Saltpeter / potash / sulfur | 1.5 | 8 | 15 ₡ | 1 |
| Plantations | Apatite | 2 | 8 | 20 ₡ | 1 |
| Plantations | Brown sugar | 0.5 | 16 | 10 ₡ | 0 |
| Plantations | Poppy seeds | 0.1 | 16 | 2 ₡ | 1 |
| Plantations | Coca drupes | 4 | 4 | 20 ₡ | 1 |
| Plantations | Khat cutting / salvia cutting | 20 | 1 | 25 ₡ | 2 |
| Plantations | Spore print (cubensis) | 24 | 1 | 30 ₡ | 2 |
| Plantations | Rare strain seeds (random landrace) | 48 | 1 | 60 ₡ | 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.)
| Tag | Value ₡ | Bundle | Min. tier |
|---|---|---|---|
c:ingots/tin, c:ingots/zinc, c:ingots/lead, c:ingots/aluminum | 6 | 4 | 1 |
c:ingots/silver, c:ingots/nickel, c:ingots/osmium | 10 | 4 | 1 |
c:ingots/uranium | 20 | 2 | 3 |
c:gems/certus_quartz (AE2), c:dusts/sulfur | 2 | 8 | 1 |
c:rubber / c:slimeballs alternatives | 1.5 | 8 | 1 |
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
| Mechanic | Rule | Why |
|---|---|---|
| Saturation | Each 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 fluctuation | Each product's price moves ±15 % per day (seeded by world seed and day). | Small reason to stockpile and pick the moment. |
| Hot product | One product per day pays ×1.5, announced by the Dealer and on the Burner Phone. | Variety and a reason to grow other plants. |
| Spread | Dealer buys at value × (0.85 + 0.05 × tier), sells at value × (1.25 − 0.05 × tier). | No buy/sell loops, reputation feels rewarding. |
| Scope | Saturation 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).
| Tier | Name | XP needed | Unlocks |
|---|---|---|---|
| 0 | Newcomer | 0 | Basic resource offers, selling T0–T1, one contract a day |
| 1 | Regular | 250 | Selling T2, more offers (gold, lapis, ender pearls, mod minerals), Burner Phone recipe |
| 2 | Trusted | 1 000 | Selling T3, Dead Drop, diamonds and emeralds, cuttings and spore prints, two contracts a day and premium dried-bud contracts |
| 3 | Connected | 4 000 | Rare strain seeds, larger stock, bulk joint contracts |
| 4 | Kingpin | 12 000 | Netherite 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:
| Item | Value | Notes |
|---|---|---|
| Banknote | 1 ₡ | Stack of 64 |
| Cash Roll | 10 ₡ | Crafts into 10 banknotes |
| Cash Brick | 100 ₡ | 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 aboveemerald: 1 emerald = 40 ₡, the villager-rate anchornumismatics: 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 fromcustomCurrency- Coins are plain items, so none of this needs a compile-time dependency. The two coin modes fall back to
plantationswhile their mod is missing.
10. Integration
| Mod | Integration |
|---|---|
| JEI / EMI | "Black Market" category: offers (cost → item) and sell values per product |
| Jade | Dealer: your reputation tier and today's hot product |
| Create | Dead Drop accepts items from funnels and belts; cash output by chute |
| Numismatics / Lightman's Currency | Currency modes numismatics and lightmans (see §9) |
| ProjectE | Market values exported as EMC (25.6 EMC per ₡), so both systems agree |
| FTB Quests | Reputation tiers (advancements) and contracts (statistic plantations:contracts_completed) as quest tasks; example chapter in docs/examples/ftbquests |
| KubeJS | Offers, values and contract templates are plain datapack JSON (examples in docs/examples/kubejs/data) |
Details and tests: INTEGRATIONS.md.