Join our discord
In partnership with NodeCraft Logo NodeCraft


You are not logged in! Create an account or login to contribute! Log in here!
From Pixelmon Wiki

This is a step-by-step guide on building your own quests!

Blank Quest

This blank quest has had all details removed. For the purpose of this guide, it will be used as a reference and starting point to building your own quests.

Show


Quest Information

At the top of all quests, there will be four fields which need to be set.

radiant

The radiant is used to specify if the quest uses inserters to make it available for completion by players. Inserters will be covered in in Quest Stages.

If the radiant is set to true, inserters (#!) will be used by the quest. If set to false, inserters will not be used - typically used by Instantaneous quests. An example of what this looks like in the quest file is "radiant": true.

In the Blank Quest, it has been set to true as it will use inserters in the stages.

type

The type is used to specify which of the following types the quest will be. This is used to change the logic of the quest (for example, if the quest type is Repeatable, it will be made available to complete multiple times) and the color of the quest markers.

The types available are shown below. The type (for example, Legendary) would need to be specified rather than the color (for example, Red). An example of what this looks like in the quest file is "type": "Legendary".

Type Color
Standard Yellow
Repeatable Blue
Instantaneous Green
Legendary Red

activeStage

The activeStage is used to specify the stage number at which the quest will appear in the player's quest log.

The activeStage will need to be a number which corresponds to one of the stage's numbers (for example, "stage": 0).

Quests that use the DIALOGUE objective on the first stage (stage 0) to ask the player if they wish to accept the quest or not will have the activeStage set to the next stage (stage 10) as the player has to accept the quest before it is available in their quest log.

In the Blank Quest, it has been set to 10 as the player will have to accept the quest.

strings

The strings are used to specify names and messages that will appear in the player's quest log.

As a minimum, quests require the strings name, desc-# (# being a stage number), desc-X, and stage-##-# (## being a stage number). If the quest has multiple stages, there can be additional strings for desc-# and stage-##-# with the appropriate stage number to help direct the player.

String Name Description
name This is the name of the quest which is displayed.
desc-# This is the message describing the quest in the player's quest log. # would represent the stage number.
desc-X This is the message shown for the quest in the history log.
npcName This is the name of the NPC which is displayed.
start This is the message given by the DIALOGUE objective to the player before they either accept or decline the quest.
startYes This is the message given by the DIALOGUE objective to the NPC when the player accept the quest.
startNo This is the message given by the DIALOGUE objective to the NPC when the player decline the quest.
stage-#-## This is a message the player receives in chat when they start the stage directing them what to do. # would represent the stage number whereas the ## would represent the objective. For example: stage-10-0 is the 0th objective whereas stage-10-1 is the first objective.
end This is the message given by the DIALOGUE objective to the player when they end the quest.
goodbye This is the message given by the DIALOGUE objective to the NPC when the player finishes the quest.

Inserters

Inserters are used to make the quest accessible to players. For inserters to be used, the radiant is required to be set to true else, they will not be used. The #! is the inserter symbol. There are two types of inserters: entities and Pokémon.

Entities

Entity inserters are used by the DIALOGUE and NPC_RESPOND objectives. This type of inserter uses the format #!<type>,<mode>,<chance>,[range],[times...].

Argument Description
<type> The type determines what kind of entity the inserter will work on. Specifying NPC causes the inserter to work on NPCs whereas specifying Pixelmon causes it to work on Pokémon.
<mode> The mode determines how the inserter is created. Specifying Time will cause the inserter to be created at a specific time with the specify time(s) specified in the [times...]. Specifying Spawn will cause the inserter to have a chance to be created when the entity spawns.
<chance> The chance determines the chance of the inserter being produced. A decimal value can be specified, with 1 being a guaranteed chance of this occuring.
[range] The range determines the maximum distance away entities can be away from the player for this to occur. The [range] argument is only required if the <mode> has been set to Time.
[times...] The times are used to specify the world times the inserter will happen on. Multiple world times can be used as long as they are comma list separated. The [times...] argument is only required if the <mode> has been set to Time.

An example of an NPC entity inserter would be #!NPC,Time,0.5,150,0. This inserter has a 50% chance for NPCs within 150 blocks of the player to be inserted when the world time is 0.

An example of an Pokémon entity inserter would be #!Pixelmon,Spawn,0.01. This inserter has a 1% chance for Pokémon to be inserted at on spawn.

If the inserter succeeds, the UUID of the entity is put in to the quest data value NPC<stage>. For example NPC0. From then, the inserter itself will act like NPC0 from then on.

Pokémon

Pokémon inserters are used by the Pokémon objectives (POKEMON_CAPTURE, POKEMON_DEFEAT, POKEMON_EVOLVE_POST, POKEMON_EVOLVE_PRE, POKEMON_HAS, POKEMON_HATCH, POKEMON_TRADE_GET and POKEMON_TRADE_GIVE). This type of inserter uses the format #!<type>,<type arg>,<natures>,<growths>.

Argument Description
<type> The type determines what kind of Pokémon the inserter will work on. Specifying Dex with a list of specific PokéDex entry numbers will cause the inserter to be inserted on the specific Pokémon whose PokéDex entry numbers have been specified. Specifying DexRange with a range of PokéDex entry numbers will cause the inserter to be inserted on the Pokémon whose PokéDex entry numbers have been specified. Specifying Types with a list of types will cause the inserter to be inserted on the Pokémon with the typing specified.
<type arg> The type arg determines the specifics about the <type>. If Dex has been specified, a semicolon separated list of PokéDex entry numbers is used or any if unspecified. For example, 1;2;3 would specify Bulbasaur, Ivysaur and Venusaur. If DexRange has been specified, a range of PokéDex entry numbers is used. For example, 10-40 would specify all entries from Caterpie to Wigglytuff. If Types has been specified, a semicolon separated list of Types is used or any if unspecified. For example, Fire;Water;Grass would specify all Fire, Water or Grass types.
<natures> The natures determines what natures the inserters are required to have to be inserted on. Multiple natures can be specified using a semicolon separated list or any if unspecified. For example, Moody;Adamant;Lax would specify any inserter with the natures Moody, Adamant or Lax.
<growths> The growths determines growths the inserters are required to have to be inserter on. Multiple growths can be specified using a semicolon separated list or any if unspecified. For example, Microscopic;Giant;Huge would specify any inserter with the growths Microscopic, Giant or Huge.

An example of a Dex Pokémon inserter would be #!Dex,any,Lax;Adamant,any. This inserter will choose between Lax or Adamant at random, and then looks for the Pokémon it chose.

An example of a DexRange Pokémon inserter would be #!DexRange,1-151,any,any. This inserter will choose a Generation 1 Pokémon at random, and then looks for the Pokémon it chose.

An example of a Type Pokémon inserter would be #!Types,Fire;Water;Grass,any,Tiny. This inserter will choose between Fire, Water or Grass at random, and then it looks the Pokémon with the type chosen and a Tiny growth.

If the inserter succeeds, the fields which aren't specified as any will put the following information into the quest data.

Value Result
POKEMON<stage>S Species
POKEMON<stage>T Type
POKEMON<stage>N Nature
POKEMON<stage>G Growth

The Pokémon Spec can be obtained with the data field POKEMON<stage>. Quest data can be referred to by the MESSAGE action and quest strings using the placeholder %POKEMON<stage><value>%. For example, %POKEMON10S% would display the Pokémon inserter's species generated by the inserter in stage 10.

Quest Stages

All quests will have stages, these are what the player will progress through.

stage

The stage is used to specify different parts of the quest and what the player will need to progress through. Stages are given a unique number, these are located by the "stage":.

It is recommended to have the general rule of a quest's first stage being stage 0 ("stage": 0), the next being 10 ("stage": 10), the next being 20 ("stage": 20) and so fourth.

nextStage

The nextStage is used to specify the next stage which will follow after the current one. As previously explained, stages are given unique numbers, located by the "stage":.

If there is a stage after the current one, the "nextStage": would have specified the number of that next stage ("nextStage":10). This number would be next to the "stage": field. If the current stage if the final one, the "nextStage": would have specified "-1":. For example: "nextStage": -1.

objectives

Objectives are goals in which the player has to complete to progress.

Objectives follow the format of <executor> <objective name> <arguments>. The <objective name> and <arguments> can be found in the table below.

The <executor> is used to specify when the action is ran. For example 0 APRICORN_HARVEST item=pixelmon:red_apricorn count=1. In this example, the executor has been set to 0 which means that once objective 0 of this stage has been complete, perform this action.

Executors can also have multiple values specified. For example, 0,1,2 APRICORN_HARVEST item=pixelmon:red_apricorn count=1. This means that once objective 0 or 1 or 2 have been completed in this stage, perform this action. Additionally, an AND condition can be used which means that all objectives specified have to be completed for the action to be performed. For example, +0,1 APRICORN_HARVEST item=pixelmon:red_apricorn count=1. This means that once both objectives 0 and 1 have been completed, perform this action

Objective Name Required Arguments Optional Arguments Description
ABSOLUTE_POSITION <x1>
[y1]
<z1>
<x2>
[y2]
<z2>
<dimension>
None This objective completes once the player is within an area specified by <x1>, <z1>, <x2> and <z2> in <dimension>. The optional arguments of [y1] and [y2] can also be added. For example: ABSOLUTE_POSITION 8412 75 7767 8401 80 7758 3.
APRICORN_HARVEST item=
count=
mod=
tag=
name=
damage=
This objective completes once the player harvests the Apricorn amount specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: APRICORN_HARVEST item=pxielmon:red_apricorn count=1.
BATTLE_MOVE_TARGET soundbase=[true/false]
count=[number]
category=[physical/special/status]
type=[any of the 17 types]
move=[attack name],[attack name],[attack name],[attack name]
result=[proceed/hit/ignore/killed/succeeded/charging/unable/failed/missed/notarget]
damage[=/</>][number]
fulldamage[=/</>][number]
accuracy[=/</>][number]
None This objective completes once the target Pokémon of a battle meet the conditions specified by soundbase=[true/false] count=[number] category=[physical/special/status] type=[any of the 17 types] move=[attack name],[attack name],[attack name],[attack name] result=[proceed/hit/ignore/killed/succeeded/charging/unable/failed/missed/notarget] damage[=/</>][number] fulldamage[=/</>][number] accuracy[=/</>][number].
BATTLE_MOVE_USER soundbase=[true/false]
count=[number]
category=[physical/special/status]
type=[any of the 17 types]
move=[attack name],[attack name],[attack name],[attack name]
result=[proceed/hit/ignore/killed/succeeded/charging/unable/failed/missed/notarget]
damage[=/</>][number]
fulldamage[=/</>][number]
accuracy[=/</>][number]
None This objective completes once the user Pokémon of a battle meet the conditions specified by soundbase=[true/false] count=[number] category=[physical/special/status] type=[any of the 17 types] move=[attack name],[attack name],[attack name],[attack name] result=[proceed/hit/ignore/killed/succeeded/charging/unable/failed/missed/notarget] damage[=/</>][number] fulldamage[=/</>][number] accuracy[=/</>][number].
BLOCK_BREAK item=
count=
mod=
tag=
name=
damage=
This objective completes once the player breaks the block specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: BLOCK_BREAK item=minecraft:stone count=1.
BLOCKER None None This objective can't be completed. It is intended to be used alongside the SET_STAGE objective. If the quest is started by something else (for example, an Instantaneous quest or a plugin), a BLOCKER objective is required in the first stage.
BLOCK_PLACE item=
count=
mod=
tag=
name=
damage=
This objective completes once the player places the block specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: BLOCK_PLACE item=minecraft:stone count=1.
BLOCK_USE item=
count=
mod=
tag=
name=
damage=
This objective completes once the player uses the block specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: BLOCK_USE item=minecraft:stone_button count=1.
DIALOGUE <uuid or inserter>
name=
text=
choice= This objective can't be completed. It causes the the NPC specified by <uuid|inserter> with the specified name string name=to display the message string specified by text=. The optional addition of choice= can be added multiple times so the player can pick responses. For example: "DIALOGUE 0eb8e4fa-f8dc-4648-989b-98ac5bd417a3 name=npcName text=start choice=startYes choice=startNo".
DIMENSION <dimension> None This objective completes once the player is within the dimension specified by <dimension>. For example: DIMENSION 1.
ENTITY_INTERACT <uuid or class name>
<count>
None This objective completes once the player has interacted an entity specified by <uuid|class name> and <count>. For example: ENTITY_INTERACT Creeper 1.
ENTITY_VICINITY <uuid or class name>
<count>
<distance>
None This objective completes once the player is within an area specified by <distance> of an entity specified by <uuid|class name> and <count>. For example: ENTITY_VICINITY Creeper 1 10.
FOLLOWTHROUGH None None This objective will automatically complete.
ITEM_CRAFT item=
count=
mod=
tag=
name=
damage=
This objective completes once the player crafts the item specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: ITEM_CRAFT item=minecraft:enchanting_table count=1 mod=minecraft tag=TagA tag=TagB name=Crafting Example damage=100.
ITEM_DROP item=
count=
mod=
tag=
name=
damage=
This objective completes once the player drops the item specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: ITEM_DROP item=minecraft:enchanting_table count=1 mod=minecraft tag=TagA tag=TagB name=Crafting Example damage=100.
ITEM_PICKUP item=
count=
mod=
tag=
name=
damage=
This objective completes once the player picks up the item specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: ITEM_PICKUP item=minecraft:enchanting_table count=1 mod=minecraft tag=TagA tag=TagB name=Crafting Example damage=100.
ITEM_SMELT item=
count=
mod=
tag=
name=
damage=
This objective completes once the player smelts the the item specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: ITEM_SMELT item=minecraft:iron_ore count=1 mod=minecraft tag=TagA tag=TagB name=Crafting Example damage=100.
ITEM_USE item=
count=
mod=
tag=
name=
damage=
This objective completes once the player uses the item specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: ITEM_USE item=minecraft:enchanting_table count=1 mod=minecraft tag=TagA tag=TagB name=Crafting Example damage=100.
NPC_RESPOND <uuid> [index] This objective is used alongside the DIALOGUE objective. This objective is used is give a response to the NPC specified by <uuid> or * from the player. The optional argument of [index] can also be added to specify the position of the reply given. Not specifying an index would give it a value of 0.
POKEMON_CAPTURE <pokémon specs or inserter>
<count>
None This objective completes once the player captures the Pokémon specified by <pokémon specs or inserter> and <count>. For example: POKEMON_CAPTURE #!Types,any,any,any 30.
POKEMON_DEFEAT <pokémon specs or inserter>
<count>
None This objective completes once the player defeats the Pokémon specified by <pokémon specs or inserter> and <count>. For example: POKEMON_DEFEAT #!Types,any,any,any 30.
POKEMON_EVOLVE_POST <pokémon specs or inserter>
<count>
None This objective completes once the player evolves the Pokémon specified by <pokémon specs or inserter> and <count>. For example, POKEMON_EVOLVE_PRE Charamander 1 would complete before the Pokémon evolves.
POKEMON_EVOLVE_PRE <pokémon specs or inserter>
<count>
None This objective completes once the player evolves the Pokémon specified by <pokémon specs or inserter> and <count>. For example, POKEMON_EVOLVE_POST Charmeleon1 would complete after the Pokémon evolves.
POKEMON_HAS <pokémon specs or inserter>
<count>
None This objective completes once the player has the Pokémon specified by <pokémon specs or inserter> and <count>. For example: POKEMON_HAS #!Types,any,any,any 1.
POKEMON_HATCH <pokémon specs or inserter>
<count>
None This objective completes once the player hatches the Pokémon specified by <pokémon specs or inserter> and <count>. For example: POKEMON_HATCH #!Types,any,any,any 30.
POKEMON_TRADE_GET <pokémon specs or inserter>
<count>
None This objective completes once the player received via a trade the Pokémon specified by <pokémon specs or inserter> and <count>. For example: POKEMON_TRADE_GET #!Types,any,any,any 1.
POKEMON_TRADE_GIVE <pokémon specs or inserter>
<count>
None This objective completes once the player gives via a trade the Pokémon specified by <pokémon specs or inserter> and <count>. For example: POKEMON_TRADE_GIVE #!Types,any,any,any 1.
RANDOM <Weight>:<ActionA>
<Weight>:<ActionB>
None This objective automatically completes and randomly selects an action specified by <Weight>:<ActionA> and <Weight>:<ActionB>. For example: RANDOM 1:0 99:1, has a weight of 1 for Action 0 and a Weight of 99 for Action 1. This means there's a 1% chance to proceed to Action 0, as its a weight of 1 out of the total of 100 (1+ 99).
SERVER_TIME <time> [range] This objective completes once the server has hit a time specified by <time>. The optional arguments of [range] can also be added to specify a time range before and after. For example: SERVER_TIME 12:00.
STRUCTURE <structure name> None This objective completes once the player is within the structure specified by <structure name>. For example: STRUCTURE Stronghold.
TILEENTITY_VICINITY <uuid or class name>
<count>
<distance>
None This objective completes once the player is within an area specified by <distance> of an tile entity specified by <uuid|class name> and <count>. For example: TILEENTITY_VICINITY TileEntityChest 1 10.
WORLD_TIME <time> [range] This objective completes once the world has hit a time specified by <time>. The optional arguments of [range] can also be added to specify a time range before and after. For example: WORLD_TIME 12:00.

actions

Actions are rewards which the player receives once they have completed an objective.

Action Name Required Arguments Optional Arguments Description
COMMAND <command> None Runs the command specified by <command> as the console. @p can be used as a placeholder for the player's username. For example COMMAND megaring @p.
COMPLETE_QUEST None None Finishes and completes the quest for the player.
FAIL_QUEST None None Stops and fails the quest for the player.
ITEM_GIVE item=
count=
mod=
tag=
name=
damage=
Gives the player the item specified by item= and count=. The optional arguments of mod=, multiple versions of tag=TagA and tag=TagB, name= and damage= can also be added. For example: ITEM_GIVE item=pixelmon:rare_candy count=1 mod=pixelmon tag=TagA tag=TagB name=Item Example damage=100.
MESSAGE <message> None Displays the message specified by <message> to the player in their chat. @p can be used as a placeholder for the player's username. MOTD Codes can be inserted before the <message> to give them some color. For example: MESSAGE \u00A7eHello @p!.
POKEMON_GIVE <Pokémon Spec> None Gives the player the Pokémon specified by <Pokémon Spec>. For example: POKEMON_GIVE Dragonite shiny:true nature:jolly growth:microscopic unbreedable.
POKEMON_SPAWN <x>
<y>
<z>
<Pokémon Spec>
None Spawns the Pokémon specified by <Pokémon Spec> at the specified coordinates <x>, <y>, and <z>. ~ can be for the relative whilst r can be used for the radius. For example POKEMON_SPAWN 0 100 0 Dragonite shiny:true nature:jolly growth:microscopic unbreedable.
SET_STAGE <stage number> [Quest filename].json Sets the player to the stage number specified by <stage number>. The optional argument of [Quest filename].json can also be added to set the player to the stage specified on a different quest. For example: SET_STAGE 10 Another Quest.json.
TELEPORT X=
Y=
Z=
YAW=
PITCH=
DIM=
None Teleports the player to the location specified by X=, Y=, Z=. YAW= can be used to specify the direction the player is looking, PITCH= can be used to specify if the player is looking up or down and DIM= can be used to specify the dimension ID. ~ can be for the relative whilst r can be used for the radius. For example: TELEPORT X=~0 Y=~100 Z=~0 YAW=0 PITCH=0 DIM=1.

© 2014 - 2020 Pixelmon Mod