Skip to content

Event System

Events are what make tasks tick. Every time something happens in the game — a player catches a Pokemon, wins a battle, enters a zone, breaks a block — Journey fires an event. Tasks listen for specific events, check if they match a filter, and award progress when they do.

Understanding events is the key to building great quests. This page covers every event type, what data it provides, and how to write filters for it.


  1. Something happens — A player catches a Pokemon
  2. Journey fires an eventPOKEMON_CAUGHT with the caught Pokemon’s data
  3. Active subtasks check their filters — “Is this a Pikachu? Is it shiny?”
  4. Matching subtasks gain progress — Progress goes up by 1 (or by item count for some events)

Here’s what that looks like in a subtask:

{
"event": "POKEMON_CAUGHT",
"filter": "q.pokemon.species.identifier == 'cobblemon:pikachu' && q.pokemon.is_shiny",
"target": 1
}

This subtask only advances when the player catches a shiny Pikachu.


Filters are Molang expressions that return a truthy value (anything non-zero) when the event should count.

"filter": "1.0" Always matches
"filter": "0.0" Never matches
"filter": "q.pokemon.level >= 50" Pokemon level 50+
"filter": "q.pokemon.is_shiny" Shiny Pokemon only
AND: q.pokemon.is_shiny && q.pokemon.level >= 50
OR: q.battle.is_pvw || q.battle.is_pvn
NOT: !q.battle.is_pvw

You can always check player state in any event filter:

q.player.has_flag('tutorial_complete')
q.player.is_in_zone('beach-zone-uuid')
q.player.has_completed_task('journey:intro_quest')
q.player.levelable_level('trainer_rank') >= 10

This lets you create context-aware objectives like “catch Pokemon, but only while in the Safari Zone.”


Fires when a player enters a zone.

Data PathTypeDescription
q.zone.uuidStringZone’s unique identifier
q.zone.nameStringZone’s display name
{
"event": "ENTER_ZONE",
"filter": "q.zone.uuid == '21af4251-ed97-499c-8445-3e6152fbcbb7'",
"target": 1
}

Fires when a player exits a zone. Same data as ENTER_ZONE.

{
"event": "LEAVE_ZONE",
"filter": "q.zone.uuid == 'pallet-town-uuid'",
"target": 1
}

Fires when a player enters a specific sub-area within a zone.

Data PathTypeDescription
q.zoneStructParent zone data
q.areaStructSpecific area data

Fires when a player catches a wild Pokemon.

Data PathTypeDescription
q.pokemon.species.identifierStringSpecies ID (e.g., 'cobblemon:pikachu')
q.pokemon.levelNumberPokemon’s level
q.pokemon.is_shinyNumber1.0 if shiny
q.pokemon.natureStringNature name
q.pokemon.abilityStringAbility name
q.pokemon.genderStringMALE, FEMALE, or GENDERLESS
q.pokemon.pokeballStringBall type used to catch
q.pokemon.formStringForm name
q.pokemon.ivs.hpNumberHP IV (0-31)
q.pokemon.ivs.attackNumberAttack IV
q.pokemon.ivs.defenceNumberDefence IV
q.pokemon.ivs.special_attackNumberSpecial Attack IV
q.pokemon.ivs.special_defenceNumberSpecial Defence IV
q.pokemon.ivs.speedNumberSpeed IV

Examples:

Catch a specific species:

{
"event": "POKEMON_CAUGHT",
"filter": "q.pokemon.species.identifier == 'cobblemon:magikarp'",
"target": 10
}

Catch any shiny:

{
"event": "POKEMON_CAUGHT",
"filter": "q.pokemon.is_shiny",
"target": 1
}

Catch high-level Pokemon in a specific zone:

{
"event": "POKEMON_CAUGHT",
"filter": "q.pokemon.level >= 50 && q.player.is_in_zone('safari-zone-uuid')",
"target": 5
}

Fires when a player’s Pokemon evolves.

