Where Requirements Appear

Page requirements determine whether a page is shown when the player interacts with an NPC. Response requirements determine whether an individual button is shown on that page. An empty [] requirements list always passes.

Named Trackers

A tracker is created with the track:id:type:[targets] action and checked here with track:id:qty. The tracker ID ties the setup action, this requirement, the {track:id} variable, and the objective display together — no need to repeat the type or target anywhere else.

FormatDescription
track:id:qty True if the named tracker's accumulated count ≥ qty. Returns false if the tracker does not exist (i.e. the track: action has not been run for this player).

In an Objectives list, use the :: label override as normal:
"track:kills:10::Defeat enemies" renders as Defeat enemies: 3/10.

Block Breaking

Counts how many times a player has broken a specific block type. Requires an active named tracker of type block (e.g. track:ore_mined:block:Ore_Iron_Stone). The * wildcard is supported for partial block ID matching (e.g. break:*Crystal_Purple*:10). Use track:id:qty to check a named tracker instead.

FormatDescription
break:blockId:qty True if the player has broken ≥ qty of the specified block type.

Example

// Require mining 20 iron ore
"Requirements": [
  "questStarted:miners_task",
  "break:Ore_Iron_Stone:20"
]

Block Placing

Counts block placements. Requires an active named tracker of type place (e.g. track:planks_placed:place:*Planks). The * wildcard is supported for partial block ID matching (e.g. place:*Planks:10 counts any plank type). Use track:id:qty to check a named tracker instead.

FormatDescription
place:blockId:qty True if the player has placed ≥ qty of the specified block type.

Example

// Require placing 10 stone bricks
"Requirements": [
  "questStarted:build_the_wall",
  "place:Rock_Stone_Brick:10"
]

Cooldown

Checks whether enough time has elapsed since a timestamp was recorded via setTimestamp:key. If the timestamp has never been set for this player, the requirement returns true.

FormatDescription
cooldown:key:seconds True if ≥ seconds have passed since setTimestamp:key was called, or if it was never called.
💡
Daily Reward Pattern

Because cooldown returns true when never set, place the ready page (with cooldown:key:86400) before the waiting page (with not:cooldown:key:86400). New players will always see the ready page first. See Quest Patterns → Daily Reward.

Example

// Ready page: cooldown has elapsed (or never been set)
"Requirements": ["cooldown:daily_key:86400"]

// Waiting page: cooldown is still active
"Requirements": ["not:cooldown:daily_key:86400"]

Use {cooldown:key:totalSeconds} in dialog text to show the remaining wait time (e.g. "Come back in 4 hours 23 minutes.").

Daily Reset Gate

Checks whether a timestamp was set before the most recent past occurrence of a specific clock time (HH:MM, server local time). If the timestamp has never been set, the requirement returns true. Pair with setTimestamp:key in a load action to gate once-per-day events.

FormatDescription
timedExact:key:hour:minute True if the key timestamp is unset, OR was set before the most recent past occurrence of HH:MM server local time.
💡
Daily Reset Pattern

Place a page with timedExact:daily_key:4:00 (resets at 4 AM) and a setTimestamp:daily_key load action. When a player visits before 4 AM and the timestamp is already set from the same day, the requirement is false. After the clock passes 4 AM, the requirement returns true for any player whose timestamp was recorded before that rollover, allowing the reward to be claimed again.

Example

// Daily reward resets at midnight (00:00)
"Requirements": ["timedExact:daily_reward:0:0"]
"LoadActions":  ["setTimestamp:daily_reward"]

Economy & Permissions (VaultUnlocked optional dependency)

These requirements integrate with the optional VaultUnlocked plugin. They return false if VaultUnlocked is not installed or the required provider is not active.

FormatDescription
economy:canafford:amount True if the player's account balance is ≥ amount. Requires VaultUnlocked with a compatible economy provider.
permission:has:perm.node True if the player has the specified permission node. Requires VaultUnlocked with a compatible permissions provider.

Example

// Gate a response on the player being able to afford the cost
"Requirements": ["economy:canafford:500"]

// Only show VIP dialogue if player has the permission node
"Requirements": ["permission:has:myserver.vip"]

Fishing (HyFishing optional dependency)

Fishing requirements integrate with the optional HyFishing plugin. They return false if HyFishing is not installed. Tracking tags must be added before counts accumulate, except for hasfishinbag which is a live inventory check requiring no tracking tag.

