Skip to content

Paid Queue Slots ​

You can buy extra queue slots right on the queue page. Price tiers live in plugins/EmakiStation/queue_costs.yml, and queue.purchase.cost_file in config.yml tells the plugin where to find it

Treat it as a business data file: release_default_data drops it in once when it is missing, and version upgrades never overwrite what an administrator changed

Three Switches ​

Purchasing is blocked if any one of them is off:

SwitchLocation
queue.purchase.enabledconfig.yml, server-wide master switch
queue.allow_purchasestations/<id>.yml, whether this station sells slots
emakistation.purchasePlayer permission, default true

Shipped Defaults ​

yaml
tiers:
  - count_range: "1-2"
    currency:
      type: vault
      amount: 5000
  - count_range: "3-4"
    currency:
      type: vault
      amount: 20000
  - count_range: "5-6"
    currency:
      type: vault
      amount: 50000
    item:
      source: "diamond"
      amount: 8

fallback:
  currency:
    type: vault
    amount: "100000 * 1.15 ^ (%count% - 7)"
  max_amount: 500000000

batch:
  enabled: true
  options:
    - 1
    - 2
    - 5

Fields ​

FieldTypeRequiredDefaultAccepted rangeDescription
tierslistNo[]list of mapsPrice tier list. An invalid tier is skipped with a [station] WARN
tiers[].count_rangestringNo—"N" or "min-max", positive integersWhich slot numbers this tier covers, such as "1-2". An unparsable value, a non-positive number, or max < min skips the tier
tiers[].currencysectionNo—see the next two rowsCurrency price; when both it and item are missing or invalid the tier is skipped
tiers[].currency.typestringNo"vault"vault, excellent (excellenteconomy is equivalent)Economy provider. An unrecognised value logs Unrecognised queue cost currency type and counts as no currency price
tiers[].currency.amountdouble | stringNo—a number >0, or a non-blank expression stringCurrency amount. A number ≤0 counts as no currency price; a string is evaluated by the CoreLib ExpressionEngine, where %count% is the ordinal of the slot being bought
tiers[].itemsectionNo—see the next two rowsAdditional item price
tiers[].item.sourcestringNo—a CoreLib ItemSource tokenThe additional item required. Empty or blank counts as no item price
tiers[].item.amountintegerNo1>0Item amount; ≤0 counts as no item price
fallbacksectionNodisabledsee the next three rowsFallback tier. With no usable currency or item the whole fallback is disabled
fallback.currency.typestringNo"vault"same as tiers[].currency.typeFallback currency type
fallback.currency.amountdouble | stringNo—same as tiers[].currency.amountFallback amount; expressions are supported
fallback.item.source / fallback.item.amountstring / integerNo— / 1same as tiers[].itemFallback item price
fallback.max_amountdoubleYes (when fallback is enabled)—>0Price ceiling for a single queue slot. When missing or non-positive the whole fallback tier is disabled and slots beyond tiers become unpurchasable
batch.enabledbooleanNotruetrue, falseWhether batch purchasing is allowed
batch.optionslist<integer>No[1, 5]positive integersSelectable batch sizes; non-positive entries are ignored and an all-invalid list falls back to [1, 5]. The effective batch choices always include 1 and keep only explicit values greater than 1

Make sure fallback.max_amount is set: if it is missing or non-positive, the whole fallback tier is disabled and slots beyond tiers cannot be bought. It exists to stop an exponential expression from overflowing to Infinity

yaml
# Example: sell only the first 4 slots and nothing beyond (no fallback)
tiers:
  - count_range: "1"
    currency:
      type: vault
      amount: 2000
  - count_range: "2-4"
    currency:
      type: vault
      amount: 8000

Pricing Rules ​

When you buy your Nth queue slot, the count_range containing N decides the price. N is the count you have already bought at this station plus one, and each station counts separately. Earlier tiers win; unmatched numbers fall back to fallback

Batch purchases are settled by pricing each slot and summing, not "unit price × quantity" -- otherwise you could buy a large batch entirely at the cheapest tier

No price means refusal: when a slot matches neither a tier nor fallback, the purchase is refused instead of being granted for free. If the file is missing or unusable as a whole, paid queue slots are disabled entirely

Relationship to the Ceiling ​

Purchased slots stack on top of the base length or permission tier, but queue.max_length on the station still clamps the result. At quoting time the plugin already refuses purchases that the clamp would swallow, so you never pay first and find out afterwards that the slot was useless

When you cancel a queue entry, currency already paid is refunded at the station's cancel_refund_rate -- the same rate as materials

unlocks.yml — Purchased-Slot Save Data ​

Your purchased queue slots are recorded in plugins/EmakiStation/data/<player UUID>/unlocks.yml. This is plugin state, not configuration: stop the server before editing it by hand. The plugin reads it when you join and writes it on purchase, on shutdown and on autosave; if you have no purchased slots, the file is never created

FieldTypeRequiredDefaultAccepted rangeDescription
playerstringYes—player UUIDThe player this file belongs to
stationsmapYes—<station id> → recordPurchased slots, tracked per station
stations.<station id>.purchased_slotsintegerNo0≥0How many queue slots this player bought at that station; 0 or missing means no extra slots (values ≤0 are read as 0)
yaml
player: "0f1e2d3c-4b5a-6978-8796-a5b4c3d2e1f0"
stations:
  blacksmith:
    purchased_slots: 3