Data PathTypeDescription
q.pokemon.species.identifierStringNew species after evolution
q.pokemon.levelNumberCurrent level
q.pokemon.is_starterNumber1.0 if this is the player’s starter
q.pokemon.is_shinyNumber1.0 if shiny

Examples:

Evolve your starter:

{
"event": "POKEMON_EVOLVE",
"filter": "q.pokemon.is_starter",
"target": 1
}

Evolve into a specific species:

{
"event": "POKEMON_EVOLVE",
"filter": "q.pokemon.species.identifier == 'cobblemon:charizard'",
"target": 1
}

Fires when a Pokemon gains a level.

Data PathTypeDescription
q.pokemon.levelNumberNew level after leveling up
q.pokemon.is_starterNumber1.0 if starter
q.pokemon.species.identifierStringSpecies ID

Examples:

Starter reaches level 16:

{
"event": "POKEMON_LEVEL_UP",
"filter": "q.pokemon.is_starter && q.pokemon.level >= 16",
"target": 1
}

Any Pokemon reaches level 100:

{
"event": "POKEMON_LEVEL_UP",
"filter": "q.pokemon.level >= 100",
"target": 1
}

Fires when a Pokemon egg hatches.

Data PathTypeDescription
q.pokemonStructThe hatched Pokemon (full Pokemon data)
q.pokemon.is_shinyNumber1.0 if shiny
{
"event": "HATCH_EGG",
"filter": "q.pokemon.is_shiny",
"target": 1
}

Fires when a player selects their starter Pokemon.

Data PathTypeDescription
q.pokemonStructChosen starter Pokemon
{
"event": "STARTER_CHOSEN",
"filter": "1.0",
"target": 1
}

Fires when a player wins a battle.

Data PathTypeDescription
q.battle.is_pvwNumber1.0 for wild Pokemon battles
q.battle.is_pvnNumber1.0 for NPC/trainer battles
q.battle.is_pvpNumber1.0 for player vs player
q.battle.team.contains_starterNumber1.0 if starter was in the team
q.battle.team.pokemon(index)StructGet team Pokemon by slot (0-5)

Examples:

Win wild battles:

{
"event": "BATTLE_VICTORY",
"filter": "q.battle.is_pvw",
"target": 10
}

Win NPC trainer battles:

{
"event": "BATTLE_VICTORY",
"filter": "q.battle.is_pvn",
"target": 5
}

Win using your starter:

{
"event": "BATTLE_VICTORY",
"filter": "q.battle.team.contains_starter",
"target": 10
}

Win PvP battles:

{
"event": "BATTLE_VICTORY",
"filter": "q.battle.is_pvp",
"target": 3
}

Fires when a player flees from battle. Same data as BATTLE_VICTORY.

{
"event": "BATTLE_FLED",
"filter": "q.battle.is_pvw",
"target": 1
}

Fires when a move is used in battle.

Data PathTypeDescription
q.event.moveStructMove data
q.event.userStructPokemon that used the move
q.event.battleStructBattle context
{
"event": "MOVE_USED",
"filter": "1.0",
"target": 50
}

Fires when a super-effective move lands.

Same data as MOVE_USED.

{
"event": "SUPER_EFFECTIVE_MOVE_USED",
"filter": "1.0",
"target": 10
}

Fires when an opponent’s Pokemon faints during your battle. For the owner side, use BATTLE_FAINTED below.

Data PathTypeDescription
q.pokemonStructThe fainted Pokemon

Fires when a battle starts. Fires once for each player in the battle.

Data PathTypeDescription
q.battleStructThe battle struct
q.playersStructPlayer actors in the battle
q.npcsStructNPC actors in the battle
q.wild_pokemonStructWild Pokemon actors in the battle
{
"event": "BATTLE_STARTED_POST",
"filter": "q.battle.is_pvw",
"target": 10
}

Fires when a Pokemon faints in battle, for the owner of the fainted Pokemon. This is the other side of POKEMON_FAINTED: if you want “my Pokemon fainted in battle” use BATTLE_FAINTED, if you want “an opponent’s Pokemon fainted” use POKEMON_FAINTED.

