Creating Quests
Last updated Jul 6, 2026
Creating Quests
Quests live in plugins/SoapsQuest/quests.yml under the top-level quests: key. Each quest needs a unique ID, a display name, at least one objective, and at least one reward.
Minimal quest
quests:
my_first_quest:
display: "<#55FF55>My First Quest"
objectives:
- type: kill
target: ZOMBIE
amount: 5
reward:
xp: 50
Reload with /sq reload, then distribute:
/sq give <player> my_first_quest
Quest ID rules
- Use lowercase letters, numbers, and underscores.
- The ID is internal. Players see
displayinstead. - Generated quests use IDs like
generated_*(Premium).
Full field reference
| Field | Required | Description |
|---|---|---|
display |
Yes | Name on the quest paper. Supports MiniMessage and legacy & colors |
objectives |
Yes | List of objective blocks. See Objectives |
reward |
Yes | Reward block. See Rewards |
material |
No | Icon material for browser GUI and default paper icon |
tier |
No | Tier ID from tiers.yml (default from config.yml) |
difficulty |
No | Difficulty ID from difficulties.yml |
sequential |
No | true = objectives must finish in list order |
milestones |
No | Progress percentages for milestone messages, e.g. [25, 50, 75] |
lock-to-player |
No | true = paper binds to the first player who receives it |
lore |
No | Custom lore lines on the quest paper |
quest_paper |
No | Override paper material, name, and glow |
conditions |
No | Unlock requirements. See Conditions |
permission |
No | Root-level permission that gates progress (not browser lock) |
quest_paper block
quest_paper:
material: BOOK
name: "<#FFD700>Custom Paper Name"
glowing: false
Root permission vs conditions.permission
conditions.permissionblocks picking up the quest in the browser when the player lacks the node.- Root
permissionon the quest blocks progress even if the player already holds the paper.
Objectives section
Each objective is a list item with at least type and the fields that type requires:
objectives:
- type: break
target: OAK_LOG
amount: 20
- type: kill
target: ZOMBIE
amount: 10
Optional per objective:
| Field | Description |
|---|---|
milestones |
Override quest-level milestones for this objective only |
Special field names (not target):
| Type | Fields |
|---|---|
reachlevel |
level |
command |
command, amount |
placeholder |
placeholder, amount |
vehicle |
vehicle (or target), amount or distance |
chat |
text (or target), amount |
move |
amount or distance |
Type aliases: shoot_bow, launch_firework, ride_vehicle, level (same as gainlevel).
Reward section
At least one reward key is required:
reward:
xp: 100
money: 50
sigils: 25
items:
- material: DIAMOND
amount: 3
chance: 100
commands:
- "broadcast {player} finished a quest!"
quest:
quest-id: next_quest_id
chance: 100
See Rewards for every field.
Conditions section
Flat keys under conditions: (not a nested list):
conditions:
min-level: 10
max-level: 50
min-money: 100
cost: 500
min-sigils: 50
sigil-cost: 25
world: ["world", "world_nether"]
permission: "rank.vip"
completed-quests: ["starter_quest"]
item: "DIAMOND:5"
consume-item: true
gamemode: ["SURVIVAL"]
active-limit: 2
time: "DAY"
placeholder: "%player_level% >= 30"
See Conditions for behavior and consumable costs.
Validation on reload
/sq reload checks every quest for:
- Valid YAML syntax
- Presence of
displayandobjectives - Registered objective types and required fields
Invalid quests abort the reload and keep the previous config active.
Testing new quests
- Add the quest block to
quests.yml. /sq reload/sq give <player> <quest_id>- Complete objectives and right-click the paper to claim.
Use showcase_<type> quests in the default quests.yml as templates for each objective type.
In-game editor (Premium)
Premium servers can create and edit quests without hand-editing YAML:
/sq editor
/sq editor <quest_id>
Requires soapsquest.gui.editor. Changes save to quests.yml or generated.yml. Run /sq reload to refresh papers already in player inventories.
Version 1.0.3