FormatDescription
catchfish:fishItemId:qty True if the player has caught ≥ qty fish by item ID. Requires an active catchfish named tracker. Supports * wildcard.
catchfishbiome:biomeName:qty True if the player has caught ≥ qty fish in the named biome. Requires an active catchfishbiome named tracker. Supports * wildcard.
catchfishrarity:rarity:qty True if the player has caught ≥ qty fish of the given rarity (case-insensitive). Requires an active catchfishrarity named tracker.
catchfishzone:zoneName:qty True if the player has caught ≥ qty fish in the named zone. Requires an active catchfishzone named tracker. Supports * wildcard.
releasefish:fishItemId:qty True if the player has released ≥ qty fish by item ID. Requires an active releasefish named tracker. Supports * wildcard.
hasfishinbag:fishItemId:qty Live check — true if the player currently has ≥ qty of the fish item in their bag. Use * to match any fish. No tracking tag needed.

Example

// Require catching 10 fish of any type
"Requirements": [
  "questStarted:fishing_quest",
  "catchfish:*:10"
]

// Gate a turn-in on having a specific fish in the bag right now
"Requirements": [
  "hasfishinbag:golden_trout:1"
]

Global State (server-wide)

Global requirements check server-wide state stored in GlobalData rather than per-player data. Tags and variables in the global store affect all players equally. Mutate global state using the corresponding global actions.

FormatDescription
global:hastag:tagName True if the server-wide global tag list contains tagName.
global:nottag:tagName True if the server-wide global tag list does not contain tagName.
global:variable:name:equal:value True if the global variable equals value.
global:variable:name:greater:value True if the global variable is strictly greater than value.
global:variable:name:less:value True if the global variable is strictly less than value.
global:variable:name:greaterOrEqual:value True if the global variable is ≥ value.
global:variable:name:lessOrEqual:value True if the global variable is ≤ value.
Global vs Per-Player

Global tags and variables are shared across all players. Use them for world events, server-wide flags, or counters that accumulate across players. Per-player tags and variables (via hasTag and variable:) remain per-player as before.

Example

// Show a world event page only when the server event is active
"Requirements": ["global:hastag:world_event_active"]

// Gate a reward on a server-wide counter reaching a threshold
"Requirements": ["global:variable:boss_kills:greaterOrEqual:100"]

HyCitizen Kill Count

For killing named HyCitizens NPCs (rather than mob entity types). Requires an active named tracker of type killcitizen (e.g. track:bandit_kills:killcitizen:Bandit Guard). The name match is case-sensitive and matches the NPC's exact display name. The * wildcard is supported — use killCitizen:*:qty to count kills of any HyCitizens NPC, or a pattern like killCitizen:Bandit*:qty to match all citizen names beginning with "Bandit".

FormatDescription
killCitizen:citizenName:qty True if the player has killed ≥ qty HyCitizens NPCs with the given display name.

Example

// Require killing 3 "Bandit Guard" citizens
"Requirements": [
  "questStarted:bandit_raid",
  "killCitizen:Bandit Guard:3"
]

Inventory

Checks whether the player currently has a sufficient quantity of an item in their inventory. The optional fourth segment :true marks the item as consumable — if the response passes and is selected, the items are removed before actions execute.

FormatDescription
item:itemId:qty True if the player has ≥ qty of the item. Items are not consumed.
item:itemId:qty:true True if the player has ≥ qty of the item. Items are consumed when the response is used.
Consumption Timing

When :true is set, items are consumed before the response's actions execute. This ensures the player cannot back out after the server takes the items.

Example

// Check without consuming
"Requirements": ["item:gold_ingot:5"]

// Check AND consume on use (item turn-in)
"Requirements": ["item:ancient_blade:1:true"]

Item Harvest

Tracks how many items a player has harvested from blocks or crops. Requires an active named tracker of type harvest (e.g. track:herb_harvest:harvest:*Herb*). The * wildcard is supported for matching multiple item IDs. Fires on InteractivelyPickupItemEvent (block/crop harvest) — does not fire for picking up dropped item entities from the ground.

FormatDescription
harvest:itemId:qty True if the player has harvested ≥ qty of the item. Requires an active harvest named tracker. Supports * wildcard.

Item Pickup

Tracks how many items a player has picked up (via InteractivelyPickupItemEvent, the same event as harvest). Requires an active named tracker of type pickup (e.g. track:herb_pickup:pickup:*Herb*). The * wildcard is supported for matching multiple item IDs.

