Creating Quests

Last updated Oct 28, 2026

Creating Quests

Quests live in plugins/SoapsQuest/quests.yml under the top-level quests: map. Each key is a unique quest ID.

After editing, run /sq reload. Premium users can also use /sq editor [questid].


Minimal quest

quests:
  lumberjack:
    display: "<#55FF55>Lumberjack"
    tier: common
    difficulty: easy
    objectives:
      - type: break
        target: OAK_LOG
        amount: 32
    reward:
      xp: 50
      money: 25

Every quest needs at least one objective and at least one reward.


Common fields

Field Description
display Name shown on the paper (MiniMessage or & codes)
material Paper item material (default PAPER)
tier Tier ID from tiers.yml
difficulty Difficulty ID from difficulties.yml
sequential true = objectives must finish in order
milestones Progress percentages for milestone messages, e.g. [25, 50, 75]
lock-to-player true = paper binds to the first player who progresses
temporary true = temporary definition (generator/contracts cleanup)
lore Custom lore lines (optional; default lore shows live progress)
permission Root field: gates progress after pickup (not browser lock)
objectives List of objective entries
reward Reward block (see Rewards)
conditions Start requirements (see Conditions)
timer Optional deadline (see Rewards)
fail-reward Payout when timed quest expires or finishes in overtime

Objectives

Each objective entry uses:

- type: kill
  target: ZOMBIE
  amount: 10
  • type: Objective type (see Objectives)
  • target: Entity, block, item, NPC id, region name, etc. depending on type
  • amount: Required count (or distance, minutes, level, etc. per type)

Some types use extra keys instead of (or in addition to) target:

Type Extra fields
command command: (or target:)
placeholder placeholder: (or target:)
reachlevel level:
chat text: (or target:)
vehicle vehicle: (or target:)
equip slot: (ANY, HAND, CHEST, …; default ANY)
enter_world world: (or target:; e.g. NETHER, world name)
advancement advancement: (or target:)
wg_* region: (or target:); wg_time_in_region also accepts seconds:
lands_* land: (or target:); level types also accept level:
citizens_* npc: (or target:); citizens_deliver_npc needs item: MATERIAL:amount
mcmmo_* skill: / ability: (or target:); level types accept level:
denizen_run script: (or target:)

kill targets may be a specific EntityType, or filters ANY, HOSTILE, PASSIVE.

Multi-target lists use YAML lists on target for break, place, and collect.

Per-objective milestones: integer lists are supported on registered types (in addition to quest-level milestones).


Conditions

Flat keys under conditions: gate pickup in the browser or at /sq give:

conditions:
  min-level: 10
  sigil-cost: 5
  permission: "rank.vip"

For prior-quest gates use the typed form (type: require-quest-completed with a quests: list). See Conditions.


Temporary quests

temporary: true

Marks the quest as temporary (used by Premium generation / contracts so definitions can be cleaned up after claim). Manual quests may set this; default is false.


Timed quests

timer:
  minutes: 15
  start-on: activate    # receive | activate
  on-expire: overtime   # fail | consolation | overtime
fail-reward:
  xp: 25

Global timer HUD options are in config.yml under quest-timer-display. See Default Config Files.


Fixed quest givers can be stored in quests.yml:

citizens-npcs:
  "42":
    quest: lumberjack
    message: "<green>Take this job."

Or linked in-game: /sq npc link <npc> <quest-id> [message]

For random contracts use /sq npc broker instead (Premium). See Contract NPC Setup.


Showcase quests

Default quests.yml includes showcase_<type> entries for every objective type. They use permission: soapsquest.admin so only staff can pick them up in the browser.

/sq give <player> showcase_break

Version 1.0.5

Still stuck? Ask about this page