Skip to content

Bounty Boards

Bounty boards display a rotating selection of tasks from a pre-defined pool. Think of them as a bulletin board in a town square — every day (or hour, or week), the available quests change. Players pick from whatever’s currently posted.

They’re accessed via commands, so you can hook them up to NPCs, signs, GUI buttons, or anything else your server supports.


File: config/journey/bounty_boards/town_board.json

{
"id": "town_board",
"name": "<gold>Town Bulletin Board",
"description": [
"<gray>Daily tasks from the townspeople",
"<gray>Refreshes every 24 hours"
],
"displayedTasks": 3,
"rotationInterval": 1728000,
"taskPool": [
"journey:catch_any_pokemon",
"journey:harvest_berries",
"journey:win_wild_battles",
"journey:level_up_pokemon",
"journey:heal_pokemon",
"journey:explore_zones"
]
}

This board has 6 tasks in its pool but only shows 3 at a time. Every 24 hours, it randomly selects 3 new tasks from the pool.


FieldTypeDescription
idStringUnique identifier for the board
nameStringDisplay name (supports MiniMessage)
descriptionString[]Description lines for the board GUI
displayedTasksNumberHow many tasks to show at once
rotationIntervalNumberTicks between rotations (20 ticks = 1 second)
lastRotationNumberLast rotation timestamp (auto-managed, don’t edit)
taskPoolString[]List of task IDs to randomly select from
IntervalTicks
1 hour72000
6 hours432000
12 hours864000
24 hours (daily)1728000
7 days (weekly)12096000

The task pool is a list of task IDs. These tasks must exist in your config/journey/tasks/ directory. When rotation happens, Journey randomly selects displayedTasks tasks from the pool.

Design tip: Make the pool 2-3x larger than displayedTasks for good variety. A board showing 3 tasks should have at least 6-9 in the pool.


  1. Board is created — initial tasks selected randomly from pool
  2. Time passes until rotationInterval ticks have elapsed
  3. New random selection is made from the pool
  4. lastRotation timestamp is updated
  5. Players with active bounty tasks can still complete them even after rotation

Boards are opened via commands. You choose how players trigger the command:

/journey bountyboard town_board
q.player.execute_command('/journey bountyboard town_board');

You can have a task reward open a bounty board:

{
"type": "script",
"data": {
"scripts": [
"q.player.execute_command('/journey bountyboard town_board');"
]
}
}

High-difficulty tasks with weekly rotation:

{
"id": "weekly_challenges",
"name": "<light_purple>Weekly Challenges",
"description": [
"<gray>Difficult challenges with great rewards",
"<gray>Refreshes every 7 days"
],
"displayedTasks": 2,
"rotationInterval": 12096000,
"taskPool": [
"journey:legendary_hunt",
"journey:master_battles",
"journey:shiny_collection",
"journey:raid_completion"
]
}

Fast-rotating easy tasks:

{
"id": "quick_tasks",
"name": "<green>Quick Tasks",
"description": [
"<gray>Simple tasks that refresh every 6 hours"
],
"displayedTasks": 5,
"rotationInterval": 432000,
"taskPool": [
"journey:catch_5_pokemon",
"journey:win_3_battles",
"journey:harvest_10_berries",
"journey:heal_pokemon",
"journey:talk_to_npc",
"journey:visit_zone",
"journey:break_100_blocks",
"journey:place_100_blocks"
]
}

Bounty board configs go in config/journey/bounty_boards/:

config/journey/bounty_boards/
├── town_board.json
├── weekly_challenges.json
└── quick_tasks.json

CommandPermissionDescription
/journey bountyboard <board_id>journey.command.bountyboardOpen a bounty board
/journey bountyboard listjourney.command.bountyboard.listList all boards
/journey bountyboard rotate <board_id>journey.command.adminForce a rotation
/journey createcontractjourney.command.createcontractOpen custom bounty creator

  • Variety matters: Include different task types (combat, exploration, collection) in each pool
  • Match difficulty to rotation speed: Fast-rotating boards should have easy tasks
  • Test task availability: Make sure all tasks in the pool exist and work correctly
  • Consider your audience: Casual players prefer shorter, simpler bounties