Skip to content

Bounty Boards

Bounty Boards are command-accessed systems that display rotating pools of server-configured tasks. Servers can hook board access to any function they desire (NPCs, GUI buttons, signs, physical entities, etc).


Bounty Boards provide:

  • Rotating Task Pools - Tasks refresh at configured intervals
  • Command-Based Access - Accessed via commands, servers choose implementation
  • Limited Selection - Display a subset of available tasks at once
  • Flexible Integration - Hook up to NPCs, signs, GUIs, or any custom trigger

Server-Configured

Admins pre-define task pools for each board

Scheduled Rotation

Tasks refresh at configured intervals (in ticks)

Simple Task Pools

Just list task IDs to populate the board

Flexible Access

Servers choose how players access boards


Access: NPC in town square
Rotation: Daily (1728000 ticks)
Tasks: Simple beginner quests
Access: Guild hall sign/NPC
Rotation: Weekly (12096000 ticks)
Tasks: Challenging group content
Access: Event NPC/GUI
Rotation: 6 hours (432000 ticks)
Tasks: Time-limited event quests

Bounty boards are configured in config/journey/bounty_boards/.

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,
"lastRotation": 1761311119724,
"taskPool": [
"journey:catch_any_pokemon",
"journey:harvest_oran_berries",
"journey:win_wild_battles",
"journey:level_up_pokemon",
"journey:heal_pokemon"
]
}

Configuration Fields:

FieldTypeDescription
idStringUnique identifier for the board
nameStringDisplay name (supports MiniMessage)
descriptionString[]Board description lines
displayedTasksIntegerHow many tasks to show at once
rotationIntervalLongTicks between rotations (20 ticks = 1 sec)
lastRotationLongLast rotation timestamp (auto-generated)
taskPoolString[]List of task IDs

Task pools are simple arrays of task IDs:

{
"taskPool": [
"journey:catch_pokemon",
"journey:win_battles",
"journey:harvest_berries",
"journey:level_up_pokemon",
"journey:heal_pokemon",
"journey:break_stone"
]
}

Tasks are selected randomly from the pool when rotation occurs.


Common interval values (in ticks, 20 ticks = 1 second):

// 1 hour
"rotationInterval": 72000
// 6 hours
"rotationInterval": 432000
// 12 hours
"rotationInterval": 864000
// 24 hours (daily)
"rotationInterval": 1728000
// 7 days (weekly)
"rotationInterval": 12096000
  1. Board Created - Initial tasks selected randomly from pool
  2. Interval Passes - Time reaches rotation interval
  3. Tasks Refresh - New tasks selected from pool
  4. lastRotation Updated - Timestamp recorded automatically
  5. Old Tasks Persist - Players with active tasks can still complete them

Bounty boards are accessed via commands. Servers can hook these commands to any trigger:

Terminal window
# Open a specific board
/journey bountyboard open <board_id>
# List available boards
/journey bountyboard list

NPC Integration (using Cobblemon NPCs):

{
"right_click_script": [
"q.player.execute_command('/journey bountyboard open town_board');"
]
}

Sign Integration:

  • Place sign with text: “Click to view bounties”
  • Use clickable sign mod/plugin to trigger /journey bountyboard open town_board

GUI Button Integration:

  • Add button to custom GUI
  • Button action: command: "/journey bountyboard open town_board"

Custom Trigger:

  • Servers can create any custom trigger they want
  • Trigger executes the bounty board open command

Simple board with daily rotation:

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

6 tasks in pool, 3 displayed at once, rotates daily.


High-difficulty weekly board:

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

Fast-rotating easy tasks:

{
"id": "quick_tasks_board",
"name": "<green>Quick Tasks",
"description": [
"<gray>Simple tasks that refresh every 6 hours",
"<gray>Perfect for quick rewards!"
],
"displayedTasks": 5,
"rotationInterval": 432000,
"lastRotation": 1761311119724,
"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",
"journey:fish_10_items",
"journey:trade_with_villager"
]
}

10 tasks in pool, 5 displayed, rotates every 6 hours.


Open a specific bounty board GUI.

Permission: journey.bountyboard.open

Examples:

Terminal window
/journey bountyboard open town_board
/journey bountyboard open guild_board

List all configured bounty boards.

Permission: journey.bountyboard.list

Output:

===== Bounty Boards =====
town_board - Town Bulletin Board
guild_board - Guild Bounty Board
weekly_board - Weekly Challenges

Manually trigger board rotation.

Permission: journey.bountyboard.rotate

Example:

Terminal window
/journey bountyboard rotate town_board

Behavior:

  • Immediately rotates tasks
  • Updates lastRotation timestamp
  • Selects new random tasks from pool

View detailed board information.

Permission: journey.bountyboard.info

Example:

Terminal window
/journey bountyboard info town_board

Output:

===== Board: Town Bulletin Board =====
ID: town_board
Displayed Tasks: 3
Pool Size: 6 tasks
Rotation Interval: 24 hours (1728000 ticks)
Last Rotation: 3 hours ago
Next Rotation: 21 hours
Current Tasks:
- journey:catch_any_pokemon
- journey:harvest_oran_berries
- journey:win_wild_battles

Reload all bounty board configurations.

Permission: journey.bountyboard.reload

Example:

Terminal window
/journey bountyboard reload

Behavior:

  • Reloads all board configs from disk
  • Updates existing boards with new settings
  • Does NOT reset rotation timers
  • Does NOT change currently displayed tasks

Variety - Include different task types (combat, exploration, collection)

Balance Pool Size - Pool should be 2-3x larger than displayed tasks

Test Rotations - Verify task selection feels fair

Task Difficulty - Match pool difficulty to board purpose

Match Player Activity - Daily boards for daily players

Reasonable Intervals - Not too fast (overwhelming) or slow (boring)

Consider Task Length - Longer tasks need longer rotation intervals

Clear Triggers - Make it obvious how to access boards

Thematic NPCs - Use appropriate NPCs for board theme

Multiple Access Points - Provide several ways to access important boards


Check:

  1. Board config file exists and is valid JSON
  2. Board ID matches exactly (case-sensitive)
  3. Player has required permissions
  4. Command syntax is correct

Check:

  1. Rotation interval configured correctly (in ticks)
  2. Server has been running long enough for rotation
  3. Use /bountyboard rotate to manually trigger
  4. Check server logs for rotation errors

Check:

  1. Task IDs in pool are correct and exist
  2. Tasks files exist in config/journey/tasks/
  3. Board config was reloaded after changes

Bounty boards display Journey tasks:

  • Tasks must exist in config/journey/tasks/
  • Tasks can be exclusive to bounty boards
  • Tasks can have repeatable settings

Bounty boards are individual, global tasks are collaborative:

  • Boards - Personal task completion
  • Global Tasks - Server-wide cooperation

Customize the bounty board GUI:

  • Configure board GUI in config/journey/guis/
  • Customize task display format
  • Add custom widgets and buttons