Reference

Sarcina (In-Depth)

The exhaustive Sarcina reference — every capacity, autosell, and multiplier formula with level breakpoints.

This is the exhaustive Sarcina reference — every formula, every level breakpoint, every interaction with the economy pipeline. If you only want the short version, see Sarcina Backpack. If you want to optimize a multi-million Auctoritas spend, you're in the right place. All numbers below come straight from SarcinaManager.kt and the matching config keys in config.yml.

The Three Upgrade Paths — At a Glance

PathEffectCost CurrencyBase Cost
CapacityBackpack holds more blocks before overflowingAuctoritas ⛁10,000 per level
AutosellSells contents on a timer (eventually instantly)Auctoritas ⛁50,000 per level
Multiplier+1% sell value per levelAuctoritas ⛁10,000 per level

All three are independent — your Capacity level has no effect on your Autosell or Multiplier level, and each has its own cost curve. You can spend tokens on any of the three at any time, in any order.

Capacity — The Doubling Curve

Formula

capacity(level) = capacityBase × 2^level
where capacityBase = 100 (config: pouches.default_capacity) and the level is bounded to [0, 60] (config: pouches.max_capacity_level).

cost(level) = capacityCostBase × 2^(costExponent × (level-1))
where capacityCostBase = 10,000 (config: pouches.upgrade_cost_base), costExponent = 2 (config: pouches.upgrade_cost_exponent), and the (level-1) exponent is capped at 22 in code so costs plateau rather than overflow.

The exponent cap means costs stop growing after level 23, but capacity keeps doubling all the way to level 60. This makes very high capacity levels disproportionately cheap in tokens-per-block — a deliberate endgame efficiency incentive.

Level-by-Level

LevelBlocks HeldTotal Tokens to Reach
Lv 01000
Lv 120010,000
Lv 240040,000
Lv 3800160,000
Lv 41,600640,000
Lv 53,2002,560,000
Lv 66,40010,240,000
Lv 712,80040,960,000
Lv 825,600163,840,000
Lv 10102,400~2.62 B
Lv 15~3.28 M~2.75 T
Lv 22~419 M~1.13 P (quad max exponent)
Lv 23~839 M~1.13 P (cost caps here)
Lv 30~107 B~1.13 P (capped)
Lv 60~115 quad~1.13 P (capped)

Autosell — Halving Intervals to Instant

Formula

autosellTicks(level) = 6000 ticks >> (level-1) — equivalent to 6000 / 2^(level-1). At 20 ticks/second, that's 300 s / 2^(level-1).

If the resulting interval drops below 20 ticks (1 second), the value is replaced with -1, which the autosell scheduler treats as "instant" (sells on every block insert, no timer).

cost(level) = autosellCostBase × 2^(level-1)
where autosellCostBase = 50,000 (config: pouches.autosell_cost_base) and the (level-1) exponent is capped at 40.

Level-by-Level

LevelSell IntervalTotal Tokens to Reach
Lv 0Disabled — manual /sellall0
Lv 15 min (300 s)50,000
Lv 22.5 min (150 s)100,000
Lv 375 s200,000
Lv 437.5 s400,000
Lv 5~19 s800,000
Lv 6~9 s1.6 M
Lv 7~4.7 s3.2 M
Lv 8~2.3 s6.4 M
Lv 9~1.1 s12.8 M
Lv 10Instant (<1 s)25.6 M
Lv 12Instant102.4 M
Lv 20Instant~26.2 B
Lv 41Instant~54.9 T (cost caps here)

Level 10 is the instant breakpoint. Past that, more autosell levels are pure prestige — they don't change gameplay, only the token-sink leaderboards. If you're optimizing, stop at level 10 and shift spend to Multiplier.

How the Timer Fires

A repeating task runs every 1 second (20 ticks) server-wide. For each online player, it reads the player's autosell level, computes the interval in ms, and triggers a sell if now - lastAutosell ≥ intervalMs. The instant path (level ≥ 10) skips the timer entirely and sells on block insert.

For manual mode (level 0), the Sarcina still auto-sells for you — but on a 2-second cooldown per player to avoid spamming the economy deposit pipeline on fast-mining hot loops. This is what makes /sellall largely optional even without autosell purchased.

Multiplier — Linear Sell Bonus

Formula

multiplier(level) = 1 + level × 0.01
So level 1 = 1.01×, level 10 = 1.10×, level 100 = 2.00×. The bonus is a flat add to the gross sell value, applied before tax.