FormatDescription
pickup:itemId:qty True if the player has picked up ≥ qty of the item. Requires an active pickup named tracker. Supports * wildcard.

Example

// Quest requiring picking up 20 of any herb
"Requirements": [
  "questStarted:herb_gathering",
  "pickup:*Herb*:20"
]

Kill Counting

Kill counting requires an active named tracker of type kill (e.g. track:goblin_kills:kill:Goblin*). The counter automatically increments whenever the player kills an entity matching the tracker's target.

FormatDescription
kill:entityTypeId:qty True if the player has killed ≥ qty of the specified entity type.
Named Tracker Required

Kill counting is not automatic. You must add a track:id:kill:entityTypeId action to the player (typically via a quest-start response) before kills are counted. Use untrack:id to reset the counter and stop counting.

💡
Partial Name Matching

The entity type ID supports * as a wildcard for partial matching. A leading, trailing, or interior * matches any characters in that position. This lets you track multiple variants of an enemy with a single tracking tag. The tracking tag must use the same wildcard pattern.

  • kill:Goblin*:10 — counts Goblin_Duke, Goblin_Miner, Goblin_Scout, etc.
  • kill:*Boss*:1 — counts any entity whose ID contains "Boss"

Example

// Require 10 goblin kills (any goblin variant)
"Requirements": [
  "questStarted:lost_sword",
  "kill:Goblin*:10"
]

Use the variable {track:id} in dialog text to show the player their current count. See Text Variables.

Logic Operators

Requirements can be composed using any (OR logic), not (negation), and the ! shorthand. By default, listing multiple requirements is AND — all must pass. Use any for OR logic.

FormatDescription
any:req1|req2|req3 True if any of the pipe-separated sub-requirements passes (OR logic).
not:type:value Negates any requirement. Prefix any requirement with not: to invert it.
!requirement Shorthand for not:. For example, !hasTag:flag is equivalent to notTag:flag.
not: syntax

The not: prefix consumes the rest of the string as the inner requirement. For example, not:questCompleted:my_quest parses as not( questCompleted:my_quest ). For requirements that are already negated by name (like questNotStarted), not: is redundant but valid.

Examples

// Page visible if player has EITHER quest started
"Requirements": [
  "any:questStarted:quest_a|questStarted:quest_b"
]

// Negate a cooldown to show a "still waiting" page
"Requirements": [
  "not:cooldown:daily_key:86400"
]

// Multiple combined: started AND (has item OR has tag)
"Requirements": [
  "questStarted:delivery",
  "any:item:package:1|hasTag:already_delivered"
]

MMO Skill Level (MMOSkillTree optional dependency)

Compares the player's current level in a named MMO skill. Requires the MMOSkillTree plugin to be active; returns false silently if it is not installed. Skill IDs are case-insensitive (e.g. MINING and mining are the same).

FormatDescription
mmo:skillId:equal:value True if the player's skill level equals value.
mmo:skillId:greater:value True if the player's skill level is strictly greater than value.
mmo:skillId:less:value True if the player's skill level is strictly less than value.
mmo:skillId:greaterOrEqual:value True if the player's skill level is ≥ value.
mmo:skillId:lessOrEqual:value True if the player's skill level is ≤ value.

Example

// Require Mining level 10 to access the deep mine quest
"Requirements": ["mmo:MINING:greaterOrEqual:10"]

// Gate a master trainer page on skill level
"Requirements": [
  "questStarted:apprentice_path",
  "mmo:CRAFTING:greaterOrEqual:25"
]

Moon Phase

FormatDescription
moonPhase:full Moon phase index 0 (full moon).
moonPhase:waning Moon phase indices 1–3.
moonPhase:new Moon phase index 4 (new moon).
moonPhase:waxing Moon phase indices 5–7.
moonPhase:3 Exact numeric phase check (0–7).

Example

// Werewolf quest only during full moon
"Requirements": ["moonPhase:full"]

Named Variables

Named variables are numeric values stored per-player. They are set and mutated via the variable: action and compared here as a requirement. Values default to 0 if never set. Comparisons use standard numeric rules; fractional values are supported.

FormatDescription
variable:name:equal:value True if the variable equals value exactly.
variable:name:greater:value True if the variable is strictly greater than value.
variable:name:less:value True if the variable is strictly less than value.
variable:name:greaterOrEqual:value True if the variable is greater than or equal to value.
variable:name:lessOrEqual:value True if the variable is less than or equal to value.
💡
Page Ordering with Variables

