aboutsummaryrefslogtreecommitdiffstats
path: root/docs/configuration
diff options
context:
space:
mode:
Diffstat (limited to 'docs/configuration')
-rw-r--r--docs/configuration/basic-options.md569
-rw-r--r--docs/configuration/colour-codes.md58
-rw-r--r--docs/configuration/configuration-problems.md96
-rw-r--r--docs/configuration/creating-a-category.md68
-rw-r--r--docs/configuration/creating-a-quest.md428
-rw-r--r--docs/configuration/custom-gui-items.md68
-rw-r--r--docs/configuration/defining-items.md317
-rw-r--r--docs/configuration/global-configurations.md103
-rw-r--r--docs/configuration/gui-configuration.md269
-rw-r--r--docs/configuration/index.md7
-rw-r--r--docs/configuration/storage-providers.md137
11 files changed, 2120 insertions, 0 deletions
diff --git a/docs/configuration/basic-options.md b/docs/configuration/basic-options.md
new file mode 100644
index 00000000..24927b12
--- /dev/null
+++ b/docs/configuration/basic-options.md
@@ -0,0 +1,569 @@
+---
+title: Basic options
+parent: Configuration
+nav_order: 1
+---
+# Basic options
+{: .no_toc }
+
+Quests allows you to configure **basic options** for the
+plugin. These can all be located in the `config.yml`.
+
+{: .how-to-read }
+> Each option is laid out with its path underneath the title.
+> A dot in the path means an extra level of indentation, for example
+> `options.categories-enabled` represents:
+>
+> ```yaml
+> options:
+> categories-enabled: [value]
+> ```
+>
+> You should have a working knowledge of how to format YAML files
+> before configuring this plugin.
+
+## Table of contents
+{: .no_toc .text-delta }
+
+1. TOC
+{:toc}
+
+## Categories enabled
+
+
+*`options.categories-enabled`*
+
+Choose whether or not quests will be sorted into categories. If this is
+disabled, quests will be put into one big GUI instead, with categories
+only helping determine the order they are sorted.
+
+``` yaml
+options:
+ ...
+ categories-enabled: true
+```
+
+## Trim gui size
+
+
+*`options.trim-gui-size`*
+
+Choose whether or not the quests GUI will scale down (reduce the number
+of rows) so that there are not any empty rows.
+
+``` yaml
+options:
+ ...
+ trim-gui-size: true
+```
+
+## Titles enabled
+
+
+*`options.titles-enabled`*
+
+Choose whether or not titles will appear when starting / finishing
+quests.
+
+``` yaml
+options:
+ ...
+ titles-enabled: true
+```
+
+## Quest started limit
+
+*`options.quest-started-limit`*
+
+{: .warning }
+**This option has been removed in version 3.8 and this wiki entry is
+subject to removal.** Please see [quest limit](#quest-limit "wikilink")
+instead.
+
+Choose the number of quests players can start at one time. This will
+include quests which have [quest-specific
+autostart](Creating_a_quest#Autostart "wikilink") enabled, however this
+value will be ignored if [global
+`quest-autostart`](Basic_options#Quest_autostart "wikilink") is enabled.
+
+``` yaml
+options:
+ ...
+ quest-started-limit: 2
+```
+
+## Quest limit
+
+
+*`options.quest-limit`*
+
+Choose the number of quests players can start at one time. This will
+include quests which have [quest-specific
+autostart](Creating_a_quest#Autostart "wikilink") enabled, however this
+value will be ignored if [global
+`quest-autostart`](Basic_options#Quest_autostart "wikilink") is enabled.
+
+Each key is called a **limit group** (sometimes referred to as a quest
+rank), and players can start the set number of quests depending on their
+limit group. The group named `default` must be defined and is available
+to everybody, however the rest can be granted through the permission
+`quests.limit.<limit group>`.
+
+``` yaml
+options:
+ ...
+ quest-limit:
+ default: 2
+ group1: 5
+ group2: 10
+ # ...
+```
+
+Group permissions are also documented in [Commands and permissions §
+Permissions](commands-and-permissions#permissions "wikilink").
+
+## Allow quest cancel
+
+
+*`options.allow-quest-cancel`*
+
+Choose whether or not players can cancel quests themselves via command
+or by right-clicking in the GUI. If this is set to false, consider
+removing the right-click cancel instruction from the [global quest
+display
+configuration](Global_configurations#Global_quest_display_configuration "wikilink").
+
+``` yaml
+options:
+ ...
+ allow-quest-cancel: true
+```
+
+## Allow quest track
+
+
+*`options.allow-quest-track`*
+
+Choose whether or not players can track quests themselves via command or
+by middle-clicking in the GUI. If this is set to false, consider
+removing the middle-click track instruction from the [global quest
+display
+configuration](Global_configurations#Global_quest_display_configuration "wikilink").
+
+``` yaml
+options:
+ ...
+ allow-quest-track: true
+```
+
+## Task type exclusions
+
+
+*`options.task-type-exclusions`*
+
+Prevent Quests from allowing specific task type registrations from those
+bearing a specific name. This can be used if you have an incompatible
+plugin which causes a dependent task type to activate, thus potentially
+leading to errors.
+
+``` yaml
+options:
+ ...
+ task-type-exclusions: []
+```
+
+**Example**
+
+``` yaml
+options:
+ ...
+ task-type-exclusions:
+ - "blockbreak"
+ - "blockbreakcertain"
+```
+
+## Guinames
+
+
+*`options.guinames`*
+
+Change and define specific GUI names for localization.
+
+``` yaml
+options:
+ ...
+ guinames:
+ quests-category: "Quests Categories"
+ quests-menu: "Quests"
+ quests-started-menu: "Started Quests"
+ daily-quests: "Daily Quests"
+ quest-cancel: "Cancel Quest"
+```
+
+## Sounds
+
+
+*`options.sounds`*
+
+Choose which sounds play at certain events.
+
+``` yaml
+options:
+ ...
+ sounds:
+ quest-start: "ENTITY_PLAYER_LEVELUP:2:3"
+ quest-cancel: "UI_TOAST_OUT:2:3"
+ quest-complete: "UI_TOAST_CHALLENGE_COMPLETE:1.25:3"
+ gui:
+ open: "ITEM_BOOK_PAGE_TURN:1:3"
+ interact: "ITEM_BOOK_PAGE_TURN1:3"
+```
+
+To define a sound, choose one from [this
+list](https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html)
+(1.9+) or [this
+list](https://helpch.at/docs/1.8.8/index.html?org/bukkit/Sound.html)
+(1.8).
+
+To not have a sound play, you can leave the string blank (i.e. `""`),
+for example:
+
+``` yaml
+options:
+ ...
+ sounds:
+ quest-start: ""
+```
+
+You can choose a specific pitch and volume by including them in the
+following format `SOUND:PITCH:VOLUME`. Note that the pitch is any float
+between 0.5 and 2 (inclusively), and the volume must be greater than 0.
+The volume only changes how far out the sound can be heard by the
+player, not the actual volume played back on the client.
+
+**Example (1.9+):** `ENTITY_PLAYER_LEVELUP:2:3` -\> sound
+`ENTITY_PLAYER_LEVELUP` at pitch `2` with a volume of `3`.
+
+## GUI hide locked
+
+
+*`options.gui-hide-locked`*
+
+Choose whether quests which cannot be started is visible to the player
+or not.
+
+``` yaml
+options:
+ ...
+ gui-hide-locked: false
+```
+
+## GUI confirm cancel
+
+
+*`options.gui-confirm-cancel`*
+
+Choose whether or not there is a confirmation screen when right clicking
+to cancel a quest. Cancelling by command does not prompt a confirmation
+screen.
+
+``` yaml
+options:
+ ...
+ gui-confirm-cancel: true
+```
+
+## GUI hide quests if no permission
+
+
+*`options.gui-hide-quests-nopermission`*
+
+Choose whether or not quests are hidden to the player if they do not
+have permission for the quest.
+
+``` yaml
+options:
+ ...
+ gui-hide-quests-nopermission: false
+```
+
+## GUI hide categories if no permission
+
+
+*`options.gui-hide-categories-nopermission`*
+
+Choose whether or not categories are hidden to the player if they do not
+have permission for the category.
+
+``` yaml
+options:
+ ...
+ gui-hide-categories-nopermission: false
+```
+
+## GUI use PlaceholderAPI
+
+
+*`options.gui-use-placeholderapi`*
+
+Choose whether or not the quest GUI is parsed with PlaceholderAPI. This
+is disabled by default for performance reasons.
+
+``` yaml
+options:
+ ...
+ gui-use-placeholderapi: false
+```
+
+## GUI truncate requirements
+
+
+*`options.gui-truncate-requirements`*
+
+Choose whether or not the displayed quest requirements for specific
+quests should be cut short. The plugin will show "Quest 1 +X more" as
+the requirement, rather than listing each quest "Quest 1, Quest 2, Quest
+3, ..." to stop lores overflowing off the screen.
+
+``` yaml
+options:
+ ...
+ gui-truncate-requirements: true
+```
+
+## GUI actions
+
+
+*`options.gui-actions`*
+
+Set the click actions for the UI. For a list of click types, check the
+[ClickType javadoc
+page](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/inventory/ClickType.html).
+
+``` yaml
+options:
+ ...
+ gui-actions:
+ start-quest: "LEFT"
+ track-quest: "MIDDLE"
+ cancel-quest: "RIGHT"
+```
+
+## Quest autostart
+
+
+*`options.quest-autostart`*
+
+Choose whether or not players need to start quests themselves. This will
+ignore the configured [quest started
+limit](#Quest_started_limit "wikilink"), and is different from the
+[autostart](#Autostart "wikilink") option.
+
+``` yaml
+options:
+ ...
+ quest-autostart: false
+```
+
+## Quest autotrack
+
+
+*`options.quest-autotrack`*
+
+Choose whether or not players need to track quests themselves. This will
+automatically track quests when they are started, and will attempt to
+track the next available started quests when the player finishes a
+quest.
+
+``` yaml
+options:
+ ...
+ quest-autotrack: true
+```
+
+## Verbose logging level
+
+
+*`options.verbose-logging-level`*
+
+Choose how much quests will log to the console. This will filter the
+output based on the following options: 0 = errors only, 1 = warnings, 2
+= info, 3 = debug
+
+``` yaml
+options:
+ ...
+ verbose-logging-level: 2
+```
+
+## Quests use PlaceholderAPI
+
+
+*`options.quests-use-placeholderapi`*
+
+Choose whether or not start strings, reward strings, reward commands and
+start commands are parsed with PlaceholderAPI. This is disabled by
+default for performance reasons.
+
+``` yaml
+options:
+ ...
+ quests-use-placeholderapi: false
+```
+
+## Verify quest exists on load
+
+
+*`options.verify-quest-exists-on-load`*
+
+Verify quests exist when a player's data is loaded - inconsistencies may
+arise when players progress on specific quests and those quests are
+later removed. Their progress is still retained in the quest progress
+file, which may lead to issues such as players reaching a quest started
+limit when the quests they had active no longer exist - having this
+option enabled prevents non-existent quests from loading as quest
+progress.
+
+``` yaml
+options:
+ ...
+ verify-quest-exists-on-load: true
+```
+
+## Performance tweaking
+
+
+*`options.performance-tweaking`*
+
+Set some specific options within the internals of Quests.
+
+The `queue executor interval` relates to how frequently players are
+checked for completed quests. Not every player is checked at once for
+performance purposes, and players are only submitted to the queue upon
+completion of a task. The interval defines how frequently players are
+polled from the queue.
+
+The `autosave interval` refers to how frequently all online players data
+is saved. Data is saved at autosave intervals to prevent data loss
+should the server crash.
+
+These options are measured in ticks, 1 second = 20 ticks.
+
+``` yaml
+options:
+ ...
+ performance-tweaking:
+ quest-queue-executor-interval: 1
+ quest-autosave-interval: 12000
+```
+
+## Tab completion
+
+
+*`options.tab-completion`*
+
+Choose whether or not commands can be tab completed. Quests will never
+offer tab completions which players cannot run, regardless of this
+setting. (In other words, players who are not admins will not see tab
+completions for `/quests admin` if they do not have the admin
+permission.)
+
+``` yaml
+options:
+ ...
+ tab-completion:
+ enabled: true
+```
+
+## Error checking
+
+
+*`options.error-checking`*
+
+Configure how Quests handles errors in your configuration. By default,
+Quests will not allow quests to be loaded if they contain an
+[error](Configuration_problems#Types_of_problem "wikilink"), since this
+could lead to undefined behaviour. The option `override-errors` will
+ignore this behaviour and forcibly allow the quest to be registered.
+
+``` yaml
+options:
+ ...
+ error-checking:
+ override-errors: false
+```
+
+## Placeholder cache time
+
+
+''`options.placeholder-cache-time`"
+
+Set how long Quests will retain parsed PlaceholderAPI strings in the
+cache, in seconds. See [PlaceholderAPI § Caching
+placeholders](PlaceholderAPI#Caching_placeholders "wikilink") for more
+information.
+
+``` yaml
+options:
+ ...
+ placeholder-cache-time: 10
+```
+
+## Global task configuration override
+
+
+*`options.global-task-configuration-override`*
+
+Choose whether or not options set in the [global task
+configuration](Global_configurations#Global_task_configuration "wikilink")
+will override per-quest specific options.
+
+``` yaml
+options:
+ ...
+ global-task-configuration-override: false
+```
+
+## Global quest display configuration override
+
+
+*`options.global-quest-display-configuration-override`*
+
+Choose whether or not the [global quest display
+configuration](Global_configurations#Global_quest_display_configuration "wikilink")
+will override per-quest specific options.
+
+``` yaml
+options:
+ ...
+ global-quest-display-configuration-override: false
+```
+
+## Storage
+
+
+*`options.storage`*
+
+Configure how Quests will store playerdata. See [storage
+providers](Storage_providers "wikilink") for more info.
+
+``` yaml
+options:
+ ...
+ storage:
+ provider: "yaml"
+ synchronisation:
+ delay-loading: 0
+ database-settings:
+ network:
+ database: "minecraft"
+ username: "root"
+ password: ""
+ address: "localhost:3306"
+ connection-pool-settings:
+ maximum-pool-size: 8
+ minimum-idle: 8
+ maximum-lifetime: 1800000
+ connection-timeout: 5000
+ table-prefix: "quests_"
+```
diff --git a/docs/configuration/colour-codes.md b/docs/configuration/colour-codes.md
new file mode 100644
index 00000000..6c7339c0
--- /dev/null
+++ b/docs/configuration/colour-codes.md
@@ -0,0 +1,58 @@
+---
+title: Colour codes
+parent: Configuration
+nav_order: 8
+---
+# Colour (color) codes
+
+You can use colour codes anywhere the plugin accepts a message (plugin messages, display items, and in task configurations themselves).
+
+The following table shows the colour capabilities of specific server versions:
+
+| | Before 1.16 | 1.16+ |
+| ---- | ---- | ---- |
+| Colour Codes | ✔️ | ✔️ |
+| Hexadecimal | ❌ | ✔️ |
+
+## Colour codes
+The plugin will automatically translate colour codes from '&' to '§' for you.
+
+| Name | Chat Code | Hex Equivalent |
+| ---- | ---- | ---- |
+| Black | `&0` | #000000 |
+| Dark Blue | `&1` | #0000AA |
+| Dark Green | `&2` | #00AA00 |
+| Dark Aqua | `&3` | #00AAAA |
+| Dark Red | `&4` | #AA0000 |
+| Dark Purple | `&5` | #AA00AA |
+| Gold | `&6` | #FFAA00 |
+| Gray | `&7` | #AAAAAA |
+| Dark Gray | `&8` | #555555 |
+| Blue | `&9` | #5555FF |
+| Green | `&a` | #55FF55 |
+| Aqua | `&b` | #55FFFF |
+| Red | `&c` | #FF5555 |
+| Light Purple | `&d` | #FF55FF |
+| Yellow | `&e` | #FFFF55 |
+| White | `&f` | #FFFFFF |
+| Obfuscated | `&k` | - |
+| Bold | `&l` | - |
+| Strikethrough | `&m` | - |
+| Underline | `&n` | - |
+| Italic | `&o` | - |
+| Reset | `&r` | - |
+
+## Hexadecimal colour
+For compatible Minecraft versions, the plugin will also translate hex colour codes for you.
+
+You can include a hex colour code as you would with a normal colour code: `&#<hex colour code>`.
+
+{: .important }
+The `#` symbol indicates a hexadecimal colour code. These must be exactly six characters long.
+
+For example, the following messages are identical:
+```
+&cThis is a red message.
+
+&#FF5555This is a red message.
+```
diff --git a/docs/configuration/configuration-problems.md b/docs/configuration/configuration-problems.md
new file mode 100644
index 00000000..a55bbfde
--- /dev/null
+++ b/docs/configuration/configuration-problems.md
@@ -0,0 +1,96 @@
+---
+title: Configuration problems
+parent: Configuration
+nav_order: 9
+---
+
+# Configuration problems
+
+If you have a configuration error, Quests will log details both to the console and in-game (if you use `/q a reload`).
+
+![](https://i.imgur.com/5o7EyVm.png)
+
+These problems are designed to be as readable as possible, allowing self-diagnosis for your configuration. Warnings are also used to spot common misconfigurations, which may lead to quests not working as expected, thus being interpreted as a bug.
+
+Most problems have extended descriptions if you mouse-over them in-game.
+
+## Types of problem
+
+| Type | Description |
+|:-------:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Error | Errors prevent the specific quest from loading. These can be overidden in the config at `options.error-checking.override-errors`. Examples include an incorrect quest ID or malformed YAML file. |
+| Warning | Warnings have no impact other than to inform you that a quest may not work as expected. Examples include an invalid material for a blockbuildcertain task, or a required quest which does not exist. |
+
+## Understanding a problem
+Problems generally follow this format:
+```
+<name of file> ----
+ | - <type of problem>: <description of problem> :<location of problem>
+```
+
+**Example 1**
+
+Take the following configuration.
+
+```yaml
+tasks:
+ damage:
+ type: "dealdamage"
+```
+The following error will show if you try to create a `dealdamage` task without specifying how much damage needs to be dealt.
+```
+example1.yml ----
+ | - E: Required field 'amount' is missing for task type 'dealdamage' :tasks.damage.amount
+```
+In the above example, the problem is an error (as denoted by E) and will prevent the quest (`example1`) from loading.
+The descriptor at the end shows you exactly where the error comes from in the YML file, which looks like this:
+
+The source of the error is given by `:tasks.damage.amount`, where each dot denotes a level of indentation. In this case, it is expecting a value at `amount`, but it is not defined.
+
+Below is the fixed version.
+
+```yaml
+tasks:
+ damage:
+ type: "dealdamage"
+ amount: 10
+```
+
+**Example 2**
+
+```
+example2.yml ----
+ | - E: Expected an integer for 'amount', but got 'ten' instead :tasks.inventory.amount
+ | - W: Material 'notablock' does not exist :tasks.inventory.item
+ | - W: Quest requirement 'example' does not exist :options.requires
+```
+```yaml
+tasks:
+ inventory:
+ type: "inventory"
+ amount: ten
+ item: notablock
+...
+options:
+ requires:
+ - "example"
+ ...
+```
+In this case, the task is broken since instead of numbers for the amount of items needed (`amount`), the string "ten" is there instead, causing an error. The source of the error is indicated by the location at the end `tasks.inventory.amount`.
+
+Also, a warning is shown for the item "thisisnotablock" at `tasks.inventory.item` and for the requirement "example" at `options.requires`. These warnings are informing you that the task may not work as expected, as "thisisnotablock" is not a real item, and that the quest "example" which is required to have been completed in order to start this quest does not exist.
+
+Unlike errors, warnings do not prevent quests from being loaded.
+
+Below is a fixed version:
+```yaml
+tasks:
+ inventory:
+ type: "inventory"
+ amount: 10
+ item: DIAMOND
+...
+options:
+ # requirements section removed
+ ...
+``` \ No newline at end of file
diff --git a/docs/configuration/creating-a-category.md b/docs/configuration/creating-a-category.md
new file mode 100644
index 00000000..e777b260
--- /dev/null
+++ b/docs/configuration/creating-a-category.md
@@ -0,0 +1,68 @@
+---
+title: Creating a category
+parent: Configuration
+nav_order: 3
+---
+
+# Creating a category
+{: .no_toc }
+
+Categories are stored in `categories.yml`. On older versions of Quests
+they were stored in the main `config.yml`; quests will read categories
+from `config.yml` if a `categories.yml` file is not present.
+
+
+## Table of contents
+{: .no_toc .text-delta }
+
+1. TOC
+{:toc}
+
+## Category ID
+
+ID of category, this is the text you should enter when putting quests
+inside a category.
+
+## Display
+
+
+*`display`*
+
+The item that is shown in the GUI.
+
+### Name
+
+
+*`display.name`*
+
+The name of the item.
+
+### Lore
+
+
+*`display.lore`*
+
+The lore (description) of the item.
+
+### Type
+
+
+*`display.type`*
+
+The type (material name/id) of item.
+
+## Permission required
+
+
+*`permission-required`*
+
+Whether permission is needed to open this category, or start quests
+within it. This permission will follow this format:
+`quests.category.<category>`\`.
+
+## Hidden
+
+
+*`hidden`*
+
+Whether this category is shown in the main quests menu.
diff --git a/docs/configuration/creating-a-quest.md b/docs/configuration/creating-a-quest.md
new file mode 100644
index 00000000..6e3b7283
--- /dev/null
+++ b/docs/configuration/creating-a-quest.md
@@ -0,0 +1,428 @@
+---
+title: Creating a quest
+parent: Configuration
+nav_order: 2
+---
+
+# Creating a quest
+{: .no_toc }
+
+Each file inside the `quests` subfolder represents a
+single quest. The **name** of the file represents the **quest id** and
+must be alphanumeric (excluding the .yml extension).
+
+{: .note }
+An example can be seen in the [default
+configuration](https://github.com/LMBishop/Quests/blob/master/bukkit/src/main/resources/resources/bukkit/quests/example1.yml).
+
+## Table of contents
+{: .no_toc .text-delta }
+
+1. TOC
+{:toc}
+
+## Quest ID
+
+The quest ID is the name of the file (excluding .yml extension) and must
+alphanumeric and unique. This ID is used as the reference in commands,
+players' quest progress file and in placeholders.
+
+## Tasks
+
+
+*`tasks`*
+
+Tasks are the objectives the player must do to complete the quest.
+Simalar to quest IDs, there are task IDs. They can be identical to the
+quest ID but must be unique to each other.
+
+For help on adding the tasks, refer to [task configuration
+layout](Task_configuration_layout "wikilink")
+
+## Display
+
+
+*`display`*
+
+This is the item which will be shown to the player in the quest GUI.
+
+### Name
+
+
+*`display.name`*
+
+The name of the item. This is also the name used in chat messages.
+
+``` yaml
+display:
+ name: "&cExample I (Single Task)"
+```
+
+### Normal lore
+
+
+*`display.lore-normal`*
+
+The lore (description) of the item as seen if the quest is not started.
+
+``` yaml
+display:
+ ...
+ lore-normal:
+ - "&cThis category is designed to show you the different"
+ - "&cattributes a quest can have."
+ - ""
+ - "&7This quest requires you to:"
+ - "&7 - Break &f30 blocks&7."
+ - ""
+ - "&7Rewards:"
+ - "&7 - &f10 &7diamonds."
+```
+
+### Started lore
+
+
+*`display.lore-started`*
+
+The lore (description) of the item **appended to `lore-normal`** if the
+quest is started. This is a good place to put progression details. To
+get the progression of a player in a task, write `{TASKID:progress}` and
+replace `TASKID` with the ID of the task you want to get the progress
+for. Alternatively, you can write `{TASKID:complete}` to get if the task
+is complete.
+
+``` yaml
+display:
+ ...
+ lore-started:
+ - ""
+ - "&7Your current progression:"
+ - "&7 - &f{mining:progress}&7/30 blocks broken."
+```
+
+### Type
+
+
+*`display.type`*
+
+The type (material name) of item.
+
+``` yaml
+display:
+ ...
+ type: "WOODEN_PICKAXE"
+```
+
+## Rewards
+
+
+*`rewards`*
+
+**Optional.** This is a list of commands which will be executed when the
+player completes the quest. You can use `{player}` and the players name
+will be substituted in place.
+
+``` yaml
+rewards:
+ - "give {player} diamond 10"
+```
+
+## Start commands
+
+
+*`startcommands`*
+
+**Optional.** This is a list of commands which will be executed when the
+player starts the quest. You can use `{player}` and the player's name
+will be substituted in place.
+
+``` yaml
+startcommands:
+ - "broadcast {player} has started a quest"
+```
+
+## Start string
+
+
+*`startstring`*
+
+**Optional.** This is a list of messages which will be sent to the
+player when they start the quest. This is useful for telling the player
+their objectives.
+
+``` yaml
+startstring:
+ - " &8- &7You must break 30 blocks."
+```
+
+## Reward string
+
+
+*`rewardstring`*
+
+**Optional.** This is a list of messages which will be sent to the
+player when they complete the quest. This is useful for telling the
+player their rewards.
+
+``` yaml
+rewardstring:
+ - " &8- &7You have received 10 dimaonds."
+```
+
+## Placeholders
+
+
+*`placeholders`*
+
+**Optional.** This is a set of placeholders which can be accessed using
+PlaceholderAPI. To get the progression of a player in a task, write
+`{TASKID:progress}` and replace `TASKID` with the ID of the task you
+want to get the progress for. Alternatively, you can write
+`{TASKID:complete}` to get if the task is complete.
+
+``` yaml
+placeholders:
+ description: "&7Break &f30 blocks &7of any type."
+ progress: " &8- &f{mining:progress}&7/30 broken"
+```
+
+These placeholders will be called using PlaceholderAPI. See [quest
+progress in scoreboard](Quest_progress_in_scoreboard "wikilink") for a
+guide which utilises this feature.
+
+## Options
+
+
+*`options`*
+
+This section defines quest-specific options.
+
+### Category
+
+
+*`options.category`*
+
+**Optional.** The category the quest will be in. You should put the ID
+of the category here.
+
+``` yaml
+options:
+ ...
+ category: "example"
+```
+
+### Requirements
+
+
+*`options.requires`*
+
+**Optional.** List of Quest IDs the player must complete before being
+able to start this quest.
+
+``` yaml
+options:
+ ...
+ requires:
+ - "quest-id"
+```
+
+### Permission required
+
+
+*`options.permission-required`*
+
+**Optional.** Whether or not the quest should require a permission to
+start. The permission will be `quests.quest.<id>`.
+
+``` yaml
+options:
+ ...
+ permission-required: false
+```
+
+### Cancellable
+
+
+*`options.cancellable`*
+
+**Optional.** Whether or not this quest can be cancelled. If global or
+local quest autostart is enabled, or is cancelling quests is disabled,
+then this option is ignored.
+
+``` yaml
+options:
+ ...
+ cancellable: false
+```
+
+### Counts towards limit
+
+
+*`options.counts-towards-limit`*
+
+**Optional.** Whether or not this quest counts towards the players quest
+started limit. If global quest autostart is enabled, this will have no
+effect as quest limits are disabled.
+
+``` yaml
+options:
+ ...
+ counts-towards-limit: false
+```
+
+### Repeatable
+
+
+*`options.repeatable`*
+
+**Optional.** Whether or not the quest can be replayed.
+
+``` yaml
+options:
+ ...
+ repeatable: false
+```
+
+### Cooldown
+
+
+*`options.cooldown`*
+
+**Optional.** Whether ot not the quest is placed on cooldown or is
+immediately replayable.
+
+``` yaml
+options:
+ ...
+ cooldown:
+ enabled: true
+ time: 1440 # minutes
+```
+
+### Time limit
+
+
+*`options.time-limit`*
+
+**Optional.** Whether or not this quest has a time limit to complete it.
+If the time limit is reached, the quest will be cancelled and progress
+reset.
+
+``` yaml
+options:
+ ...
+ time-limit:
+ enabled: true
+ time: 1440 # minutes
+```
+
+### Sort order
+
+
+*`options.sort-order`*
+
+**Optional.** How the plugin sorts the quests in the GUI, lower numbers
+come first.
+
+``` yaml
+options:
+ ...
+ sort-order: 1
+```
+
+### Autostart
+
+
+*`options.autostart`*
+
+**Optional.** Whether or not the quest should automatically be started.
+This is similar to enabling quest autostart for the entire plugin, but
+specific only to this quest, meaning it cannot be cancelled and counts
+towards the players quest started limit.
+
+See [§ counts towards
+limit](Creating_a_quest#Counts_towards_limit "wikilink") if you do not
+want autostart quests to count towards the quest started limit.
+
+``` yaml
+options:
+ ...
+ autostart: true
+```
+
+### Completed display
+
+
+*`options.completed-display`*
+
+**Optional.** The display item this quest should take if it is
+completed. This accepts the standard ItemStack definition format
+described in [Defining items](Defining_items "wikilink"). If this option
+is not specified, the display item [defined in the main
+config.yml](gui-configuration#quest-completed-display "wikilink") will
+be used.
+
+``` yaml
+options:
+ ...
+ completed-display:
+ type: "STEAK"
+```
+
+### Cooldown display
+
+
+*`options.cooldown-display`*
+
+**Optional.** The display item this quest should take if it is on
+cooldown. This accepts the standard ItemStack definition format
+described in [Defining items](Defining_items "wikilink"). If this option
+is not specified, the display item [defined in the main
+config.yml](gui-configuration#quest-cooldown-display "wikilink") will be
+used.
+
+``` yaml
+options:
+ ...
+ cooldown-display:
+ type: "STEAK"
+```
+
+### Permission display
+
+
+*`options.permission-display`*
+
+**Optional.** The display item this quest should take if the player does
+not have permission to start it. This accepts the standard ItemStack
+definition format described in [Defining
+items](Defining_items "wikilink"). If this option is not specified, the
+display item [defined in the main
+config.yml](gui-configuration#quest-permission-display "wikilink") will
+be used.
+
+``` yaml
+options:
+ ...
+ permission-display:
+ type: "STEAK"
+```
+
+### Locked display
+
+
+*`options.locked-display`*
+
+**Optional.** The display item this quest should take if the player has
+not unlocked it. This accepts the standard ItemStack definition format
+described in [Defining items](Defining_items "wikilink"). If this option
+is not specified, the display item [defined in the main
+config.yml](gui-configuration#quest-locked-display "wikilink") will be
+used.
+
+``` yaml
+options:
+ ...
+ locked-display:
+ type: "STEAK"
+```
diff --git a/docs/configuration/custom-gui-items.md b/docs/configuration/custom-gui-items.md
new file mode 100644
index 00000000..3ce97b15
--- /dev/null
+++ b/docs/configuration/custom-gui-items.md
@@ -0,0 +1,68 @@
+---
+title: Custom GUI items
+parent: Configuration
+nav_order: 7
+---
+# Custom GUI items
+
+**Custom GUI items** are dummy items added to the category menu and the
+quest menu. This can be used to help stylise your quests GUI.
+
+This can be done in the `config.yml`:
+
+``` yaml
+custom-elements:
+ "categories": # apply to the categories menu (the main menu by default)
+ 0: # <--- slot 1, note the slots start from 0! so 0 = slot 1 in this case
+ display:
+ name: "&cExample Custom Item (slot 1)"
+ lore:
+ - "&7This is a custom item which can be added"
+ - "&7to your menus. This is purely cosmetic."
+ - ""
+ - "&7Two empty slots should follow."
+ type: "DIAMOND_BLOCK"
+ 1: # <--- start from slot 2
+ spacer: true # empty slot in GUI
+ repeat: 2 # repeats for 2 slots
+ 3: # <--- start from slot 4
+ display:
+ name: "&cExample Custom Item (slots 4 - 7)"
+ lore:
+ - "&7This is a custom item which can be added"
+ - "&7to your menus, but in slot 4 and repeated"
+ - "&73 times."
+ - "&7"
+ - "&7This will come after 2 empty slots."
+ - "&7"
+ - "&7This is purely cosmetic."
+ type: "NETHERRACK"
+ repeat: 3 # repeats for 3 more slots
+ commands:
+ - "this command will be executed if the player click on this item"
+```
+
+The optional `repeat` field will repeat the item for consecutive slots
+after that.
+
+The optional `commands` list will execute commands if the player clicks
+on the item. The `{player}` placeholder can be used to substitute the
+player name.
+
+These custom elements take precedence over quest items, as quests and
+categories will fill empty slots once all the custom items have been
+set.
+
+![Example of how custom GUI items are laid out](https://i.imgur.com/5odcqM9.png)
+
+To add a custom item within the quest menu itself, you must specify the
+category, or if categories are disabled you can specify "quests"
+instead:
+
+``` yaml
+custom-elements:
+ "c:<category-name>": # apply to <category-name> menu
+ ...
+ "quests": # apply to whole quests menu if categories are disabled
+ ...
+```
diff --git a/docs/configuration/defining-items.md b/docs/configuration/defining-items.md
new file mode 100644
index 00000000..fddec792
--- /dev/null
+++ b/docs/configuration/defining-items.md
@@ -0,0 +1,317 @@
+---
+title: Defining items
+parent: Configuration
+nav_order: 5
+---
+
+# Defining items
+{: .no_toc }
+
+An **ItemStack** is a **representation of an item** in an inventory.
+Every configured ItemStack in Quests is parsed the exact same way. This
+page gives guidance on how to define items with specific attributes.
+
+{: .note }
+The information on this page describes how to define items across every
+configuration file.
+
+## Table of contents
+{: .no_toc .text-delta }
+
+1. TOC
+{:toc}
+
+## Layout
+
+``` yaml
+item:
+ name: "&6&lSuper Cool Stick"
+ item: STICK
+ lore:
+ - "&7Really cool lore."
+ # field4: value4
+ # etc.
+```
+
+## Options
+
+| Field | Optional | Minecraft Version | More Information |
+|----------------------|-----------------|-------------------|-----------------------------------------|
+| `item` | ❌ | \- | [Jump](#item "wikilink") |
+| `name` | ✅ <sup>\*</sup> | \- | [Jump](#name "wikilink") |
+| `lore` | ✅ | \- | [Jump](#lore "wikilink") |
+| `enchantments` | ✅ | \- | [Jump](#enchantments "wikilink") |
+| `itemflags` | ✅ | 1.8+ | [Jump](#item-flags "wikilink") |
+| `unbreakable` | ✅ | 1.13+ | [Jump](#unbreakable "wikilink") |
+| `attributemodifiers` | ✅ | 1.13+ | [Jump](#attribute-modifiers "wikilink") |
+| `custommodeldata` | ✅ | 1.14+ | [Jump](#custom-model-data "wikilink") |
+| `owner-[...]` | ✅ | 1.8+ | [Jump](#owner "wikilink") |
+
+<sup>\*: The name must be defined for the display item of Quests.</sup>
+
+### Item
+
+
+*`item` or `type` or `material`*
+
+The item is the material the itemstack is made out of. Please see the
+[latest
+javadocs](https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html)
+(1.13+) or the [1.12
+javadocs](https://helpch.at/docs/1.12.2/org/bukkit/Material.html)
+(1.8-1.12) for item names. For 1.8-1.12, data codes can be added on at
+the end with a colon `:<code>`.
+
+``` yaml
+item:
+ item: "WHEAT"
+ ...
+```
+
+### Name
+
+
+*`name`*
+
+The name is displayed at the top of the item when hovered over, or just
+above the hotbar when selected.
+
+``` yaml
+item:
+ name: "&2&lSuper Cool Name"
+ ...
+```
+
+### Lore
+
+
+*`lore`*
+
+The lore is the description of the item seen when hovering over it. You
+can remove this omit entirely if a lore is not desired.
+
+``` yaml
+item:
+ lore:
+ - "Line 1"
+ - "Line 2"
+ ...
+```
+
+### Enchantments
+
+The format of enchantments depends on your Minecraft version.
+
+
+**Pre-1.13**: Use [spigot
+names](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/enchantments/Enchantment.html)
+-\> format "{enchantment}:{level}"
+
+**1.13+**: Use Vanilla names -\> namespace for vanilla enchantments is
+"minecraft" -\> format "{namespace}:{enchantment}:{level}"
+
+``` yaml
+item:
+ enchantments:
+ - "minecraft:infinity:1"
+ ...
+```
+
+### Item flags
+
+Item flags can be added to hide enchantment names, etc. A full list of
+itemflags is available on the [Spigot
+javadocs](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemFlag.html).
+
+``` yaml
+item:
+ itemflags:
+ - "HIDE_ATTRIBUTES"
+ ...
+```
+
+### Unbreakable
+
+- *1.13+*'
+
+``` yaml
+item:
+ unbreakable: true
+ ...
+```
+
+### Attribute modifiers
+
+**1.13+** Adds specific attribute modifiers to the items. The UUID
+should always be specified otherwise the server will randomly generate
+one on each restart. Full list of attributes is available on the [Spigot
+javadocs](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/Attribute.html),
+along with full list of
+[operations](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/AttributeModifier.Operation.html).
+
+``` yaml
+item:
+ attributemodifiers:
+ - attribute: GENERIC_MOVEMENT_SPEED
+ modifier:
+ uuid: "49dc07dc-bfdb-4dc7-85d3-66ef52b51858"
+ name: "generic.movementSpeed"
+ operation: ADD_NUMBER
+ amount: 0.03
+ equipmentslot: HAND
+ - attribute: GENERIC_MOVEMENT_SPEED
+ modifier:
+ uuid: "e22513cf-b15f-4443-9e2f-103c0ff9731b"
+ name: "generic.movementSpeed"
+ operation: ADD_NUMBER
+ amount: 0.01
+ equipmentslot: OFF_HAND
+ ...
+```
+
+### Custom model data
+
+**1.14+**
+
+``` yaml
+item:
+ custommodeldata: 12345
+ ...
+```
+
+### Owner
+
+This only applies if you have a skull item stack (`PLAYER_HEAD` 1.13+,
+`SKULL_ITEM` 1.8-1.12). There are three ways to define the player for
+the skull: by **username**; **uuid**; or, **base64 encoded string**.
+
+The **preferred method** is to **explicitly specify a base64 encoded
+string**. Using any of the other two methods require that the player has
+joined the server before, and may possibly make a request to Mojang
+(locking the server thread) depending on which server software you use.
+
+You can get the base64 encoded representation of a player skin here:
+<https://mineskin.org/>. It will look like the following (may be
+referred to as 'texture data'):
+
+ ewogICJ0aW1lc3RhbXAiIDogMTYyNTgzNjU0OTAxNCwKICAicHJvZmlsZUlkIiA6ICJlMmNlNzA0ZWVjNGE0YjE4YTNlYjA4MTRiMzdmYTFkNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJmYXRwaWdzYXJlZmF0IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzJiMTIzMWEyZjNkYTQ2OTQxZDY1OWI4NDNjZWZhNDljOGE1NTA0ZjE4MzNlOTA3YzY3YmJiMTQ2NTE0OTlhNyIKICAgIH0KICB9Cn0=
+
+You can specify each type by the following:
+
+``` yaml
+item:
+ owner-base64: "base64 encoded string"
+ ...
+```
+
+``` yaml
+item:
+ owner-username: "username"
+ ...
+```
+
+``` yaml
+item:
+ owner-uuid: "uuid"
+ ...
+```
+
+## Quest items
+
+**Quest items** can help simplify your configuration by putting
+individual itemstacks inside a named file (under directory items/), to
+allow for easy referencing from a task configuration and reducing
+configuration duplication across your quests.
+
+The types of quest items are as follows:
+
+- `raw` (items imported using /q a items import)
+- `defined` (items manually written following the format above)
+- `mmoitems` (items from MMOItems)
+- `slimefun` (items from Slimefun)
+- `executableitems` (items from ExecutableItems)
+
+### Importing items
+
+**Importing** an item means creating a new quest item **from the item
+you are holding** in game. To do this, simply hold the desired item and
+run `/q a items import <id>`, where `<id>` is the desired name of the
+item. Your item will be saved to file items/\<id\>.yml, **with the type
+'raw**'.
+
+<https://i.imgur.com/6lsld61.png> <https://i.imgur.com/Pg2eO9a.png>
+
+### Defining items
+
+You can manually define an item by creating a new `yml` file within the
+items/ directory. You must specify a `type` and the item itself under
+`item`.
+
+#### Defined
+
+**Defined quest items** are regular ItemStacks and follow the format
+defined under [§ Configurable
+options](Defined_items#Configurable_options "wikilink").
+
+ items/testitem.yml
+
+``` yaml
+type: "defined"
+item:
+ name: "Cool item"
+ type: DIAMOND_SWORD
+ lore:
+ - "Really cool lore"
+```
+
+#### MMOItems
+
+**MMOItems quest items** are ItemStacks which belong to the MMOItems
+plugin.
+
+ items/testitem.yml
+
+``` yaml
+type: "mmoitems"
+item:
+ type: "BOW" #mmoitems type
+ id: "HELL_BOW" #mmoitems id
+```
+
+#### Slimefun
+
+**Slimefun quest items** are ItemStacks which belong to the Slimefun
+plugin.
+
+ items/testitem.yml
+
+``` yaml
+type: "slimefun"
+item:
+ id: "slimefun_item_id" #slimefun id
+```
+
+#### ExecutableItems
+
+**ExecutableItems quest items** are ItemStacks which belong to the
+ExecutableItems plugin.
+
+ items/testitem.yml
+
+``` yaml
+type: "executableitems"
+item:
+ id: "executableitems_id" #executableitems id
+```
+
+### Referencing a quest item
+
+In most cases where an ItemStack is accepted in Quests, you can simply
+provide the ID of the quest item under the key `quest-item`.
+
+``` yaml
+# Within a task
+type: "inventory"
+item:
+ quest-item: "testitem"
+```
diff --git a/docs/configuration/global-configurations.md b/docs/configuration/global-configurations.md
new file mode 100644
index 00000000..6be6b744
--- /dev/null
+++ b/docs/configuration/global-configurations.md
@@ -0,0 +1,103 @@
+---
+title: Global configurations
+parent: Configuration
+nav_order: 4
+---
+
+# Global configurations
+
+**Global configurations** are intended to be used in place of
+**quest-specific configurations**. This helps reduce repetition across
+your configuration as you copy common elements from quest to quest, and
+also allows you to quickly propagate edits across quests.
+
+## Global task configuration
+
+A global task configuration will add configuration values to all tasks
+of a specified type.
+
+For example (in `config.yml`),
+
+``` yaml
+...
+global-task-configuration:
+ types:
+ inventory:
+ update-progress: true
+...
+```
+
+This will add to *all* tasks configurations with `type: inventory`
+across *all* quests the following: `update-progress: true`.
+
+{: .note }
+Any errors which arise from global task configurations will appear as
+if they are coming from individual quests.
+
+Quest-level configurations will override anything set here. To change
+this behaviour, modify the [global task configuration
+override](Basic_options#Global_task_configuration_override "wikilink").
+
+## Global quest display configuration
+
+A global quest display configuration adds text to the display items of
+items in the GUI.
+
+By default, this is already configured:
+
+``` yaml
+global-quest-display:
+ lore:
+ append-not-started:
+ - ""
+ - "&eLeft Click &7to start this quest."
+ append-started:
+ - ""
+ - "&aYou have started this quest."
+ - "&eMiddle Click &7to track this quest."
+ - "&eRight Click &7to cancel this quest."
+ append-tracked:
+ - ""
+ - "&aYou are &etracking &athis quest."
+ - "&eMiddle Click &7to stop tracking this quest."
+ - "&eRight Click &7to cancel this quest."
+```
+
+<img src="https://i.imgur.com/l0FI5Ma.png" width="450px">
+
+If you do not want this, simply remove the section.
+
+## Global macros
+
+Global macros help you reduce repetition across your configuration
+files by centralizing values in your config.yml. Think of them as your
+own variables/placeholders which you can use in your quest files.
+
+You can define macros in your `config.yml`, under the `global-macros`
+section:
+
+ global-macros:
+ ...
+ # <name of macro>: <string value of macro>
+ top-bar: "&6---&7---&6---"
+
+To use these in your quests, reference it by using
+`<$m name-of-macro $m>`. Macro names **cannot have spaces**.
+
+For example, to use the `top-bar` macro in `example-quest.yml`:
+
+``` yaml
+tasks:
+ ...
+display:
+ ...
+ lore-normal:
+ - "<$m top-bar $>"
+ - "..."
+ ...
+```
+
+{: .caution }
+Macros are replaced by a pre-processor before a configuration is
+parsed. This means they have the ability to cause syntax errors in
+ways you do not expect if you are not careful. \ No newline at end of file
diff --git a/docs/configuration/gui-configuration.md b/docs/configuration/gui-configuration.md
new file mode 100644
index 00000000..6a40629a
--- /dev/null
+++ b/docs/configuration/gui-configuration.md
@@ -0,0 +1,269 @@
+---
+title: GUI configuration
+parent: Configuration
+nav_order: 6
+---
+
+# GUI configuration
+
+*See also [Custom GUI items](Custom_GUI_items "wikilink") and [Defining
+items](Defining_items "wikilink").*
+
+The **GUI configuration** is defined in the `config.yml`. These define
+the static UI elements such as the back button, quest locked display
+etc. All options accept the standard ItemStack definition format
+described in [Defining items](Defining_items "wikilink").
+
+## Back button
+
+
+*`gui.back-button`*
+
+The back button displayed within sub menus.
+
+``` yaml
+gui:
+ ...
+ back-button:
+ name: "&cReturn"
+ lore:
+ - "&7Return to the categories menu."
+ type: "ARROW"
+```
+
+## Page previous
+
+
+*`gui.page-prev`*
+
+The previous page button displayed on paiginated menus.
+
+``` yaml
+gui:
+ ...
+ page-prev:
+ name: "&7Previous Page"
+ lore:
+ - "&7Switch the page to page &c{prevpage}."
+ type: "FEATHER"
+```
+
+The `{prevpage}` variable represents the page number for the previous
+page.
+
+## Page next
+
+
+*`gui.page-next`*
+
+The next page button displayed on paiginated menus.
+
+``` yaml
+gui:
+ ...
+ page-next:
+ name: "&7Next Page"
+ lore:
+ - "&7Switch the page to page &c{nextpage}."
+ type: "FEATHER"
+```
+
+The `{nextpage}` variable represents the page number for the next page.
+
+## Page description
+
+
+*`gui.page-next`*
+
+The current page item displayed on paginated menus. The amount of this
+item will automatically update on the page number.
+
+``` yaml
+gui:
+ ...
+ page-desc:
+ name: "&7Page &c{page}"
+ lore:
+ - "&7You are currently viewing page &c{page}."
+ type: "PAPER"
+```
+
+The `{page}` variable represents the page number for the current page.
+
+## Quest locked display
+
+
+*`gui.quest-locked-display`*
+
+The item is used to represent locked quests. A quest is locked if its
+[requirements](Creating_a_quest#Requirements "wikilink") are not met.
+
+``` yaml
+gui:
+ ...
+ quest-locked-display:
+ name: "&c&lQuest Locked"
+ lore:
+ - "&7You have not completed the requirements"
+ - "&7for this quest (&c{quest}&7)."
+ - ""
+ - "&7Requires: &c{requirements}"
+ - "&7to be completed to unlock."
+ type: "RED_STAINED_GLASS_PANE"
+```
+
+The `{quest}` variable represents the quest [display
+name](Creating_a_quest#name "wikilink"), with its formatting stripped.
+
+The `{questid}` variable represents the quest ID.
+
+The `{requirements}` variable represents the display names of the quests
+needed to unlock this quest. By default, this name is truncated to show
+only the first quest, with a number after (e.g. "Example II +4 more").
+This behaviour is defined at [Basic options § GUI-truncate
+requirements](basic-options.md#GUI-truncate-requirements "wikilink")
+
+## Quest permission display
+
+
+*`gui.quest-permission-display`*
+
+The item is used to represent quests which the player does not have
+permission to start.
+
+``` yaml
+gui:
+ ...
+ quest-permission-display:
+ name: "&6&lNo Permission"
+ lore:
+ - "&7You do not have permission for this"
+ - "&7quest (&6{quest}&7)."
+ type: "BROWN_STAINED_GLASS_PANE"
+```
+
+The `{quest}` variable represents the quest [display
+name](Creating_a_quest#name "wikilink"), with its formatting stripped.
+
+The `{questid}` variable represents the quest ID.
+
+## Quest cooldown display
+
+
+*`gui.quest-cooldown-display`*
+
+The item is used to represent quests which are repeatable, the player
+has completed, but are on cooldown.
+
+``` yaml
+gui:
+ ...
+ quest-cooldown-display:
+ name: "&e&lQuest On Cooldown"
+ lore:
+ - "&7You have recently completed this quest"
+ - "&7(&e{quest}&7) and you must"
+ - "&7wait another &e{time} &7to unlock again."
+ type: "ORANGE_STAINED_GLASS_PANE"
+```
+
+The `{quest}` variable represents the quest [display
+name](Creating_a_quest#name "wikilink"), with its formatting stripped.
+
+The `{questid}` variable represents the quest ID.
+
+The `{time}` variable represents the formatted time remaining until the
+cooldown period is over. This can be configured in the messages section.
+
+## Quest completed display
+
+
+*`gui.quest-completed-display`*
+
+The item is used to represent quests which are completed and not
+repeatable.
+
+``` yaml
+gui:
+ ...
+ quest-completed-display:
+ name: "&a&lQuest Complete"
+ lore:
+ - "&7You have completed this quest"
+ - "&7(&a{quest}&7) and cannot."
+ - "&7repeat it."
+ type: "GREEN_STAINED_GLASS_PANE"
+```
+
+The `{quest}` variable represents the quest [display
+name](Creating_a_quest#name "wikilink"), with its formatting stripped.
+
+The `{questid}` variable represents the quest ID.
+
+## No started quests
+
+
+*`gui.no-started-quests`*
+
+This is shown as the only item in the quest started menu if the player
+has not started any quests.
+
+``` yaml
+gui:
+ ...
+ no-started-quests:
+ name: "&c&lNo Started Quests"
+ lore:
+ - "&7Go start some!"
+ type: "FEATHER"
+```
+
+## Quest cancel yes
+
+
+*`gui.quest-cancel-yes`*
+
+Confirmation item in the quest cancel menu.
+
+``` yaml
+gui:
+ ...
+ quest-cancel-yes:
+ name: "&a&lConfirm Cancel"
+ lore:
+ - "&7Confirm you wish to cancel"
+ - "&7this quest and lose all"
+ - "&7progress."
+ type: "GREEN_STAINED_GLASS_PANE"
+```
+
+## Quest cancel no
+
+
+*`gui.quest-cancel-no`*
+
+Cancellation item in the quest cancel menu.
+
+``` yaml
+gui:
+ ...
+ quest-cancel-no:
+ name: "&c&lAbort Cancel"
+ lore:
+ - "&7Return to the quest menu."
+ type: "RED_STAINED_GLASS_PANE"
+```
+
+## Quest cancel background
+
+
+*`gui.quest-cancel-background`*
+
+Background item in the quest cancel menu.
+
+``` yaml
+gui:
+ ...
+ quest-cancel-background:
+ type: "GRAY_STAINED_GLASS_PANE"
+```
diff --git a/docs/configuration/index.md b/docs/configuration/index.md
new file mode 100644
index 00000000..32f9e38e
--- /dev/null
+++ b/docs/configuration/index.md
@@ -0,0 +1,7 @@
+---
+title: Configuration
+nav_order: 5
+has_children: true
+---
+
+# Configuration \ No newline at end of file
diff --git a/docs/configuration/storage-providers.md b/docs/configuration/storage-providers.md
new file mode 100644
index 00000000..f8d68886
--- /dev/null
+++ b/docs/configuration/storage-providers.md
@@ -0,0 +1,137 @@
+---
+title: Storage providers
+parent: Configuration
+nav_order: 10
+---
+
+# Storage providers
+{: .no_toc }
+
+A **storage provider** is a source for player data
+(sometimes referred to as quest progress files). Quests requires that
+one storage system be configured to allow the plugin to initialise. If
+there is no storage system configured, the plugin will default to
+**yaml** storage. If there is an error for any reason during the
+initialisation of a storage system, the plugin will be disabled.
+
+- YAML (`yaml`)
+- MySQL (`mysql`)
+
+When changing storage systems, **the plugin must be restarted for the
+changes to have effect**.
+
+## Table of contents
+{: .no_toc .text-delta }
+
+1. TOC
+{:toc}
+
+## Supported storage systems
+
+### Flatfile
+
+#### YAML
+
+Storing player data in YAML files is the default storage method in
+Quests, and is a type of 'flatfile' storage.
+
+``` yaml
+options:
+ ...
+ storage:
+ provider: "yaml"
+```
+
+Player data can be found inside Quests/playerdata/ and can be modified
+as long as the server is not running. It is not recommended to try and
+alter these files while the server is online, as this could cause data
+consistency issues.
+
+### Network
+
+{: .warning }
+> ️**Using Quests on a BungeeCord network may lead to a possible race
+> condition.** Allowing players to to connect directly to another server
+> running Quests may result in the new server loading old data. This
+> happens because BungeeCord establishes a connection with the new server
+> before disconnecting the player from the old one, leading to the new
+> server loading player data before the old server has saved it.
+>
+> Quests offers a workaround, which is to [delay the loading of player
+> data](#delay-loading "wikilink"). You may also want to
+> consider forcing players to switch servers through a hub server, or
+> decreasing the autosave period. In either case, the race condition still
+> exists; there is not an easy way to coordinate the loading/saving due to
+> how BungeeCord works. **You must understand this warning before using
+> Quests in this way.**
+
+#### MySQL
+
+Quests can connect to and store player data in a MySQL database. This is
+particularly useful if you want to have multiple servers use the same
+player data.
+
+``` yaml
+options:
+ ...
+ storage:
+ provider: "mysql"
+```
+
+You must also configure the plugin to connect to the database.
+
+``` yaml
+ database-settings:
+ network:
+ database: "minecraft"
+ username: "root"
+ password: ""
+ address: "localhost:3306"
+```
+
+The database specified **must** exist before connecting Quests to it.
+The address is given in the following format: ip:port (e.g
+127.0.0.1:3306).
+
+There are also some other options you can configure, as Quests uses
+HikariCP to manage its connections to the database. You can see
+descriptions of each option on the [HikariCP
+README](https://github.com/brettwooldridge/HikariCP).
+
+``` yaml
+ connection-pool-settings:
+ maximum-pool-size: 8
+ minimum-idle: 8
+ maximum-lifetime: 1800000
+ connection-timeout: 5000
+ table-prefix: "quests_"
+```
+
+## Data synchronisiation
+
+### Delay loading
+
+Quests offers a workaround to the [race
+condition](Storage_providers#Network "wikilink"), which is to delay the
+loading of player data in hopes that the server before has enough time
+to save the data.
+
+You can enable this in your config here:
+
+``` yaml
+options:
+ ...
+ storage:
+ provider: "mysql"
+ synchronisation:
+ delay-loading: 0 # (ticks - change to any value above 0)
+ ...
+```
+
+A value of 50 (2.5 seconds) should be enough for most servers, however
+you may want to increase it if, for example, your database is not on the
+same network as your Minecraft server. Again, this **does not solve the
+race condition**, but it should help mitigate it.
+
+See the issue in the issue tracker:
+[Issue 180](https://github.com/LMBishop/Quests/issues/180)