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,000 (config: pouches.default_capacity) and the level is bounded to [0, 60] (config: pouches.max_capacity_level).

cost(level) = 10,000 × 1.5^(level-1)
(config base: pouches.upgrade_cost_base). The old quadrupling curve (2^(2×level)) was retuned to a ×1.5 growth per level precisely because it made capacity unreachable past level 5 - the current curve stays climbable all the way to the level-60 cap.

The starter capacity alone is 100,000 blocks, and it doubles every level - level 5 already holds 3.2 million blocks. For almost every play pattern the base capacity is more than enough; capacity upgrades are for mass-detonate AFK builds that generate burst volumes.

Level-by-Level

LevelBlocks HeldTotal Tokens to Reach
Lv 0100,0000
Lv 1200,00010,000
Lv 2400,00025,000
Lv 3800,00047,500
Lv 53.2 M~131,900
Lv 10102.4 M~1.13 M
Lv 20~104.9 B~66.5 M
Lv 60~115 quintillion~670 T

Autosell - Default On, Timers Optional

How it works now

Everyone auto-sells by default. At autosell level 0 (nothing purchased), blocks that enter the Sarcina trigger a sell on a 2-second per-player batch cooldown - mined value lands in your balance continuously without you doing anything. This replaced the old "level 0 = disabled" model, which caused new players' backpacks to fill and blocks to spill.

Purchased autosell levels switch you to the timer path: interval(level) = 300 s / 2^(level-1) - 5 minutes at level 1, halving each level. When the interval drops below 1 second (level 10+), the system flips back to sell-on-insert (no timer at all). The timer task scans every online player once per second and fires each player's sell when their interval has elapsed.

cost(level) = 50,000 × 1.4^(level-1)
(config base: pouches.autosell_cost_base). Autosell can be toggled off from the backpack menu (/backpack) if you prefer to hoard and sell manually with /sellall.

Level-by-Level

LevelSell IntervalTotal Tokens to Reach
Lv 0Default auto-sell (2 s batching)0
Lv 15 min (300 s)50,000
Lv 22.5 min (150 s)120,000
Lv 375 s218,000
Lv 5~19 s~547,000
Lv 10Sell-on-insert (instant)~3.49 M
Lv 20Sell-on-insert (instant)~104.5 M

The default (level 0) is already near-instant thanks to the 2-second batching. Autosell upgrades mostly matter for the toggle and the ladder - spend here only after your multiplier is comfortable.

Multiplier - Linear Sell Bonus

Formula

multiplier(level) = mineTier × (1 + level × 0.01)
So level 1 = +1%, level 10 = +10%, level 30 = +30%, stacked multiplicatively with your mine-tier multiplier and the rest of the economy pipeline. The bonus is a flat add to the gross sell value, applied before tax.

cost(level) = 10,000 × 1.5^(level-1)
(config base: pouches.multiplier_cost_base).

Level Breakpoints

LevelBonusEffective ×Total Tokens to Reach
Lv 1+1%1.01×10,000
Lv 5+5%1.05×~131,900
Lv 10+10%1.10×~1.13 M
Lv 20+20%1.20×~66.5 M
Lv 30+30%1.30×~3.84 B

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. Multiplier Lv 3 → 5. ~47.5K-131.9K tokens total for +3-5% on every sell. Pays back fast on high-value ores.
  2. Capacity Lv 1 → 3. 47.5K total. The base 100K already covers most loops; a few levels adds burst headroom for ability windows.
  3. Multiplier Lv 10. ~1.13M total for +10%. Stack this once your pipeline multiplier is high enough that the +X% matters.
  4. Autosell levels only if you want the toggle. The default (level 0) already auto-sells on a 2-second batch - the upgrades mostly buy the on/off toggle and the ladder, not faster liquidation.
  5. Capacity Lv 10+. Only if you're mining AFK with mass-detonate abilities - the excess capacity prevents overflow during burst windows.

Multiplier is the priority path. The base capacity (100,000 blocks) and the default auto-sell cover the gameplay need on their own - tokens are best spent making every sell worth more, not on headroom you will never fill.

Configurable Defaults

All three base costs and the capacity floor 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_capacity100,000capacityBase in capacityAt()
pouches.max_capacity_level60Upper bound on capacity level
pouches.upgrade_cost_base10,000capacityCostBase in capacityCostAt()
pouches.autosell_cost_base50,000autosellCostBase in autosellCostAt()
pouches.multiplier_cost_base10,000multiplierCostBase in multiplierCostAt()

The per-level growth factors themselves (×1.5 capacity, ×1.4 autosell, ×1.5 multiplier) are code constants in SarcinaManager.kt.

Quick Reference

SettingValue
Capacity formula100,000 × 2^level
Capacity cost10,000 × 1.5^(level-1)
Autosell defaultLevel 0 = auto-sell on a 2 s batch cooldown
Autosell timer levels5 min / 2^(level-1); sell-on-insert from Lv 10
Autosell cost50,000 × 1.4^(level-1)
Multiplier formulamineTier × (1 + level × 0.01)
Multiplier cost10,000 × 1.5^(level-1)
Sell tax5% → seasonal tax vault (rounded to cent)
Mining summary cadenceEvery 60 seconds (1,200 ticks)
Storage tablebackpack_data (uuid PK + JSON blocks)
Manual sell command/sellall
Upgrade currencyAuctoritas tokens (⛁)