Data PathTypeDescription
q.battleStructThe battle struct
q.pokemonStructThe fainted Pokemon
q.contextStructThe faint context (what caused it)
q.playersStructPlayer actors in the battle
q.npcsStructNPC actors in the battle
q.wild_pokemonStructWild Pokemon actors in the battle

Fires when a Pokemon changes forme in battle.

Data PathTypeDescription
q.battleStructBattle context
q.pokemonStructThe Pokemon that changed forme
q.forme_nameStringName of the new forme

Fires when a Pokemon is placed on the player’s shoulder.

Data PathTypeDescription
q.pokemonStructThe shouldered Pokemon

Fires when a Pokemon is sent out of its Pokeball.

Data PathTypeDescription
q.pokemonStructThe sent-out Pokemon

Fires when a Pokemon is healed.

Data PathTypeDescription
q.pokemonStructThe healed Pokemon

Fires when a Pokemon is released into the wild.

Data PathTypeDescription
q.pokemonStructThe released Pokemon

Fires when a Pokemon is scanned with the Pokedex.

Data PathTypeDescription
q.pokemonStructThe scanned Pokemon

Fires when a Pokemon is given a nickname.

Data PathTypeDescription
q.pokemonStructThe nicknamed Pokemon
q.nicknameStringThe new nickname

Fires when a Pokemon’s friendship value changes.

Data PathTypeDescription
q.pokemonStructPokemon with updated friendship
q.new_friendshipNumberNew friendship value

Fires when a player gains a Pokemon from any source — capture, trade, starter selection, fossil revival, or egg hatch. This double-fires alongside the specific event (e.g. POKEMON_CAUGHT fires a POKEMON_GAINED too).

Data PathTypeDescription
q.pokemonStructThe gained Pokemon
{
"event": "POKEMON_GAINED",
"filter": "q.pokemon.is_shiny",
"target": 1
}

Fires when a Pokemon trade is completed. Fires once for each player in the trade.

Data PathTypeDescription
q.pokemonStructThe Pokemon received from the trade
q.traded_pokemonStructThe Pokemon sent away
{
"event": "TRADE_COMPLETED",
"filter": "1.0",
"target": 5
}

Fires when a Pokemon gains experience. Progress increases by the experience amount, not by 1. Fires many times per battle — one per Pokemon per experience source.

Data PathTypeDescription
q.pokemonStructThe Pokemon gaining experience
q.experienceNumberAmount of experience gained

Fires when a Pokemon gains EVs. Fires many times per battle — once per stat per Pokemon.

Data PathTypeDescription
q.pokemonStructThe Pokemon gaining EVs
q.statStringStat identifier
q.amountNumberAmount of EVs gained
q.sourceStringbattle, interaction, or a sidemod id
{
"event": "EV_GAINED",
"filter": "q.stat == 'attack'",
"target": 252
}

Fires when a player accepts a Pokemon evolution prompt. This fires before the evolution completes — POKEMON_EVOLVE fires after.

Data PathTypeDescription
q.pokemonStructThe Pokemon about to evolve
q.evolutionStructThe evolution being used

Fires when a Pokemon’s held item changes.

Data PathTypeDescription
q.pokemonStructThe Pokemon whose held item changed
q.receivedStructThe new held item
q.returnedStructThe previous held item
q.decrementedNumber1.0 if the received item was decremented

Fires when a Pokemon is recalled to its Pokeball.

Data PathTypeDescription
q.pokemonStructThe recalled Pokemon

Fires when a thrown Pokeball hits a Pokemon, regardless of capture success. Useful for tracking catch attempts.

Data PathTypeDescription
q.pokemonStructThe Pokemon that was hit

Fires when a Pokemon is seen by the player (registers in the Pokedex as encountered).

Data PathTypeDescription
q.pokemonStructThe Pokemon that was seen

Fires when a player’s Pokedex data changes.

Data PathTypeDescription
q.pokemonStructThe Pokemon whose data changed
q.knowledgeStringKnowledge level: none, encountered, caught
q.pokedexStructThe Pokedex manager struct
{
"event": "POKEDEX_DATA_CHANGED",
"filter": "q.knowledge == 'caught'",
"target": 151
}