Put the most-specific variable page first. For example, place the threshold-met page (using greaterOrEqual) before the in-progress page (using less) in the quest's Pages list so the completion page is checked first.

Example

// Complete page — shown once counter reaches 5
"Requirements": [
  "questStarted:my_quest",
  "variable:counter:greaterOrEqual:5"
]

// Progress page — shown while counter is still below 5
"Requirements": [
  "questStarted:my_quest",
  "variable:counter:less:5"
]

Use {variable:name} in dialog text to display the current value to the player. See Text Variables.

NPC Name

Passes when the NPC that opened the current dialogue has a specific display name. The comparison is case-insensitive. Colons in the name are supported — everything after npcname: is treated as the name. This is useful when multiple NPCs share a quest but you want different pages to show depending on which NPC the player interacted with.

FormatDescription
npcname:displayName True if the NPC that opened the dialogue has the given display name (case-insensitive).
Not available in auto-trigger

The NPC name context is set automatically by the interaction listeners when a player opens dialogue. It is not available in auto-trigger pages (which fire without NPC interaction) — npcname: will always return false in that context.

Example

// Show a special page only when talking to "Elder Maren"
"Requirements": [
  "questStarted:main_story",
  "npcname:Elder Maren"
]

NPC Talk Count

Talk counts are tracked automatically on every NPC interaction — no tracking tag is needed. The counter is incremented before the dialogue page is resolved. Use the NPC's display name (the name shown above their head) as the key.

FormatDescription
talk:citizenName:qty True if the player has talked to this NPC ≥ qty times. Use the NPC's display name (e.g. talk:Elder Maren:3).

Example

// Unlock dialogue on the 3rd visit to Elder Maren
"Requirements": ["talk:Elder Maren:3"]

// A "returning visitor" page for visits 2+
"Requirements": ["talk:Elder Maren:2"]

OrbisGuard Regions (OrbisGuard optional dependency)

Check whether the player is inside, owns, or is a member of an OrbisGuard region. All three requirements return false if OrbisGuard is not installed.

FormatDescription
inregion:regionId True if the player is currently inside the named OrbisGuard region.
regionowner:regionId True if the player is an owner of the named OrbisGuard region.
regionmember:regionId True if the player is a member or owner of the named OrbisGuard region.

Example

// Show dialogue only while inside the city region
"Requirements": ["inregion:city_of_auren"]

// Gate a landowner page on region ownership
"Requirements": ["regionowner:player_homestead"]

Player Stats

Player-kill and travel-distance requirements track global player actions. The relevant tracking tag must be added before the counter starts accumulating.

FormatDescription
playerKill:qty True if the player has killed ≥ qty other players. Requires an active playerkill named tracker.
travelDistance:qty True if the player has traveled ≥ qty blocks. Requires an active travel named tracker. No progress notification is sent.

Example

// Unlock a bounty page after 5 player kills
"Requirements": [
  "questStarted:bounty_hunter",
  "playerKill:5"
]

// Reward the player for exploring 1000 blocks
"Requirements": [
  "questStarted:explorer_quest",
  "travelDistance:1000"
]

Player Tags

Tags are arbitrary string labels attached to a player's data. They are managed via addTag and removeTag actions. Use them to track custom state that doesn't map to a full quest.

FormatDescription
hasTag:tagName True if the player currently has the named tag.
notTag:tagName True if the player does not have the named tag.

Example

// Only show dialogue if player has the "vip" tag
"Requirements": ["hasTag:vip"]

// Show a path only if a branching choice has NOT been made
"Requirements": ["notTag:chose_evil_path"]

Position

FormatDescription
nearPosition:x:y:z:radius True if the player is within radius blocks of the coordinate (x, y, z).
depth:less:value True if the player's Y-position is strictly less than value.
depth:greater:value True if the player's Y-position is strictly greater than value.
depth:equal:value True if the player's Y-position is exactly value.
distanceFrom:less:x:y:z:distance True if the player's Euclidean distance to (x, y, z) is strictly less than distance.
distanceFrom:greater:x:y:z:distance True if the player's Euclidean distance to (x, y, z) is strictly greater than distance.
distanceFrom:equal:x:y:z:distance True if the player's Euclidean distance to (x, y, z) is exactly distance.

Example

// Player must be near the quest location to turn in
"Requirements": ["nearPosition:120:64:-340:10"]

// Page only shows underground (below Y=40)
"Requirements": ["depth:less:40"]