cost(level) = multiplierCostBase × 2^(level-1)
where multiplierCostBase = 10,000 (config: pouches.multiplier_cost_base) and the exponent is capped at 40.

Level Breakpoints

LevelBonusEffective ×Total Tokens to Reach
Lv 1+1%1.01×10,000
Lv 5+5%1.05×160,000
Lv 10+10%1.10×~5.12 M
Lv 20+20%1.20×~5.24 B
Lv 30+30%1.30×~5.37 T
Lv 41+41%1.41×~5.50 P (cost caps here)

The Full Sell Calculation — Step by Step

When the Sarcina sells (whether manual /sellall or autosell), the manager runs the following pipeline. Each step is applied in order:

  1. Sum block values. For each (material, count) in the backpack snapshot, multiply the block's unit value (from MineManager.getBlockValue) by the count and sum everything to get total. If total ≤ 0, the sell is a no-op.
  2. Apply Sarcina multiplier. multiplier = 1 + (multiplierLevel × 0.01).
  3. Apply mine-fortune upgrade. If you have a public-mine fortune upgrade stored, multiply the running multiplier by fortuneMultiplier().
  4. Apply the EconomyModifierPipeline. This folds in your rank, prestige, pet, crystal, booster, donor, and event multipliers — the entire economy stack. Call pipeline.getMultiplier(player, DENARIUS) and multiply it in.
  5. Compute gross. gross = max(0.01, total × multiplier). The floor prevents zero-value sells from creating dead ledger entries.
  6. Compute tax. tax = round(gross × 0.05 × 100.0) / 100.0 — 5% of gross, rounded to the cent (two decimal places).
  7. Contribute tax to the seasonal pool. serverTaxPoolService.contribute(tax) — the tax vault pays out during festivals.
  8. Net deposit. net = gross − tax, deposited as Denarius with reason backpack:sell (auto) or backpack:sell_explicit (manual).
  9. On success only — clear the backpack. The snapshot is held until the deposit confirms. If the deposit fails, blocks are not lost — the backpack keeps its contents and you can retry.
  10. Update player stats. The net amount is added to your totalEarned stat (used by leaderboards and stats).

Anti-loss design: the backpack is not cleared until the deposit future returns true. If the DB is briefly unreachable, your blocks stay in the backpack and you can re-trigger a sell. The DB row is also only persisted after success, so a server crash mid-sell preserves the pre-sell (full) state.

Worked Example — A Mid-Game Sell

Suppose you have a Sarcina with multiplier level 5, a mine fortune upgrade of 1.20×, a rank+prestige+pet economy pipeline of 3.50×, and you sell a backpack containing:

  • 1,500 stone @ $1 = $1,500
  • 200 iron ore @ $8 = $1,600
  • 40 diamond ore @ $50 = $2,000

Total block value: $5,100.

StepCalculationRunning value
1. Sum1,500 + 1,600 + 2,000$5,100
2. Sarcina multiplier$5,100 × 1.05$5,355
3. Mine fortune$5,355 × 1.20$6,426
4. Economy pipeline$6,426 × 3.50$22,491 (gross)
5. Tax (5%)$22,491 × 0.05$1,124.55 → tax pool
6. Net deposit$22,491 − $1,124.55$21,366.45 to your balance

The boost summary line will read: Sell Boost: +375% (Sarcina +5% | Prestige +X% | Rank +Y%). Note that the Sarcina-only contribution is small here — the rank and prestige multipliers dominate. That's why Sarcina multiplier upgrades are not the highest-priority spend for most players.

How Blocks Enter the Backpack

addBlock(uuid, material, amount) is called by every block-break code path — the listener that suppresses normal drops, the enchant proc that breaks extra blocks, the pickaxe-skin ability, the mass-detonate ability, and the public-mine listener. The function:

  1. Skips zero-value blocks — if MineManager.getBlockValue(material) ≤ 0, returns true (block is "accepted") but doesn't store it. This is why some blocks (like grass in a non-grass-valued mine) just vanish silently.
  2. Checks capacity — if current + amount > capacity, returns false. The caller then drops the block normally into the world so it isn't destroyed.
  3. Otherwise stores — merges into the per-material map and increments the cached totalBlocks counter (kept current for O(1) capacity checks).
  4. If autosell is instant (level ≥ 10), schedules a synchronous sellAll(player) on the next tick. Otherwise, in manual mode, schedules a sell on a 2-second per-player cooldown so fast-mining loops don't spam deposits.

