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
| Path | Effect | Cost Currency | Base Cost |
|---|---|---|---|
| Capacity | Backpack holds more blocks before overflowing | Auctoritas ⛁ | 10,000 per level |
| Autosell | Sells contents on a timer (eventually instantly) | Auctoritas ⛁ | 50,000 per level |
| Multiplier | +1% sell value per level | Auctoritas ⛁ | 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
| Level | Blocks Held | Total Tokens to Reach |
|---|---|---|
| Lv 0 | 100,000 | 0 |
| Lv 1 | 200,000 | 10,000 |
| Lv 2 | 400,000 | 25,000 |
| Lv 3 | 800,000 | 47,500 |
| Lv 5 | 3.2 M | ~131,900 |
| Lv 10 | 102.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
| Level | Sell Interval | Total Tokens to Reach |
|---|---|---|
| Lv 0 | Default auto-sell (2 s batching) | 0 |
| Lv 1 | 5 min (300 s) | 50,000 |
| Lv 2 | 2.5 min (150 s) | 120,000 |
| Lv 3 | 75 s | 218,000 |
| Lv 5 | ~19 s | ~547,000 |
| Lv 10 | Sell-on-insert (instant) | ~3.49 M |
| Lv 20 | Sell-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
| Level | Bonus | Effective × | 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:
- Sum block values. For each
(material, count)in the backpack snapshot, multiply the block's unit value (fromMineManager.getBlockValue) by the count and sum everything to gettotal. Iftotal ≤ 0, the sell is a no-op. - Apply Sarcina multiplier.
multiplier = 1 + (multiplierLevel × 0.01). - Apply mine-fortune upgrade. If you have a public-mine fortune upgrade stored, multiply the running multiplier by
fortuneMultiplier(). - 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. - Compute gross.
gross = max(0.01, total × multiplier). The floor prevents zero-value sells from creating dead ledger entries. - Compute tax.
tax = round(gross × 0.05 × 100.0) / 100.0- 5% of gross, rounded to the cent (two decimal places). - Contribute tax to the seasonal pool.
serverTaxPoolService.contribute(tax)- the tax vault pays out during festivals. - Net deposit.
net = gross − tax, deposited as Denarius with reasonbackpack:sell(auto) orbackpack:sell_explicit(manual). - 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.
- Update player stats. The net amount is added to your
totalEarnedstat (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.
| Step | Calculation | Running value |
|---|---|---|
| 1. Sum | 1,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:
- Skips zero-value blocks - if
MineManager.getBlockValue(material) ≤ 0, returnstrue(block is "accepted") but doesn't store it. This is why some blocks (like grass in a non-grass-valued mine) just vanish silently. - Checks capacity - if
current + amount > capacity, returnsfalse. The caller then drops the block normally into the world so it isn't destroyed. - Otherwise stores - merges into the per-material map and increments the cached
totalBlockscounter (kept current for O(1) capacity checks). - 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:
| Counter | What it tracks |
|---|---|
| Blocks | Total blocks broken (mining + enchant + ability) |
| Earned (total) | Net Denarius earned (mine income + enchants) |
| ├ Mine Income | Denarius from base block sells (Sarcina) |
| ├ Enchants | Denarius from enchant procs (Denarius Boost, etc.) |
| Auctoritas | Tokens earned (split into Mining vs Milestones when applicable) |
| Crystals | Gemmae crystals gained |
| Civitas | Beacons gained |
| Crates | Crates opened |
| Pouches | Lucky 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_dataas JSON: levels for the three upgrade paths, plus ablocks_jsonmap 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 fallbackINSERTif 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:
- Multiplier Lv 3 → 5. ~47.5K-131.9K tokens total for +3-5% on every sell. Pays back fast on high-value ores.
- Capacity Lv 1 → 3. 47.5K total. The base 100K already covers most loops; a few levels adds burst headroom for ability windows.
- Multiplier Lv 10. ~1.13M total for +10%. Stack this once your pipeline multiplier is high enough that the +X% matters.
- 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.
- 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 key | Default | Used for |
|---|---|---|
pouches.default_capacity | 100,000 | capacityBase in capacityAt() |
pouches.max_capacity_level | 60 | Upper bound on capacity level |
pouches.upgrade_cost_base | 10,000 | capacityCostBase in capacityCostAt() |
pouches.autosell_cost_base | 50,000 | autosellCostBase in autosellCostAt() |
pouches.multiplier_cost_base | 10,000 | multiplierCostBase 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
| Setting | Value |
|---|---|
| Capacity formula | 100,000 × 2^level |
| Capacity cost | 10,000 × 1.5^(level-1) |
| Autosell default | Level 0 = auto-sell on a 2 s batch cooldown |
| Autosell timer levels | 5 min / 2^(level-1); sell-on-insert from Lv 10 |
| Autosell cost | 50,000 × 1.4^(level-1) |
| Multiplier formula | mineTier × (1 + level × 0.01) |
| Multiplier cost | 10,000 × 1.5^(level-1) |
| Sell tax | 5% → seasonal tax vault (rounded to cent) |
| Mining summary cadence | Every 60 seconds (1,200 ticks) |
| Storage table | backpack_data (uuid PK + JSON blocks) |
| Manual sell command | /sellall |
| Upgrade currency | Auctoritas tokens (⛁) |