// Page shows when player is far from a dangerous area
"Requirements": ["distanceFrom:greater:500:64:-200:100"]

Quest State

FormatDescription
questCompleted:questId True if the player has completed the named quest.
questNotCompleted:questId True if the player has not completed the named quest.
questStarted:questId True if the quest is currently in progress (started but not completed).
questNotStarted:questId True if the quest has not been started (and is also not completed).

Example

// Show the turn-in page only when quest is in progress
"Requirements": ["questStarted:lost_sword"]

// Show reward page only after completion
"Requirements": ["questCompleted:lost_sword"]

RPG Level & XP (RPGLeveling optional dependency)

Compares the player's global RPG level or total XP. Requires the RPGLeveling plugin to be active; returns false silently if it is not installed.

FormatDescription
rpglevel:max True if the player is at the maximum RPG level.
rpglevel:equal:value True if the player's RPG level equals value.
rpglevel:greater:value True if the player's RPG level is strictly greater than value.
rpglevel:less:value True if the player's RPG level is strictly less than value.
rpglevel:greaterOrEqual:value True if the player's RPG level is ≥ value.
rpglevel:lessOrEqual:value True if the player's RPG level is ≤ value.
rpgxp:equal:value True if the player's total RPG XP equals value.
rpgxp:greater:value True if the player's total RPG XP is strictly greater than value.
rpgxp:less:value True if the player's total RPG XP is strictly less than value.
rpgxp:greaterOrEqual:value True if the player's total RPG XP is ≥ value.
rpgxp:lessOrEqual:value True if the player's total RPG XP is ≤ value.

Example

// Require RPG level 10 to start a veteran quest
"Requirements": ["rpglevel:greaterOrEqual:10"]

// Show a special page only at max level
"Requirements": ["rpglevel:max"]

Timed Quest

Timed requirements check whether an active countdown is still running or has expired. The timer is started via the timedStart:key action. Both requirements return false if the timer was never started.

FormatDescription
timedActive:key:seconds True if timedStart:key was called AND fewer than seconds have elapsed. Timer is still running.
timedExpired:key:seconds True if timedStart:key was called AND ≥ seconds have elapsed. Time is up.
Page Ordering for Timed Quests

Place the expired page before the active page. Both return false when never started, so the intro page (with questNotStarted) catches those players. Once started, the expired page is checked first — if time is up it shows the failure; otherwise the active page shows. See Quest Patterns → Timed Quest.

Example

// Expire page — must come BEFORE active page in Pages list
"Requirements": [
  "questStarted:courier_run",
  "timedExpired:courier_timer:300"
]

// Active page — shown while timer is running
"Requirements": [
  "questStarted:courier_run",
  "timedActive:courier_timer:300"
]

Use {timeleft:key:totalSeconds} in dialog text to show the remaining time (e.g. "You have 2 minutes 45 seconds left.").

World

FormatDescription
world:worldName True if the player is currently in the named world.

Example

"Requirements": ["world:overworld"]

World Time

FormatDescription
timeOfDay:morning In-game hours 6–11.
timeOfDay:afternoon In-game hours 12–16.
timeOfDay:evening In-game hours 17–20.
timeOfDay:night In-game hours 21–5.

Example

// NPC only talks at night
"Requirements": ["timeOfDay:night"]

Zone & Biome

Check the player's current world zone or biome. Zone names correspond to named map regions (e.g. emerald_grove); biome names correspond to biome identifiers (e.g. temperate_forest). No tracking tag required.

FormatDescription
zone:regionName True if the player is currently in the named world zone.
biome:biomeName True if the player is currently in the named biome.

Example

// Show dialogue only in the Emerald Grove zone
"Requirements": ["zone:emerald_grove"]

// Show a page only in the temperate forest biome
"Requirements": ["biome:temperate_forest"]

Quick Reference

