Skip to content
ShadowMC

Configuration

ShadowQuests

Daily missions, eighty objective types, an editor you drive in game.

Free with Premium v1.0.4

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.

What’s inside

18 files · 232 settings

Start with: config.yml

Settings

The files that decide how the plugin behaves. Start here.

config.yml

General settings
63 settings
plugins/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-version1

Storage

storage8 keys
storage.mysql7 keys
enabledfalse

false = 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.1
port3306
databaseshadowquests
usernameroot
password""
parameters"useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8"
storage
table-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-localtrue

MySQL 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 keys
maximum-pool-size10
minimum-idle2
connection-timeout-ms10000
idle-timeout-ms600000
max-lifetime-ms1800000
storage.h21 key
auto-serverfalse

Lets another process (a web panel, say) open the same H2 file while the server runs. Rarely needed.

storage.history2 keys
enabledtrue

The 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-days90

Several 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 keys
modeAUTO

AUTO = on when you use MySQL, off on the local database. ON | OFF to decide for yourself.

primarytrue

IMPORTANT: across a network, ONE server only must have primary: true. That is the one that cleans up the message log.

server-idauto

A 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 keys
timezone"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-onMONDAY

Where 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 keys
only[ ]
except[lobby]

Quests

quests3 keys
auto-claimfalse

With 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 key

Quests 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-canceltrue
quests
keep-history-days30

After 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 keys
ignore-afktrue

Someone 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-second60

How 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-mobstrue

Mobs 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-blockstrue

A 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-memory20000

How 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 keys
default-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-localetrue

With true every player sees the messages in their own client's language, when a file exists for it.

announce-progresstrue

Progress 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-resettrue
announce-rewardstrue
announce-on-jointrue
complete-titletrue
complete-sound"entity.player.levelup 0.7 1.2"
messages.bar3 keys
length20
full"|"
empty"|"
messages
free-credit-linetrue

The 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 keys
enabledtrue

With 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 keys
integrations.suite1 key
enabledtrue

Announce ourselves to ShadowEssentials, so the suite panel lists us with the right version.

integrations.crates1 key
give-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 key
grant-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 keys

THE 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-days7

How 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-iptrue

Ask 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 keys
enabledtrue
plugin-id0

The 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 key
log-sqlfalse

