Bounty Board

Rotating shared contracts that pay Bounty Tokens plus skill XP

Overview

Bounty boards are placeable poster blocks that offer a rotating set of contracts - short jobs that pay Bounty Tokens plus skill XP. Every player on the server sees the same board each rotation, accepts the contracts they like, and finishes the task anywhere in the world. Finishing a contract does not hand out the reward on the spot: it parks the bounty as ready to claim, and you collect the reward with a Claim button back at the board. Don't like a contract? Reroll just that one for a few tokens while the rest of the board stays put.

The board and its rotation belong to the shared ZiggfreedCommon library that ships beside this mod: it owns the postings, the draw, the reroll allowance and the accept gates, and this mod contributes the theme and the reward kinds. The board content - the contracts, the Bounty Token wallet, the board schedules, and the in-world board blocks - ships in the free, standalone MMO Skill Bounty Pack. Without that pack the feature is dormant: no boards, no contracts, nothing to place. Install both and bounties appear.

Where boards and contracts live

Content pack assetServer/ZiggfreedCommon/Boards/<Namespace>/<Id>.jsonBoards/

One file per board: how often it turns over, how many contracts it posts and at which bands, what a reroll costs, which wallets show in its header, and what each band takes to accept.

defaults<pack<owner
Content pack assetServer/ZiggfreedCommon/Bounties/<Namespace>/<Id>.jsonBounties/

One file per contract: its task, its reward, and the boards it hangs on. The file name is the id.

Override configmods/ziggfreedcommon/boards.json

The server owner's last word: take a board down or retune it by id, one leaf at a time, without editing a pack an update would overwrite.

mods/ziggfreedcommon/boards.json
{
  "daily":  { "Reroll": { "Cost": { "Currencies": { "bounty_token": 40 } } } },
  "weekly": { "Enabled": false }
}

Everything you leave out keeps reading the way the pack shipped it, and case is ignored in an id. Precedence runs bottom to top: what the library ships, then a pack, then this file.

A contract is a quest

A contract is written with the same words a quest is - its text, its objectives, its rewards, its requirements - plus the one thing only a contract has: the list of boards it hangs on, with the band and the draw weight it takes on each. So one contract can sit on two boards at different bands, everything you already know about writing a quest applies, and a contract and a quest can never drift into two spellings of "kill eight of them".

Server/ZiggfreedCommon/Bounties/MMOSkillTree/Bounty_Boar_Hunt.json
{
  "Parent": "Bounty_Kill",
  "Text": {
    "TitleKey": "quest.bounty_boar_hunt.title",
    "FlavorKey": "quest.bounty_boar_hunt.flavor"
  },
  "Boards": [ { "Board": "Daily", "Difficulty": "Easy", "Weight": 2 } ],
  "Objectives": { "main": { "Target": "Boar", "Amount": 15 } },
  "Rewards": {
    "Claim": [
      { "Kind": "Currency", "Params": { "Currency": "bounty_token", "Amount": 75 } },
      { "Kind": "Mmo_Xp",   "Params": { "Skill": "UNARMED", "Amount": 600 } }
    ]
  }
}

The pay sits in the same two-bucket Rewards group a quest or an achievement uses, and a contract writes it into Claim: the reward waits at the board and is handed over by the Claim button. That is what every contract in the Bounty Contracts pack authors, and it is what the stamped behaviours below hold you to: nothing on a contract pays out before the board claim.

Five behaviours are stamped on every contract and no file can author them, because each one would otherwise be a lost reward one careless line away:

  • It never pays out in the field. A contract that settled where you stood would vanish with the rotation and take the reward with it.
  • It is never listed as an open quest. A contract is read at its board; listing it anywhere else is a second, wrong door.
  • It cannot set its own repeat clock. The board's rotation is the clock, timed from finishing, so a private cooldown can never outlive a posting and burn the next period's slot.
  • It is collected at the accept site. Any board of that id answers, and nowhere else does.
  • It never spends a quest-log slot. It is carried beside the log, so taking three contracts costs you no room for real quests.

Contract Types

Contracts come in a few shapes. Each one renders a localized task line with the count spelled out ("Defeat 12 Zombies"), so the board reads the same in every supported language.