FormatCategoryDescription
questCompleted:idQuest StateQuest is completed
questNotCompleted:idQuest StateQuest is not completed
questStarted:idQuest StateQuest is in progress
questNotStarted:idQuest StateQuest not started
hasTag:tagTagsPlayer has tag
notTag:tagTagsPlayer does not have tag
kill:entityTypeId:qtyKill CountKill threshold (requires tracking tag; * wildcard supported)
killCitizen:name:qtyCitizen KillHyCitizen kill threshold (requires tracking tag; * wildcard supported)
break:blockId:qtyBlock BreakBlock break threshold (requires tracking tag; * wildcard supported)
place:blockId:qtyBlock PlaceBlock place threshold (requires tracking tag; * wildcard supported)
item:itemId:qtyInventoryHas item (no consume)
item:itemId:qty:trueInventoryHas item (consume on use)
talk:citizenName:qtyNPC TalkTalk count threshold (auto-tracked; use the NPC's display name)
npcname:displayNameNPC NameTrue if the NPC that opened the dialogue has this name (case-insensitive; always false in auto-trigger)
cooldown:key:secondsCooldownElapsed since setTimestamp (true if never set)
timedActive:key:secondsTimerTimer running and not yet expired
timedExpired:key:secondsTimerTimer started and expired
timedExact:key:hour:minuteTimerDaily reset gate; true if timestamp unset or before last HH:MM
nearPosition:x:y:z:rPositionWithin radius blocks
depth:less|greater|equal:valuePositionPlayer Y-position comparison
distanceFrom:less|greater|equal:x:y:z:distPositionDistance from fixed world point
playerKill:qtyPlayer StatsPlayer-kill count threshold (requires playerkill named tracker)
travelDistance:qtyPlayer StatsBlocks traveled threshold (requires travel named tracker)
timeOfDay:morning|afternoon|evening|nightWorld TimeTime of day
moonPhase:full|waning|new|waxing|<int>Moon PhaseMoon phase check
world:worldNameWorldCurrent world
zone:regionNameZone/BiomePlayer is in named world zone
biome:biomeNameZone/BiomePlayer is in named biome
any:req1|req2|...LogicOR across sub-requirements
not:requirementLogicNegate any requirement
!requirementLogicShorthand negation — equivalent to not:requirement
variable:name:equal:valueVariableNamed variable equals value
variable:name:greater:valueVariableNamed variable > value
variable:name:less:valueVariableNamed variable < value
variable:name:greaterOrEqual:valueVariableNamed variable ≥ value
variable:name:lessOrEqual:valueVariableNamed variable ≤ value
economy:canafford:amountEconomyPlayer balance ≥ amount (requires VaultUnlocked)
permission:has:perm.nodePermissionsPlayer has permission node (requires VaultUnlocked)
mmo:skillId:equal:valueMMO SkillSkill level equals value (requires MMOSkillTree)
mmo:skillId:greater|less|greaterOrEqual|lessOrEqual:valueMMO SkillSkill level comparison (requires MMOSkillTree)
rpglevel:maxRPG LevelPlayer is at max RPG level (requires RPGLeveling)
rpglevel:equal:valueRPG LevelRPG level equals value (requires RPGLeveling)
rpglevel:greater|less|greaterOrEqual|lessOrEqual:valueRPG LevelRPG level comparison (requires RPGLeveling)
rpgxp:greater|less|equal|greaterOrEqual|lessOrEqual:valueRPG XPTotal RPG XP comparison (requires RPGLeveling)
harvest:itemId:qtyItem HarvestBlock/crop harvest count ≥ qty (* wildcard; requires harvest named tracker)
pickup:itemId:qtyItem PickupPickup count ≥ qty (* wildcard; requires pickup named tracker)
catchfish:fishItemId:qtyFishingFish catch count ≥ qty by item ID (* wildcard; requires HyFishing + catchfish tracker)
catchfishbiome:biomeName:qtyFishingCatch count by biome (* wildcard; requires HyFishing + catchfishbiome tracker)
catchfishrarity:rarity:qtyFishingCatch count by rarity (requires HyFishing + catchfishrarity tracker)
catchfishzone:zoneName:qtyFishingCatch count by zone (* wildcard; requires HyFishing + tracking tag)
releasefish:fishItemId:qtyFishingRelease count (* wildcard; requires HyFishing + tracking tag)
hasfishinbag:fishItemId:qtyFishingLive bag check; * for any fish; no tracking tag needed (requires HyFishing)
inregion:regionIdOrbisGuardPlayer is inside named OrbisGuard region (requires OrbisGuard)
regionowner:regionIdOrbisGuardPlayer owns named OrbisGuard region (requires OrbisGuard)
regionmember:regionIdOrbisGuardPlayer is member or owner of named OrbisGuard region (requires OrbisGuard)
global:hastag:tagNameGlobal StateServer-wide tag list contains the tag
global:nottag:tagNameGlobal StateServer-wide tag list does not contain the tag
global:variable:name:op:valueGlobal StateServer-wide variable comparison (ops: greater, less, equal, greaterOrEqual, lessOrEqual)