Writes 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
plugins/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-version1
npcs4 keys
miner[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
plugins/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-version1
bundles12 keys

The ladder

bundles
starter-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.

bundles
builder-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
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 command

Commands 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.

FileLanguageTexts
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

  • prefix 1
  • common 19
  • command 10
  • input 4
  • condition 22
  • objective 144
  • quest 60
  • chain 5
  • reward 62
  • npc 4
  • branding 1
  • license 41
  • admin 70
  • editor 172
  • menu 27

Other

Ready-made content, examples, imports: the files you copy and edit as a model.

quests/

Quests, one group per file
9 files
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.yml
  • daily.yml
  • examples.yml
  • miner-chain.yml
  • monthly.yml
  • sea-chain.yml
  • suite.yml
  • warrior-chain.yml
  • weekly.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-version1
group7 keys
idexamples
display"<gray>Examples"
description["<gray>To be read and copied."]
iconWRITABLE_BOOK
order99
periodNEVER
sizeall
quests2 keys
quests.example_full10 keys
display"<white>Example: everything that can be written"
description["<gray>Open the file to see how it is made."]
quests.example_full.icon3 keys
materialENCHANTED_BOOK
name"<white>Example"
glowtrue
quests.example_full
difficultyHARD
time-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-completions3

How 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
description

The line the player reads. Without it, one is built from the type and the target.

modeall

Both 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 keys
display"<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_STAR
difficultyEPIC
objectives
[{ type: game_win, amount: 3 }, { type: money_earn, amount: 500 }, { type: crate_open, target: […], amount: 1 }]+2
type

ShadowGames

type

ShadowEconomy

type

ShadowCrazyChest

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-version1
group8 keys
idsuite
display"<dark_purple>Suite feats"
description
["<gray>Quests that cross more than one plugin.", "<gray>Three at a time, renewed every Monday."]+1
iconNETHER_STAR
order4
periodWEEKLY
size3
completion-rewards
["money: 20000", "pass-xp: 3000", "crate: epic 1", "broadcast: <dark_purple><player> finished this week's feats."]+2
quests12 keys
ShadowGames
quests.arena_champion7 keys
display"<white>Five wins"
description["<gray>In the arena, not in the world."]
icon-materialGOLDEN_HELMET
difficultyMEDIUM
weight1.2
objectives[{ type: game_win, amount: 5, description: "<g…]
rewards
["money: 8000", "pass-xp: 1500", "crate: magic 1"]+1
9 more entries shaped like arena_champion: arena_blood, war_games, bed_breaker, merchant_week, big_spender, investor, token_hunter, crate_week, lucky_hands
ShadowEconomy
quests.rich_week7 keys
display"<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_INGOT
difficultyMEDIUM
weight1.2
objectives[{ type: money_earn, amount: 20000, descriptio…]
type

With 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 keys
display"<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 keys
materialNETHER_STAR
name"<gradient:#B388FF:#4527A0>The triple crown</gradient>"
glowtrue
quests.triple_crown
difficultyEPIC
weight0.5
modeall
objectives
[{ 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
type

ShadowGames

type

ShadowEconomy

type

ShadowCrazyChest

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-version1
group8 keys
iddaily
display"<aqua>Dailies"
description["<gray>Renewed every day."]
iconCLOCK
order1
periodDAILY

DAILY | WEEKLY | MONTHLY | YEARLY | NEVER

size3

How 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 keys
The trades. The bulk of the deck: high weight, no surprises
quests.mine_stone7 keys
display"<white>An everyday miner"
description["<gray>Stone does not dig itself."]
icon-materialSTONE
difficultyEASY
weight2.0
objectives[{ type: block_break, target: […], amount: 300…]
rewards["bundle: small-reward"]
quests.night_hunt7 keys
display"<white>Night hunt"
description["<gray>Whatever comes out when the sun goes d…]
icon-materialBONE
difficultyMEDIUM
weight2.0
objectives[{ 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.

11 more entries shaped like mine_stone: evening_fishing, furnace_running, field_work, craft_bench, ore_day, shearing_day, animal_pen, builder_day, long_walk, nether_patrol, full_day
quests.wood_run7 keys
display"<white>Firewood for tonight"
description["<gray>A forest, an axe, an hour."]
icon-materialIRON_AXE
difficultyEASY
weight2.0
objectives[{ type: log_chop, amount: 128, no-placed-bloc…]
no-placed-blocks

A 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 keys
display"<white>Your way"
description
["<gray>Any one of these things.", "<dark_gray>One is enough."]+1
icon-materialCOMPASS
difficultyMEDIUM
weight0.9
modeany

"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-version1
group8 keys
idweekly
display"<gold>Weeklies"
description["<gray>Three at a time, renewed on Monday."]
iconGOLDEN_APPLE
order2
periodWEEKLY
size3
completion-rewards
["money: 15000", "xp: 500", "crate: magic 1", "broadcast: <gold><player> finished every weekly."]+1
quests12 keys
Underground
quests.deep_miner7 keys
display"<white>In the depths"
description["<gray>Below sea level, where it is worth it."]
icon-materialDEEPSLATE
difficultyMEDIUM
weight1.5
objectives[{ type: ore_mine, amount: 500, max-y: 0, no-p…]
rewards["bundle: medium-reward"]
10 more entries shaped like deep_miner: stone_week, clear_cut, great_harvest, architect, foundry, tough_skin, boss_week, sea_week, enchanter, trader_week
On the surface
Combat
quests.exterminator7 keys
display"<white>Exterminator"
description["<gray>Five hundred monsters, and monsters on…]
icon-materialNETHERITE_SWORD
difficultyMEDIUM
weight1.2
objectives[{ type: mob_kill, amount: 500, hostile-only:…]
hostile-only

Hostile creatures only: killing cows is not fighting.

rewards["money: 6000", "bundle: hunter-crate"]

All the documentation