TypeTask
KillDefeat a number of a creature - desert scorpions, cave raptors, swamp crocodiles, and on the weekly board, marquee boss hunts.
GatherBreak a number of blocks, or mine ore. Some mining contracts end by delivering a share of what you dug.
Train a skillEarn a chunk of XP in a skill. These are the everyday jobs - steady skill XP for quick work.
DeliveryHand in gathered materials (Life Essence, ore) at the board itself using a Turn In button.

A contract pays out in the same open reward vocabulary everything else on the server uses, so a wallet amount, a flat skill-XP grant, an item, a loot roll or a command are all available, and the board's reward list shows each with its icon. Spend the tokens you earn at the Token Shop - see Currencies for how Bounty Tokens are tracked.

Boards and Rotation

A board declares how often it turns over, how it draws, and its slots - one contract per slot per period. What a board shows is worked out from its id and the clock alone, with no stored schedule anywhere, so every player sees an identical board and a restart shows what was there before. A slot marked optional posts nothing rather than reading as broken when a period is short of eligible contracts.

A repeatable contract re-offers correctly once its board rotates back to it: repeat eligibility is tied to the board's period, not a per-contract cooldown, so a contract you already completed this period will not stick on "Completed" forever once the pool cycles past it. The Bounty Pack ships these boards ready-made:

BoardCadenceFocus
DailyTurns over at midnight UTCThe main token faucet - a weighted mix of easy, normal, and hard contracts, plus two training slots that anyone can take.
WeeklyTurns over every MondayTougher, higher-paying warrants, including marquee boss hunts that pay out bigger than a regular hard contract.
BihourlyTurns over every two hoursOne low-stakes contract at a time, paying skill XP rather than tokens, so the Daily and Weekly boards stay the token source.

Running a bigger world? Stand up several boards - the daily board in the town square, the weekly board at the guild hall. Each block opens the board it belongs to.

The header balance strip

A board lists the wallets worth showing while a player chooses, and each one renders in the header as an icon and an amount. The daily board lists both Bounty Tokens and Life Essence, because one of its contracts asks the player to spend essence and both balances have to be readable at that moment; the Bihourly board lists only the wallet its reroll is charged in, which keeps the header honest about what is spent there.

Rerolling one posting

A board sets what a reroll costs and how many are allowed per period. Rerolling swaps a single contract for a fresh one and leaves the rest of the board alone. The allowance comes back when the period turns over.

What a band is called

Bands are free content words: a pack invents its own ladder, and nothing in the schema enumerates them. What each band reads as is written once on the board, in its grades map, keyed by the band's own word - never on a slot, so a board that posts whatever it holds with no slots at all can still name its bands.

The library ships a word for the common bands (training, easy, normal, hard, elite) in all nine supported languages, so a board using those needs to author nothing. A band a pack invented reads as its own word until the board names it, which means an unnamed band is always a readable word on screen rather than a raw key.

Opening the Board

A board is never opened with a plain player command. Players reach it three ways:

  • The board block. The pack ships placeable poster blocks; pressing use on one opens the board it belongs to.
  • A Bounty Master / Trader NPC. An NPC with the board wired to its interaction opens the same board inline.
  • The Adventurer's Guide hub tile. The hub NPC at world spawn has a bounty preview tile that routes into the board.

Admins (or the console) can open the board for any player with /mmobountyui <player> [board], mirroring /mmoshopui. The player-facing /mmobounty list/accept/reroll subcommands do not exist; /mmobounty is console/admin-only diagnostics.

Gates

A board can require something of a player before they accept a contract, per band rather than per contract. The requirement is the same shared block every other piece of content on the server uses, so a band can be gated on anything a requirement can read: a combat level, a skill level, a finished quest, a permission, an earned achievement, or several of those combined. The pack's daily and weekly boards gate normal at combat level 25 and hard at 60; training and easy stay open to everyone.

The check happens at accept time only. A contract a player is not ready for is still posted and still shown, locked, so they can see what to work towards; filtering it out of the draw would make the board read as empty for exactly the players it is meant to give a goal to. A contract may carry its own requirements too, and both are answered together.