Fires when a Pokemon’s visual aspects change (form, cosmetic, etc.).

Data PathTypeDescription
q.pokemonStructThe Pokemon whose aspects changed

Fires when a player starts riding a Pokemon.

Data PathTypeDescription
q.eventStructRide context

Fires when a Pokemon’s IV is hyper trained.

Data PathTypeDescription
q.pokemonStructThe hyper-trained Pokemon

Fires when a cosmetic item is applied to a Pokemon.

Data PathTypeDescription
q.pokemonStructThe Pokemon whose cosmetic changed

Fires when a Pokemon is spawned from a Pokerod bobber.

Data PathTypeDescription
q.pokemonStructThe fished Pokemon

Fires when a Pokemon mega evolves in battle.

Data PathTypeDescription
q.pokemonStructThe mega-evolved Pokemon

Fires when a Pokemon terastallizes in battle.

Data PathTypeDescription
q.pokemonStructThe terastallized Pokemon

Fires when Z-Power is activated.

Data PathTypeDescription
q.pokemonStructThe Pokemon using Z-Power

Fires when a fossil is revived into a Pokemon.

Data PathTypeDescription
q.pokemonStructThe revived Pokemon

Fires when a player picks up an item from the ground.

Data PathTypeDescription
q.item.idStringItem registry ID (e.g., 'minecraft:diamond')
q.item.countNumberStack count
{
"event": "ITEM_PICKUP",
"filter": "q.item.id == 'minecraft:diamond'",
"target": 10
}

Fires when a player drops/throws an item.

Data PathTypeDescription
q.item.idStringItem registry ID
q.item.countNumberStack count

Fires when a player right-clicks an entity.

Data PathTypeDescription
q.entity.uuidStringEntity UUID
q.event.handString"MAIN_HAND" or "OFF_HAND"
q.pokemonStructPokemon data (if entity is a Pokemon)

Examples:

Interact with a specific NPC:

{
"event": "ENTITY_INTERACT",
"filter": "q.entity.uuid == 'bb030064-870d-4513-b49b-bba5c92b19c1'",
"target": 1
}

Talk to NPC after completing a quest:

{
"event": "ENTITY_INTERACT",
"filter": "q.entity.uuid == 'professor-oak-uuid' && q.player.has_completed_task('journey:evolve_starter')",
"target": 1
}

Fires when a player breaks a block.

Data PathTypeDescription
q.block.idStringBlock registry ID (e.g., 'minecraft:diamond_ore')
q.block.pos.xNumberX coordinate
q.block.pos.yNumberY coordinate
q.block.pos.zNumberZ coordinate
{
"event": "BREAK_BLOCK",
"filter": "q.block.id == 'minecraft:diamond_ore'",
"target": 5
}

Fires when a player places a block. Same data as BREAK_BLOCK.

Fires when a player right-clicks a block. Same data as BREAK_BLOCK.

Fires when a player crafts an item.

Data PathTypeDescription
q.item.idStringCrafted item ID
q.item.countNumberStack count
{
"event": "ITEM_CRAFT",
"filter": "q.item.id == 'minecraft:diamond_sword'",
"target": 1
}

Fires when a player right-clicks (uses) an item.

Data PathTypeDescription
q.item.idStringUsed item ID
q.item.countNumberStack count
{
"event": "ITEM_USE",
"filter": "q.item.id == 'cobblemon:rare_candy'",
"target": 10
}

Fires when experience candy is fed to a Pokemon.

Data PathTypeDescription
q.pokemonStructPokemon that received the candy
q.experienceNumberAmount of experience gained

Fires when an apricorn is harvested from a tree.

Data PathTypeDescription
q.apricorn.colorStringApricorn color name

Fires when a berry is harvested.

Fires when an egg is collected from breeding.

Fires when loot is dropped from a Pokemon or entity.

Data PathTypeDescription
q.eventStructLoot context

