Configuration
ShadowQuests
Daily missions, eighty objective types, an editor you drive in game.
Where the files are
plugins/ShadowQuests/ The plugin creates them on first start and updates them by itself on new versions, keeping your changes.
Applying changes
/sqa reload Reloads the files without restarting the server.
No setting found
Try another word, or search every plugin.
Settings
The files that decide how the plugin behaves. Start here.
config.yml
General settings 63 settings
config.ymlplugins/ShadowQuests/config.yml File notes
On update your files (this one, quests/, lang/, menus/ and the others below) are moved to the new version automatically: every value you changed or added stays, new options arrive with their comments, and what you deleted stays deleted. The old copies are in backup/<date>/; if something needs your attention you will find PORTING-<version>.txt in the plugin folder.
A wrong value never stops anything: it is replaced by the factory one and reported in the console at startup, with the path and what was expected.
LANGUAGE. Everything you configure is written in English - keys, sections, values, and these notes - because this file is read by server owners all over the world. What a PLAYER reads is a different matter and stays translatable: see lang/ below, which ships in English and in Italian, and messages.default-locale a few sections down.
Where things live:
config.yml this file: storage, rules, messages, integrations
quests/*.yml the quests, one file per group
rewards.yml reusable reward bundles
npcs.yml which NPC hands out which quest
lang/*.yml the messages players read
menus/*.yml the layout of the windows
license.yml the licence (created on first start, kept apart on
purpose: a "send me your config" must never arrive
with somebody's licence inside it)config-version1Storage
storage8 keysstorage.mysql7 keysenabledfalsefalse = local H2 database inside plugins/ShadowQuests/data/. Nothing to install: the plugin works the moment it is copied in. Put your credentials here and restart: the tables are created for you and nothing in the local file is touched.
MySQL is a Premium feature. On the free version this line is ignored (and said so in the console) and the local file stays where it is: the day a licence arrives, it switches over on its own.
host127.0.0.1port3306databaseshadowquestsusernamerootpassword""parameters"useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8"storagetable-prefix"sq_"Table prefix. Change it and the plugin creates a fresh set and starts over: useful for two servers on one database that must stay separate.
fallback-to-localtrueMySQL configured but unreachable: with true the plugin says so in the console and starts on the local file, so the server comes up anyway. With false it refuses to start, which only makes sense if you would rather have a server down than a server writing somewhere unexpected.
flush-interval"30s"How often the progress kept in memory is written down.
This is NOT "how often we save": a player leaving is always written, and so is a shutdown. This is how often what piled up while people play gets flushed. Lower = more writes; higher = more progress to replay after a server crash.
storage.pool5 keysmaximum-pool-size10minimum-idle2connection-timeout-ms10000idle-timeout-ms600000max-lifetime-ms1800000storage.h21 keyauto-serverfalseLets another process (a web panel, say) open the same H2 file while the server runs. Rarely needed.
storage.history2 keysenabledtrueThe log of who got what, and why.
You need it the day somebody says they never received a reward - and that day comes. A reward that is a command leaves no other trace: the console runs it and from there on there is nothing left to tell whether it happened.
keep-days90Several servers on one database
Only needed if you run a network (lobby + survival + ...) sharing one MySQL. The servers pass news to each other through the database: no ports to open, no plugin on the proxy.
Keep reading
What travels is a NOTICE, never a value: a message says "the quests changed", not "the quests are now these". Whoever receives it goes and reads the truth from the database.
A player's progress does not need to travel: one person is on one server at a time. The only case where two servers really touch the same row - a reward given from the console while the player is elsewhere - is covered by the atomic increment, which needs no message at all.
This is a Premium feature.
storage.sync5 keysmodeAUTOAUTO = on when you use MySQL, off on the local database. ON | OFF to decide for yourself.
primarytrueIMPORTANT: across a network, ONE server only must have primary: true. That is the one that cleans up the message log.
server-idautoA name for this server. "auto" uses hostname + port. No two servers may ever share one.
poll-interval"3s"keep-messages"1h"Cycles
When daily, weekly, monthly and yearly quests reset.
Keep reading
A reset is NOT a timer: it is a comparison between the name of the current cycle and the one stored next to the progress. Which means a server that was off at midnight comes back up correct - the first player in next morning finds the new quests - and there is no appointment that can be missed.
Automatic cycles are a Premium feature. On the free version the quests are there and work, they simply do not renew on their own.
cycles3 keystimezone"system"The timezone that decides what day it is. "system" uses the machine's own. Write it out if your server sits in a datacentre in another country: this is the single most common mistake, and it shows up as dailies resetting at a strange hour.
reset-at"04:00"What time the day turns over. 04:00 rather than midnight is what almost every real server settles on: someone playing at one in the morning is still playing yesterday evening, and watching their quests vanish mid-session is the thing that produces the most tickets.
week-starts-onMONDAYWhere the week starts, for the weeklies.
Worlds
Where quests count. Leave both lists empty and they count everywhere.
"only" wins when it is set: saying where quests apply is shorter and clearer than saying where they do not, for anyone running a lobby, a survival and eight minigame worlds.
worlds2 keysonly[ ]except[lobby]Quests
quests3 keysauto-claimfalseWith true the reward arrives on its own as soon as the quest is finished, with nobody having to go and collect it.
The default is false, and that is not laziness: collecting a reward is the moment someone opens the menu, sees the other quests and starts another one. A reward that lands while they are busy mining goes unnoticed.
Any quest can decide for itself with "auto-claim: true".
quests.deliver1 keyQuests that ask the player to HAND IN items (objective type "item_deliver") take real things out of a real inventory. This decides what happens to them when such a quest closes without ever paying out: given up, run out of time, or wiped by a cycle turning over.
Keep reading
true - they go back. The plugin remembers each hand-in exactly as it
was, so a custom item returns identical, name and enchants
included. This is the setting that does not produce tickets:
a daily resetting at 04:00 cannot burn an evening of
gathering.
false - handed in is handed in, the way most quest plugins behave.Either way, a quest that DID pay out keeps the items: the reward was the trade.
refund-on-canceltruequestskeep-history-days30After how many days finished and claimed quests disappear from the database. Zero = nothing is ever deleted.
Unclaimed quests are never touched by this cleanup, whatever the number: a reward earned and not collected stays where it is.
Anti abuse
Not an anticheat. Three common-sense rules that rule out the most obvious ways of advancing a quest without playing it.
anti-abuse6 keysignore-afktrueSomeone whose client has been idle for a while advances nothing. Standing still inside a mob farm is still playing; having switched windows an hour ago is not.
afk-after"5m"max-events-per-second60How many events per second can count, per player. This exists so a machine breaking four thousand blocks a second does not become four thousand advancements and four thousand database rows. What goes over is dropped for quest purposes and changes nothing in the game. Zero = no limit.
ignore-spawner-mobstrueMobs born from a spawner do not count towards kill objectives. It is the only real defence against industrial farms: without it, "kill 200 zombies" is a lever to pull for twenty minutes. Any objective can decide for itself with "no-spawner-mobs".
ignore-placed-blockstrueA block you placed and then broke does not count. Without this, "mine 500 ores" is solved by placing and breaking the same block.
placed-blocks-memory20000How many placed-block positions are remembered. The case to cover is short - place it and break it within the same minute - so a huge number is not needed: past the cap, the oldest ones drop out.
Messages
This is the one place where language is a setting rather than a rule. Everything a player reads comes from lang/, which ships in English and in Italian; add lang/<tag>.yml for any other language and name it here.
messages11 keysdefault-locale"en_US"The language used when a player's own is not in lang/, and by the console. Set "it_IT" here for an Italian server.
follow-client-localetrueWith true every player sees the messages in their own client's language, when a file exists for it.
announce-progresstrueProgress is written to the bar above the hotbar, not to the chat. A thousand-block quest produces a thousand advancements: printing them all would flood the chat, printing none would make the quest feel like it counts for nothing.
progress-cooldown"2s"announce-resettrueannounce-rewardstrueannounce-on-jointruecomplete-titletruecomplete-sound"entity.player.levelup 0.7 1.2"messages.bar3 keyslength20full"|"empty"|"messagesfree-credit-linetrueThe free version's credit line: one line, once per session, after a reward has been collected. With a Premium licence it never appears.
In-game editor
editor3 keysenabledtrueWith false the editor command answers that it is switched off. Quests keep working: they are written by hand in the files, as always.
file"editor"The group (and therefore the file) that quests created by the editor end up in when no other one is chosen.
answer-timeout"2m"How long there is to answer a question asked in chat before the editor gives up and reopens the window as it was.
Integrations
All optional. Each one sits behind a presence check, and when a piece switches off because a plugin is missing it is written to the console once, naming what is missing.
integrations3 keysintegrations.suite1 keyenabledtrueAnnounce ourselves to ShadowEssentials, so the suite panel lists us with the right version.
integrations.crates1 keygive-command""The command your crate plugin uses to hand over a key. Leave it empty: ShadowCrazyChest, CrazyCrates, ExcellentCrates and SpecializedCrates are recognised on their own.
Placeholders: <player> <crate> <amount>
integrations.permissions1 keygrant-command""The command your permissions manager uses to grant one. Leave it empty: ShadowPermissions and LuckPerms are recognised on their own, temporary grants included.
Placeholders: <player> <node> <duration>
Licence
The key does NOT go here. Its place is license.yml, which the plugin creates for you on first start: that way a support request saying "send me your config" does not arrive with your licence inside it.
Keep reading
The simplest way to activate is:
/quest license claim <code>
The server asks the activation service for the licence itself and writes it down. One second, nobody involved.
license3 keysTHE KEY LIVES IN license.yml (same folder as this file), or in the central plugins/ShadowControl/licenses.yml for the whole suite. The 'key' below is only a fallback for deploy systems that generate config.yml: leave it empty.
The key does NOT live here: it lives in license.yml, in this folder, written at first start (or in plugins/ShadowControl/licenses.yml for the whole suite). Last resort: if you really want to keep it here, it works. It is read after license.yml and before ShadowControl's list.
activation-url'https://shadow-licences.riccardobotins.workers.dev'The BASE address of the activation service: /claim and /check are appended by the plugin. Empty = activation by hand only.
grace-days7How many days of grace before falling back to free when a subscription has just expired or the addresses do not match. That second case is far more often a NAT or a proxy than a thief.
resolve-public-iptrueAsk the licence service (activation-url + /ip) what this server looks like from outside: it answers with the address it sees, and nothing about the server is sent. It is the only reliable way to know a public address from behind a NAT, and the reason a licence sold for "play.example.net" works on a machine whose local addresses are all 10.x. Only when a licence is installed: a server without a key asks nobody. false = never ask.
Anonymous statistics (bStats)
These serve one purpose: knowing how many servers run this plugin and on which version, so we can tell when it is safe to stop carrying compatibility code for an old one.
Keep reading
What is sent, every 30 minutes: a random server id (serverUuid, not derived from anything), the plugin version, the Minecraft/Paper and Java versions, the operating system and core count, the online mode, how many players are online (a number only), the edition (free/premium/creator) and the storage in use (local H2 or MySQL). NOTHING about players: no names, no UUIDs, no addresses, no progress.
false switches off this plugin only. enabled: false in plugins/bStats/config.yml switches off every bStats plugin on the server at once.
metrics2 keysenabledtrueplugin-id0The id bstats.org assigned to this plugin. 0 = use the id built into the jar; a number above 0 written here takes its place. While both are 0 nothing is sent and no connection is opened.
Diagnostics
debug1 keylog-sqlfalseWrites every SQL statement to the console. Useful to whoever is hunting a fault, and to nobody else: on a busy server it fills the log fast.
npcs.yml
The NPCs 5 settings
npcs.ymlplugins/ShadowQuests/npcs.yml File notes
Which NPC hands out which quest.
The NPCs themselves come from ShadowEssentials: this file only says, for each of them, what they have to offer. Without ShadowEssentials the file does nothing and raises no error.
There are two ways to tie a quest to an NPC, and both are fine:
1. inside the quest, with "npc: blacksmith" - the right place for anyone writing YAML by hand, because it keeps the binding next to the rest of the quest; 2. here - the place the in-game editor writes to, and the only way to have one NPC offer more than one quest.
The two sources add up.
ORDER MATTERS: the NPC offers the first quest in the list that the player can still take. That is how one character tells a story a chapter at a time instead of dumping six offers at once.
It can also be done from a command:
/sqa npc bind <npc> <quest> /sqa npc unbind <npc> <quest> /sqa npc list
What is already wired here
One character per chain, each holding their whole story in order:
Keep reading
miner quests/miner-chain.yml 4 chapters builder quests/builder-chain.yml 5 chapters warrior quests/warrior-chain.yml 6 chapters fisher quests/sea-chain.yml 5 chapters
The bindings are real and work the moment those four NPCs exist. They do not yet, because an NPC is a position in your world and no file can guess it. Four commands, once:
/npc create miner Il Minatore /npc create builder Il Costruttore /npc create warrior Il Guerriero /npc create fisher Il Pescatore
The id is the first argument and stays English like every other id in this plugin; the second argument is the name over their head, and that is the part a player reads. Then "/npc skin <id> <player>" for a face. An id written here that has no NPC yet costs nothing: nobody can click on what is not there.
TURNING THEM INTO REAL QUESTGIVERS. Out of the box a chapter starts by itself, so an NPC you click on says "you already have it" - it is a signpost, and it still counts for "talk_npc" objectives. Write "auto-start: false" on the FIRST chapter of a chain and that chapter stops being handed out on its own: from then on the only way in is to walk up to the character and say yes. It is one line per chain, and it is the difference between a quest list and a world with people in it.
config-version1npcs4 keysminer[miner_1, miner_2, miner_3, miner_4]"The miner's way" - quests/miner-chain.yml
builder[builder_1, builder_2, builder_3, builder_4, builder_5]+2
"The builder's hand" - quests/builder-chain.yml
warrior[warrior_1, warrior_2, warrior_3, warrior_4, warrior_5, warrior_6]+3
"The warrior's path" - quests/warrior-chain.yml
fisher[sea_1, sea_2, sea_3, sea_4, sea_5]"The call of the sea" - quests/sea-chain.yml
rewards.yml
Rewards 13 settings
rewards.ymlplugins/ShadowQuests/rewards.yml File notes
Reusable reward bundles.
A bundle is defined here once and called from any quest with "bundle: <name>". Changing it here changes every quest that uses it, without touching a single quest file: that is the difference between retuning a server's rewards in a minute and reopening thirty files.
Inside a bundle you write exactly what you would write inside a quest, so there is no second syntax to learn.
THE LADDER, AND WHY THE NUMBERS ARE THESE
They are priced against ShadowEconomy's shop.yml, where a diamond sells for 10 and costs 1000, an iron ingot sells for 4 and a log for 2. A quest that pays a thousand times what it asks for breaks the economy on the first day, so the whole ladder is written down here in one place and every quest picks a rung instead of inventing a number:
starter-reward 400 the first chapter of a chain small-reward 500 an ordinary daily medium-reward 5.000 a weekly weekly-reward 7.500 a hard weekly, with a crate key big-reward 25.000 the end of a chain, or a monthly monthly-reward 35.000 a monthly that took the whole month legend-reward 60.000 the last chapter of a long chain
Sixty thousand is four netherite ingots at shop price. That is the ceiling on purpose: a reward that buys more than a player could ever mine turns the shop into scenery.
THE CRATE KEYS are the ones ShadowCrazyChest ships with - basic, vote, daily, magic, epic. On a server without a crate plugin the key is not delivered and the console says so once: every bundle that carries one also carries money, so nobody is left with nothing.
Names, keys and values are English, and so is what a player sees - "display": change it, it is yours. An Italian version of this file is in esempi/it_IT/rewards.yml. It is not loaded: copy it over this one to use it.
config-version1bundles12 keysThe ladder
bundlesstarter-reward["money: 400", "xp: 25"]The first step of a chain: enough to feel paid, not enough to skip the chapter that comes after it.
small-reward["money: 500", "xp: 50"]The reward of an ordinary daily.
medium-reward["money: 5000", "xp: 200", "item: DIAMOND 3"]The reward of a weekly.
weekly-reward["money: 7500", "xp: 300", "crate: daily 1"]A weekly that asked for a whole week.
big-reward["money: 25000", "item: NETHERITE_INGOT 1", "broadcast: <gold><player> finished a legendary quest!", "firework: yes"]+2
End of a chain, or a monthly.
monthly-reward["money: 35000", "xp: 1200", "item: DIAMOND_BLOCK 2", "crate: magic 1", "firework: yes"]+3
A monthly that took the month.
legend-reward["money: 60000", "xp: 2000", "item: NETHERITE_INGOT 2", "crate: epic 1", "title: <gold><bold>Feat accomplished|<gray>The road ends here", "broadcast: <gradient:#FFD54F:#FF8F00><player> completed a legendary chain!</grad …+5
The last chapter of a long chain. The only rung above big-reward, and the only one that puts a title on the screen: it is the last thing some players will see from this plugin, and it should look like it.
The trade chests
A CHOICE opens a small window and lets the player take one thing. It is worth more than its contents: a player who picks feels paid twice. If they close it without choosing, the choice comes back on their next login - the reward is theirs and nobody takes it away.
bundlesbuilder-crate[{ type: CHOICE, display: "<green>The builder'…]For the builder: material, not tools. Whoever is building wants quantity.
hunter-crate[{ type: CHOICE, display: "<red>The hunter's t…]For the fighter: what wears out in a fight.
sea-crate[{ type: CHOICE, display: "<aqua>The fisherman…]For whoever lives on the water.
mystery-box[{ type: RANDOM, display: "<light_purple>Myste…]A reward drawn at random. The long form is only needed when you want the options: it lives in the file, because an editor nested inside an editor would be harder to use than writing it.
your-choice[{ type: CHOICE, display: "<gold>Pick your rew…]A reward the player picks: a small window opens and they take what they want. If they close it without choosing, the choice comes back on their next login - the reward is theirs and nobody takes it away.
Languages
The texts the plugin shows to players, one file per language.
lang/
Texts and messages 2 files
lang/plugins/ShadowQuests/lang/ File notes
MiniMessage format. Placeholders are written <like_this>.
THREE PLACEHOLDERS ARE ALWAYS AVAILABLE, EVERYWHERE:
<prefix> the prefix below
<label> the label the player command was ACTUALLY registered
under on this server
<adminlabel> the same thing for the staff commandCommands are never written by hand in a message. A short alias such as /sq may already belong to another plugin, and whoever asks second does not get it: an in-chat help that names a command which does not answer here sends people to type something that does not work, and it looks like the plugin's fault. With <label> that cannot happen.
On update this file is moved to the new version automatically: the lines you rewrote stay as you wrote them, the new keys are added, and the old copy is kept in backup/<date>/. If something needs your attention you will find PORTING-<version>.txt in the plugin folder.
Every message the plugin shows to players, one file per language. The keys are not listed one by one: here are the files, how many texts they hold and the placeholders they use.
| File | Language | Texts |
|---|---|---|
lang/en_US.yml reference | English | 642 |
lang/it_IT.yml | Italiano | 642 |
Most used placeholders
The plugin replaces them with the right value: leave them written as they are.
<prefix><value><quest><id><amount><label><type><count><adminlabel><player><group><npc><what><bar>
Message groups
prefix1common19command10input4condition22objective144quest60chain5reward62npc4branding1license41admin70editor172menu27
Other
Ready-made content, examples, imports: the files you copy and edit as a model.
quests/
Quests, one group per file 9 files
quests/plugins/ShadowQuests/quests/ 9 files with the same structure. Below, 4 of them in full, one for each different shape; the others are listed by name.
builder-chain.ymldaily.ymlexamples.ymlminer-chain.ymlmonthly.ymlsea-chain.ymlsuite.ymlwarrior-chain.ymlweekly.yml
Example quests/examples.yml
File notes
Two quests written to be read, not to be played.
The first shows WHAT CAN GO INSIDE an objective: filters on world, biome and height, requirements, custom text, a time limit, how many times it can be repeated.
The second is what this plugin is about, in six lines: it crosses three plugins of the suite. No competitor can write it, because writing it means owning those three plugins. It ships switched off behind a requirement nobody has until you turn it on.
Keys and values are English, and so are "display" and "description", what the player reads: change them, they are yours. An Italian version of this file is in esempi/it_IT/quests/examples.yml. It is not loaded: copy it over this one to use it.
config-version1group7 keysidexamplesdisplay"<gray>Examples"description["<gray>To be read and copied."]iconWRITABLE_BOOKorder99periodNEVERsizeallquests2 keysquests.example_full10 keysdisplay"<white>Example: everything that can be written"description["<gray>Open the file to see how it is made."]quests.example_full.icon3 keysmaterialENCHANTED_BOOKname"<white>Example"glowtruequests.example_fulldifficultyHARDtime-limit"2h"How long to finish it, counted from when it is handed out. Once it runs out the quest starts over instead of sitting half done forever.
max-completions3How many times it can be done in total. 0 = once per cycle.
objectives[{ type: ore_mine, target: […], amount: 10, world: […], min-y: -64, max-y: 16, description: "<gray>Mine diamonds deep down" }, { type: mob_kill, target: […], amount: 25, biome: […], hostile-only: true }]+1
descriptionThe line the player reads. Without it, one is built from the type and the target.
modeallBoth objectives are needed. "any" would make one enough.
conditions["permission: shadowquests.use", "level: >= 5", "not-world: lobby"]+1
Who can see it and take it. One language, learned once: the same one ShadowCommand uses when a line starts with "scmd:".
rewards["money: 10000", "item: DIAMOND_BLOCK 2", "command: give <player> golden_apple 3", "broadcast: <gold><player> finished the full example!", "bundle: mystery-box"]+3
quests.example_suite7 keysdisplay"<white>Example: the quest that crosses three plugins"description["<gray>Win, earn, open a crate.", "<dark_gray>Remove 'conditions' to switch it on."]+1
icon-materialNETHER_STARdifficultyEPICobjectives[{ type: game_win, amount: 3 }, { type: money_earn, amount: 500 }, { type: crate_open, target: […], amount: 1 }]+2
typeShadowGames
typeShadowEconomy
typeShadowCrazyChest
conditions["permission: shadowquests.example.suite"]Off on purpose: it is an example, and on a server without those three plugins it could never be completed. Remove this line to switch it on.
rewards["bundle: your-choice", "pass-xp: 500"]A hand-in quest, ready to uncomment
It ships switched off so a free server still loads every quest in the box: the free version caps at ten, and ten is exactly what these three files hold. Remove the "#" from the block below and it becomes the eleventh.
Keep reading
The objective type is "item_deliver". It listens to nothing: it moves when the player presses the Hand in button inside the quest, and the plugin takes what matches out of the inventory, up to what is still missing. Handing in 200 of 5000 is normal - the counter keeps them and waits for the next trip.
Every item filter works here, so a custom item is named the same way it is named in a reward:
target: [ DIAMOND ] the material item-name: "Ancient heart" the display name, or part of it item-lore: "Relic" a line of the lore model-data: 1201 the custom model data enchant: [ sharpness ] an enchantment it must carry
Together they are enough to tell one Oraxen, Nexo, ItemsAdder, MMOItems or ShadowCustomizer item from a plain one of the same material.
What happens to items already handed in, if the player gives up or a cycle turns over, is decided by quests.deliver.refund-on-cancel in config.yml.
example_delivery:
display: "<white>The village collection"
description:
- "<gray>The village needs stone. Lots of it."
- "<dark_gray>You can hand it in a little at a time."
icon-material: CHEST_MINECART
difficulty: MEDIUM
objectives:
- type: item_deliver
target: [ STONE, COBBLESTONE ]
amount: 5000
description: "<gray>Hand stone in to the village"
- type: item_deliver
target: [ DIAMOND ]
amount: 8
item-name: "Heart diamond"
description: "<gray>Hand in a special diamond"
rewards:
- "bundle: big-reward" Example quests/suite.yml
File notes
THE QUESTS NO COMPETITOR CAN WRITE.
Everything in this file crosses at least one other plugin of the suite. "Win five matches", "earn twenty thousand", "open ten crates", "make a profit on the market": none of them is a Minecraft event, so no quest plugin on the market can count them. This one can, because the events come from ShadowGames, ShadowEconomy, ShadowCrazyChest and ShadowBattlePass, and because the objective ids are the same ones the battle pass uses - one vocabulary, learned once, for the whole suite.
WHAT EACH ONE NEEDS, plainly:
game_win / game_kill / game_play ShadowGames money_earn / money_spend ShadowEconomy shop_sell ShadowEconomy crypto_profit / crypto_sell ShadowEconomy (market) token_earn ShadowEconomy (tokens) crate_open ShadowCrazyChest pass-xp (reward) ShadowBattlePass
IF YOU DO NOT RUN THOSE PLUGINS, delete this file, or write "auto-assign: false" in the group block below: the quests stay readable and stop being handed out. Nothing else in the plugin depends on them. They ship switched ON because a quest that arrives already off is not content, it is homework.
THE TARGETS. Crate names are the ones ShadowCrazyChest ships with (basic, vote, daily, magic, epic) and game names are the file names inside ShadowGames' games/ folder (bedwars, skywars, eggwars, ...). Where no target is written, the objective counts any of them.
Keys and values are English, and so are "display" and "description", what the player reads: change them, they are yours. An Italian version of this file is in esempi/it_IT/quests/suite.yml. It is not loaded: copy it over this one to use it.
config-version1group8 keysidsuitedisplay"<dark_purple>Suite feats"description["<gray>Quests that cross more than one plugin.", "<gray>Three at a time, renewed every Monday."]+1
iconNETHER_STARorder4periodWEEKLYsize3completion-rewards["money: 20000", "pass-xp: 3000", "crate: epic 1", "broadcast: <dark_purple><player> finished this week's feats."]+2
quests12 keysShadowGames
quests.arena_champion7 keysdisplay"<white>Five wins"description["<gray>In the arena, not in the world."]icon-materialGOLDEN_HELMETdifficultyMEDIUMweight1.2objectives[{ type: game_win, amount: 5, description: "<g…]rewards["money: 8000", "pass-xp: 1500", "crate: magic 1"]+1
arena_champion:
arena_blood, war_games, bed_breaker, merchant_week, big_spender, investor, token_hunter, crate_week, lucky_handsShadowEconomy
quests.rich_week7 keysdisplay"<white>Twenty thousand in seven days"description["<gray>How you earn it is nobody's business.", "<dark_gray>Quest rewards do not count."]+1
icon-materialGOLD_INGOTdifficultyMEDIUMweight1.2objectives[{ type: money_earn, amount: 20000, descriptio…]typeWith no target any currency counts. Payments made by this very plugin are left out on purpose: a quest that moves itself forward by paying out its own reward is not a quest.
rewards["money: 5000", "pass-xp: 1500"]ShadowCrazyChest
All three together
quests.triple_crown8 keysdisplay"<gradient:#B388FF:#4527A0>The triple crown</gradient>"description["<gray>Win, earn, open.", "<dark_gray>Three different plugins in a single quest."]+1
quests.triple_crown.icon3 keysmaterialNETHER_STARname"<gradient:#B388FF:#4527A0>The triple crown</gradient>"glowtruequests.triple_crowndifficultyEPICweight0.5modeallobjectives[{ type: game_win, amount: 3, description: "<gray>Win 3 matches" }, { type: money_earn, amount: 5000, description: "<gray>Earn 5,000 coins" }, { type: crate_open, target: […], amount: 1, description: "<gray>Open a Magic …+2
typeShadowGames
typeShadowEconomy
typeShadowCrazyChest
rewards["money: 15000", "pass-xp: 3000", "crate: epic 1", "bundle: your-choice", "broadcast: <gradient:#B388FF:#4527A0><player> took the triple crown.</gradient>"]+3
Example quests/daily.yml
File notes
ONE FILE = ONE GROUP. The group sets the rhythm: how often its quests are renewed, and how many are handed out at a time.
Fifteen dailies, three handed out a day. That is what keeps a server interesting for months without asking anyone to write months of content: the draw is by weight and repeatable, so two players on the same day get different quests and the same player keeps theirs across a restart.
THE SIZE OF A DAILY. Every quest here is meant to be finished in one evening by somebody who was going to play anyway. Three hundred stone, forty mobs, fifteen fish: the number is what an hour of ordinary play produces, never a target that asks for a farm. The three hard ones at the bottom carry a low weight on purpose - they should turn up as a change of pace, not as tonight's homework.
Automatic cycles are a Premium feature. On the free version these quests exist and work, they simply do not renew on their own.
A NOTE ON LANGUAGE. Every key, section and value in this file is English, because the file is read by server owners all over the world. What a player sees on screen - "display" and "description" - ships in English too: change it, it is yours. An Italian version of this file is in esempi/it_IT/quests/daily.yml. It is not loaded: copy it over this one to use it.
config-version1group8 keysiddailydisplay"<aqua>Dailies"description["<gray>Renewed every day."]iconCLOCKorder1periodDAILYDAILY | WEEKLY | MONTHLY | YEARLY | NEVER
size3How many are handed out at a time. "all" = every quest in the file.
With a number, each player gets that many, drawn by weight - and the draw is repeatable: the same player always gets the same quests for the same day, even if the server restarts mid-morning. Without that guarantee a restart could reshuffle someone's quests and take their progress with it.
completion-rewards["money: 2500", "xp: 150", "crate: daily 1", "message: <gold>You finished every daily!"]+1
An extra reward for finishing every quest of the day.
quests15 keysThe trades. The bulk of the deck: high weight, no surprises
quests.mine_stone7 keysdisplay"<white>An everyday miner"description["<gray>Stone does not dig itself."]icon-materialSTONEdifficultyEASYweight2.0objectives[{ type: block_break, target: […], amount: 300…]rewards["bundle: small-reward"]quests.night_hunt7 keysdisplay"<white>Night hunt"description["<gray>Whatever comes out when the sun goes d…]icon-materialBONEdifficultyMEDIUMweight2.0objectives[{ type: mob_kill, target: […], amount: 40 }]rewards["money: 1200", "xp: 100"]Mobs born from a spawner do not count: that is the global setting in config.yml, and it could be overridden here with "no-spawner-mobs: false" if a quest should also count inside a mob farm.
mine_stone:
evening_fishing, furnace_running, field_work, craft_bench, ore_day, shearing_day, animal_pen, builder_day, long_walk, nether_patrol, full_dayquests.wood_run7 keysdisplay"<white>Firewood for tonight"description["<gray>A forest, an axe, an hour."]icon-materialIRON_AXEdifficultyEASYweight2.0objectives[{ type: log_chop, amount: 128, no-placed-bloc…]no-placed-blocksA log you planted this morning does not count. It is the general anti-farm brake, spelled out here because this is exactly the shortcut somebody would think of.
rewards["bundle: small-reward"]The change of pace
Low weight: they should turn up, not be waited for.
quests.any_way8 keysdisplay"<white>Your way"description["<gray>Any one of these things.", "<dark_gray>One is enough."]+1
icon-materialCOMPASSdifficultyMEDIUMweight0.9modeany"any" instead of the default "all": the first objective finished closes the quest. It is the daily that does not tell anybody how they have to spend their evening.
objectives[{ type: ore_mine, amount: 100 }, { type: mob_kill, amount: 60 }, { type: item_fish, amount: 30 }, { type: crop_harvest, amount: 250 }]+3
rewards["money: 1300", "xp: 120"] Example quests/weekly.yml
File notes
THE WEEKLIES: the same shape as the dailies, one size up.
A weekly is not a daily with a bigger number. A daily is something you finish tonight; a weekly is something you come back to. Five hundred ore, a thousand crops, one dragon: none of them fits in an evening, all of them fit in a week, and that is the whole difference.
Twelve of them, three handed out on Monday. Whoever finishes all three gets the group reward at the bottom of the "group" block - and with twelve in the file, the three are different next week.
WHERE THE WEEK TURNS OVER is decided by cycles.week-starts-on and cycles.reset-at in config.yml, not here. The factory setting is Monday at 04:00, because somebody playing at one in the morning is still playing Sunday evening.
Automatic cycles are a Premium feature. On the free version these quests exist and work, they simply do not renew on their own.
Keys and values are English, and so are "display" and "description", what the player reads: change them, they are yours. An Italian version of this file is in esempi/it_IT/quests/weekly.yml. It is not loaded: copy it over this one to use it.
config-version1group8 keysidweeklydisplay"<gold>Weeklies"description["<gray>Three at a time, renewed on Monday."]iconGOLDEN_APPLEorder2periodWEEKLYsize3completion-rewards["money: 15000", "xp: 500", "crate: magic 1", "broadcast: <gold><player> finished every weekly."]+1
quests12 keysUnderground
quests.deep_miner7 keysdisplay"<white>In the depths"description["<gray>Below sea level, where it is worth it."]icon-materialDEEPSLATEdifficultyMEDIUMweight1.5objectives[{ type: ore_mine, amount: 500, max-y: 0, no-p…]rewards["bundle: medium-reward"]deep_miner:
stone_week, clear_cut, great_harvest, architect, foundry, tough_skin, boss_week, sea_week, enchanter, trader_weekOn the surface
Combat
quests.exterminator7 keysdisplay"<white>Exterminator"description["<gray>Five hundred monsters, and monsters on…]icon-materialNETHERITE_SWORDdifficultyMEDIUMweight1.2objectives[{ type: mob_kill, amount: 500, hostile-only:…]hostile-onlyHostile creatures only: killing cows is not fighting.
rewards["money: 6000", "bundle: hunter-crate"]