Pending blocks for still-loading players: if a block-break fires before the player's backpack has finished loading from the DB, the blocks are queued in pendingBlocks and merged on load completion. No blocks are lost during the login window.

The 60-Second Mining Summary

Every 60 seconds (1,200 ticks) the Sarcina sends a chat summary of the previous minute's activity while you were mining. It tracks nine independent counters and resets them after sending:

CounterWhat it tracks
BlocksTotal blocks broken (mining + enchant + ability)
Earned (total)Net Denarius earned (mine income + enchants)
├ Mine IncomeDenarius from base block sells (Sarcina)
├ EnchantsDenarius from enchant procs (Denarius Boost, etc.)
AuctoritasTokens earned (split into Mining vs Milestones when applicable)
CrystalsGemmae crystals gained
CivitasBeacons gained
CratesCrates opened
PouchesLucky pouches triggered

The summary only fires if at least one counter is non-zero, so AFK players don't get spammed. Use it to compare mining spots, test build changes, and detect when an enchant proc rate is too low (Enchants line near zero means your build isn't firing).

The Sarcina Item

The Sarcina exists as a physical Ender Chest item in your inventory. It carries a NamespacedKey tag with your UUID, making it soulbound — another player who picks it up cannot use it to access your blocks. Right-click it to open the backpack view.

The giveBackpackItem(player) helper checks whether you already have one (by scanning for the PDC tag) before granting, and drops it on the ground at your location if your inventory is full — so you never end up with two Sarcinas and never lose one to a full inventory.

Persistence & Reload Safety

  • The backpack is stored in backpack_data as JSON: levels for the three upgrade paths, plus a blocks_json map of material → count.
  • Saves happen on quit, on every successful sell, and on every upgrade purchase. The save uses an UPSERT (UPDATE ... WHERE uuid=? with a fallback INSERT if 0 rows updated) so a missing row never corrupts state.
  • On shutdown, all in-memory backpacks are flushed synchronously — even quit-during-save races don't lose blocks.
  • The schema is created on enable with SchemaBuilder; no manual migration is needed.

Optimal Token-Allocation Strategy

The right answer depends on your goal — but for most players, the priority order is:

  1. Capacity Lv 3 → 5. 160K–2.56M tokens total. Removes the "backpack full" interruption without breaking the bank.
  2. Autosell Lv 3 → 5. 200K–800K additional. A 19–75 second sell interval is enough for any mining loop.
  3. Multiplier Lv 5. 160K total for +5% on every sell. Pays back fast on high-value ores.
  4. Autosell Lv 10 (instant). 25.6M total — the long-term quality-of-life breakpoint. This is the "mining becomes pure block-breaking" upgrade.
  5. Multiplier Lv 10–20. 5M–5B total for +10–20%. Stack this once your pipeline multiplier is high enough that the +X% matters.
  6. Capacity Lv 10+. Only if you're mining AFK with mass-detonate abilities — the excess capacity prevents overflow during burst windows.

Don't chase Capacity past Lv 5–7 unless you're running mass-detonate builds. The doubling curve gives absurd headroom (Lv 5 = 3,200 blocks), and most mining sessions sell far more often than that.

Configurable Defaults

All four base costs and the capacity exponent are read from config.yml at plugin enable. If your server has tuned them, the numbers above change accordingly. The relevant keys:

Config keyDefaultUsed for
pouches.default_capacity100capacityBase in capacityAt()
pouches.max_capacity_level60Upper bound on capacity level
pouches.upgrade_cost_base10,000capacityCostBase in capacityCostAt()
pouches.upgrade_cost_exponent2costExponent (1–4)
pouches.autosell_cost_base50,000autosellCostBase in autosellCostAt()
pouches.multiplier_cost_base10,000multiplierCostBase in multiplierCostAt()

Quick Reference

SettingValue
Capacity formula100 × 2^level
Capacity cost10,000 × 2^(2×(level-1)), exp capped at 22
Autosell interval5 min / 2^(level-1), instant at Lv 10
Autosell cost50,000 × 2^(level-1), exp capped at 40
Multiplier formula1 + level × 0.01
Multiplier cost10,000 × 2^(level-1), exp capped at 40
Sell tax5% → seasonal tax vault (rounded to cent)
Manual sell cooldown2 seconds per player (no autosell)
Mining summary cadenceEvery 60 seconds (1,200 ticks)
Storage tablebackpack_data (uuid PK + JSON blocks)
Manual sell command/sellall
Upgrade currencyAuctoritas tokens (⛁)