Core & composable
The general-purpose types most powers are built from: event listeners, timed passives, auras, attribute and damage modifiers, and the multiple container.
Fields every power accepts (name, hidden, power_condition, …) are on Power basics. See also: Power basics, Costs & upkeep (effect_over_time and the toggleable passives), Events.
Types on this page: simple · multiple · action_on_event · condition_passive · effect_over_time · persistent_effect · attribute_modifier · modify_damage · prevent_action · conditional · tick_action.
neoorigins:simple
Does nothing. A display-only marker power, the direct equivalent of origins:simple from the original Origins mod.
It has no gameplay effect, no capabilities, and no behavior. Its only purpose is to appear as an entry in the origin info panel so you can attach a name + description (the heading + body text every power carries) without also granting an ability. Use it for flavor text, lore lines, or to describe an effect that is implemented elsewhere (a mixin, datapack, command, or another mod).
No additional fields beyond name and description.
Example:
{
"type": "neoorigins:simple",
"name": "Cold Blooded",
"description": "You feel the chill of the deep more keenly than others."
}
Imported
origins:simple/apace:simple(andorigins:tooltip) powers translate to this type automatically when no specific id-override applies, so their text still shows in the GUI.
neoorigins:multiple
A container that bundles several powers into one. Every key in the JSON other than the shared display fields is treated as a sub-power — its own complete power object. At datapack load the container is flattened: each sub-power becomes a standalone power with the synthetic id <container-namespace>:<container-path>/<subkey>, and the origin’s power list is rewritten to reference those synthetic ids instead of the container.
Use it when a single conceptual ability is really several powers working together (a passive attribute + an on-hit action + a keybind active), so the origin panel can collapse them under one name and description instead of listing each piece.
| Field | Type | Description |
|---|---|---|
name / description | display fields | Shown once for the whole bundle. The origin selection screen collapses the sub-powers back under this single heading. |
<subkey> | power object | Any other key is a sub-power. Its value is a full power object (any type, including a nested neoorigins:multiple). The key name becomes the last path segment of the sub-power’s synthetic id. |
Sub-powers may be native neoorigins: powers or imported origins:/apoli: powers; each is loaded by the same pipeline it would use on its own. A sub-power can reference a sibling with the *:*<subkey> self-reference shorthand, which resolves to the sibling’s synthetic id.
Example: a passive flag wired to an on-hit action under one entry
{
"type": "neoorigins:multiple",
"name": "Venomous",
"description": "Your strikes carry poison.",
"poison_on_hit": {
"type": "neoorigins:action_on_hit",
"hidden": true,
"entity_action": { "type": "neoorigins:apply_effect", "effect": "minecraft:poison", "duration": 60 }
},
"immune": {
"type": "neoorigins:effect_immunity",
"hidden": true,
"effects": ["minecraft:poison"]
}
}
This loads as two powers, <ns>:<path>/poison_on_hit and <ns>:<path>/immune, collapsed under the single “Venomous” entry.
The imported
origins:multiple/apace:multiple(andapoli:multiple) containers flatten through the exact same path, so existing Apoli packs keep working unchanged.neoorigins:multipleis the first-class, in-namespace spelling for new native packs.
neoorigins:action_on_event
The 2.0 generic event hook: fires an action and/or applies a float modifier when a named player event occurs. Replaces 20+ bespoke Origins-Classes hook powers (better_enchanting, more_smoker_xp, crop_harvest_bonus, break_speed_modifier, natural_regen_modifier, action_on_kill, action_on_hit_taken, thorns_aura, knockback_modifier, hunger_drain_modifier, food_restriction, …) with one configurable type.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
event | string | yes | — | Event name (case-insensitive). See EVENTS.md for the full list. |
condition | EntityCondition | no | always-true | DSL gate: the event only fires when this is true |
entity_action | EntityAction | no | noop | Side-effect run when the event fires |
modifier | FloatModifier or list | no | identity | Float modifier applied to the event’s numeric payload (for modifier-style events). Each entry is { "operation": ..., "value": ... }; a list applies in order. value defaults to 0 (amount is not read). Operations (case-sensitive): addition, add_base, add_base_early, add_total, add_total_early add value; multiplication, multiply_base_multiplicative, multiply_total_multiplicative multiply by value; multiply_base_additive, multiply_total_additive multiply by 1 + value; set / set_total replace with value; min_total caps at value; max_total floors at value. Any other operation, including multiply_base and multiply_total, is logged as defaulted to identity and leaves the payload unchanged. |
block_condition | BlockCondition | no | — | Block-position gate for block events (block_break, block_place, block_use, bonemeal). Supports block/id, in_tag, and/or (aliases all_of/any_of), block_state, height, adjacent, and the positional offset wrapper (see below). On any other event a set block_condition never matches, so entity_action does not run there. The modifier path does not check it. |
hands | string or list | no | — | Hand gate for interaction events (block_use, entity_use, villager_interact): only fire for the listed hands, "main_hand" and/or "off_hand". Use ["main_hand"] to stop a power double-firing (vanilla dispatches the right-click once per hand). Fails closed when the event carries no hand info; ignored on other events. |
hand | string or list | no | — | Singular alias for hands, read only when hands is absent (Apoli’s action_on_block_use spelling). |
item_condition | ItemCondition | no | — | Item gate for item-carrying events (item_use, item_use_finish, food_eaten, food_finished, item_pickup, block_use, entity_use, villager_interact): only fire when the stack the event carries matches. That is the used, eaten or picked-up stack for the first five and the stack in the interacting hand for the rest, which is what Apoli’s item_condition on action_on_block_use / action_on_entity_use translates to. Takes the same Apoli item-condition shapes as equipped_item (id/tag/nbt/enchantment, with and/or/not). Fails closed when set but the event carries no item, including on events that never carry one; the modifier path does not check it. |
effect | id | no | — | effect_applied only: pre-dispatch filter on this exact effect id. |
effect_tag | tag id | no | — | effect_applied only: pre-dispatch filter on this effect tag (leading # optional). OR-matched with effect. |
immunity_ticks | int ≥ 0 | no | 0 | effect_applied only: after a successful cancel, grant this many ticks of full immunity to the same effect id before re-rolling. |
power | id or list | no | — | power_activated only: pre-dispatch filter on the activated power’s id (single id or array). Omit to fire on any activation. |
cooldown_ticks | int ≥ 0 | no | 0 | After entity_action fires, suppress further firings of this power for this many ticks (20 = 1s). Tracked per player per power instance and persisted across respawn/relog. Only gates the action path: modifier chains are unaffected. |
The offset block-condition wrapper. Inside block_condition, { "type": "neoorigins:offset", "x": 0, "y": -2, "z": 0, "condition": { ... } } evaluates its nested block condition at the event’s block position shifted by the given block offsets, the Apoli structural wrapper for checks like “a basin two blocks below the block I clicked”. Without a nested condition it matches all blocks (warned at load). The same wrapper works in block_collision and the area_of_effect block fan-out.
Block-condition types. Every field documented as a BlockCondition (block_condition here, in block_collision, in_block, in_block_anywhere, near_block, on_block, prevent_sleep and the area_of_effect block fan-out) accepts the same set of nested types:
| Type | Fields | Matches when |
|---|---|---|
block | block (or legacy id) | The block is exactly that id. |
in_tag | tag | The block is in that block tag (leading # optional). |
and / all_of / or / any_of | conditions | All / at least one nested condition matches. |
offset | x, y, z, condition | The nested condition matches at the shifted position. |
block_state | property, plus value/enum or comparison+compare_to | The block carries that blockstate property and its value matches. A block without the property never matches. |
height | comparison (default >=), compare_to | The block’s own Y level compares true; { "comparison": "<=", "compare_to": 63 } is “at or below sea level”. |
adjacent | adjacent_condition, comparison (default >=), compare_to (default 1) | The number of the six face-neighbours satisfying adjacent_condition compares true. |
Any node also honours "inverted": true, which negates just that node.
{ "type": "neoorigins:adjacent",
"adjacent_condition": { "type": "neoorigins:in_tag", "tag": "minecraft:ice" },
"comparison": "<=",
"compare_to": 2 }
{ "type": "neoorigins:block_state", "property": "waterlogged", "value": true }
Event categories (see EVENTS.md for the full list):
- Lifecycle:
GAINED,LOST,CHOSEN,POWER_ACTIVATED,RESPAWN,DEATH,DIMENSION_CHANGE,ADVANCEMENT_EARNED - Combat:
ATTACK,HIT_TAKEN,HIT_DEALT,KILL,PROJECTILE_HIT,MOD_KNOCKBACK - Food:
FOOD_EATEN,FOOD_FINISHED,MOD_EXHAUSTION,MOD_NATURAL_REGEN,MOD_FOOD_NUTRITION,MOD_CRAFTED_FOOD_SATURATION - Mining / blocks:
BLOCK_BREAK,BLOCK_PLACE,BLOCK_USE,BONEMEAL,MOD_HARVEST_DROPS,MOD_BONEMEAL_EXTRA - Crafting / stations:
CRAFT_ITEM,SMELT_ITEM,ENCHANT_ITEM,ANVIL_REPAIR,MOD_CRAFT_AMOUNT,MOD_ENCHANT_LEVEL,MOD_ANVIL_COST - Trading:
TRADE_COMPLETED,VILLAGER_INTERACT,MOD_TRADE_PRICE - Animals:
BREED,TAME - Items / interaction:
ITEM_USE,ITEM_USE_FINISH,ITEM_PICKUP,ENTITY_USE - Movement:
JUMP,LAND,CLIMB,WAKE_UP,TICK,MOD_TELEPORT_RANGE,MOD_FALL_DAMAGE - Other modifiers:
MOD_POTION_DURATION - Status effects:
EFFECT_APPLIED
For action-style events set entity_action; for modifier-style events set modifier. A single power may declare both: the action path fires on dispatch sites and the modifier path chains on dispatchModifier sites.
neoorigins:cancel_event support. Using cancel_event as the entity_action vetoes the underlying game event, but only where NeoForge exposes a cancellable event:
- Cancellable:
death(the lethal blow is undone; if the player is still at 0 HP they are left at 1 HP, totem-style; pair with aconditionor a healingentity_action, otherwise the next damage tick kills them again),kill(spares the victim, same 1-HP patch),hit_taken(negates the incoming damage),attack(stops the swing before damage),land(negates fall damage),projectile_hit(negates the impact),item_use,food_eaten(blocks the use/eat),effect_applied(blocks the effect),block_break,block_place,block_use,entity_use,villager_interact,breed,tame,bonemeal. - Not cancellable (the NeoForge event fires after the fact or cannot be cancelled;
cancel_eventis a silent no-op):jump,item_use_finish,food_finished,item_pickup,craft_item,smelt_item,enchant_item,anvil_repair,trade_completed,advancement_earned,wake_up,respawn,dimension_change,climb,tick,gained,lost,chosen,power_activated, and allmod_*modifier events.
Example: heal 1 heart on kill only while holding a wooden sword
{
"type": "neoorigins:action_on_event",
"event": "kill",
"condition": {
"type": "neoorigins:equipped_item",
"equipment_slot": "mainhand",
"item_condition": { "id": "minecraft:wooden_sword" }
},
"entity_action": {
"type": "neoorigins:heal",
"amount": 2.0
},
"name": "Wooden Vampire",
"description": "Regain health on kills, but only with a wooden sword."
}
Example: 30% faster natural regen
{
"type": "neoorigins:action_on_event",
"event": "mod_natural_regen",
"modifier": {
"operation": "multiplication",
"value": 1.3
}
}
Example: 90% probabilistic resistance to a third-party infection effect, with 2s of full immunity after each cleanse
{
"type": "neoorigins:action_on_event",
"event": "effect_applied",
"effect": "spore:mycelium_ef",
"entity_action": {
"type": "neoorigins:chance",
"chance": 0.9,
"action": { "type": "neoorigins:cancel_event" }
},
"immunity_ticks": 40
}
Imported
origins:action_on_block_useandorigins:bonemealpowers translate to this type automatically (eventsblock_useandbonemeal), the same wayorigins:action_on_block_breakandorigins:action_on_entity_usealready do. The translation carriescondition,block_conditionand the hand filter over directly;block_actionandentity_actionboth run as the event’sentity_action(block actions self-resolve the clicked/bonemealed block from the event context), and an Apoliaction_resultofSUCCESS/CONSUME/CONSUME_PARTIAL/FAILappends acancel_eventso the interaction outcome matches.
neoorigins:condition_passive
Generic condition-gated periodic action: “a passive with a trigger”. Part of the 2.0 consolidation: collapses biome_buff, damage_in_biome, damage_in_daylight, damage_in_water, burn_at_health_threshold, mobs_ignore_player, no_mob_spawns_nearby, and item_magnetism into a single type. Also supersedes tick_action when condition is omitted.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
interval | int | no | 20 | Tick interval between evaluations (clamped to ≥ 1) |
condition | EntityCondition | no | always-true | DSL condition to test each interval |
entity_action | EntityAction | no | noop | Action run against the player when condition is true |
else_action | EntityAction | no | noop | Action run when condition is false |
toggleable | bool | no | false | When true, binds a skill keybind that flips the periodic action on/off (chat feedback via neoorigins.toggle.on/off). While off the interval action never runs. |
default_off | bool | no | false | Toggleable powers only: when true the power starts disabled so the player opts in via the keybind. |
Also takes the shared toggle upkeep fields (hunger_cost, resource_cost, resource_cost_amount, upkeep_interval, upkeep_condition).
See EVENTS.md / the Apoli compat docs for the full condition and action DSL.
Example: take 1 damage every 2 seconds in the Nether
{
"type": "neoorigins:condition_passive",
"interval": 40,
"condition": {
"type": "neoorigins:in_tag",
"tag": "minecraft:is_nether"
},
"entity_action": {
"type": "neoorigins:damage",
"amount": 1.0,
"source": "fire"
},
"name": "Nether Intolerance",
"description": "Burns while in the Nether."
}
neoorigins:effect_over_time
Sustained aura type: one entity_action tree pulsed on an interval, in one of two modes via the activation field. An aura is a constant effect (usually an origins:area_of_effect radiating from the holder). A passive aura is always on; an active aura is keybind-toggled. A passive aura can also be made toggleable (toggleable: true) to give it an on/off keybind. Active auras start off by default (opt-in); toggleable passives start on. Any of them may pay an upkeep each pulse (hunger_cost, resource_cost): a toggleable aura that can’t pay switches itself off, and a plain passive aura skips the pulse, running neither entity_action nor else_action, and tries again on the next one. (For one-shot, cooldown-gated abilities use active_ability instead; this type is specifically for auras.)
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
activation | enum | no | passive | passive | active (toggle accepted as an alias for active). passive pulses entity_action every interval while granted. active binds a keybind that toggles the aura on/off. Either mode may pay an upkeep. Unrecognised values fall back to passive. |
toggleable | bool | no | false | Passive mode only: add an on/off keybind. A toggleable passive starts on. Active auras are always toggleable and start off; this flag is ignored for them. |
interval | int | no | 20 | Ticks between aura pulses, and so between upkeep charges (clamped ≥ 1). |
condition | EntityCondition | no | always-true | Gate: entity_action pulses each interval only while it passes, else else_action. The upkeep is charged regardless of this gate; use upkeep_condition to gate the cost. |
entity_action | EntityAction | no | noop | Action pulsed on the player each interval, typically an origins:area_of_effect applying damage/effects to nearby entities. Inside an area_of_effect, damage, heal, apply_effect, clear_effect and spawn_particles run on each affected entity, so you can paint custom particles (and apply/strip status effects) on everyone the aura touches. |
else_action | EntityAction | no | noop | Action pulsed each interval while condition is false. |
hunger_cost | int | no | 0 | Upkeep: food points drained each pulse, in any mode. A toggleable aura switches itself off when the holder can’t pay; a plain passive aura skips the pulse. 0 = free. |
resource_cost | string | no | "" | Upkeep: resource power id drained each pulse, in any mode; falls back to hunger_cost when resource bars are globally disabled. |
resource_cost_amount | int | no | 0 | Upkeep: amount of resource_cost drained each pulse. Nothing is deducted unless the whole cost, hunger included, can be paid. |
upkeep_condition | EntityCondition | no | always-true | Charge the upkeep only on pulses where this passes. A pulse whose charge is waived still runs. |
default_off | bool | no | mode-dependent | Override the initial on/off state of a toggleable aura. Default: active → off, toggleable passive → on. Ignored for plain (non-toggleable) passive auras. |
See EVENTS.md / the Apoli compat docs for the full condition and action DSL.
Custom particles & status effects on affected entities. Put
spawn_particles(andapply_effect/damage/heal/clear_effect) inside thearea_of_effect’sentity_actionto apply them to each entity the aura hits, at that entity’s position. Putspawn_particlesoutside (a sibling of thearea_of_effect) to draw on the holder instead. To apply a potion effect without its swirling vanilla particles, useapply_effectwith"show_particles": false.
Filtering who the aura affects. Set the
area_of_effect’sentity_conditionto control which entities are touched. Entity-general conditions filter mobs and players alike:entity_type: minecraft:player= players only;entity_type: "#minecraft:skeletons"= a tag group;target_group= a vanilla mob category;health/relative_health/has_effect/on_fire/living; andand/or/notof those (plus Apoli’sinverted: true). For example, wrapnot { entity_type: minecraft:player }to scorch hostile mobs without burning your allies. Seearea_of_effectfor the full list.
Example (active damage aura): toggle it on to scorch nearby mobs every second, draining 2 hunger per second to keep it up. The flame particles spawn on each burned entity (inside the area_of_effect), not on you
{
"type": "neoorigins:effect_over_time",
"activation": "active",
"interval": 20,
"hunger_cost": 2,
"entity_action": {
"type": "origins:area_of_effect",
"radius": 6,
"shape": "sphere",
"include_source": false,
"entity_action": {
"type": "origins:and",
"actions": [
{
"type": "origins:damage",
"amount": 3.0,
"damage_type": "minecraft:on_fire"
},
{
"type": "origins:spawn_particles",
"particle": "minecraft:flame",
"count": 12,
"speed": 0.02,
"offset_y": 1.0,
"spread": { "x": 0.4, "y": 0.6, "z": 0.4 }
}
]
}
},
"cooldown_icon": "minecraft:blaze_powder",
"name": "Searing Aura",
"description": "A ring of flame that burns nearby foes while it drains your stamina."
}
For a plain passive aura (always on, e.g. a constant self-healing field), set "activation": "passive". Drop the cost fields to make it free, or keep them and it skips every pulse it can’t pay for. For a toggleable passive (an on/off keybind, on by default), add "toggleable": true; with a cost, it switches off when it can’t pay, like an active aura.
effect_over_time has no upkeep_interval: it charges once per pulse. The rest of the toggle upkeep rules apply as written, all-or-nothing charges included.
neoorigins:persistent_effect
Generic condition-gated, toggleable status-effect stack. Part of the 2.0 consolidation: replaces status_effect, stacking_status_effects, night_vision, glow, water_breathing, breath_in_fluid, and the tag branch of regen_in_fluid with one type that applies an arbitrary list of mob effects whenever an optional condition (an EntityCondition DSL tree) is met.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
effects | list of EffectSpec | no | [] | Mob effects to apply. See below. May also be a single inline EffectSpec on the top-level object, which is read only when effects is absent or not an array. Not schema-required, but an empty list applies nothing. |
condition | EntityCondition | no | always-true | DSL condition: effects only apply while it is true. Effects are cleared when it becomes false. |
toggleable | bool | no | true | When true, this is an active-keybind power: pressing the key toggles effects on/off. When false, effects are always applied while condition is true. |
default_off | bool | no | false | Toggleable powers only: when true, the power starts disabled, so effects stay off until the player first toggles it on. |
effect | Identifier | no | — | Root-level single-effect shorthand, equivalent to a one-entry effects list. Read only when effects is absent. Alias id. |
amplifier | int | no | — | Effect level for the root-level single-effect shorthand. With an effects array present it instead overrides the first effect’s amplifier — winning even over one that entry sets itself — which is how a server admin retunes strength without editing the array. Later specs are unchanged, and unlike its three neighbours below it does not cascade. |
ambient | bool | no | true | Root default, cascaded onto every EffectSpec that omits it. |
show_particles | bool | no | false | Root default, cascaded onto every EffectSpec that omits it. |
show_icon | bool | no | true | Root default, cascaded onto every EffectSpec that omits it. |
Also takes the shared toggle upkeep fields (hunger_cost, resource_cost, resource_cost_amount, upkeep_interval, upkeep_condition).
EffectSpec object:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
effect | Identifier | yes | — | Effect ID, e.g. minecraft:strength (alias id also accepted). A spec with a missing or unknown id is dropped without a log. |
amplifier | int | no | 0 | Effect level |
ambient | bool | no | true | Ambient particles (low visibility) |
show_particles | bool | no | false | Whether to show particles |
show_icon | bool | no | true | Whether to show the HUD icon |
Root cascade:
show_icon,show_particles, andambientplaced at the power root (alongsidetype/effects) cascade as defaults onto every nestedEffectSpecthat does not declare its own value. This lets you set HUD/particle visibility once for the whole stack instead of repeating it per effect.
minecraft:night_visionis special-cased. A spec granting night vision is skipped while either thedisable_night_visionserver config is set or the player has switched night vision off with the dedicated Toggle Night Vision keybind (defaultK). The gate is per effect, not per power, so a stack of water breathing + night vision + haste keeps applying the other two. Nothing is needed in the JSON for this. Seeneoorigins:night_vision.
Example: permanent always-on Weakness II
{
"type": "neoorigins:persistent_effect",
"effect": "minecraft:weakness",
"amplifier": 1,
"toggleable": false,
"name": "Frail",
"description": "Permanently weakened."
}
Example: Strength + Haste while in water (conditional, not toggleable)
{
"type": "neoorigins:persistent_effect",
"toggleable": false,
"condition": { "type": "neoorigins:in_water" },
"effects": [
{ "effect": "minecraft:strength", "amplifier": 0 },
{ "effect": "minecraft:haste", "amplifier": 1 }
],
"name": "Tidecaller",
"description": "Empowered while immersed in water."
}
Effects are applied with infinite duration (MobEffectInstance.INFINITE_DURATION), so they never tick down or expire on their own. They are cleared when the condition becomes false, when the power is toggled off, or when the origin is revoked, and re-applied when the condition becomes true again. When toggleable is true (the default), the player can press their skill key to toggle effects on/off. Set toggleable: false for effects that should always be active, or default_off: true to start a toggleable power in the off state. A single effect can be specified inline on the top-level object (effect, amplifier, etc.) instead of using the effects list.
neoorigins:attribute_modifier
Adds or multiplies a player attribute while the origin is active. Optionally gated on an environment condition, an equipped-item condition, or both (AND).
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
attribute | Identifier | yes | — | Attribute to modify, e.g. minecraft:generic.movement_speed |
amount | double | yes | — | Amount to add or multiply. Ignored while resource is set, which supplies the value instead, so write 0. |
resource | Identifier | no | — | Power id of a resource power (native or Apoli-format) whose current value becomes this modifier’s value. See below. |
operation | string | no | add_value | add_value, add_multiplied_base, or add_multiplied_total (exact lowercase). Any other string, including Apoli’s addition / multiply_base, is treated as add_value without a warning. |
condition | string or EntityCondition | no | — | Environment gate: in_water, on_land, or in_lava, or any entity condition object. Tick-driven apply/remove. An unknown string logs a warning and the modifier stays on unconditionally. See the note below on what on_land counts. |
equipment_condition | object | no | — | Equipment gate (see below). Tick-driven apply/remove. |
location_condition | object | no | — | Location gate: dimension / biome / structure (see below). Tick-driven apply/remove. |
resource: an attribute that follows a counter. With resource set, the modifier’s value is the current value of that resource power rather than amount, re-read every 5 ticks and re-applied whenever it has moved, so the attribute tracks the resource in both directions. This is Apoli’s resource-driven modifier, and an imported origins:modify_attribute carrying a resource lands here. A resource nothing has written yet reads 0, the same floor the resource condition compares against, so an attribute gains nothing until the counter starts. Name one resource power: a wildcard selector takes no single value, so it logs once and counts as 0. The gates above still decide whether the modifier is attached at all; while it is, its value follows the resource.
{
"type": "neoorigins:attribute_modifier",
"attribute": "minecraft:generic.max_health",
"amount": 0,
"resource": "mypack:soul_count",
"operation": "add_value",
"name": "Soul Vessel",
"description": "Each soul you hold is another half heart."
}
Apoli can nest further modifiers over the resource value before it reaches the attribute. That is not supported: the attribute tracks the raw value, and the load warns when a pack nests them. To scale a counter, keep the scaled number in the resource itself.
Operations:
add_value: flat addition to base valueadd_multiplied_base: addsbase * amount(e.g.-0.1= 10% slower)add_multiplied_total: multiplies total after all other modifiers
equipment_condition object:
| Field | Type | Required | Description |
|---|---|---|---|
slot | string | no | One of mainhand, offhand, head, chest, legs, feet, body. Defaults to mainhand. |
item | Identifier | no | Exact item ID to match (e.g. minecraft:iron_helmet) |
tag | Identifier | no | Item tag to match (e.g. minecraft:helmets) |
If both item and tag are given, either match satisfies the condition (OR). If neither is given, any non-empty stack in the slot counts as a match. When multiple of condition / equipment_condition / location_condition are set, all must hold for the modifier to apply.
location_condition object:
| Field | Type | Required | Description |
|---|---|---|---|
dimension | Identifier | no | Match only in this dimension, e.g. minecraft:the_end |
biome | Identifier | no | Match only in this specific biome, e.g. minecraft:plains |
biome_tag | Identifier | no | Match only in biomes with this tag, e.g. minecraft:is_forest |
biomes | list of Identifier | no | Match only in any of these biomes |
structure | Identifier | no | Match only inside this structure, e.g. minecraft:end_city |
structure_tag | Identifier | no | Match only inside structures with this tag, e.g. minecraft:on_ocean_monument_maps |
All fields are optional. dimension, structure and structure_tag combine with AND; the biome fields (biome, biome_tag, biomes) are OR’d with each other, so any one biome match satisfies the biome part. So { "dimension": "minecraft:the_end", "structure": "minecraft:end_city" } is “only when standing inside an End City in The End.” Structure membership is evaluated server-side via ServerLevel.structureManager().
Stacking across layers. Each attribute_modifier power owns its own modifier id, so two powers touching the same attribute add up rather than replacing one another: an origin granting +6 max health and a class granting +4 leave the player at +10. Changing one layer re-grants only that layer and leaves every other layer’s modifiers in place, so re-picking a class no longer costs the player their origin’s health, armor or reach. Modifiers left behind by a power that no longer exists (JSON deleted or renamed) are swept at that same moment, so stale bonuses cannot accumulate either.
Example: 8 flat armor (unconditional)
{
"type": "neoorigins:attribute_modifier",
"attribute": "minecraft:generic.armor",
"amount": 8.0,
"operation": "add_value",
"name": "Shell",
"description": "Has permanent natural armor."
}
Example: slower on land only
{
"type": "neoorigins:attribute_modifier",
"attribute": "minecraft:generic.movement_speed",
"amount": -0.25,
"operation": "add_multiplied_base",
"condition": "on_land",
"name": "Landwalker",
"description": "Moves slower while out of water."
}
on_landtreats an active conduit as still being in water. A player carrying Conduit Power does not count as on land, so a land penalty written this way lifts while they are in a conduit’s range instead of punishing them inside their own base.in_wateris the literal check and is unaffected, which means the two are not exact opposites: a player with Conduit Power on dry ground satisfies neither. Rain is not water for either gate — a player out in a storm is on land.
Example: +1 attack when wearing any helmet
{
"type": "neoorigins:attribute_modifier",
"attribute": "minecraft:generic.attack_damage",
"amount": 1.0,
"equipment_condition": {
"slot": "head",
"tag": "minecraft:helmets"
},
"name": "Helm of Valor",
"description": "Empowered while helmeted."
}
Example: +2 armor only inside End Cities
{
"type": "neoorigins:attribute_modifier",
"attribute": "minecraft:generic.armor",
"amount": 2.0,
"location_condition": {
"dimension": "minecraft:the_end",
"structure": "minecraft:end_city"
},
"name": "Void Ward",
"description": "Armored while within the towers of the End."
}
Useful attributes:
minecraft:movement_speed: walk speed (base ≈ 0.1)minecraft:water_movement_efficiency: swim speed boost (0.0–1.0, stacks with Depth Strider)minecraft:armor: armor pointsminecraft:armor_toughness: armor toughnessminecraft:attack_damage: melee damageminecraft:attack_speed: attack cooldown speedminecraft:max_health: max HPminecraft:fall_damage_multiplier: fall damage scaleminecraft:mining_efficiency: mining speed bonusminecraft:oxygen_bonus: extends underwater air (like Respiration)
Note: 1.21+ uses short-form IDs (
minecraft:movement_speed). The legacyminecraft:generic.movement_speedformat still parses via fallback.
Iron’s Spells ‘n Spellbooks attributes:
The attribute field resolves any registered attribute id, so it can target the custom attributes added by Iron’s Spells ‘n Spellbooks (irons_spellbooks). The eight ids a pack can modify:
| Attribute id | add_value does | Scale |
|---|---|---|
irons_spellbooks:max_mana | Flat add to mana capacity | Flat points (100.0 = +100 max mana) |
irons_spellbooks:mana_regen | Mana regen multiplier | Base 1.0: 0.5 ≈ +50% regen |
irons_spellbooks:spell_power | Overall spell power multiplier | Base 1.0: 0.25 ≈ +25% |
irons_spellbooks:spell_resist | Incoming magic resistance | Base 1.0: 0.2 ≈ +20% resist |
irons_spellbooks:cooldown_reduction | Spell cooldown reduction | Fraction 0–1 (0.15 = 15%) |
irons_spellbooks:cast_time_reduction | Cast-time reduction | Fraction 0–1 (0.15 = 15%) |
irons_spellbooks:casting_movespeed | Movement speed while casting | Movement-speed units |
irons_spellbooks:summon_damage | Summoned-mob damage | Damage units |
The operation and scale differ per attribute: max_mana is a flat add; spell_power / mana_regen / spell_resist sit on a base of 1.0, so add_value is a fractional bonus; cooldown_reduction / cast_time_reduction are 0-based fractions in 0–1. Match Iron’s own scaling. There are no per-school spell-power attributes in 3.14.0; those eight are the complete list. Referencing one on a server without Iron’s installed logs one warning per grant and applies nothing (the power still loads); gate the origin with "required_mods": ["irons_spellbooks"] if it should only exist when Iron’s is present.
neoorigins:modify_damage
Multiplies damage dealt or received, optionally filtered to a specific damage type and, for direction: out, restricted to a target entity group.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
direction | string | no | in | in (damage received) or out (damage dealt) |
multiplier | float | no | 1.0 | Damage multiplier (e.g. 2.0 = double, 0.5 = half) |
damage_type | string | no | (all types) | Optional vanilla damage type to filter, e.g. drown, fire, fall |
target_group | string | no | (any) | Outgoing only. Restrict to targets in this entity group: undead, arthropod, illager, aquatic. Resolved as the vanilla minecraft:<group> entity-type tag. |
condition | condition | no | (always) | Only applies while this DSL condition passes. |
set_total | float | no | — | Replaces the damage with this exact value after multiplier is applied. |
max_total | float | no | — | Damage cap. |
min_total | float | no | — | Damage floor. |
The three total fields are the Apoli set_total / max_total / min_total stages and run in that order, after the multiplier: damage * multiplier → replace with set_total → cap at max_total → raise to min_total. max_total and min_total still clamp a value that set_total just wrote, so a set_total of 100 alongside a max_total of 10 yields 10. Omit a field to skip that stage.
Example: double incoming water damage
{
"type": "neoorigins:modify_damage",
"direction": "in",
"multiplier": 2.5,
"damage_type": "drown",
"name": "Water Weakness",
"description": "Takes extra damage from water."
}
Example: bonus fire damage dealt
{
"type": "neoorigins:modify_damage",
"direction": "out",
"multiplier": 1.5,
"damage_type": "fire",
"name": "Fire Mastery",
"description": "Deals extra fire damage."
}
Example: +50% damage to undead
{
"type": "neoorigins:modify_damage",
"direction": "out",
"multiplier": 1.5,
"target_group": "undead",
"name": "Smite",
"description": "Strikes the undead harder."
}
Common damage types: fire, in_fire, lava, drown, fall, freeze, magic, wither, lightning_bolt, fly_into_wall, generic
Matching: damage types are matched against both the vanilla message ID (camelCase, e.g. flyIntoWall) and the registry key path (snake_case, e.g. fly_into_wall). Either convention works. Tag-based filters like #minecraft:is_fire match all damage types in that tag.
neoorigins:prevent_action
Prevents a specific harmful action or event from affecting the player.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
action | string | yes | — | The action to prevent (see values below) |
active_when | string | no | "always" | Stance gate for the prevention: "always", "sneaking", "not_sneaking", "on_ground", or "not_on_ground". The action is only prevented while the condition holds. |
head / chest / legs / feet | bool | no | false | Per-slot toggles for armor_equip only. When true, the matching armor slot rejects equip attempts (item snaps back to inventory, drops on the ground if full). |
Action values:
| Value | What it prevents |
|---|---|
fire | All fire and lava damage |
fall_damage | All fall damage |
drown | Drowning damage |
freeze | Freeze damage from powder snow |
sprint_food | While sprinting, all hunger exhaustion is zeroed (not just the sprint cost) |
armor_equip | Prevents wearing armor in any slot whose corresponding head / chest / legs / feet boolean is true. Items are ejected back to the inventory (or dropped if full). |
chestplate_equip | Legacy alias of armor_equip with chest: true. Kept for back-compat with packs that pre-date armor_equip. |
eye_damage | Accepted, but currently has no effect: nothing reads it |
water_damage | Accepted, but currently has no effect: nothing reads it |
swim | Prevents swimming (velocity-sinks the player in water) |
sleep | Prevents sleeping (bed use returns a “no sleep” message). Clicking a vanilla bed still sets the respawn point before the sleep is refused. |
elytra | Prevents elytra flight (player is stopped from gliding each tick) |
Example: fire immunity
{
"type": "neoorigins:prevent_action",
"action": "fire",
"name": "Fire Immunity",
"description": "Immune to fire and lava."
}
Example: heavy-armor restriction (chest + legs only)
{
"type": "neoorigins:prevent_action",
"action": "armor_equip",
"chest": true,
"legs": true,
"name": "Light-Footed",
"description": "Cannot wear chestplate or leggings."
}
neoorigins:conditional
Currently only one combination does anything: condition: "climbing" with an inner_power whose path contains no_fall cancels fall damage while the player is on a climbable block. The inner power itself is not gated: it runs unconditionally, and every other condition/inner-power combination has no effect. The inner power must be a separately defined power that is also listed in the origin’s power list.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
condition | string | no | always | climbing, in_water, on_ground, or always |
inner_power | Identifier | yes | — | The power to conditionally enable |
Example: no fall damage only while climbing
{
"type": "neoorigins:conditional",
"condition": "climbing",
"inner_power": "examplepack:specter_no_fall_base",
"name": "Spider's Grip",
"description": "Takes no fall damage while clinging to walls."
}
The
inner_powermust also be listed in the origin’spowersarray for it to be registered.
neoorigins:tick_action
Legacy no-op: it dispatches nothing. The type still loads and its fields still parse, so an existing pack keeps booting, but no action ever runs on the interval. Use neoorigins:condition_passive instead: it takes the same interval field and actually runs an entity_action, with an optional condition gating each run.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
interval | int | no | 20 | Parsed and ignored: nothing is dispatched on the interval. |
action_type | string | no | none | Parsed and ignored. teleport_on_damage is accepted by the codec but has no behaviour behind it. |
Replacement: the same shape on condition_passive
{
"type": "neoorigins:condition_passive",
"interval": 40,
"entity_action": {
"type": "neoorigins:heal",
"amount": 1.0
},
"name": "Slow Mend",
"description": "Knits itself back together every two seconds."
}