Origin (Entity Condition Type)

Entity condition — passes when the player has a given origin.

Passes when the player currently has a given origin — on one specific layer, or on any layer at all.

Type ID: origins:origin — an entity condition.

Needs the Origins mod. Registered by Origins, not core Apoli. It only passes for players; any other entity fails.

Fields

FieldTypeDefaultPurpose
originorigin pattern, or a list of themrequiredThe origin(s) to look for. Passes if any of them matches.
layerIdentifieroptionalOnly check this layer. Omit to pass if a match is held on any layer.
selectionSelectionmainWhere to look: main (the chosen origin), active (the swapped-in origin, falling back to the chosen one), pool (origins sitting in a swap pool) or all (any of the three).

An origin pattern is an identifier that may use * as a wildcard in its namespace or its path — my_pack:aliens/* matches every origin whose path starts with aliens/, at any depth. Without a * it is an ordinary identifier and must match exactly.

Examples

Is this player a Phantom on the main layer?

{
  "type": "origins:origin",
  "origin": "origins:phantom",
  "layer": "origins:origin"
}

Anywhere at all — including a copy layer they picked it up on:

{
  "type": "origins:origin",
  "origin": "origins:merling"
}

Any of a whole family, without listing them one by one:

{
  "type": "origins:origin",
  "layer": "origins:origin",
  "origin": [
    "my_pack:base",
    "my_pack:aliens/*"
  ]
}

Use the list form instead of wrapping several origins:origin checks in an origins:or. It reads better, and — since "inverted": true applies to the whole condition — one inverted copy of it gives you the exact complement, which is what a derived layer needs for its other branch.

Gating one power on several origins

This is how a power behaves differently depending on which origin the player picked. Grant the power broadly, then branch inside it:

{
  "type": "apoli:action_over_time",
  "interval": 20,
  "entity_action": {
    "type": "apoli:if_else",
    "condition": { "type": "origins:origin", "origin": "origins:merling" },
    "if_action": { "type": "apoli:gain_air", "value": 4 },
    "else_action": { "type": "apoli:feed", "food": 1, "saturation": 0.5 }
  }
}

Notes

  • This reads the player’s current choice. To test an origin saved earlier, use origins:stored_origin.
  • It works on both sides: the server reads the player’s origin state, the client reads its synced copy, so it’s safe in render- and HUD-side conditions.

Checking a swap pool

selection decides which of a player’s origins count. By default only their chosen origin does, so a swapped-in origin reads as absent unless you widen it:

{
  "type": "origins:origin",
  "origin": "origins:phantom",
  "selection": "active"
}

That passes while the player is actually playing as a Phantom, swapped in or not. Use pool to ask “could they swap to it?”, and all to mean “do they have it at all?“.