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_CAPTURE 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_CAPTURE",
"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_CAPTURE",
"filter": "q.pokemon.species.identifier == 'cobblemon:magikarp'",
"target": 10
}

Catch any shiny:

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

Catch high-level Pokemon in a specific zone:

{
"event": "POKEMON_CAPTURE",
"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.

Data PathTypeDescription
q.pokemonStructThe fainted Pokemon

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

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_CAPTUREPokemonPokemon 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
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
ITEM_PICKUPItemItem picked up
ITEM_THROWItemItem dropped
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
EGG_COLLECTEDResourceEgg collected
RUN_COMMANDUtilityCommand executed
KILL_ENTITYUtilityEntity killed

  • 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