Fires when a berry yield is calculated, for the player who placed the berry tree.

Data PathTypeDescription
q.berryStringBerry identifier
q.yieldNumberYield amount
{
"event": "BERRY_YIELD",
"filter": "q.berry == 'cobblemon:oran_berry'",
"target": 50
}

Fires when a player runs a command.

Data PathTypeDescription
q.event.commandStringThe full command string
q.event.matches(cmd)Number1.0 if command exactly matches
q.event.contains(text)Number1.0 if command contains text
{
"event": "RUN_COMMAND",
"filter": "q.event.matches('/spawn')",
"target": 1
}

Fires when a player kills an entity.

Data PathTypeDescription
q.event.entityStructThe killed entity

Fires when a player shears an entity (wooloo, sheep, etc.).

Data PathTypeDescription
q.entityStructThe sheared entity

Fires when a Pokerod is cast.

Data PathTypeDescription
q.eventStructRod and bait context

Fires when a Pokerod is reeled in.

Data PathTypeDescription
q.eventStructRod context

Fires when a player respawns after dying or using an end portal.

Data PathTypeDescription
q.old_aliveNumber1.0 if the previous state was alive (end portal), 0.0 for death respawn
{
"event": "PLAYER_RESPAWN",
"filter": "!q.old_alive",
"target": 1
}

Fires when a player starts sleeping in a bed.

Data PathTypeDescription
q.bed_pos.xNumberBed X coordinate
q.bed_pos.yNumberBed Y coordinate
q.bed_pos.zNumberBed Z coordinate

Fires when a player dies.

Data PathTypeDescription
q.sourceStringDamage source message id (fall, drown, lava, player, etc.)
{
"event": "PLAYER_DEATH",
"filter": "q.source == 'fall'",
"target": 5
}

Fires when a player attacks an entity.

Data PathTypeDescription
q.entityStructThe attacked entity

Fires when a player takes damage. Progress increases by the damage amount, not by 1.

Data PathTypeDescription
q.damageNumberAmount of damage taken
q.sourceStringDamage source message id
{
"event": "PLAYER_DAMAGE",
"filter": "1.0",
"target": 100
}

When q.pokemon is available (in any Pokemon-related event), these properties are accessible:

PropertyTypeDescription
species.identifierStringSpecies ID (e.g., 'cobblemon:pikachu')
levelNumberCurrent level (1-100)
is_shinyNumber1.0 if shiny
is_pvwNumber1.0 if wild
is_in_partyNumber1.0 if in player’s party
is_starterNumber1.0 if player’s starter
friendshipNumberFriendship value (0-255)
natureStringNature name
abilityStringAbility name
genderStringMALE, FEMALE, or GENDERLESS
pokeballStringBall type
formStringForm name
nicknameStringCustom nickname
tera_typeStringTera type
can_evolveNumber1.0 if can evolve
has_aspect('name')Number1.0 if has aspect
is_type('type')Number1.0 if has type
ivs.hpNumberHP IV (0-31)
ivs.attackNumberAttack IV
ivs.defenceNumberDefence IV
ivs.special_attackNumberSp. Attack IV
ivs.special_defenceNumberSp. Defence IV
ivs.speedNumberSpeed IV
evs.hpNumberHP EV
evs.attackNumberAttack EV
evs.defenceNumberDefence EV
evs.special_attackNumberSp. Attack EV
evs.special_defenceNumberSp. Defence EV
evs.speedNumberSpeed EV