A locked contract shows a Locked status instead of the misleading "Available", and a Required section lists every unmet reason inline - the band's gate plus anything the contract itself asks for - in the same wording the NPC quest page uses.

A locked contract in the detail panel, showing the Locked status and the Required section listing every unmet requirement.
A locked contract in the detail panel, showing the Locked status and the Required section listing every unmet requirement.

The Board UI

Interacting with a board block opens a two-panel page with a Board / My Bounties tab split at the top.

Board tab

  • Ready to turn in - a rotation-independent section at the top of the list, showing every bounty you have finished but not yet claimed or turned in, so a completed contract is never lost when it rotates off the board.
  • List panel - below that, each of the rotation's contracts shows its task, a band pill, its reward icon, and a lock badge if you cannot accept it yet.
  • Detail panel - the selected contract's full task, flavor text, and reward breakdown, with live X/Y progress on each objective as you play.
  • Accept / Reroll - accept what you want; reroll a single contract for tokens, up to the board's allowance, swapping it for a fresh one while the rest of the board stays.
  • Turn In - delivery contracts surface a Turn In button bound to the contract's delivery objective, so you hand items in at the board.
  • Claim - every completed contract parks and requires the Claim button; the reward never grants automatically out in the field. If a contract grants an item and your inventory happens to be full when you claim, the reward stays parked with a clear message until you have space, so an item reward is never silently lost.

My Bounties tab

A flat list of every bounty you have accepted from this board, independent of the current rotation - so an accepted contract stays visible to you even after it rotates off the public board list. From here you can Abandon an accepted bounty at any time, whether or not it is still in rotation.

Accepted contracts also appear in your quest log under their real name with a simple Bounty and band tag, but only while active or ready to claim - a bounty you have not accepted never shows as a permanently "Available" entry there, and a contract never occupies a quest-log slot of its own.

The two-panel Bounty Board page: Ready to turn in section, an accepted contract's live X/Y progress, and the Board/My Bounties tab split.
The two-panel Bounty Board page: Ready to turn in section, an accepted contract's live X/Y progress, and the Board/My Bounties tab split.

Achievements and Daily Streaks

Completing contracts feeds achievement progress. The plugin jar ships board-agnostic bounty achievements that work with any board: a count ladder, a hard-difficulty chain, a server-first, and a daily streak that rewards completing bounties on consecutive days. The Bounty Pack adds per-board chains on top - a Daily Contractor ladder and a Weekly Warrant ladder - that key on the specific board id.

Each completion fires once and updates both your achievements and the bounties_completed statistic. See Achievements for how the chains, points, and pinning work.

Admin and Validation

The shared economy's own admin family is the full surface, and this mod's /mmobounty is an alias over the same audit.

CommandWhat it does
/zigcommerce boards [--board=<id>]List the boards, their cadence, their slots and whether each is enabled.
/zigcommerce resetrerollsGive a player their reroll allowance back for the period; their shelf goes back to the shared draw.
/zigcommerce validateAudit every wallet, storefront and board at once.
/mmobounty validateThe same audit, under this mod's spelling.
/mmobounty resetSays where the content comes from; boards reload with the asset stores, so there is nothing to reset by hand.

The audit reports an empty board pool, an unfillable required slot, a missing or disabled reroll wallet, an unknown rotation or draw type, two files landing on one id, and malformed reward or icon ids - so a content pack's boards are checked before players ever open them. It also runs once by itself when the first player joins, and its findings go to the server log.

There is deliberately no "rotate this board now". A posting is a pure function of the board's id, its cadence and the clock, which is exactly what makes every player see the same board; clearing a player's rerolls is the real admin move underneath that wish.

Taking a whole board down is { "Enabled": false } for its id in mods/ziggfreedcommon/boards.json, and the admin menu's Bounties switch turns the block interaction, the page and the commands off together.

Server owners author their own contracts and boards as plain pack files - one small file adds a contract, another adds a whole board with its own placeable block. No coding required. See Authoring Quests & Bounties.

Prefer a content pack: author one file per contract under Server/ZiggfreedCommon/Bounties/ inside a pack folder, zip it, and drop the .zip into your server Mods/ folder. Building the zip.