Event System
Event System
Section titled “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.
How Events Work
Section titled “How Events Work”- Something happens — A player catches a Pokemon
- Journey fires an event —
POKEMON_CAPTUREwith the caught Pokemon’s data - Active subtasks check their filters — “Is this a Pikachu? Is it shiny?”
- 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.
Writing Filters
Section titled “Writing Filters”Filters are Molang expressions that return a truthy value (anything non-zero) when the event should count.
Basics
Section titled “Basics”"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 onlyCombining Conditions
Section titled “Combining Conditions”AND: q.pokemon.is_shiny && q.pokemon.level >= 50OR: q.battle.is_pvw || q.battle.is_pvnNOT: !q.battle.is_pvwUsing Player Functions in Any Filter
Section titled “Using Player Functions in Any Filter”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') >= 10This lets you create context-aware objectives like “catch Pokemon, but only while in the Safari Zone.”
Zone Events
Section titled “Zone Events”ENTER_ZONE
Section titled “ENTER_ZONE”Fires when a player enters a zone.
| Data Path | Type | Description |
|---|---|---|
q.zone.uuid | String | Zone’s unique identifier |
q.zone.name | String | Zone’s display name |
{ "event": "ENTER_ZONE", "filter": "q.zone.uuid == '21af4251-ed97-499c-8445-3e6152fbcbb7'", "target": 1}LEAVE_ZONE
Section titled “LEAVE_ZONE”Fires when a player exits a zone. Same data as ENTER_ZONE.
{ "event": "LEAVE_ZONE", "filter": "q.zone.uuid == 'pallet-town-uuid'", "target": 1}ENTER_ZONE_AREA
Section titled “ENTER_ZONE_AREA”Fires when a player enters a specific sub-area within a zone.
| Data Path | Type | Description |
|---|---|---|
q.zone | Struct | Parent zone data |
q.area | Struct | Specific area data |
Pokemon Events
Section titled “Pokemon Events”POKEMON_CAPTURE
Section titled “POKEMON_CAPTURE”Fires when a player catches a wild Pokemon.
| Data Path | Type | Description |
|---|---|---|
q.pokemon.species.identifier | String | Species ID (e.g., 'cobblemon:pikachu') |
q.pokemon.level | Number | Pokemon’s level |
q.pokemon.is_shiny | Number | 1.0 if shiny |
q.pokemon.nature | String | Nature name |
q.pokemon.ability | String | Ability name |
q.pokemon.gender | String | MALE, FEMALE, or GENDERLESS |
q.pokemon.pokeball | String | Ball type used to catch |
q.pokemon.form | String | Form name |
q.pokemon.ivs.hp | Number | HP IV (0-31) |
q.pokemon.ivs.attack | Number | Attack IV |
q.pokemon.ivs.defence | Number | Defence IV |
q.pokemon.ivs.special_attack | Number | Special Attack IV |
q.pokemon.ivs.special_defence | Number | Special Defence IV |
q.pokemon.ivs.speed | Number | Speed 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}POKEMON_EVOLVE
Section titled “POKEMON_EVOLVE”Fires when a player’s Pokemon evolves.
| Data Path | Type | Description |
|---|---|---|
q.pokemon.species.identifier | String | New species after evolution |
q.pokemon.level | Number | Current level |
q.pokemon.is_starter | Number | 1.0 if this is the player’s starter |
q.pokemon.is_shiny | Number | 1.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}POKEMON_LEVEL_UP
Section titled “POKEMON_LEVEL_UP”Fires when a Pokemon gains a level.
| Data Path | Type | Description |
|---|---|---|
q.pokemon.level | Number | New level after leveling up |
q.pokemon.is_starter | Number | 1.0 if starter |
q.pokemon.species.identifier | String | Species 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}HATCH_EGG
Section titled “HATCH_EGG”Fires when a Pokemon egg hatches.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The hatched Pokemon (full Pokemon data) |
q.pokemon.is_shiny | Number | 1.0 if shiny |
{ "event": "HATCH_EGG", "filter": "q.pokemon.is_shiny", "target": 1}STARTER_CHOSEN
Section titled “STARTER_CHOSEN”Fires when a player selects their starter Pokemon.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | Chosen starter Pokemon |
{ "event": "STARTER_CHOSEN", "filter": "1.0", "target": 1}Battle Events
Section titled “Battle Events”BATTLE_VICTORY
Section titled “BATTLE_VICTORY”Fires when a player wins a battle.
| Data Path | Type | Description |
|---|---|---|
q.battle.is_pvw | Number | 1.0 for wild Pokemon battles |
q.battle.is_pvn | Number | 1.0 for NPC/trainer battles |
q.battle.is_pvp | Number | 1.0 for player vs player |
q.battle.team.contains_starter | Number | 1.0 if starter was in the team |
q.battle.team.pokemon(index) | Struct | Get 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}BATTLE_FLED
Section titled “BATTLE_FLED”Fires when a player flees from battle. Same data as BATTLE_VICTORY.
{ "event": "BATTLE_FLED", "filter": "q.battle.is_pvw", "target": 1}MOVE_USED
Section titled “MOVE_USED”Fires when a move is used in battle.
| Data Path | Type | Description |
|---|---|---|
q.event.move | Struct | Move data |
q.event.user | Struct | Pokemon that used the move |
q.event.battle | Struct | Battle context |
{ "event": "MOVE_USED", "filter": "1.0", "target": 50}SUPER_EFFECTIVE_MOVE_USED
Section titled “SUPER_EFFECTIVE_MOVE_USED”Fires when a super-effective move lands.
Same data as MOVE_USED.
{ "event": "SUPER_EFFECTIVE_MOVE_USED", "filter": "1.0", "target": 10}POKEMON_FAINTED
Section titled “POKEMON_FAINTED”Fires when an opponent’s Pokemon faints during your battle.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The fainted Pokemon |
Pokemon Interaction Events
Section titled “Pokemon Interaction Events”POKEMON_SHOULDER_MOUNTED
Section titled “POKEMON_SHOULDER_MOUNTED”Fires when a Pokemon is placed on the player’s shoulder.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The shouldered Pokemon |
POKEMON_SENT_OUT
Section titled “POKEMON_SENT_OUT”Fires when a Pokemon is sent out of its Pokeball.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The sent-out Pokemon |
POKEMON_HEALED
Section titled “POKEMON_HEALED”Fires when a Pokemon is healed.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The healed Pokemon |
POKEMON_RELEASED
Section titled “POKEMON_RELEASED”Fires when a Pokemon is released into the wild.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The released Pokemon |
POKEMON_SCANNED
Section titled “POKEMON_SCANNED”Fires when a Pokemon is scanned with the Pokedex.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The scanned Pokemon |
POKEMON_NICKNAMED
Section titled “POKEMON_NICKNAMED”Fires when a Pokemon is given a nickname.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The nicknamed Pokemon |
q.nickname | String | The new nickname |
FRIENDSHIP_UPDATED
Section titled “FRIENDSHIP_UPDATED”Fires when a Pokemon’s friendship value changes.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | Pokemon with updated friendship |
q.new_friendship | Number | New friendship value |
Special Mechanic Events
Section titled “Special Mechanic Events”MEGA_EVOLUTION
Section titled “MEGA_EVOLUTION”Fires when a Pokemon mega evolves in battle.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The mega-evolved Pokemon |
TERASTALLIZATION
Section titled “TERASTALLIZATION”Fires when a Pokemon terastallizes in battle.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The terastallized Pokemon |
ZPOWER_USED
Section titled “ZPOWER_USED”Fires when Z-Power is activated.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The Pokemon using Z-Power |
FOSSIL_REVIVED
Section titled “FOSSIL_REVIVED”Fires when a fossil is revived into a Pokemon.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | The revived Pokemon |
Item & Block Events
Section titled “Item & Block Events”ITEM_PICKUP
Section titled “ITEM_PICKUP”Fires when a player picks up an item from the ground.
| Data Path | Type | Description |
|---|---|---|
q.item.id | String | Item registry ID (e.g., 'minecraft:diamond') |
q.item.count | Number | Stack count |
{ "event": "ITEM_PICKUP", "filter": "q.item.id == 'minecraft:diamond'", "target": 10}ITEM_THROW
Section titled “ITEM_THROW”Fires when a player drops/throws an item.
| Data Path | Type | Description |
|---|---|---|
q.item.id | String | Item registry ID |
q.item.count | Number | Stack count |
ENTITY_INTERACT
Section titled “ENTITY_INTERACT”Fires when a player right-clicks an entity.
| Data Path | Type | Description |
|---|---|---|
q.entity.uuid | String | Entity UUID |
q.event.hand | String | "MAIN_HAND" or "OFF_HAND" |
q.pokemon | Struct | Pokemon 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}BREAK_BLOCK
Section titled “BREAK_BLOCK”Fires when a player breaks a block.
| Data Path | Type | Description |
|---|---|---|
q.block.id | String | Block registry ID (e.g., 'minecraft:diamond_ore') |
q.block.pos.x | Number | X coordinate |
q.block.pos.y | Number | Y coordinate |
q.block.pos.z | Number | Z coordinate |
{ "event": "BREAK_BLOCK", "filter": "q.block.id == 'minecraft:diamond_ore'", "target": 5}BLOCK_PLACED
Section titled “BLOCK_PLACED”Fires when a player places a block. Same data as BREAK_BLOCK.
BLOCK_USE
Section titled “BLOCK_USE”Fires when a player right-clicks a block. Same data as BREAK_BLOCK.
Resource Events
Section titled “Resource Events”EXPERIENCE_CANDY_USED
Section titled “EXPERIENCE_CANDY_USED”Fires when experience candy is fed to a Pokemon.
| Data Path | Type | Description |
|---|---|---|
q.pokemon | Struct | Pokemon that received the candy |
q.experience | Number | Amount of experience gained |
APRICORN_HARVESTED
Section titled “APRICORN_HARVESTED”Fires when an apricorn is harvested from a tree.
| Data Path | Type | Description |
|---|---|---|
q.apricorn.color | String | Apricorn color name |
BERRY_HARVESTED
Section titled “BERRY_HARVESTED”Fires when a berry is harvested.
EGG_COLLECTED
Section titled “EGG_COLLECTED”Fires when an egg is collected from breeding.
Utility Events
Section titled “Utility Events”RUN_COMMAND
Section titled “RUN_COMMAND”Fires when a player runs a command.
| Data Path | Type | Description |
|---|---|---|
q.event.command | String | The full command string |
q.event.matches(cmd) | Number | 1.0 if command exactly matches |
q.event.contains(text) | Number | 1.0 if command contains text |
{ "event": "RUN_COMMAND", "filter": "q.event.matches('/spawn')", "target": 1}KILL_ENTITY
Section titled “KILL_ENTITY”Fires when a player kills an entity.
| Data Path | Type | Description |
|---|---|---|
q.event.entity | Struct | The killed entity |
Pokemon Data Reference
Section titled “Pokemon Data Reference”When q.pokemon is available (in any Pokemon-related event), these properties are accessible:
| Property | Type | Description |
|---|---|---|
species.identifier | String | Species ID (e.g., 'cobblemon:pikachu') |
level | Number | Current level (1-100) |
is_shiny | Number | 1.0 if shiny |
is_pvw | Number | 1.0 if wild |
is_in_party | Number | 1.0 if in player’s party |
is_starter | Number | 1.0 if player’s starter |
friendship | Number | Friendship value (0-255) |
nature | String | Nature name |
ability | String | Ability name |
gender | String | MALE, FEMALE, or GENDERLESS |
pokeball | String | Ball type |
form | String | Form name |
nickname | String | Custom nickname |
tera_type | String | Tera type |
can_evolve | Number | 1.0 if can evolve |
has_aspect('name') | Number | 1.0 if has aspect |
is_type('type') | Number | 1.0 if has type |
ivs.hp | Number | HP IV (0-31) |
ivs.attack | Number | Attack IV |
ivs.defence | Number | Defence IV |
ivs.special_attack | Number | Sp. Attack IV |
ivs.special_defence | Number | Sp. Defence IV |
ivs.speed | Number | Speed IV |
evs.hp | Number | HP EV |
evs.attack | Number | Attack EV |
evs.defence | Number | Defence EV |
evs.special_attack | Number | Sp. Attack EV |
evs.special_defence | Number | Sp. Defence EV |
evs.speed | Number | Speed EV |
Complete Event List
Section titled “Complete Event List”| Event | Category | Description |
|---|---|---|
ENTER_ZONE | Zone | Player enters zone |
LEAVE_ZONE | Zone | Player exits zone |
ENTER_ZONE_AREA | Zone | Player enters sub-area |
POKEMON_CAPTURE | Pokemon | Pokemon caught |
POKEMON_EVOLVE | Pokemon | Pokemon evolves |
POKEMON_LEVEL_UP | Pokemon | Pokemon gains level |
HATCH_EGG | Pokemon | Egg hatches |
STARTER_CHOSEN | Pokemon | Starter selected |
BATTLE_VICTORY | Battle | Battle won |
BATTLE_FLED | Battle | Fled from battle |
MOVE_USED | Battle | Move used in battle |
SUPER_EFFECTIVE_MOVE_USED | Battle | Super effective hit |
POKEMON_FAINTED | Battle | Opponent Pokemon fainted |
MEGA_EVOLUTION | Mechanic | Mega evolution triggered |
TERASTALLIZATION | Mechanic | Terastallization triggered |
ZPOWER_USED | Mechanic | Z-Power activated |
FOSSIL_REVIVED | Mechanic | Fossil revived |
POKEMON_SHOULDER_MOUNTED | Interaction | Pokemon shouldered |
POKEMON_SENT_OUT | Interaction | Pokemon sent from ball |
POKEMON_HEALED | Interaction | Pokemon healed |
POKEMON_RELEASED | Interaction | Pokemon released |
POKEMON_SCANNED | Interaction | Pokedex scan |
POKEMON_NICKNAMED | Interaction | Pokemon nicknamed |
FRIENDSHIP_UPDATED | Interaction | Friendship changed |
ITEM_PICKUP | Item | Item picked up |
ITEM_THROW | Item | Item dropped |
ENTITY_INTERACT | Entity | Entity right-clicked |
BREAK_BLOCK | Block | Block broken |
BLOCK_PLACED | Block | Block placed |
BLOCK_USE | Block | Block right-clicked |
EXPERIENCE_CANDY_USED | Resource | Candy used on Pokemon |
APRICORN_HARVESTED | Resource | Apricorn harvested |
BERRY_HARVESTED | Resource | Berry harvested |
EGG_COLLECTED | Resource | Egg collected |
RUN_COMMAND | Utility | Command executed |
KILL_ENTITY | Utility | Entity 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_shinyworks - 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