EventCategoryDescription
ENTER_ZONEZonePlayer enters zone
LEAVE_ZONEZonePlayer exits zone
ENTER_ZONE_AREAZonePlayer enters sub-area
POKEMON_CAUGHTPokemonPokemon caught
POKEMON_EVOLVEPokemonPokemon evolves
POKEMON_LEVEL_UPPokemonPokemon gains level
HATCH_EGGPokemonEgg hatches
STARTER_CHOSENPokemonStarter selected
BATTLE_VICTORYBattleBattle won
BATTLE_FLEDBattleFled from battle
MOVE_USEDBattleMove used in battle
SUPER_EFFECTIVE_MOVE_USEDBattleSuper effective hit
POKEMON_FAINTEDBattleOpponent Pokemon fainted
BATTLE_STARTED_POSTBattleBattle started (fires per player)
BATTLE_FAINTEDBattleOwn Pokemon fainted in battle
FORME_CHANGEBattlePokemon changed forme in battle
MEGA_EVOLUTIONMechanicMega evolution triggered
TERASTALLIZATIONMechanicTerastallization triggered
ZPOWER_USEDMechanicZ-Power activated
FOSSIL_REVIVEDMechanicFossil revived
POKEMON_SHOULDER_MOUNTEDInteractionPokemon shouldered
POKEMON_SENT_OUTInteractionPokemon sent from ball
POKEMON_HEALEDInteractionPokemon healed
POKEMON_RELEASEDInteractionPokemon released
POKEMON_SCANNEDInteractionPokedex scan
POKEMON_NICKNAMEDInteractionPokemon nicknamed
FRIENDSHIP_UPDATEDInteractionFriendship changed
POKEMON_GAINEDPokemonPokemon added to party (any source)
TRADE_COMPLETEDPokemonTrade completed (fires per participant)
EXPERIENCE_GAINEDPokemonPokemon gained XP (progress = XP)
EV_GAINEDPokemonPokemon gained EVs
EVOLUTION_ACCEPTEDPokemonEvolution prompt accepted
HELD_ITEM_CHANGEDPokemonPokemon held item swapped
POKEMON_RECALLEDPokemonPokemon recalled to ball
THROWN_POKEBALL_HITPokemonThrown Pokeball hit target
POKEMON_SEENPokemonPokemon seen (Pokedex encounter)
POKEDEX_DATA_CHANGEDPokemonPokedex knowledge updated
POKEMON_ASPECTS_CHANGEDPokemonPokemon visual aspects changed
POKEMON_RIDEInteractionPlayer started riding Pokemon
HYPER_TRAINEDPokemonIV hyper-trained
COSMETIC_CHANGEDPokemonPokemon cosmetic applied
FISHING_POKEMON_CAUGHTPokemonPokemon caught via Pokerod
ITEM_PICKUPItemItem picked up
ITEM_THROWItemItem dropped
ITEM_CRAFTItemItem crafted
ITEM_USEItemItem right-clicked / used
ENTITY_INTERACTEntityEntity right-clicked
BREAK_BLOCKBlockBlock broken
BLOCK_PLACEDBlockBlock placed
BLOCK_USEBlockBlock right-clicked
EXPERIENCE_CANDY_USEDResourceCandy used on Pokemon
APRICORN_HARVESTEDResourceApricorn harvested
BERRY_HARVESTEDResourceBerry harvested
BERRY_YIELDResourceBerry yield calculated
EGG_COLLECTEDResourceEgg collected
LOOT_DROPPEDResourceLoot dropped from Pokemon / entity
RUN_COMMANDUtilityCommand executed
KILL_ENTITYUtilityEntity killed
SHEAR_ENTITYUtilityEntity sheared
POKEROD_CASTUtilityPokerod cast
POKEROD_REELUtilityPokerod reeled in
PLAYER_RESPAWNUtilityPlayer respawned
PLAYER_SLEEPUtilityPlayer started sleeping
PLAYER_DEATHUtilityPlayer died
PLAYER_ATTACK_ENTITYUtilityPlayer attacked an entity
PLAYER_DAMAGEUtilityPlayer took damage (progress = damage)

  • Always start with "filter": "1.0" to test that your event fires, then add conditions
  • Check server logs if a filter isn’t matching — Molang errors appear there
  • Use q.player.* functions in any filter to add player-state conditions
  • No-parameter functions don’t need parentheses: q.pokemon.is_shiny works
  • Functions with parameters need them: q.player.is_in_zone('uuid-here')
  • Strings use single quotes in Molang: 'cobblemon:pikachu'
  • Use && for AND, || for OR, ! for NOT