Neo OriginsСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачать
ВЕРСИИ (236)
release
NeoOrigins v2.2.31 (MC 1.21.1)
v2.2.31+1.21.125 окт. 2026 г.318Minecraft: 1.21.1neoforge
Что нового
> The headline is classic mode: a new `content.toml` switch that offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. Turn it on before the world is created if you can: players who already have an origin or class hidden by classic mode keep it until they reset it.
>
> Rebuilding those sets added four power types for pack authors, and Origins packs that use Blazeborn's snowball weakness, the Merling's conduit power, the Arachnid's webs or `entity_glow` now behave as they do in Origins. Two reports late in testing turned into a further batch of compatibility fixes: an imported resource bar keeps the value you earned rather than resetting on every world join, and an attribute can now follow a resource, as Apoli packs expect of it. Three well-known Origins powers that loaded and did nothing now work, and a power handler registered from a KubeJS `startup_scripts/` file remains registered when a world loads.
>
> This release also brings NeoOrigins to Minecraft 26.3. A client running Punchy, or any mod that checks item use animations often, no longer loses about a third of every frame to NeoOrigins when a pack loads Origins-format powers (#136), and flight powers such as Riding the Sword can no longer be switched off by mods that reset player flight every tick, such as Create Buzzy Beez. Each resource bar can now be resized in the origin editor, and a new `dynamic` flag stacks cooldown and timer bars above the permanent ones.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 26.3 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Classic mode.** A new `classic_mode` option in `content.toml`, off by default, offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. The origins are Human, Merling, Avian, Blazeborn, Elytrian, Enderian, Arachnid, Shulk, Phantom and Feline. The classes are Archer, Beastmaster, Blacksmith, Cleric, Cook, Explorer, Farmer, Lumberjack, Merchant, Miner, Nitwit, Rancher, Rogue and Warrior. Farmer and Rancher are new, and only appear in classic mode. While it is on, every other built-in origin and class is hidden whatever its toggle says, and so are the three Dragon Survival dragons. A classic origin or class switched off by its own toggle stays hidden, and origins from datapacks or `originpacks/` are still offered. Switching it while the server runs applies at once: online players holding a classic origin swap power sets, powers both versions share keep their state, and every client's picker is resent. See [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md#classic-mode).
- **Turn classic mode on before the world is created if you can.** A player who already holds a built-in origin or class that classic mode hides keeps it, powers and all, until it is reset with an Orb of Origin or an Orb of Class, or by an admin running `/neoorigins reset <player>`. Affected players receive a chat message explaining this and how to reset their origin or class, every time they join and when the mode is switched on while they are online. The server also logs a warning when a world that already has player data starts with classic mode on, or has it switched on while running.
- **Classic mode turns evolution off in practice.** None of the classic origins has evolution tiers, and every other built-in is hidden while the mode is on, so none of the selectable built-in origins evolves. Kill counts stop mattering until the mode goes off again. Datapack and `originpacks/` origins keep whatever tiers they declare.
- **`/neoorigins list` shows what classic mode hides.** Hidden entries are marked `[disabled]`, and the header says `(classic mode)` while it is on.
- **The classic Arachnid's climbing is a toggle.** As in Origins, climbing starts on and flips with the origin's ability key, with a low note for off and a high one for on. Climbing inside cobwebs only works while climbing is enabled. The standard Arachnid is unchanged.
- **The classic Arachnid can craft cobwebs.** Players with Master of Webs can craft one cobweb from two pieces of string in any arrangement. Nobody else can craft it.
- **NeoOrigins now ships for Minecraft 26.3.** The new build runs on NeoForge 26.3 (26.3.0.83 or newer), alongside the 26.1.x, 26.2 and 1.21.1 builds. NeoForge 26.3 moved per-world config overrides from `<world>/serverconfig/` to `<world>/syncedconfig/`, so the first time a world starts on 26.3, NeoOrigins copies its `content.toml` override across and applies it straight away. The 26.2-era file is left where it is, so the world still opens on an older build, and a pre-2.2.2 `neoorigins-server.toml` is renamed once its values have been carried across. [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md) describes the new layout.
- **Each resource bar can be resized.** The origin editor, opened from the Edit button on the origin info screen, has a new Resource Bar Sizes panel below the powers list, with a slider for every resource bar that has a label, from 50% to 200%. A bar grows from its top-left corner, with its name and value scaling alongside it, and both the HUD behind the editor and the HUD editor itself draw it at its size. Each bar's slot grows or shrinks with it, so a larger bar never runs into its neighbours and a smaller one leaves no gap. Sizes are saved to `config/neoorigins/hud.json` when the editor closes, separately from bar positions, so resizing a bar neither moves it nor takes it out of the stack. The Edit button appears in Creative mode, or in any game mode with the `show_origin_editor` client option turned on.
### Bug Fixes
- **Punchy no longer causes heavy client lag when a pack loads Origins-format powers (#136).** Punchy, and any mod that checks item use animations often, could spend about a third of each frame rebuilding NeoOrigins' list of edible items. With Origins-format powers loaded, the full power list was rebuilt on every lookup, so the edible-item cache never hit. The power list is now built once per reload, and the edible-item cache also refreshes when the client receives new tags.
- **Flight powers are no longer cancelled by mods that reset player flight every tick.** Riding the Sword, Phantom Form and the other creative-style flight powers granted flight through the player's `mayfly` ability flag, which some mods, such as Create Buzzy Beez, switch off for every survival player each tick. These powers now grant flight through NeoForge's creative flight attribute instead, which those mods leave alone. Turning a flight power off or losing it still drops the player out of flight and clears their fall distance, as before, and creative or spectator flight is never affected. Switching one on while its condition is not yet met, such as drawing the sword after the toggle, now lifts the player off as soon as the condition holds, where before they had to jump to start flying.
- **The slime's bounce keeps the speed you had in the air.** The bounce used the player's sideways speed at landing, after ground contact had already reduced it, so a running slime could still come out of a bounce with almost no forward speed. The sideways speed now comes from the last full tick in the air.
- **The origin info screen lists the powers your evolution tier has given you.** The Powers section only ever showed an origin's base powers, so a power gained at a later tier, such as the Sword Immortal's Heavenly Sword Formation at tier 2, was missing from it along with its keybind, and a power that a tier takes away was still listed. The list and the keybind slots now follow the player's current tier, the same way the server grants the powers. Classes do not evolve, so the class layer still shows its base powers.
- **Origin packs left in the old game-root `originpacks/` folder load again.** 2.0 moved the folder to `config/originpacks/` and read the old one only when the new one was missing, but it also created `config/originpacks/` on every launch, so a single launch left an empty new folder beside a full old one and the packs stopped loading without warning. The old folder is now read whenever it still holds packs and `config/originpacks/` does not, still with the warning asking you to move it across. If both hold packs, only `config/originpacks/` is read, and a warning names the folder being skipped.
- **`exhaustion_filter` cancels the exhaustion it lists.** The power loaded, but nothing read it, so it never filtered anything, including the imported `origins-classes:no_sprint_exhaustion` and `no_mining_exhaustion`. It now cancels the hunger exhaustion vanilla charges for each listed source: `sprint`, `mining`, `jump` and `swim`. Every other source of exhaustion is left alone.
- **Cobweb affinity now covers the mod's own web, not just vanilla's.** Climbing read the `#neoorigins:cobwebs` tag, but the slowdown suppression and the 10x break speed tested `minecraft:cobweb` directly, so a holder inside `neoorigins:temporary_cobweb`, which that tag has always listed, could climb it and still be slowed by it and still break it at normal speed. All three now read the tag, so a pack that adds its own web to it gets the whole of cobweb affinity rather than climbing alone.
- **Three power descriptions now say what their powers actually do.** The Herbalist's Bountiful Harvest promised 50% more crops, the classic Farmer's promised twice the yield, and the classic Rancher's Twin Births promised a chance of two babies. The descriptions reflected the intended behaviour rather than the actual behaviour: both harvest powers add one extra drop, and Twin Births fires every time. The Herbalist power also carried a `multiplier` field that `crop_harvest_bonus` has never accepted, so it was being dropped in silence and the power fell back to one extra drop anyway; the dead field is gone. No power's behaviour changes here, only the text that described it.
- **`in_block_anywhere` works in entity conditions.** It was only usable in player conditions. A condition tested against a living entity, such as the `entity_condition` of `entity_glow` or `prevent_entity_render`, can now use it.
- **`NeoOrigins.registerPower` works from a `startup_scripts/` file (1.21.1 and 26.1, the builds carrying the KubeJS bridge).** KubeJS clears every plugin's caches at the top of each script reload, and the server scripts reload when a world loads, long after the startup script's single run for that session. That cleared the handler before any power could look it up, so a `js_custom` or `js_active` power stayed inert, while the same call from `server_scripts/` worked because it ran after the clear. Registrations from a startup script now survive a reload; ones from a reloadable script are still replaced on each reload, so re-registering there keeps working. `NeoOrigins.registerCallback` was affected the same way and is fixed with it.
- **The classic Enderian's Gourd Blindness works.** The power checks whether another entity is wearing a pumpkin, but `equipped_item` could not check other entities' equipment. The resulting condition could never be satisfied: the power hid nobody, and the server logged a warning on every load. The verb now reads any entity's equipment, in any of the six vanilla slots, so the power works, and so does any pack power written the same way. Two limits remain: the `accessory` slot cannot be asked about another entity, and a nested item condition NeoOrigins does not understand makes it refuse the whole filter rather than match everything, which in a hide-entities power would have hidden the world.
### Pack Author Features
- **`hud_render.dynamic` stacks a bar above the permanent ones.** Cooldown and timer bars took their slot in the same resource id order as every other bar, so one that appeared partway up the stack pushed every bar above it up, and they all dropped back when it went. A bar with `"dynamic": true` in its `hud_render` now stacks above every bar without it, with each group still in resource id order, so permanent bars hold their places while dynamic ones come and go on top. Cooldown bars from the Origins compatibility layer, both an `origins:cooldown` power and the cooldown bar of an active power, are dynamic by default. Native `neoorigins:resource` bars are not, and opt in with `"hud_render": { "dynamic": true }`. A bar given a saved position in the HUD editor is unaffected.
- **`neoorigins:execute_command` runs when an action targets a mob.** Commands were a player-only verb, so wherever an action ran against a mob, such as the target of `action_on_hit`, `target_action_on_hit` or a projectile hit, a command was skipped, and an `and` containing one was skipped entirely. The command now runs as the mob, so `@s` is the mob, with output suppressed and the same permission level as other power commands. It goes through the same legacy command repair, blocked-command list and unparseable-command log as every other place a power runs a command.
- **`neoorigins:like_air` carries movement speed into the air.** Airborne control speed goes through the player's `movement_speed` modifiers, as it does for Origins' Avian. That includes the sprint modifier, so a sprinting holder gets vanilla's airborne sprint bonus with the modifier's +30% on top, also as in Origins. Creative and ability flight are left alone.
- **`neoorigins:conduit_power_on_land` lets conduits affect players with this power while they are on land.** An active conduit nearby gives them Conduit Power out of water or rain too. The power grants nothing by itself: a conduit still has to be built and active.
- **`neoorigins:entity_glow` outlines entities for the holder alone.** Living entities matching `entity_condition`, and `bientity_condition` with the holder as actor, get a glowing outline that only the holder sees, the way a Spectral Arrow marks a target. Nobody is given the Glowing effect. With `use_teams` on, the default, an entity on a coloured team keeps its team colour; otherwise the outline takes `red`, `green` and `blue`. The classic Arachnid uses it to sense non-arthropods stuck in cobwebs.
- **`neoorigins:projectile_vulnerability` adds damage from listed projectiles.** The holder takes `amount` extra damage, 3 by default, from each projectile in `projectiles`, given by id or as a `#tag`. The bonus is dealt even when the projectile itself deals none, so a snowball can hurt a Blazeborn. [POWER_TYPES.md](docs/POWER_TYPES.md) documents all four new types.
- **`cobweb_affinity` can climb.** A new `climb` field, off by default, makes a cobweb the player is inside work as a ladder: jump to climb, sneak to hold. [POWER_TYPES.md](docs/POWER_TYPES.md) shows how the classic Arachnid gates wall and web climbing on a toggle, under `wall_climbing`.
### Compatibility (Apoli / Origins)
- **`target_action_on_hit` fires on every hit and acts on the entity that was hit.** The compatibility layer ran its `entity_action` only when the holder killed something, and ran it on the holder rather than on the victim. It now fires each time the holder damages an entity and runs on that entity, as in Apoli, honouring the power's `condition` and its `cooldown`. A player who is hit gets the full action set; a mob gets the actions that can apply to any entity, such as effects, damage, fire, knockback and now commands. `damage_condition` and `target_condition` are not read yet, so the action fires on any hit while the power's `condition` holds.
- **An older origin pack's worldgen files can stop a 26.x server from starting.** A pack that ships its own dimension or worldgen files in the 1.21.1 format, such as a `dimension_type` without `has_ender_dragon_fight` or a biome with `"carvers": {}`, is rejected by vanilla Minecraft 26.x, and the server fails to start. NeoOrigins does not read these files, so it cannot bypass these errors: the fix is to update the pack's worldgen files to the 26.x format. Pack authors targeting 26.x should check every `dimension_type`, `dimension` and `worldgen` file they ship. Server admins whose startup log names one of these files should update the pack or remove it.
- **Imported `origins:entity_glow` outlines entities for the holder.** It gave the holder the Glowing effect, so everyone else saw the holder glow while the holder saw nothing new. It now maps onto `neoorigins:entity_glow`, which outlines matching entities for the holder alone. Its `bientity_condition` can now check `distance`, so SeerOrigin's sight outlines living things within 25 blocks while astral, where before that sight outlined nothing. `origins:self_glow` is unchanged.
- **Imported `origins:conduit_power_on_land` no longer grants effects Origins never gave.** A power with that id, whether the pack shipped the file or only referenced the bare id, gave permanent Water Breathing, Night Vision and Haste. In Origins it only lets an active conduit reach the holder out of water, and that is now what it does. Written as a power `type`, it now maps the same way.
- **The bare `origins:master_of_webs` id no longer climbs every wall.** A pack referencing it without shipping the file got `wall_climbing`. It now gets `cobweb_affinity` with `climb` on.
- **Imported Blazeborn snowball damage matches Origins.** Origins' `damage_from_snowballs` loaded as a 4x multiplier on all incoming damage, with no snowball check, and the bare id was not recognised at all. Both now map onto `neoorigins:projectile_vulnerability`: a snowball deals a Blazeborn 3 damage, and other damage is unaffected. Any `modify_damage_taken` of the same shape, a positive flat addition from one projectile type, maps the same way.
- **An imported resource bar keeps its value when you log back in.** `origins:resource` seeded its `start_value` on every login, not only when the power was granted, so a bar tracking progress (a level counter, stored energy, a kill tally) reset to its floor on every world join, and any power reading it read the floor with it. A login now leaves the stored value alone, and still seeds one for a player who has none. Changing origin, or an Orb of Origin re-pick, resets the bar as before. The native `neoorigins:resource` was already right.
- **Three well-known Origins powers did nothing when a pack named them by id alone.** `origins:burn_in_daylight`, `origins:hotblooded` and `origins:water_vulnerability` were each represented by a power with no configuration, which loaded but did nothing. They now get what Origins gives: catching fire once a second in direct sunlight unless invisible, immunity to Poison and Hunger, and 2 damage a second in water or rain. A pack shipping its own file for one of these is translated from that file, as before.
- **An attribute can follow a resource.** Apoli lets a modifier take its value from a resource, which is how a pack makes max health, or any other attribute, track a counter it keeps. NeoOrigins applied the modifier's declared value and ignored the resource, and these powers are written with a value of `0` because the resource is meant to supply all of it, so the power loaded and then did nothing. `origins:modify_attribute` now carries the resource across, and `neoorigins:attribute_modifier` takes a `resource` of its own: the modifier's value is the resource's current value, re-read every 5 ticks, so the attribute moves with it both ways. A resource nothing has written yet reads 0. Apoli can also run further modifiers over that value before it reaches the attribute, which is not supported: the attribute tracks the raw value, and a warning is logged during loading when a pack requests additional modifiers.
release
NeoOrigins v2.2.31 (MC 26.3)
v2.2.31+26.325 окт. 2026 г.32Minecraft: 26.3neoforge
Что нового
> The headline is classic mode: a new `content.toml` switch that offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. Turn it on before the world is created if you can: players who already have an origin or class hidden by classic mode keep it until they reset it.
>
> Rebuilding those sets added four power types for pack authors, and Origins packs that use Blazeborn's snowball weakness, the Merling's conduit power, the Arachnid's webs or `entity_glow` now behave as they do in Origins. Two reports late in testing turned into a further batch of compatibility fixes: an imported resource bar keeps the value you earned rather than resetting on every world join, and an attribute can now follow a resource, as Apoli packs expect of it. Three well-known Origins powers that loaded and did nothing now work, and a power handler registered from a KubeJS `startup_scripts/` file remains registered when a world loads.
>
> This release also brings NeoOrigins to Minecraft 26.3. A client running Punchy, or any mod that checks item use animations often, no longer loses about a third of every frame to NeoOrigins when a pack loads Origins-format powers (#136), and flight powers such as Riding the Sword can no longer be switched off by mods that reset player flight every tick, such as Create Buzzy Beez. Each resource bar can now be resized in the origin editor, and a new `dynamic` flag stacks cooldown and timer bars above the permanent ones.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 26.3 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Classic mode.** A new `classic_mode` option in `content.toml`, off by default, offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. The origins are Human, Merling, Avian, Blazeborn, Elytrian, Enderian, Arachnid, Shulk, Phantom and Feline. The classes are Archer, Beastmaster, Blacksmith, Cleric, Cook, Explorer, Farmer, Lumberjack, Merchant, Miner, Nitwit, Rancher, Rogue and Warrior. Farmer and Rancher are new, and only appear in classic mode. While it is on, every other built-in origin and class is hidden whatever its toggle says, and so are the three Dragon Survival dragons. A classic origin or class switched off by its own toggle stays hidden, and origins from datapacks or `originpacks/` are still offered. Switching it while the server runs applies at once: online players holding a classic origin swap power sets, powers both versions share keep their state, and every client's picker is resent. See [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md#classic-mode).
- **Turn classic mode on before the world is created if you can.** A player who already holds a built-in origin or class that classic mode hides keeps it, powers and all, until it is reset with an Orb of Origin or an Orb of Class, or by an admin running `/neoorigins reset <player>`. Affected players receive a chat message explaining this and how to reset their origin or class, every time they join and when the mode is switched on while they are online. The server also logs a warning when a world that already has player data starts with classic mode on, or has it switched on while running.
- **Classic mode turns evolution off in practice.** None of the classic origins has evolution tiers, and every other built-in is hidden while the mode is on, so none of the selectable built-in origins evolves. Kill counts stop mattering until the mode goes off again. Datapack and `originpacks/` origins keep whatever tiers they declare.
- **`/neoorigins list` shows what classic mode hides.** Hidden entries are marked `[disabled]`, and the header says `(classic mode)` while it is on.
- **The classic Arachnid's climbing is a toggle.** As in Origins, climbing starts on and flips with the origin's ability key, with a low note for off and a high one for on. Climbing inside cobwebs only works while climbing is enabled. The standard Arachnid is unchanged.
- **The classic Arachnid can craft cobwebs.** Players with Master of Webs can craft one cobweb from two pieces of string in any arrangement. Nobody else can craft it.
- **NeoOrigins now ships for Minecraft 26.3.** The new build runs on NeoForge 26.3 (26.3.0.83 or newer), alongside the 26.1.x, 26.2 and 1.21.1 builds. NeoForge 26.3 moved per-world config overrides from `<world>/serverconfig/` to `<world>/syncedconfig/`, so the first time a world starts on 26.3, NeoOrigins copies its `content.toml` override across and applies it straight away. The 26.2-era file is left where it is, so the world still opens on an older build, and a pre-2.2.2 `neoorigins-server.toml` is renamed once its values have been carried across. [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md) describes the new layout.
- **Each resource bar can be resized.** The origin editor, opened from the Edit button on the origin info screen, has a new Resource Bar Sizes panel below the powers list, with a slider for every resource bar that has a label, from 50% to 200%. A bar grows from its top-left corner, with its name and value scaling alongside it, and both the HUD behind the editor and the HUD editor itself draw it at its size. Each bar's slot grows or shrinks with it, so a larger bar never runs into its neighbours and a smaller one leaves no gap. Sizes are saved to `config/neoorigins/hud.json` when the editor closes, separately from bar positions, so resizing a bar neither moves it nor takes it out of the stack. The Edit button appears in Creative mode, or in any game mode with the `show_origin_editor` client option turned on.
### Bug Fixes
- **Punchy no longer causes heavy client lag when a pack loads Origins-format powers (#136).** Punchy, and any mod that checks item use animations often, could spend about a third of each frame rebuilding NeoOrigins' list of edible items. With Origins-format powers loaded, the full power list was rebuilt on every lookup, so the edible-item cache never hit. The power list is now built once per reload, and the edible-item cache also refreshes when the client receives new tags.
- **Flight powers are no longer cancelled by mods that reset player flight every tick.** Riding the Sword, Phantom Form and the other creative-style flight powers granted flight through the player's `mayfly` ability flag, which some mods, such as Create Buzzy Beez, switch off for every survival player each tick. These powers now grant flight through NeoForge's creative flight attribute instead, which those mods leave alone. Turning a flight power off or losing it still drops the player out of flight and clears their fall distance, as before, and creative or spectator flight is never affected. Switching one on while its condition is not yet met, such as drawing the sword after the toggle, now lifts the player off as soon as the condition holds, where before they had to jump to start flying.
- **The slime's bounce keeps the speed you had in the air.** The bounce used the player's sideways speed at landing, after ground contact had already reduced it, so a running slime could still come out of a bounce with almost no forward speed. The sideways speed now comes from the last full tick in the air.
- **The origin info screen lists the powers your evolution tier has given you.** The Powers section only ever showed an origin's base powers, so a power gained at a later tier, such as the Sword Immortal's Heavenly Sword Formation at tier 2, was missing from it along with its keybind, and a power that a tier takes away was still listed. The list and the keybind slots now follow the player's current tier, the same way the server grants the powers. Classes do not evolve, so the class layer still shows its base powers.
- **Origin packs left in the old game-root `originpacks/` folder load again.** 2.0 moved the folder to `config/originpacks/` and read the old one only when the new one was missing, but it also created `config/originpacks/` on every launch, so a single launch left an empty new folder beside a full old one and the packs stopped loading without warning. The old folder is now read whenever it still holds packs and `config/originpacks/` does not, still with the warning asking you to move it across. If both hold packs, only `config/originpacks/` is read, and a warning names the folder being skipped.
- **`exhaustion_filter` cancels the exhaustion it lists.** The power loaded, but nothing read it, so it never filtered anything, including the imported `origins-classes:no_sprint_exhaustion` and `no_mining_exhaustion`. It now cancels the hunger exhaustion vanilla charges for each listed source: `sprint`, `mining`, `jump` and `swim`. Every other source of exhaustion is left alone.
- **Cobweb affinity now covers the mod's own web, not just vanilla's.** Climbing read the `#neoorigins:cobwebs` tag, but the slowdown suppression and the 10x break speed tested `minecraft:cobweb` directly, so a holder inside `neoorigins:temporary_cobweb`, which that tag has always listed, could climb it and still be slowed by it and still break it at normal speed. All three now read the tag, so a pack that adds its own web to it gets the whole of cobweb affinity rather than climbing alone.
- **Three power descriptions now say what their powers actually do.** The Herbalist's Bountiful Harvest promised 50% more crops, the classic Farmer's promised twice the yield, and the classic Rancher's Twin Births promised a chance of two babies. The descriptions reflected the intended behaviour rather than the actual behaviour: both harvest powers add one extra drop, and Twin Births fires every time. The Herbalist power also carried a `multiplier` field that `crop_harvest_bonus` has never accepted, so it was being dropped in silence and the power fell back to one extra drop anyway; the dead field is gone. No power's behaviour changes here, only the text that described it.
- **`in_block_anywhere` works in entity conditions.** It was only usable in player conditions. A condition tested against a living entity, such as the `entity_condition` of `entity_glow` or `prevent_entity_render`, can now use it.
- **`NeoOrigins.registerPower` works from a `startup_scripts/` file (1.21.1 and 26.1, the builds carrying the KubeJS bridge).** KubeJS clears every plugin's caches at the top of each script reload, and the server scripts reload when a world loads, long after the startup script's single run for that session. That cleared the handler before any power could look it up, so a `js_custom` or `js_active` power stayed inert, while the same call from `server_scripts/` worked because it ran after the clear. Registrations from a startup script now survive a reload; ones from a reloadable script are still replaced on each reload, so re-registering there keeps working. `NeoOrigins.registerCallback` was affected the same way and is fixed with it.
- **The classic Enderian's Gourd Blindness works.** The power checks whether another entity is wearing a pumpkin, but `equipped_item` could not check other entities' equipment. The resulting condition could never be satisfied: the power hid nobody, and the server logged a warning on every load. The verb now reads any entity's equipment, in any of the six vanilla slots, so the power works, and so does any pack power written the same way. Two limits remain: the `accessory` slot cannot be asked about another entity, and a nested item condition NeoOrigins does not understand makes it refuse the whole filter rather than match everything, which in a hide-entities power would have hidden the world.
### Pack Author Features
- **`hud_render.dynamic` stacks a bar above the permanent ones.** Cooldown and timer bars took their slot in the same resource id order as every other bar, so one that appeared partway up the stack pushed every bar above it up, and they all dropped back when it went. A bar with `"dynamic": true` in its `hud_render` now stacks above every bar without it, with each group still in resource id order, so permanent bars hold their places while dynamic ones come and go on top. Cooldown bars from the Origins compatibility layer, both an `origins:cooldown` power and the cooldown bar of an active power, are dynamic by default. Native `neoorigins:resource` bars are not, and opt in with `"hud_render": { "dynamic": true }`. A bar given a saved position in the HUD editor is unaffected.
- **`neoorigins:execute_command` runs when an action targets a mob.** Commands were a player-only verb, so wherever an action ran against a mob, such as the target of `action_on_hit`, `target_action_on_hit` or a projectile hit, a command was skipped, and an `and` containing one was skipped entirely. The command now runs as the mob, so `@s` is the mob, with output suppressed and the same permission level as other power commands. It goes through the same legacy command repair, blocked-command list and unparseable-command log as every other place a power runs a command.
- **`neoorigins:like_air` carries movement speed into the air.** Airborne control speed goes through the player's `movement_speed` modifiers, as it does for Origins' Avian. That includes the sprint modifier, so a sprinting holder gets vanilla's airborne sprint bonus with the modifier's +30% on top, also as in Origins. Creative and ability flight are left alone.
- **`neoorigins:conduit_power_on_land` lets conduits affect players with this power while they are on land.** An active conduit nearby gives them Conduit Power out of water or rain too. The power grants nothing by itself: a conduit still has to be built and active.
- **`neoorigins:entity_glow` outlines entities for the holder alone.** Living entities matching `entity_condition`, and `bientity_condition` with the holder as actor, get a glowing outline that only the holder sees, the way a Spectral Arrow marks a target. Nobody is given the Glowing effect. With `use_teams` on, the default, an entity on a coloured team keeps its team colour; otherwise the outline takes `red`, `green` and `blue`. The classic Arachnid uses it to sense non-arthropods stuck in cobwebs.
- **`neoorigins:projectile_vulnerability` adds damage from listed projectiles.** The holder takes `amount` extra damage, 3 by default, from each projectile in `projectiles`, given by id or as a `#tag`. The bonus is dealt even when the projectile itself deals none, so a snowball can hurt a Blazeborn. [POWER_TYPES.md](docs/POWER_TYPES.md) documents all four new types.
- **`cobweb_affinity` can climb.** A new `climb` field, off by default, makes a cobweb the player is inside work as a ladder: jump to climb, sneak to hold. [POWER_TYPES.md](docs/POWER_TYPES.md) shows how the classic Arachnid gates wall and web climbing on a toggle, under `wall_climbing`.
### Compatibility (Apoli / Origins)
- **`target_action_on_hit` fires on every hit and acts on the entity that was hit.** The compatibility layer ran its `entity_action` only when the holder killed something, and ran it on the holder rather than on the victim. It now fires each time the holder damages an entity and runs on that entity, as in Apoli, honouring the power's `condition` and its `cooldown`. A player who is hit gets the full action set; a mob gets the actions that can apply to any entity, such as effects, damage, fire, knockback and now commands. `damage_condition` and `target_condition` are not read yet, so the action fires on any hit while the power's `condition` holds.
- **An older origin pack's worldgen files can stop a 26.x server from starting.** A pack that ships its own dimension or worldgen files in the 1.21.1 format, such as a `dimension_type` without `has_ender_dragon_fight` or a biome with `"carvers": {}`, is rejected by vanilla Minecraft 26.x, and the server fails to start. NeoOrigins does not read these files, so it cannot bypass these errors: the fix is to update the pack's worldgen files to the 26.x format. Pack authors targeting 26.x should check every `dimension_type`, `dimension` and `worldgen` file they ship. Server admins whose startup log names one of these files should update the pack or remove it.
- **Imported `origins:entity_glow` outlines entities for the holder.** It gave the holder the Glowing effect, so everyone else saw the holder glow while the holder saw nothing new. It now maps onto `neoorigins:entity_glow`, which outlines matching entities for the holder alone. Its `bientity_condition` can now check `distance`, so SeerOrigin's sight outlines living things within 25 blocks while astral, where before that sight outlined nothing. `origins:self_glow` is unchanged.
- **Imported `origins:conduit_power_on_land` no longer grants effects Origins never gave.** A power with that id, whether the pack shipped the file or only referenced the bare id, gave permanent Water Breathing, Night Vision and Haste. In Origins it only lets an active conduit reach the holder out of water, and that is now what it does. Written as a power `type`, it now maps the same way.
- **The bare `origins:master_of_webs` id no longer climbs every wall.** A pack referencing it without shipping the file got `wall_climbing`. It now gets `cobweb_affinity` with `climb` on.
- **Imported Blazeborn snowball damage matches Origins.** Origins' `damage_from_snowballs` loaded as a 4x multiplier on all incoming damage, with no snowball check, and the bare id was not recognised at all. Both now map onto `neoorigins:projectile_vulnerability`: a snowball deals a Blazeborn 3 damage, and other damage is unaffected. Any `modify_damage_taken` of the same shape, a positive flat addition from one projectile type, maps the same way.
- **An imported resource bar keeps its value when you log back in.** `origins:resource` seeded its `start_value` on every login, not only when the power was granted, so a bar tracking progress (a level counter, stored energy, a kill tally) reset to its floor on every world join, and any power reading it read the floor with it. A login now leaves the stored value alone, and still seeds one for a player who has none. Changing origin, or an Orb of Origin re-pick, resets the bar as before. The native `neoorigins:resource` was already right.
- **Three well-known Origins powers did nothing when a pack named them by id alone.** `origins:burn_in_daylight`, `origins:hotblooded` and `origins:water_vulnerability` were each represented by a power with no configuration, which loaded but did nothing. They now get what Origins gives: catching fire once a second in direct sunlight unless invisible, immunity to Poison and Hunger, and 2 damage a second in water or rain. A pack shipping its own file for one of these is translated from that file, as before.
- **An attribute can follow a resource.** Apoli lets a modifier take its value from a resource, which is how a pack makes max health, or any other attribute, track a counter it keeps. NeoOrigins applied the modifier's declared value and ignored the resource, and these powers are written with a value of `0` because the resource is meant to supply all of it, so the power loaded and then did nothing. `origins:modify_attribute` now carries the resource across, and `neoorigins:attribute_modifier` takes a `resource` of its own: the modifier's value is the resource's current value, re-read every 5 ticks, so the attribute moves with it both ways. A resource nothing has written yet reads 0. Apoli can also run further modifiers over that value before it reaches the attribute, which is not supported: the attribute tracks the raw value, and a warning is logged during loading when a pack requests additional modifiers.
release
NeoOrigins v2.2.31 (MC 26.2)
v2.2.31+26.225 окт. 2026 г.11Minecraft: 26.2neoforge
Что нового
> The headline is classic mode: a new `content.toml` switch that offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. Turn it on before the world is created if you can: players who already have an origin or class hidden by classic mode keep it until they reset it.
>
> Rebuilding those sets added four power types for pack authors, and Origins packs that use Blazeborn's snowball weakness, the Merling's conduit power, the Arachnid's webs or `entity_glow` now behave as they do in Origins. Two reports late in testing turned into a further batch of compatibility fixes: an imported resource bar keeps the value you earned rather than resetting on every world join, and an attribute can now follow a resource, as Apoli packs expect of it. Three well-known Origins powers that loaded and did nothing now work, and a power handler registered from a KubeJS `startup_scripts/` file remains registered when a world loads.
>
> This release also brings NeoOrigins to Minecraft 26.3. A client running Punchy, or any mod that checks item use animations often, no longer loses about a third of every frame to NeoOrigins when a pack loads Origins-format powers (#136), and flight powers such as Riding the Sword can no longer be switched off by mods that reset player flight every tick, such as Create Buzzy Beez. Each resource bar can now be resized in the origin editor, and a new `dynamic` flag stacks cooldown and timer bars above the permanent ones.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 26.3 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Classic mode.** A new `classic_mode` option in `content.toml`, off by default, offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. The origins are Human, Merling, Avian, Blazeborn, Elytrian, Enderian, Arachnid, Shulk, Phantom and Feline. The classes are Archer, Beastmaster, Blacksmith, Cleric, Cook, Explorer, Farmer, Lumberjack, Merchant, Miner, Nitwit, Rancher, Rogue and Warrior. Farmer and Rancher are new, and only appear in classic mode. While it is on, every other built-in origin and class is hidden whatever its toggle says, and so are the three Dragon Survival dragons. A classic origin or class switched off by its own toggle stays hidden, and origins from datapacks or `originpacks/` are still offered. Switching it while the server runs applies at once: online players holding a classic origin swap power sets, powers both versions share keep their state, and every client's picker is resent. See [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md#classic-mode).
- **Turn classic mode on before the world is created if you can.** A player who already holds a built-in origin or class that classic mode hides keeps it, powers and all, until it is reset with an Orb of Origin or an Orb of Class, or by an admin running `/neoorigins reset <player>`. Affected players receive a chat message explaining this and how to reset their origin or class, every time they join and when the mode is switched on while they are online. The server also logs a warning when a world that already has player data starts with classic mode on, or has it switched on while running.
- **Classic mode turns evolution off in practice.** None of the classic origins has evolution tiers, and every other built-in is hidden while the mode is on, so none of the selectable built-in origins evolves. Kill counts stop mattering until the mode goes off again. Datapack and `originpacks/` origins keep whatever tiers they declare.
- **`/neoorigins list` shows what classic mode hides.** Hidden entries are marked `[disabled]`, and the header says `(classic mode)` while it is on.
- **The classic Arachnid's climbing is a toggle.** As in Origins, climbing starts on and flips with the origin's ability key, with a low note for off and a high one for on. Climbing inside cobwebs only works while climbing is enabled. The standard Arachnid is unchanged.
- **The classic Arachnid can craft cobwebs.** Players with Master of Webs can craft one cobweb from two pieces of string in any arrangement. Nobody else can craft it.
- **NeoOrigins now ships for Minecraft 26.3.** The new build runs on NeoForge 26.3 (26.3.0.83 or newer), alongside the 26.1.x, 26.2 and 1.21.1 builds. NeoForge 26.3 moved per-world config overrides from `<world>/serverconfig/` to `<world>/syncedconfig/`, so the first time a world starts on 26.3, NeoOrigins copies its `content.toml` override across and applies it straight away. The 26.2-era file is left where it is, so the world still opens on an older build, and a pre-2.2.2 `neoorigins-server.toml` is renamed once its values have been carried across. [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md) describes the new layout.
- **Each resource bar can be resized.** The origin editor, opened from the Edit button on the origin info screen, has a new Resource Bar Sizes panel below the powers list, with a slider for every resource bar that has a label, from 50% to 200%. A bar grows from its top-left corner, with its name and value scaling alongside it, and both the HUD behind the editor and the HUD editor itself draw it at its size. Each bar's slot grows or shrinks with it, so a larger bar never runs into its neighbours and a smaller one leaves no gap. Sizes are saved to `config/neoorigins/hud.json` when the editor closes, separately from bar positions, so resizing a bar neither moves it nor takes it out of the stack. The Edit button appears in Creative mode, or in any game mode with the `show_origin_editor` client option turned on.
### Bug Fixes
- **Punchy no longer causes heavy client lag when a pack loads Origins-format powers (#136).** Punchy, and any mod that checks item use animations often, could spend about a third of each frame rebuilding NeoOrigins' list of edible items. With Origins-format powers loaded, the full power list was rebuilt on every lookup, so the edible-item cache never hit. The power list is now built once per reload, and the edible-item cache also refreshes when the client receives new tags.
- **Flight powers are no longer cancelled by mods that reset player flight every tick.** Riding the Sword, Phantom Form and the other creative-style flight powers granted flight through the player's `mayfly` ability flag, which some mods, such as Create Buzzy Beez, switch off for every survival player each tick. These powers now grant flight through NeoForge's creative flight attribute instead, which those mods leave alone. Turning a flight power off or losing it still drops the player out of flight and clears their fall distance, as before, and creative or spectator flight is never affected. Switching one on while its condition is not yet met, such as drawing the sword after the toggle, now lifts the player off as soon as the condition holds, where before they had to jump to start flying.
- **The slime's bounce keeps the speed you had in the air.** The bounce used the player's sideways speed at landing, after ground contact had already reduced it, so a running slime could still come out of a bounce with almost no forward speed. The sideways speed now comes from the last full tick in the air.
- **The origin info screen lists the powers your evolution tier has given you.** The Powers section only ever showed an origin's base powers, so a power gained at a later tier, such as the Sword Immortal's Heavenly Sword Formation at tier 2, was missing from it along with its keybind, and a power that a tier takes away was still listed. The list and the keybind slots now follow the player's current tier, the same way the server grants the powers. Classes do not evolve, so the class layer still shows its base powers.
- **Origin packs left in the old game-root `originpacks/` folder load again.** 2.0 moved the folder to `config/originpacks/` and read the old one only when the new one was missing, but it also created `config/originpacks/` on every launch, so a single launch left an empty new folder beside a full old one and the packs stopped loading without warning. The old folder is now read whenever it still holds packs and `config/originpacks/` does not, still with the warning asking you to move it across. If both hold packs, only `config/originpacks/` is read, and a warning names the folder being skipped.
- **`exhaustion_filter` cancels the exhaustion it lists.** The power loaded, but nothing read it, so it never filtered anything, including the imported `origins-classes:no_sprint_exhaustion` and `no_mining_exhaustion`. It now cancels the hunger exhaustion vanilla charges for each listed source: `sprint`, `mining`, `jump` and `swim`. Every other source of exhaustion is left alone.
- **Cobweb affinity now covers the mod's own web, not just vanilla's.** Climbing read the `#neoorigins:cobwebs` tag, but the slowdown suppression and the 10x break speed tested `minecraft:cobweb` directly, so a holder inside `neoorigins:temporary_cobweb`, which that tag has always listed, could climb it and still be slowed by it and still break it at normal speed. All three now read the tag, so a pack that adds its own web to it gets the whole of cobweb affinity rather than climbing alone.
- **Three power descriptions now say what their powers actually do.** The Herbalist's Bountiful Harvest promised 50% more crops, the classic Farmer's promised twice the yield, and the classic Rancher's Twin Births promised a chance of two babies. The descriptions reflected the intended behaviour rather than the actual behaviour: both harvest powers add one extra drop, and Twin Births fires every time. The Herbalist power also carried a `multiplier` field that `crop_harvest_bonus` has never accepted, so it was being dropped in silence and the power fell back to one extra drop anyway; the dead field is gone. No power's behaviour changes here, only the text that described it.
- **`in_block_anywhere` works in entity conditions.** It was only usable in player conditions. A condition tested against a living entity, such as the `entity_condition` of `entity_glow` or `prevent_entity_render`, can now use it.
- **`NeoOrigins.registerPower` works from a `startup_scripts/` file (1.21.1 and 26.1, the builds carrying the KubeJS bridge).** KubeJS clears every plugin's caches at the top of each script reload, and the server scripts reload when a world loads, long after the startup script's single run for that session. That cleared the handler before any power could look it up, so a `js_custom` or `js_active` power stayed inert, while the same call from `server_scripts/` worked because it ran after the clear. Registrations from a startup script now survive a reload; ones from a reloadable script are still replaced on each reload, so re-registering there keeps working. `NeoOrigins.registerCallback` was affected the same way and is fixed with it.
- **The classic Enderian's Gourd Blindness works.** The power checks whether another entity is wearing a pumpkin, but `equipped_item` could not check other entities' equipment. The resulting condition could never be satisfied: the power hid nobody, and the server logged a warning on every load. The verb now reads any entity's equipment, in any of the six vanilla slots, so the power works, and so does any pack power written the same way. Two limits remain: the `accessory` slot cannot be asked about another entity, and a nested item condition NeoOrigins does not understand makes it refuse the whole filter rather than match everything, which in a hide-entities power would have hidden the world.
### Pack Author Features
- **`hud_render.dynamic` stacks a bar above the permanent ones.** Cooldown and timer bars took their slot in the same resource id order as every other bar, so one that appeared partway up the stack pushed every bar above it up, and they all dropped back when it went. A bar with `"dynamic": true` in its `hud_render` now stacks above every bar without it, with each group still in resource id order, so permanent bars hold their places while dynamic ones come and go on top. Cooldown bars from the Origins compatibility layer, both an `origins:cooldown` power and the cooldown bar of an active power, are dynamic by default. Native `neoorigins:resource` bars are not, and opt in with `"hud_render": { "dynamic": true }`. A bar given a saved position in the HUD editor is unaffected.
- **`neoorigins:execute_command` runs when an action targets a mob.** Commands were a player-only verb, so wherever an action ran against a mob, such as the target of `action_on_hit`, `target_action_on_hit` or a projectile hit, a command was skipped, and an `and` containing one was skipped entirely. The command now runs as the mob, so `@s` is the mob, with output suppressed and the same permission level as other power commands. It goes through the same legacy command repair, blocked-command list and unparseable-command log as every other place a power runs a command.
- **`neoorigins:like_air` carries movement speed into the air.** Airborne control speed goes through the player's `movement_speed` modifiers, as it does for Origins' Avian. That includes the sprint modifier, so a sprinting holder gets vanilla's airborne sprint bonus with the modifier's +30% on top, also as in Origins. Creative and ability flight are left alone.
- **`neoorigins:conduit_power_on_land` lets conduits affect players with this power while they are on land.** An active conduit nearby gives them Conduit Power out of water or rain too. The power grants nothing by itself: a conduit still has to be built and active.
- **`neoorigins:entity_glow` outlines entities for the holder alone.** Living entities matching `entity_condition`, and `bientity_condition` with the holder as actor, get a glowing outline that only the holder sees, the way a Spectral Arrow marks a target. Nobody is given the Glowing effect. With `use_teams` on, the default, an entity on a coloured team keeps its team colour; otherwise the outline takes `red`, `green` and `blue`. The classic Arachnid uses it to sense non-arthropods stuck in cobwebs.
- **`neoorigins:projectile_vulnerability` adds damage from listed projectiles.** The holder takes `amount` extra damage, 3 by default, from each projectile in `projectiles`, given by id or as a `#tag`. The bonus is dealt even when the projectile itself deals none, so a snowball can hurt a Blazeborn. [POWER_TYPES.md](docs/POWER_TYPES.md) documents all four new types.
- **`cobweb_affinity` can climb.** A new `climb` field, off by default, makes a cobweb the player is inside work as a ladder: jump to climb, sneak to hold. [POWER_TYPES.md](docs/POWER_TYPES.md) shows how the classic Arachnid gates wall and web climbing on a toggle, under `wall_climbing`.
### Compatibility (Apoli / Origins)
- **`target_action_on_hit` fires on every hit and acts on the entity that was hit.** The compatibility layer ran its `entity_action` only when the holder killed something, and ran it on the holder rather than on the victim. It now fires each time the holder damages an entity and runs on that entity, as in Apoli, honouring the power's `condition` and its `cooldown`. A player who is hit gets the full action set; a mob gets the actions that can apply to any entity, such as effects, damage, fire, knockback and now commands. `damage_condition` and `target_condition` are not read yet, so the action fires on any hit while the power's `condition` holds.
- **An older origin pack's worldgen files can stop a 26.x server from starting.** A pack that ships its own dimension or worldgen files in the 1.21.1 format, such as a `dimension_type` without `has_ender_dragon_fight` or a biome with `"carvers": {}`, is rejected by vanilla Minecraft 26.x, and the server fails to start. NeoOrigins does not read these files, so it cannot bypass these errors: the fix is to update the pack's worldgen files to the 26.x format. Pack authors targeting 26.x should check every `dimension_type`, `dimension` and `worldgen` file they ship. Server admins whose startup log names one of these files should update the pack or remove it.
- **Imported `origins:entity_glow` outlines entities for the holder.** It gave the holder the Glowing effect, so everyone else saw the holder glow while the holder saw nothing new. It now maps onto `neoorigins:entity_glow`, which outlines matching entities for the holder alone. Its `bientity_condition` can now check `distance`, so SeerOrigin's sight outlines living things within 25 blocks while astral, where before that sight outlined nothing. `origins:self_glow` is unchanged.
- **Imported `origins:conduit_power_on_land` no longer grants effects Origins never gave.** A power with that id, whether the pack shipped the file or only referenced the bare id, gave permanent Water Breathing, Night Vision and Haste. In Origins it only lets an active conduit reach the holder out of water, and that is now what it does. Written as a power `type`, it now maps the same way.
- **The bare `origins:master_of_webs` id no longer climbs every wall.** A pack referencing it without shipping the file got `wall_climbing`. It now gets `cobweb_affinity` with `climb` on.
- **Imported Blazeborn snowball damage matches Origins.** Origins' `damage_from_snowballs` loaded as a 4x multiplier on all incoming damage, with no snowball check, and the bare id was not recognised at all. Both now map onto `neoorigins:projectile_vulnerability`: a snowball deals a Blazeborn 3 damage, and other damage is unaffected. Any `modify_damage_taken` of the same shape, a positive flat addition from one projectile type, maps the same way.
- **An imported resource bar keeps its value when you log back in.** `origins:resource` seeded its `start_value` on every login, not only when the power was granted, so a bar tracking progress (a level counter, stored energy, a kill tally) reset to its floor on every world join, and any power reading it read the floor with it. A login now leaves the stored value alone, and still seeds one for a player who has none. Changing origin, or an Orb of Origin re-pick, resets the bar as before. The native `neoorigins:resource` was already right.
- **Three well-known Origins powers did nothing when a pack named them by id alone.** `origins:burn_in_daylight`, `origins:hotblooded` and `origins:water_vulnerability` were each represented by a power with no configuration, which loaded but did nothing. They now get what Origins gives: catching fire once a second in direct sunlight unless invisible, immunity to Poison and Hunger, and 2 damage a second in water or rain. A pack shipping its own file for one of these is translated from that file, as before.
- **An attribute can follow a resource.** Apoli lets a modifier take its value from a resource, which is how a pack makes max health, or any other attribute, track a counter it keeps. NeoOrigins applied the modifier's declared value and ignored the resource, and these powers are written with a value of `0` because the resource is meant to supply all of it, so the power loaded and then did nothing. `origins:modify_attribute` now carries the resource across, and `neoorigins:attribute_modifier` takes a `resource` of its own: the modifier's value is the resource's current value, re-read every 5 ticks, so the attribute moves with it both ways. A resource nothing has written yet reads 0. Apoli can also run further modifiers over that value before it reaches the attribute, which is not supported: the attribute tracks the raw value, and a warning is logged during loading when a pack requests additional modifiers.
release
NeoOrigins v2.2.31 (MC 26.1.x)
v2.2.31+26.125 окт. 2026 г.19Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> The headline is classic mode: a new `content.toml` switch that offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. Turn it on before the world is created if you can: players who already have an origin or class hidden by classic mode keep it until they reset it.
>
> Rebuilding those sets added four power types for pack authors, and Origins packs that use Blazeborn's snowball weakness, the Merling's conduit power, the Arachnid's webs or `entity_glow` now behave as they do in Origins. Two reports late in testing turned into a further batch of compatibility fixes: an imported resource bar keeps the value you earned rather than resetting on every world join, and an attribute can now follow a resource, as Apoli packs expect of it. Three well-known Origins powers that loaded and did nothing now work, and a power handler registered from a KubeJS `startup_scripts/` file remains registered when a world loads.
>
> This release also brings NeoOrigins to Minecraft 26.3. A client running Punchy, or any mod that checks item use animations often, no longer loses about a third of every frame to NeoOrigins when a pack loads Origins-format powers (#136), and flight powers such as Riding the Sword can no longer be switched off by mods that reset player flight every tick, such as Create Buzzy Beez. Each resource bar can now be resized in the origin editor, and a new `dynamic` flag stacks cooldown and timer bars above the permanent ones.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 26.3 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Classic mode.** A new `classic_mode` option in `content.toml`, off by default, offers only the original Origins mod's ten origins and the fourteen Origins: Classes classes, each with a power set modelled on the original mod. The origins are Human, Merling, Avian, Blazeborn, Elytrian, Enderian, Arachnid, Shulk, Phantom and Feline. The classes are Archer, Beastmaster, Blacksmith, Cleric, Cook, Explorer, Farmer, Lumberjack, Merchant, Miner, Nitwit, Rancher, Rogue and Warrior. Farmer and Rancher are new, and only appear in classic mode. While it is on, every other built-in origin and class is hidden whatever its toggle says, and so are the three Dragon Survival dragons. A classic origin or class switched off by its own toggle stays hidden, and origins from datapacks or `originpacks/` are still offered. Switching it while the server runs applies at once: online players holding a classic origin swap power sets, powers both versions share keep their state, and every client's picker is resent. See [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md#classic-mode).
- **Turn classic mode on before the world is created if you can.** A player who already holds a built-in origin or class that classic mode hides keeps it, powers and all, until it is reset with an Orb of Origin or an Orb of Class, or by an admin running `/neoorigins reset <player>`. Affected players receive a chat message explaining this and how to reset their origin or class, every time they join and when the mode is switched on while they are online. The server also logs a warning when a world that already has player data starts with classic mode on, or has it switched on while running.
- **Classic mode turns evolution off in practice.** None of the classic origins has evolution tiers, and every other built-in is hidden while the mode is on, so none of the selectable built-in origins evolves. Kill counts stop mattering until the mode goes off again. Datapack and `originpacks/` origins keep whatever tiers they declare.
- **`/neoorigins list` shows what classic mode hides.** Hidden entries are marked `[disabled]`, and the header says `(classic mode)` while it is on.
- **The classic Arachnid's climbing is a toggle.** As in Origins, climbing starts on and flips with the origin's ability key, with a low note for off and a high one for on. Climbing inside cobwebs only works while climbing is enabled. The standard Arachnid is unchanged.
- **The classic Arachnid can craft cobwebs.** Players with Master of Webs can craft one cobweb from two pieces of string in any arrangement. Nobody else can craft it.
- **NeoOrigins now ships for Minecraft 26.3.** The new build runs on NeoForge 26.3 (26.3.0.83 or newer), alongside the 26.1.x, 26.2 and 1.21.1 builds. NeoForge 26.3 moved per-world config overrides from `<world>/serverconfig/` to `<world>/syncedconfig/`, so the first time a world starts on 26.3, NeoOrigins copies its `content.toml` override across and applies it straight away. The 26.2-era file is left where it is, so the world still opens on an older build, and a pre-2.2.2 `neoorigins-server.toml` is renamed once its values have been carried across. [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md) describes the new layout.
- **Each resource bar can be resized.** The origin editor, opened from the Edit button on the origin info screen, has a new Resource Bar Sizes panel below the powers list, with a slider for every resource bar that has a label, from 50% to 200%. A bar grows from its top-left corner, with its name and value scaling alongside it, and both the HUD behind the editor and the HUD editor itself draw it at its size. Each bar's slot grows or shrinks with it, so a larger bar never runs into its neighbours and a smaller one leaves no gap. Sizes are saved to `config/neoorigins/hud.json` when the editor closes, separately from bar positions, so resizing a bar neither moves it nor takes it out of the stack. The Edit button appears in Creative mode, or in any game mode with the `show_origin_editor` client option turned on.
### Bug Fixes
- **Punchy no longer causes heavy client lag when a pack loads Origins-format powers (#136).** Punchy, and any mod that checks item use animations often, could spend about a third of each frame rebuilding NeoOrigins' list of edible items. With Origins-format powers loaded, the full power list was rebuilt on every lookup, so the edible-item cache never hit. The power list is now built once per reload, and the edible-item cache also refreshes when the client receives new tags.
- **Flight powers are no longer cancelled by mods that reset player flight every tick.** Riding the Sword, Phantom Form and the other creative-style flight powers granted flight through the player's `mayfly` ability flag, which some mods, such as Create Buzzy Beez, switch off for every survival player each tick. These powers now grant flight through NeoForge's creative flight attribute instead, which those mods leave alone. Turning a flight power off or losing it still drops the player out of flight and clears their fall distance, as before, and creative or spectator flight is never affected. Switching one on while its condition is not yet met, such as drawing the sword after the toggle, now lifts the player off as soon as the condition holds, where before they had to jump to start flying.
- **The slime's bounce keeps the speed you had in the air.** The bounce used the player's sideways speed at landing, after ground contact had already reduced it, so a running slime could still come out of a bounce with almost no forward speed. The sideways speed now comes from the last full tick in the air.
- **The origin info screen lists the powers your evolution tier has given you.** The Powers section only ever showed an origin's base powers, so a power gained at a later tier, such as the Sword Immortal's Heavenly Sword Formation at tier 2, was missing from it along with its keybind, and a power that a tier takes away was still listed. The list and the keybind slots now follow the player's current tier, the same way the server grants the powers. Classes do not evolve, so the class layer still shows its base powers.
- **Origin packs left in the old game-root `originpacks/` folder load again.** 2.0 moved the folder to `config/originpacks/` and read the old one only when the new one was missing, but it also created `config/originpacks/` on every launch, so a single launch left an empty new folder beside a full old one and the packs stopped loading without warning. The old folder is now read whenever it still holds packs and `config/originpacks/` does not, still with the warning asking you to move it across. If both hold packs, only `config/originpacks/` is read, and a warning names the folder being skipped.
- **`exhaustion_filter` cancels the exhaustion it lists.** The power loaded, but nothing read it, so it never filtered anything, including the imported `origins-classes:no_sprint_exhaustion` and `no_mining_exhaustion`. It now cancels the hunger exhaustion vanilla charges for each listed source: `sprint`, `mining`, `jump` and `swim`. Every other source of exhaustion is left alone.
- **Cobweb affinity now covers the mod's own web, not just vanilla's.** Climbing read the `#neoorigins:cobwebs` tag, but the slowdown suppression and the 10x break speed tested `minecraft:cobweb` directly, so a holder inside `neoorigins:temporary_cobweb`, which that tag has always listed, could climb it and still be slowed by it and still break it at normal speed. All three now read the tag, so a pack that adds its own web to it gets the whole of cobweb affinity rather than climbing alone.
- **Three power descriptions now say what their powers actually do.** The Herbalist's Bountiful Harvest promised 50% more crops, the classic Farmer's promised twice the yield, and the classic Rancher's Twin Births promised a chance of two babies. The descriptions reflected the intended behaviour rather than the actual behaviour: both harvest powers add one extra drop, and Twin Births fires every time. The Herbalist power also carried a `multiplier` field that `crop_harvest_bonus` has never accepted, so it was being dropped in silence and the power fell back to one extra drop anyway; the dead field is gone. No power's behaviour changes here, only the text that described it.
- **`in_block_anywhere` works in entity conditions.** It was only usable in player conditions. A condition tested against a living entity, such as the `entity_condition` of `entity_glow` or `prevent_entity_render`, can now use it.
- **`NeoOrigins.registerPower` works from a `startup_scripts/` file (1.21.1 and 26.1, the builds carrying the KubeJS bridge).** KubeJS clears every plugin's caches at the top of each script reload, and the server scripts reload when a world loads, long after the startup script's single run for that session. That cleared the handler before any power could look it up, so a `js_custom` or `js_active` power stayed inert, while the same call from `server_scripts/` worked because it ran after the clear. Registrations from a startup script now survive a reload; ones from a reloadable script are still replaced on each reload, so re-registering there keeps working. `NeoOrigins.registerCallback` was affected the same way and is fixed with it.
- **The classic Enderian's Gourd Blindness works.** The power checks whether another entity is wearing a pumpkin, but `equipped_item` could not check other entities' equipment. The resulting condition could never be satisfied: the power hid nobody, and the server logged a warning on every load. The verb now reads any entity's equipment, in any of the six vanilla slots, so the power works, and so does any pack power written the same way. Two limits remain: the `accessory` slot cannot be asked about another entity, and a nested item condition NeoOrigins does not understand makes it refuse the whole filter rather than match everything, which in a hide-entities power would have hidden the world.
### Pack Author Features
- **`hud_render.dynamic` stacks a bar above the permanent ones.** Cooldown and timer bars took their slot in the same resource id order as every other bar, so one that appeared partway up the stack pushed every bar above it up, and they all dropped back when it went. A bar with `"dynamic": true` in its `hud_render` now stacks above every bar without it, with each group still in resource id order, so permanent bars hold their places while dynamic ones come and go on top. Cooldown bars from the Origins compatibility layer, both an `origins:cooldown` power and the cooldown bar of an active power, are dynamic by default. Native `neoorigins:resource` bars are not, and opt in with `"hud_render": { "dynamic": true }`. A bar given a saved position in the HUD editor is unaffected.
- **`neoorigins:execute_command` runs when an action targets a mob.** Commands were a player-only verb, so wherever an action ran against a mob, such as the target of `action_on_hit`, `target_action_on_hit` or a projectile hit, a command was skipped, and an `and` containing one was skipped entirely. The command now runs as the mob, so `@s` is the mob, with output suppressed and the same permission level as other power commands. It goes through the same legacy command repair, blocked-command list and unparseable-command log as every other place a power runs a command.
- **`neoorigins:like_air` carries movement speed into the air.** Airborne control speed goes through the player's `movement_speed` modifiers, as it does for Origins' Avian. That includes the sprint modifier, so a sprinting holder gets vanilla's airborne sprint bonus with the modifier's +30% on top, also as in Origins. Creative and ability flight are left alone.
- **`neoorigins:conduit_power_on_land` lets conduits affect players with this power while they are on land.** An active conduit nearby gives them Conduit Power out of water or rain too. The power grants nothing by itself: a conduit still has to be built and active.
- **`neoorigins:entity_glow` outlines entities for the holder alone.** Living entities matching `entity_condition`, and `bientity_condition` with the holder as actor, get a glowing outline that only the holder sees, the way a Spectral Arrow marks a target. Nobody is given the Glowing effect. With `use_teams` on, the default, an entity on a coloured team keeps its team colour; otherwise the outline takes `red`, `green` and `blue`. The classic Arachnid uses it to sense non-arthropods stuck in cobwebs.
- **`neoorigins:projectile_vulnerability` adds damage from listed projectiles.** The holder takes `amount` extra damage, 3 by default, from each projectile in `projectiles`, given by id or as a `#tag`. The bonus is dealt even when the projectile itself deals none, so a snowball can hurt a Blazeborn. [POWER_TYPES.md](docs/POWER_TYPES.md) documents all four new types.
- **`cobweb_affinity` can climb.** A new `climb` field, off by default, makes a cobweb the player is inside work as a ladder: jump to climb, sneak to hold. [POWER_TYPES.md](docs/POWER_TYPES.md) shows how the classic Arachnid gates wall and web climbing on a toggle, under `wall_climbing`.
### Compatibility (Apoli / Origins)
- **`target_action_on_hit` fires on every hit and acts on the entity that was hit.** The compatibility layer ran its `entity_action` only when the holder killed something, and ran it on the holder rather than on the victim. It now fires each time the holder damages an entity and runs on that entity, as in Apoli, honouring the power's `condition` and its `cooldown`. A player who is hit gets the full action set; a mob gets the actions that can apply to any entity, such as effects, damage, fire, knockback and now commands. `damage_condition` and `target_condition` are not read yet, so the action fires on any hit while the power's `condition` holds.
- **An older origin pack's worldgen files can stop a 26.x server from starting.** A pack that ships its own dimension or worldgen files in the 1.21.1 format, such as a `dimension_type` without `has_ender_dragon_fight` or a biome with `"carvers": {}`, is rejected by vanilla Minecraft 26.x, and the server fails to start. NeoOrigins does not read these files, so it cannot bypass these errors: the fix is to update the pack's worldgen files to the 26.x format. Pack authors targeting 26.x should check every `dimension_type`, `dimension` and `worldgen` file they ship. Server admins whose startup log names one of these files should update the pack or remove it.
- **Imported `origins:entity_glow` outlines entities for the holder.** It gave the holder the Glowing effect, so everyone else saw the holder glow while the holder saw nothing new. It now maps onto `neoorigins:entity_glow`, which outlines matching entities for the holder alone. Its `bientity_condition` can now check `distance`, so SeerOrigin's sight outlines living things within 25 blocks while astral, where before that sight outlined nothing. `origins:self_glow` is unchanged.
- **Imported `origins:conduit_power_on_land` no longer grants effects Origins never gave.** A power with that id, whether the pack shipped the file or only referenced the bare id, gave permanent Water Breathing, Night Vision and Haste. In Origins it only lets an active conduit reach the holder out of water, and that is now what it does. Written as a power `type`, it now maps the same way.
- **The bare `origins:master_of_webs` id no longer climbs every wall.** A pack referencing it without shipping the file got `wall_climbing`. It now gets `cobweb_affinity` with `climb` on.
- **Imported Blazeborn snowball damage matches Origins.** Origins' `damage_from_snowballs` loaded as a 4x multiplier on all incoming damage, with no snowball check, and the bare id was not recognised at all. Both now map onto `neoorigins:projectile_vulnerability`: a snowball deals a Blazeborn 3 damage, and other damage is unaffected. Any `modify_damage_taken` of the same shape, a positive flat addition from one projectile type, maps the same way.
- **An imported resource bar keeps its value when you log back in.** `origins:resource` seeded its `start_value` on every login, not only when the power was granted, so a bar tracking progress (a level counter, stored energy, a kill tally) reset to its floor on every world join, and any power reading it read the floor with it. A login now leaves the stored value alone, and still seeds one for a player who has none. Changing origin, or an Orb of Origin re-pick, resets the bar as before. The native `neoorigins:resource` was already right.
- **Three well-known Origins powers did nothing when a pack named them by id alone.** `origins:burn_in_daylight`, `origins:hotblooded` and `origins:water_vulnerability` were each represented by a power with no configuration, which loaded but did nothing. They now get what Origins gives: catching fire once a second in direct sunlight unless invisible, immunity to Poison and Hunger, and 2 damage a second in water or rain. A pack shipping its own file for one of these is translated from that file, as before.
- **An attribute can follow a resource.** Apoli lets a modifier take its value from a resource, which is how a pack makes max health, or any other attribute, track a counter it keeps. NeoOrigins applied the modifier's declared value and ignored the resource, and these powers are written with a value of `0` because the resource is meant to supply all of it, so the power loaded and then did nothing. `origins:modify_attribute` now carries the resource across, and `neoorigins:attribute_modifier` takes a `resource` of its own: the modifier's value is the resource's current value, re-read every 5 ticks, so the attribute moves with it both ways. A resource nothing has written yet reads 0. Apoli can also run further modifiers over that value before it reaches the attribute, which is not supported: the attribute tracks the raw value, and a warning is logged during loading when a pack requests additional modifiers.
release
NeoOrigins v2.2.30 (MC 1.21.1)
v2.2.30+1.21.111 окт. 2026 г.9,1 тыс.Minecraft: 1.21.1neoforge
Что нового
> A small release for the resource bar HUD and for pack commands. Resource bars now stack in a fixed, predictable order instead of one that followed an internal hash, with no empty slot left behind a bar that is hidden or dragged to its own position, and no bar's text printed over another bar's. The bars also get a new look: the built-in ones now draw in a framed style with value ticks, most with a scrolling fill themed to their origin, and packs can use the same eight styles, tint the plain one any colour, and run a bar from one colour into another. For pack authors, a command that does not parse is now written to the log along with the power that ran it, where before it failed in complete silence, and a valid `execute ... run` chain is no longer mistaken for a broken command by the legacy translation layer.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Resource bars stack in resource id order, lowest id nearest the hotbar.** The client kept its bars in a hash map, so the vertical order of the stack followed the resource keys' string hashes: stable for a given set of bars, but nothing a pack could predict, describe to a player, or control, and adding one resource dropped its bar wherever its hash happened to fall. A full sync now stores the bars sorted by resource key, which is the power id, and value updates leave each bar where it is. This rearranges existing stacks: any two or more bars sitting at their default positions, whose hash order differed from their id order, will have moved. Bars given a saved position in the HUD editor are unaffected. [POWER_TYPES.md](docs/POWER_TYPES.md) describes the order and which bars take a slot.
- **The built-in resource bars use the new bar styles.** Every origin that shows a resource bar now draws it in a framed style with value ticks: a scrolling themed fill where the origin has a clear element, such as fire for the Blazeling, water for the Kraken, void for the Enderian and sculk for the Warden, and otherwise the plain grey fill tinted to the bar's existing colour. The Frostborn bar is the one exception: it was orange and is now an ice gradient, blue at the empty end shading to frost white at the full end. Only the look changed: no resource values, regeneration or costs moved.
### Bug Fixes
- **A hidden or repositioned resource bar no longer leaves a gap in the stack.** The HUD advanced its stacking counter for every bar it knew about, whether or not that bar was drawn in the stack, so a bar hidden by hide when full, or one moved to a saved position in the HUD editor, still reserved its slot and the bars above it did not close up. The draw decision is now made for every bar first, and slots are handed only to the bars that will actually draw at a default position. The HUD editor assigns its slots the same way, so the gap that used to sit behind a dragged bar there is gone as well.
- **Stacked resource bars no longer print their text over each other.** Every bar draws its name above it and its value below it, but the stack climbed a fixed sixteen pixels per bar, which is less than a bar and its two lines of text need. Each bar's value landed on the name of the bar below it, so in a stack of several bars everything between the top name and the bottom value was an unreadable pile. Each slot is now as tall as what its bar actually draws: the bar, the name line, the value line and a small gap, which puts the built-in framed bars 29 pixels apart. A bar whose `label` is empty draws no name line and takes a shorter slot, though never shorter than the old sixteen. The HUD editor measures its bars the same way, so its default stack uses the same spacing as the HUD. [POWER_TYPES.md](docs/POWER_TYPES.md) describes the slot sizes.
- **A resource bar colour of the wrong length falls back to the default.** `color`, `tint` and `tint_end` in `hud_render` read any run of hex digits as a number, so the shorthand `#FFF` was read as `#00000FFF` rather than white, which draws an invisible fill or a blue tint, and a seven- or nine-digit typo gave some other wrong colour. Anything other than six or eight hex digits now falls back to `#55AAFF`, as a value that is not hex already did, and the log names the power and the value it rejected. An empty `tint` or `tint_end` counts as not set, as the field descriptions say, rather than as a bad value. A `bar_fx` preset whose `track_color` or `level_color` has the wrong length is skipped with a warning, the same as any other malformed preset.
### Pack Author Features
- **A pack command that does not parse is written to the log, naming the power that ran it.** Powers run their commands on a source with output suppressed, which is what keeps command spam out of chat. The game reports a command it cannot parse through that same suppressed channel, runs nothing, and raises no error doing so, so a typo such as `tellraw @s {"Triggered"}` produced no chat message, no log line and no effect: the power simply appeared to do nothing. Such a command is now logged once for each combination of power, site and command text, carrying the game's own reason for refusing it. Commands are still handed to the game exactly as before, so nothing that used to run stops running, and a legacy command the compatibility layer repairs on its way through is not reported. [ACTIONS.md](docs/ACTIONS.md) and [ADMIN_CONFIG.md](docs/ADMIN_CONFIG.md) both record what is logged.
- **Eight resource bar styles to choose from.** `hud_render.animated` now has built-in styles: `neoorigins:fire`, `water`, `wind`, `earth`, `soul`, `void` and `sculk` draw a scrolling themed fill inside a grey frame, and `neoorigins:tinted` draws a plain grey fill that does not move. Every style draws value ticks over the fill, a faint one every 5 points and a brighter one every 25, the same steps the old bar used, and ticks that would sit closer than 2 pixels apart are still left out. The scroll follows game time, so it moves smoothly between game ticks and stops while the game is paused. A player whose resource packs do not have the style sees the flat `color` fill instead, and a pack already using `neoorigins:fire` gets the new art and frame. Presets also gained `frame` (sized by `frame_width` and `frame_height`), `loop_width`, `tint_from_color` and a `static` mode, for packs that ship their own styles; a preset with no `frame` still draws the old box. [POWER_TYPES.md](docs/POWER_TYPES.md) lists the styles, [PACK_FORMAT.md](docs/PACK_FORMAT.md) describes the `hud_render` fields, and [animated_bar_artist_spec.md](docs/animated_bar_artist_spec.md) covers drawing the textures.
- **`neoorigins:tinted` takes any colour.** The fill is grey, and `tint` multiplies it channel by channel: its lightest pixels come out as the colour itself and its darker greys as deeper shades of it, so the fill keeps its shading, and a bright, saturated colour gives the clearest bar. When `tint` is not set the bar uses its `color`, so a bar that already has one only needs `"animated": "neoorigins:tinted"` added. `tint` takes `#RRGGBB` or `#AARRGGBB`, with the alpha ignored since the fill is always opaque. It works on the themed styles too, but those are drawn in colour already. [POWER_TYPES.md](docs/POWER_TYPES.md) has worked examples.
- **`hud_render.tint_end` shades a bar from one colour into another.** On a framed style that does not scroll, such as `neoorigins:tinted`, the fill runs from `tint` at the left end of the bar to `tint_end` at the right, starting from `color` instead when `tint` is not set and the style takes its colour, as `neoorigins:tinted` does. The gradient spans the whole bar rather than the filled part, so each point of the bar keeps its colour as the value rises and falls. Without `tint_end` the bar is one flat colour, as before. The Frostborn bar is built this way, and is the gradient example in [POWER_TYPES.md](docs/POWER_TYPES.md).
- **Both power editors know the new bar fields.** In the in-game creator, `animated` has a pick button listing the eight built-in styles and any style a loaded resource pack adds, and it still takes any id typed in. The web editor suggests the eight styles as you type and shows a preview of the bar above the `hud_render` fields, with its style, tint and gradient applied. Both editors now flag a `color`, `tint` or `tint_end` that is not six or eight hex digits, which the loader would replace with `#55AAFF`, and an `animated` id with no namespace, which can never match a style.
### Compatibility (Apoli / Origins)
- **A valid `execute ... run` command is no longer treated as unparseable by the legacy rewriter.** The check that decides whether a legacy pack's command may be rewritten asked whether the top level of the parse carried a command to run. A redirect such as `execute as @s run` does not: it leaves the top level empty and puts the command in a child context, so every valid execute chain in every pack read as broken. That was the reverse of what the check exists for, since an execute chain also matching a legacy pattern was handed to the rewriter even though the game would have run it exactly as written. The check now judges a parse the way the game itself does when it finishes parsing, taking the game's own parse error first, then asking whether the chain of contexts flattens into something runnable.
### Documentation
- **The commands page shows a text component.** Every example under `neoorigins:execute_command` used a command with no JSON payload, so the one thing most likely to go wrong in a pack command had no worked example on the page that documents pack commands: a text component is itself JSON, and its quotes have to be escaped inside the `command` string. The escaped `tellraw` form now sits beside the existing example, with `{"Triggered"}` named as the shape that does not parse and the reason it does not. The paragraph describing what a command that does not parse writes to the log now notes that up to 2.2.29 nothing was written at all, so a reader still on that version does not go hunting for a line that is not there. See [ACTIONS.md](docs/ACTIONS.md).
release
NeoOrigins v2.2.30 (MC 26.2)
v2.2.30+26.211 окт. 2026 г.258Minecraft: 26.2neoforge
Что нового
> A small release for the resource bar HUD and for pack commands. Resource bars now stack in a fixed, predictable order instead of one that followed an internal hash, with no empty slot left behind a bar that is hidden or dragged to its own position, and no bar's text printed over another bar's. The bars also get a new look: the built-in ones now draw in a framed style with value ticks, most with a scrolling fill themed to their origin, and packs can use the same eight styles, tint the plain one any colour, and run a bar from one colour into another. For pack authors, a command that does not parse is now written to the log along with the power that ran it, where before it failed in complete silence, and a valid `execute ... run` chain is no longer mistaken for a broken command by the legacy translation layer.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Resource bars stack in resource id order, lowest id nearest the hotbar.** The client kept its bars in a hash map, so the vertical order of the stack followed the resource keys' string hashes: stable for a given set of bars, but nothing a pack could predict, describe to a player, or control, and adding one resource dropped its bar wherever its hash happened to fall. A full sync now stores the bars sorted by resource key, which is the power id, and value updates leave each bar where it is. This rearranges existing stacks: any two or more bars sitting at their default positions, whose hash order differed from their id order, will have moved. Bars given a saved position in the HUD editor are unaffected. [POWER_TYPES.md](docs/POWER_TYPES.md) describes the order and which bars take a slot.
- **The built-in resource bars use the new bar styles.** Every origin that shows a resource bar now draws it in a framed style with value ticks: a scrolling themed fill where the origin has a clear element, such as fire for the Blazeling, water for the Kraken, void for the Enderian and sculk for the Warden, and otherwise the plain grey fill tinted to the bar's existing colour. The Frostborn bar is the one exception: it was orange and is now an ice gradient, blue at the empty end shading to frost white at the full end. Only the look changed: no resource values, regeneration or costs moved.
### Bug Fixes
- **A hidden or repositioned resource bar no longer leaves a gap in the stack.** The HUD advanced its stacking counter for every bar it knew about, whether or not that bar was drawn in the stack, so a bar hidden by hide when full, or one moved to a saved position in the HUD editor, still reserved its slot and the bars above it did not close up. The draw decision is now made for every bar first, and slots are handed only to the bars that will actually draw at a default position. The HUD editor assigns its slots the same way, so the gap that used to sit behind a dragged bar there is gone as well.
- **Stacked resource bars no longer print their text over each other.** Every bar draws its name above it and its value below it, but the stack climbed a fixed sixteen pixels per bar, which is less than a bar and its two lines of text need. Each bar's value landed on the name of the bar below it, so in a stack of several bars everything between the top name and the bottom value was an unreadable pile. Each slot is now as tall as what its bar actually draws: the bar, the name line, the value line and a small gap, which puts the built-in framed bars 29 pixels apart. A bar whose `label` is empty draws no name line and takes a shorter slot, though never shorter than the old sixteen. The HUD editor measures its bars the same way, so its default stack uses the same spacing as the HUD. [POWER_TYPES.md](docs/POWER_TYPES.md) describes the slot sizes.
- **A resource bar colour of the wrong length falls back to the default.** `color`, `tint` and `tint_end` in `hud_render` read any run of hex digits as a number, so the shorthand `#FFF` was read as `#00000FFF` rather than white, which draws an invisible fill or a blue tint, and a seven- or nine-digit typo gave some other wrong colour. Anything other than six or eight hex digits now falls back to `#55AAFF`, as a value that is not hex already did, and the log names the power and the value it rejected. An empty `tint` or `tint_end` counts as not set, as the field descriptions say, rather than as a bad value. A `bar_fx` preset whose `track_color` or `level_color` has the wrong length is skipped with a warning, the same as any other malformed preset.
### Pack Author Features
- **A pack command that does not parse is written to the log, naming the power that ran it.** Powers run their commands on a source with output suppressed, which is what keeps command spam out of chat. The game reports a command it cannot parse through that same suppressed channel, runs nothing, and raises no error doing so, so a typo such as `tellraw @s {"Triggered"}` produced no chat message, no log line and no effect: the power simply appeared to do nothing. Such a command is now logged once for each combination of power, site and command text, carrying the game's own reason for refusing it. Commands are still handed to the game exactly as before, so nothing that used to run stops running, and a legacy command the compatibility layer repairs on its way through is not reported. [ACTIONS.md](docs/ACTIONS.md) and [ADMIN_CONFIG.md](docs/ADMIN_CONFIG.md) both record what is logged.
- **Eight resource bar styles to choose from.** `hud_render.animated` now has built-in styles: `neoorigins:fire`, `water`, `wind`, `earth`, `soul`, `void` and `sculk` draw a scrolling themed fill inside a grey frame, and `neoorigins:tinted` draws a plain grey fill that does not move. Every style draws value ticks over the fill, a faint one every 5 points and a brighter one every 25, the same steps the old bar used, and ticks that would sit closer than 2 pixels apart are still left out. The scroll follows game time, so it moves smoothly between game ticks and stops while the game is paused. A player whose resource packs do not have the style sees the flat `color` fill instead, and a pack already using `neoorigins:fire` gets the new art and frame. Presets also gained `frame` (sized by `frame_width` and `frame_height`), `loop_width`, `tint_from_color` and a `static` mode, for packs that ship their own styles; a preset with no `frame` still draws the old box. [POWER_TYPES.md](docs/POWER_TYPES.md) lists the styles, [PACK_FORMAT.md](docs/PACK_FORMAT.md) describes the `hud_render` fields, and [animated_bar_artist_spec.md](docs/animated_bar_artist_spec.md) covers drawing the textures.
- **`neoorigins:tinted` takes any colour.** The fill is grey, and `tint` multiplies it channel by channel: its lightest pixels come out as the colour itself and its darker greys as deeper shades of it, so the fill keeps its shading, and a bright, saturated colour gives the clearest bar. When `tint` is not set the bar uses its `color`, so a bar that already has one only needs `"animated": "neoorigins:tinted"` added. `tint` takes `#RRGGBB` or `#AARRGGBB`, with the alpha ignored since the fill is always opaque. It works on the themed styles too, but those are drawn in colour already. [POWER_TYPES.md](docs/POWER_TYPES.md) has worked examples.
- **`hud_render.tint_end` shades a bar from one colour into another.** On a framed style that does not scroll, such as `neoorigins:tinted`, the fill runs from `tint` at the left end of the bar to `tint_end` at the right, starting from `color` instead when `tint` is not set and the style takes its colour, as `neoorigins:tinted` does. The gradient spans the whole bar rather than the filled part, so each point of the bar keeps its colour as the value rises and falls. Without `tint_end` the bar is one flat colour, as before. The Frostborn bar is built this way, and is the gradient example in [POWER_TYPES.md](docs/POWER_TYPES.md).
- **Both power editors know the new bar fields.** In the in-game creator, `animated` has a pick button listing the eight built-in styles and any style a loaded resource pack adds, and it still takes any id typed in. The web editor suggests the eight styles as you type and shows a preview of the bar above the `hud_render` fields, with its style, tint and gradient applied. Both editors now flag a `color`, `tint` or `tint_end` that is not six or eight hex digits, which the loader would replace with `#55AAFF`, and an `animated` id with no namespace, which can never match a style.
### Compatibility (Apoli / Origins)
- **A valid `execute ... run` command is no longer treated as unparseable by the legacy rewriter.** The check that decides whether a legacy pack's command may be rewritten asked whether the top level of the parse carried a command to run. A redirect such as `execute as @s run` does not: it leaves the top level empty and puts the command in a child context, so every valid execute chain in every pack read as broken. That was the reverse of what the check exists for, since an execute chain also matching a legacy pattern was handed to the rewriter even though the game would have run it exactly as written. The check now judges a parse the way the game itself does when it finishes parsing, taking the game's own parse error first, then asking whether the chain of contexts flattens into something runnable.
### Documentation
- **The commands page shows a text component.** Every example under `neoorigins:execute_command` used a command with no JSON payload, so the one thing most likely to go wrong in a pack command had no worked example on the page that documents pack commands: a text component is itself JSON, and its quotes have to be escaped inside the `command` string. The escaped `tellraw` form now sits beside the existing example, with `{"Triggered"}` named as the shape that does not parse and the reason it does not. The paragraph describing what a command that does not parse writes to the log now notes that up to 2.2.29 nothing was written at all, so a reader still on that version does not go hunting for a line that is not there. See [ACTIONS.md](docs/ACTIONS.md).
release
NeoOrigins v2.2.30 (MC 26.1.x)
v2.2.30+26.111 окт. 2026 г.496Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A small release for the resource bar HUD and for pack commands. Resource bars now stack in a fixed, predictable order instead of one that followed an internal hash, with no empty slot left behind a bar that is hidden or dragged to its own position, and no bar's text printed over another bar's. The bars also get a new look: the built-in ones now draw in a framed style with value ticks, most with a scrolling fill themed to their origin, and packs can use the same eight styles, tint the plain one any colour, and run a bar from one colour into another. For pack authors, a command that does not parse is now written to the log along with the power that ran it, where before it failed in complete silence, and a valid `execute ... run` chain is no longer mistaken for a broken command by the legacy translation layer.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Resource bars stack in resource id order, lowest id nearest the hotbar.** The client kept its bars in a hash map, so the vertical order of the stack followed the resource keys' string hashes: stable for a given set of bars, but nothing a pack could predict, describe to a player, or control, and adding one resource dropped its bar wherever its hash happened to fall. A full sync now stores the bars sorted by resource key, which is the power id, and value updates leave each bar where it is. This rearranges existing stacks: any two or more bars sitting at their default positions, whose hash order differed from their id order, will have moved. Bars given a saved position in the HUD editor are unaffected. [POWER_TYPES.md](docs/POWER_TYPES.md) describes the order and which bars take a slot.
- **The built-in resource bars use the new bar styles.** Every origin that shows a resource bar now draws it in a framed style with value ticks: a scrolling themed fill where the origin has a clear element, such as fire for the Blazeling, water for the Kraken, void for the Enderian and sculk for the Warden, and otherwise the plain grey fill tinted to the bar's existing colour. The Frostborn bar is the one exception: it was orange and is now an ice gradient, blue at the empty end shading to frost white at the full end. Only the look changed: no resource values, regeneration or costs moved.
### Bug Fixes
- **A hidden or repositioned resource bar no longer leaves a gap in the stack.** The HUD advanced its stacking counter for every bar it knew about, whether or not that bar was drawn in the stack, so a bar hidden by hide when full, or one moved to a saved position in the HUD editor, still reserved its slot and the bars above it did not close up. The draw decision is now made for every bar first, and slots are handed only to the bars that will actually draw at a default position. The HUD editor assigns its slots the same way, so the gap that used to sit behind a dragged bar there is gone as well.
- **Stacked resource bars no longer print their text over each other.** Every bar draws its name above it and its value below it, but the stack climbed a fixed sixteen pixels per bar, which is less than a bar and its two lines of text need. Each bar's value landed on the name of the bar below it, so in a stack of several bars everything between the top name and the bottom value was an unreadable pile. Each slot is now as tall as what its bar actually draws: the bar, the name line, the value line and a small gap, which puts the built-in framed bars 29 pixels apart. A bar whose `label` is empty draws no name line and takes a shorter slot, though never shorter than the old sixteen. The HUD editor measures its bars the same way, so its default stack uses the same spacing as the HUD. [POWER_TYPES.md](docs/POWER_TYPES.md) describes the slot sizes.
- **A resource bar colour of the wrong length falls back to the default.** `color`, `tint` and `tint_end` in `hud_render` read any run of hex digits as a number, so the shorthand `#FFF` was read as `#00000FFF` rather than white, which draws an invisible fill or a blue tint, and a seven- or nine-digit typo gave some other wrong colour. Anything other than six or eight hex digits now falls back to `#55AAFF`, as a value that is not hex already did, and the log names the power and the value it rejected. An empty `tint` or `tint_end` counts as not set, as the field descriptions say, rather than as a bad value. A `bar_fx` preset whose `track_color` or `level_color` has the wrong length is skipped with a warning, the same as any other malformed preset.
### Pack Author Features
- **A pack command that does not parse is written to the log, naming the power that ran it.** Powers run their commands on a source with output suppressed, which is what keeps command spam out of chat. The game reports a command it cannot parse through that same suppressed channel, runs nothing, and raises no error doing so, so a typo such as `tellraw @s {"Triggered"}` produced no chat message, no log line and no effect: the power simply appeared to do nothing. Such a command is now logged once for each combination of power, site and command text, carrying the game's own reason for refusing it. Commands are still handed to the game exactly as before, so nothing that used to run stops running, and a legacy command the compatibility layer repairs on its way through is not reported. [ACTIONS.md](docs/ACTIONS.md) and [ADMIN_CONFIG.md](docs/ADMIN_CONFIG.md) both record what is logged.
- **Eight resource bar styles to choose from.** `hud_render.animated` now has built-in styles: `neoorigins:fire`, `water`, `wind`, `earth`, `soul`, `void` and `sculk` draw a scrolling themed fill inside a grey frame, and `neoorigins:tinted` draws a plain grey fill that does not move. Every style draws value ticks over the fill, a faint one every 5 points and a brighter one every 25, the same steps the old bar used, and ticks that would sit closer than 2 pixels apart are still left out. The scroll follows game time, so it moves smoothly between game ticks and stops while the game is paused. A player whose resource packs do not have the style sees the flat `color` fill instead, and a pack already using `neoorigins:fire` gets the new art and frame. Presets also gained `frame` (sized by `frame_width` and `frame_height`), `loop_width`, `tint_from_color` and a `static` mode, for packs that ship their own styles; a preset with no `frame` still draws the old box. [POWER_TYPES.md](docs/POWER_TYPES.md) lists the styles, [PACK_FORMAT.md](docs/PACK_FORMAT.md) describes the `hud_render` fields, and [animated_bar_artist_spec.md](docs/animated_bar_artist_spec.md) covers drawing the textures.
- **`neoorigins:tinted` takes any colour.** The fill is grey, and `tint` multiplies it channel by channel: its lightest pixels come out as the colour itself and its darker greys as deeper shades of it, so the fill keeps its shading, and a bright, saturated colour gives the clearest bar. When `tint` is not set the bar uses its `color`, so a bar that already has one only needs `"animated": "neoorigins:tinted"` added. `tint` takes `#RRGGBB` or `#AARRGGBB`, with the alpha ignored since the fill is always opaque. It works on the themed styles too, but those are drawn in colour already. [POWER_TYPES.md](docs/POWER_TYPES.md) has worked examples.
- **`hud_render.tint_end` shades a bar from one colour into another.** On a framed style that does not scroll, such as `neoorigins:tinted`, the fill runs from `tint` at the left end of the bar to `tint_end` at the right, starting from `color` instead when `tint` is not set and the style takes its colour, as `neoorigins:tinted` does. The gradient spans the whole bar rather than the filled part, so each point of the bar keeps its colour as the value rises and falls. Without `tint_end` the bar is one flat colour, as before. The Frostborn bar is built this way, and is the gradient example in [POWER_TYPES.md](docs/POWER_TYPES.md).
- **Both power editors know the new bar fields.** In the in-game creator, `animated` has a pick button listing the eight built-in styles and any style a loaded resource pack adds, and it still takes any id typed in. The web editor suggests the eight styles as you type and shows a preview of the bar above the `hud_render` fields, with its style, tint and gradient applied. Both editors now flag a `color`, `tint` or `tint_end` that is not six or eight hex digits, which the loader would replace with `#55AAFF`, and an `animated` id with no namespace, which can never match a style.
### Compatibility (Apoli / Origins)
- **A valid `execute ... run` command is no longer treated as unparseable by the legacy rewriter.** The check that decides whether a legacy pack's command may be rewritten asked whether the top level of the parse carried a command to run. A redirect such as `execute as @s run` does not: it leaves the top level empty and puts the command in a child context, so every valid execute chain in every pack read as broken. That was the reverse of what the check exists for, since an execute chain also matching a legacy pattern was handed to the rewriter even though the game would have run it exactly as written. The check now judges a parse the way the game itself does when it finishes parsing, taking the game's own parse error first, then asking whether the chain of contexts flattens into something runnable.
### Documentation
- **The commands page shows a text component.** Every example under `neoorigins:execute_command` used a command with no JSON payload, so the one thing most likely to go wrong in a pack command had no worked example on the page that documents pack commands: a text component is itself JSON, and its quotes have to be escaped inside the `command` string. The escaped `tellraw` form now sits beside the existing example, with `{"Triggered"}` named as the shape that does not parse and the reason it does not. The paragraph describing what a command that does not parse writes to the log now notes that up to 2.2.29 nothing was written at all, so a reader still on that version does not go hunting for a line that is not there. See [ACTIONS.md](docs/ACTIONS.md).
release
NeoOrigins v2.2.29 (MC 1.21.1)
v2.2.29+1.21.128 сент. 2026 г.8,3 тыс.Minecraft: 1.21.1neoforge
Что нового
> A fixes release, mostly for the two origin editors, which could quietly lose data on save. Saving a power in the in-game creator deleted any detail its form could not display, loading a template and saving it dropped the origin's evolution tiers and custom spawn, one creator save could overwrite another origin's power files, and the web editor started new origins in the `neoorigins` namespace, where a name matching a shipped origin replaced it for the whole server. Outside the editors, an `area_of_effect` with a block action and no radius no longer runs that action across seventeen thousand blocks, one invalid origin id no longer empties an entire origin layer, and origin spawn searches start from the world spawn instead of the wrong end of the map. On 1.21.1 other players are drawn in their own model colour rather than yours.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **An `area_of_effect` with a block action no longer runs it across seventeen thousand blocks.** The block sweep borrowed the entity sweep's default radius of sixteen, so a `block_action` with no radius written ran at every block within sixteen of the centre: 17,077 positions per activation, and with `explode` as the block action the server stalled. The block sweep now defaults to two blocks, thirty-three positions, while the entity sweep keeps its sixteen, and a radius you do write is honoured as before up to the existing cap of sixteen. Separately, `explode` is limited to four per player per tick. They all go off at the player rather than the swept block, and hurt immunity after the first absorbs most of what the rest would deal, so the extras bought lag and nothing else. [ACTIONS.md](docs/ACTIONS.md) records both defaults and the cap.
- **One invalid origin id no longer empties a whole origin layer.** An id the game cannot parse, such as a web export named `Wizard` or `wizard ` with a trailing space, threw while its layer was being read, and the loader's answer was to discard the entire layer. Since addon and exported packs add to the built-in `neoorigins:origin` and `neoorigins:class` layers, one bad id emptied the picker of every origin, or every class, for everyone on the server, with nothing on screen to say why. The bad entry is now skipped with a warning naming it, and the rest of the layer loads.
- **Origin spawn searches start from the world spawn, scaled into the searched dimension the way a portal scales it.** On 1.21.1 only the Nether was wrong: the search read the Overworld's spawn point without dividing by eight, so a world spawn at 8000, 0 sent a new Blazeling to Nether 8000, 0, sixty-four thousand blocks out in Overworld terms. On 26.1 and 26.2 every search started from 0, 0 in whatever dimension it searched, so all nine built-in origins with a spawn location ignored a moved world spawn. All three versions now start from the world spawn converted into the searched dimension, so an Overworld spawn at 8000, 0 centres a Nether search on 1000, 0, with the height kept inside build limits and the position inside the world border. [PACK_FORMAT.md](docs/PACK_FORMAT.md) covers `spawn_location` itself.
- **Every player is drawn in their own model colour instead of yours (1.21.1).** `model_color` tints were read from your own powers for every player on screen, so everyone around you wore your colour and nobody ever saw theirs. Each player's tint now comes from that player's own synced powers, clears when their effect ends, and is dropped when they log out or leave range. Minecraft 26.1 and 26.2 draw no model colours, since the 26.1 rendering rework removed the call the tint depends on.
- **Caveborn meal tints clear when the meal's effect wears off.** `model_color` kept one condition slot per player, so the six Caveborn diet tints overwrote each other every second: a tint that ran out only told the client if it happened to be checked last, and the others stayed on the model until a respawn, relog or dimension change forced a resync. The shared slot also flipped twice a second, sending a full power sync each time. Each power now keeps its own result. On 26.1 and 26.2, where tints are not drawn, what changes is that the needless syncs stop.
- **Saving a power in the in-game creator keeps everything its form cannot show.** Opening a power in the form and saving it rebuilt each field from what the form understands, so any detail a sub-form did not model was deleted even if you changed nothing: an `"inverted": true` on a condition vanished and flipped its meaning, a nested `weapon_damage_scale` disappeared, an action written as a list could be dropped outright, and a shorthand item condition with no `type` was read as empty. That last one is how a saved Riding the Sword would fly with anything in hand. A save now applies only what you changed, onto the JSON the form was opened on, at any depth and inside lists, and clearing a field still removes it. A list you wrote as `[]` is kept rather than dropped, since for some fields it means something different from leaving the key out. Every shipped power saves back unchanged now, apart from `starting_equipment` folding a single item into its `stacks` list, which the game reads the same way.
- **Load template followed by Save gives you back the origin you loaded.** Loading a template into the in-game creator and saving it wrote a different origin from the one on screen. Evolution tiers, spawn locations and upgrades were dropped, so of the seventy-eight shipped origins the fifty-eight with evolution tiers lost them and the nine with a spawn location lost that, along with any origin field the creator has no box for, such as `unchoosable`, `special` or the Figura model keys. Powers were copied under new ids without updating the references between them, so a saved Iron Monk's Palm Strike still checked the original stamina pool, read zero and never fired. A name or description written as a translation key came back as the raw key, and the identity boxes truncated at two hundred and fifty-six characters, cutting six built-in descriptions. All of that is kept or corrected now, and a power keeps its id once given, so later edits in the Powers tab no longer rename it out from under its references.
- **A creator save no longer overwrites another origin's power files.** Power files are named after the origin's path and the power's type, with anything that is not a letter, digit or underscore folded into `_`. So a mob origin and a player origin both called `foo`, or two origins called `a/b` and `a_b`, wrote to the same file, and the second save silently replaced the first origin's power. The creator now checks which origin already lists each power id, saves a clashing one under a free id, updates every reference to it, and logs the move.
- **The web editor starts new origins in `neoorigins_custom`, so they cannot replace shipped ones by accident.** New origin and mob origin drafts defaulted to `neoorigins`, the namespace the built-in content uses, so a name matching a shipped origin or power silently replaced it for everyone on the server. New drafts now default to `neoorigins_custom`, the namespace the in-game creator already writes to. Loading a template still keeps the shipped id, since overriding that origin is the point. Templates also keep their evolution tiers, which used to be stripped on load: fifty-eight of the seventy-eight web templates have them, and they are carried through and exported as they were, though still not editable here. An empty list you wrote survives export too.
- **Web exports refuse ids the game cannot load.** The check only caught blank and duplicate ids, so a path with a capital letter or a trailing space exported cleanly and then, through the layer fault above, emptied the origin picker. The origin's namespace and path, the layer id, power ids and upgrade ids are now all checked against the game's own id rules first, with a message naming the offending character, and a blank upgrade is refused instead of loading as a dead reference. The mob origin editor, which had no export check at all, now refuses the same ids, and any power id used twice.
- **Modded fish whitelisted in the config now count as meat.** `ocean_origins.extra_fish_foods` lets you name modded fish an ocean origin may eat without editing a datapack, but the carnivore and vegetarian diets read only the `neoorigins:meat_foods` tag, so a fish listed there fed a Merling and was invisible to `origins:carnivore`. Both diets now read the tag **or** that list, so a whitelisted fish feeds a carnivore and is refused to a vegetarian, the same way tagged fish already were.
---
release
NeoOrigins v2.2.29 (MC 26.2)
v2.2.29+26.228 сент. 2026 г.305Minecraft: 26.2neoforge
Что нового
> A fixes release, mostly for the two origin editors, which could quietly lose data on save. Saving a power in the in-game creator deleted any detail its form could not display, loading a template and saving it dropped the origin's evolution tiers and custom spawn, one creator save could overwrite another origin's power files, and the web editor started new origins in the `neoorigins` namespace, where a name matching a shipped origin replaced it for the whole server. Outside the editors, an `area_of_effect` with a block action and no radius no longer runs that action across seventeen thousand blocks, one invalid origin id no longer empties an entire origin layer, and origin spawn searches start from the world spawn instead of the wrong end of the map. On 1.21.1 other players are drawn in their own model colour rather than yours.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **An `area_of_effect` with a block action no longer runs it across seventeen thousand blocks.** The block sweep borrowed the entity sweep's default radius of sixteen, so a `block_action` with no radius written ran at every block within sixteen of the centre: 17,077 positions per activation, and with `explode` as the block action the server stalled. The block sweep now defaults to two blocks, thirty-three positions, while the entity sweep keeps its sixteen, and a radius you do write is honoured as before up to the existing cap of sixteen. Separately, `explode` is limited to four per player per tick. They all go off at the player rather than the swept block, and hurt immunity after the first absorbs most of what the rest would deal, so the extras bought lag and nothing else. [ACTIONS.md](docs/ACTIONS.md) records both defaults and the cap.
- **One invalid origin id no longer empties a whole origin layer.** An id the game cannot parse, such as a web export named `Wizard` or `wizard ` with a trailing space, threw while its layer was being read, and the loader's answer was to discard the entire layer. Since addon and exported packs add to the built-in `neoorigins:origin` and `neoorigins:class` layers, one bad id emptied the picker of every origin, or every class, for everyone on the server, with nothing on screen to say why. The bad entry is now skipped with a warning naming it, and the rest of the layer loads.
- **Origin spawn searches start from the world spawn, scaled into the searched dimension the way a portal scales it.** On 1.21.1 only the Nether was wrong: the search read the Overworld's spawn point without dividing by eight, so a world spawn at 8000, 0 sent a new Blazeling to Nether 8000, 0, sixty-four thousand blocks out in Overworld terms. On 26.1 and 26.2 every search started from 0, 0 in whatever dimension it searched, so all nine built-in origins with a spawn location ignored a moved world spawn. All three versions now start from the world spawn converted into the searched dimension, so an Overworld spawn at 8000, 0 centres a Nether search on 1000, 0, with the height kept inside build limits and the position inside the world border. [PACK_FORMAT.md](docs/PACK_FORMAT.md) covers `spawn_location` itself.
- **Every player is drawn in their own model colour instead of yours (1.21.1).** `model_color` tints were read from your own powers for every player on screen, so everyone around you wore your colour and nobody ever saw theirs. Each player's tint now comes from that player's own synced powers, clears when their effect ends, and is dropped when they log out or leave range. Minecraft 26.1 and 26.2 draw no model colours, since the 26.1 rendering rework removed the call the tint depends on.
- **Caveborn meal tints clear when the meal's effect wears off.** `model_color` kept one condition slot per player, so the six Caveborn diet tints overwrote each other every second: a tint that ran out only told the client if it happened to be checked last, and the others stayed on the model until a respawn, relog or dimension change forced a resync. The shared slot also flipped twice a second, sending a full power sync each time. Each power now keeps its own result. On 26.1 and 26.2, where tints are not drawn, what changes is that the needless syncs stop.
- **Saving a power in the in-game creator keeps everything its form cannot show.** Opening a power in the form and saving it rebuilt each field from what the form understands, so any detail a sub-form did not model was deleted even if you changed nothing: an `"inverted": true` on a condition vanished and flipped its meaning, a nested `weapon_damage_scale` disappeared, an action written as a list could be dropped outright, and a shorthand item condition with no `type` was read as empty. That last one is how a saved Riding the Sword would fly with anything in hand. A save now applies only what you changed, onto the JSON the form was opened on, at any depth and inside lists, and clearing a field still removes it. A list you wrote as `[]` is kept rather than dropped, since for some fields it means something different from leaving the key out. Every shipped power saves back unchanged now, apart from `starting_equipment` folding a single item into its `stacks` list, which the game reads the same way.
- **Load template followed by Save gives you back the origin you loaded.** Loading a template into the in-game creator and saving it wrote a different origin from the one on screen. Evolution tiers, spawn locations and upgrades were dropped, so of the seventy-eight shipped origins the fifty-eight with evolution tiers lost them and the nine with a spawn location lost that, along with any origin field the creator has no box for, such as `unchoosable`, `special` or the Figura model keys. Powers were copied under new ids without updating the references between them, so a saved Iron Monk's Palm Strike still checked the original stamina pool, read zero and never fired. A name or description written as a translation key came back as the raw key, and the identity boxes truncated at two hundred and fifty-six characters, cutting six built-in descriptions. All of that is kept or corrected now, and a power keeps its id once given, so later edits in the Powers tab no longer rename it out from under its references.
- **A creator save no longer overwrites another origin's power files.** Power files are named after the origin's path and the power's type, with anything that is not a letter, digit or underscore folded into `_`. So a mob origin and a player origin both called `foo`, or two origins called `a/b` and `a_b`, wrote to the same file, and the second save silently replaced the first origin's power. The creator now checks which origin already lists each power id, saves a clashing one under a free id, updates every reference to it, and logs the move.
- **The web editor starts new origins in `neoorigins_custom`, so they cannot replace shipped ones by accident.** New origin and mob origin drafts defaulted to `neoorigins`, the namespace the built-in content uses, so a name matching a shipped origin or power silently replaced it for everyone on the server. New drafts now default to `neoorigins_custom`, the namespace the in-game creator already writes to. Loading a template still keeps the shipped id, since overriding that origin is the point. Templates also keep their evolution tiers, which used to be stripped on load: fifty-eight of the seventy-eight web templates have them, and they are carried through and exported as they were, though still not editable here. An empty list you wrote survives export too.
- **Web exports refuse ids the game cannot load.** The check only caught blank and duplicate ids, so a path with a capital letter or a trailing space exported cleanly and then, through the layer fault above, emptied the origin picker. The origin's namespace and path, the layer id, power ids and upgrade ids are now all checked against the game's own id rules first, with a message naming the offending character, and a blank upgrade is refused instead of loading as a dead reference. The mob origin editor, which had no export check at all, now refuses the same ids, and any power id used twice.
- **Modded fish whitelisted in the config now count as meat.** `ocean_origins.extra_fish_foods` lets you name modded fish an ocean origin may eat without editing a datapack, but the carnivore and vegetarian diets read only the `neoorigins:meat_foods` tag, so a fish listed there fed a Merling and was invisible to `origins:carnivore`. Both diets now read the tag **or** that list, so a whitelisted fish feeds a carnivore and is refused to a vegetarian, the same way tagged fish already were.
---
release
NeoOrigins v2.2.29 (MC 26.1.x)
v2.2.29+26.128 сент. 2026 г.192Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A fixes release, mostly for the two origin editors, which could quietly lose data on save. Saving a power in the in-game creator deleted any detail its form could not display, loading a template and saving it dropped the origin's evolution tiers and custom spawn, one creator save could overwrite another origin's power files, and the web editor started new origins in the `neoorigins` namespace, where a name matching a shipped origin replaced it for the whole server. Outside the editors, an `area_of_effect` with a block action and no radius no longer runs that action across seventeen thousand blocks, one invalid origin id no longer empties an entire origin layer, and origin spawn searches start from the world spawn instead of the wrong end of the map. On 1.21.1 other players are drawn in their own model colour rather than yours.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **An `area_of_effect` with a block action no longer runs it across seventeen thousand blocks.** The block sweep borrowed the entity sweep's default radius of sixteen, so a `block_action` with no radius written ran at every block within sixteen of the centre: 17,077 positions per activation, and with `explode` as the block action the server stalled. The block sweep now defaults to two blocks, thirty-three positions, while the entity sweep keeps its sixteen, and a radius you do write is honoured as before up to the existing cap of sixteen. Separately, `explode` is limited to four per player per tick. They all go off at the player rather than the swept block, and hurt immunity after the first absorbs most of what the rest would deal, so the extras bought lag and nothing else. [ACTIONS.md](docs/ACTIONS.md) records both defaults and the cap.
- **One invalid origin id no longer empties a whole origin layer.** An id the game cannot parse, such as a web export named `Wizard` or `wizard ` with a trailing space, threw while its layer was being read, and the loader's answer was to discard the entire layer. Since addon and exported packs add to the built-in `neoorigins:origin` and `neoorigins:class` layers, one bad id emptied the picker of every origin, or every class, for everyone on the server, with nothing on screen to say why. The bad entry is now skipped with a warning naming it, and the rest of the layer loads.
- **Origin spawn searches start from the world spawn, scaled into the searched dimension the way a portal scales it.** On 1.21.1 only the Nether was wrong: the search read the Overworld's spawn point without dividing by eight, so a world spawn at 8000, 0 sent a new Blazeling to Nether 8000, 0, sixty-four thousand blocks out in Overworld terms. On 26.1 and 26.2 every search started from 0, 0 in whatever dimension it searched, so all nine built-in origins with a spawn location ignored a moved world spawn. All three versions now start from the world spawn converted into the searched dimension, so an Overworld spawn at 8000, 0 centres a Nether search on 1000, 0, with the height kept inside build limits and the position inside the world border. [PACK_FORMAT.md](docs/PACK_FORMAT.md) covers `spawn_location` itself.
- **Every player is drawn in their own model colour instead of yours (1.21.1).** `model_color` tints were read from your own powers for every player on screen, so everyone around you wore your colour and nobody ever saw theirs. Each player's tint now comes from that player's own synced powers, clears when their effect ends, and is dropped when they log out or leave range. Minecraft 26.1 and 26.2 draw no model colours, since the 26.1 rendering rework removed the call the tint depends on.
- **Caveborn meal tints clear when the meal's effect wears off.** `model_color` kept one condition slot per player, so the six Caveborn diet tints overwrote each other every second: a tint that ran out only told the client if it happened to be checked last, and the others stayed on the model until a respawn, relog or dimension change forced a resync. The shared slot also flipped twice a second, sending a full power sync each time. Each power now keeps its own result. On 26.1 and 26.2, where tints are not drawn, what changes is that the needless syncs stop.
- **Saving a power in the in-game creator keeps everything its form cannot show.** Opening a power in the form and saving it rebuilt each field from what the form understands, so any detail a sub-form did not model was deleted even if you changed nothing: an `"inverted": true` on a condition vanished and flipped its meaning, a nested `weapon_damage_scale` disappeared, an action written as a list could be dropped outright, and a shorthand item condition with no `type` was read as empty. That last one is how a saved Riding the Sword would fly with anything in hand. A save now applies only what you changed, onto the JSON the form was opened on, at any depth and inside lists, and clearing a field still removes it. A list you wrote as `[]` is kept rather than dropped, since for some fields it means something different from leaving the key out. Every shipped power saves back unchanged now, apart from `starting_equipment` folding a single item into its `stacks` list, which the game reads the same way.
- **Load template followed by Save gives you back the origin you loaded.** Loading a template into the in-game creator and saving it wrote a different origin from the one on screen. Evolution tiers, spawn locations and upgrades were dropped, so of the seventy-eight shipped origins the fifty-eight with evolution tiers lost them and the nine with a spawn location lost that, along with any origin field the creator has no box for, such as `unchoosable`, `special` or the Figura model keys. Powers were copied under new ids without updating the references between them, so a saved Iron Monk's Palm Strike still checked the original stamina pool, read zero and never fired. A name or description written as a translation key came back as the raw key, and the identity boxes truncated at two hundred and fifty-six characters, cutting six built-in descriptions. All of that is kept or corrected now, and a power keeps its id once given, so later edits in the Powers tab no longer rename it out from under its references.
- **A creator save no longer overwrites another origin's power files.** Power files are named after the origin's path and the power's type, with anything that is not a letter, digit or underscore folded into `_`. So a mob origin and a player origin both called `foo`, or two origins called `a/b` and `a_b`, wrote to the same file, and the second save silently replaced the first origin's power. The creator now checks which origin already lists each power id, saves a clashing one under a free id, updates every reference to it, and logs the move.
- **The web editor starts new origins in `neoorigins_custom`, so they cannot replace shipped ones by accident.** New origin and mob origin drafts defaulted to `neoorigins`, the namespace the built-in content uses, so a name matching a shipped origin or power silently replaced it for everyone on the server. New drafts now default to `neoorigins_custom`, the namespace the in-game creator already writes to. Loading a template still keeps the shipped id, since overriding that origin is the point. Templates also keep their evolution tiers, which used to be stripped on load: fifty-eight of the seventy-eight web templates have them, and they are carried through and exported as they were, though still not editable here. An empty list you wrote survives export too.
- **Web exports refuse ids the game cannot load.** The check only caught blank and duplicate ids, so a path with a capital letter or a trailing space exported cleanly and then, through the layer fault above, emptied the origin picker. The origin's namespace and path, the layer id, power ids and upgrade ids are now all checked against the game's own id rules first, with a message naming the offending character, and a blank upgrade is refused instead of loading as a dead reference. The mob origin editor, which had no export check at all, now refuses the same ids, and any power id used twice.
- **Modded fish whitelisted in the config now count as meat.** `ocean_origins.extra_fish_foods` lets you name modded fish an ocean origin may eat without editing a datapack, but the carnivore and vegetarian diets read only the `neoorigins:meat_foods` tag, so a fish listed there fed a Merling and was invisible to `origins:carnivore`. Both diets now read the tag **or** that list, so a whitelisted fish feeds a carnivore and is refused to a vegetarian, the same way tagged fish already were.
---
release
NeoOrigins v2.2.28 (MC 1.21.1)
v2.2.28+1.21.125 сент. 2026 г.1,7 тыс.Minecraft: 1.21.1neoforge
Что нового
> A large fixes release, and one of them is a crash. On 1.21.1, installing a resource pack built from our own theme template could kill the client at boot, or stop a server loading its datapacks, and the template shipped in a state that triggered both. All three are fixed, and a theme whose panel texture is missing now falls back to the parchment panel instead of stretching the missing-texture checkerboard across the origin screen. Elytrian now wears its wings folded on its back instead of showing them only mid-glide (#130), through a new third setting on `render_elytra` that every editor offers as a dropdown, and on 26.1 and 26.2 a chestplate no longer hides power-granted wings. The Rogue's one Class Skill key now goes to Step Assist, so the switch the Rogue gained in 2.2.26 can finally be pressed, and sneaking stops a step-assisted player at a ledge again (#134). The slime's bounce keeps a running player's speed, and a jump or a short drop no longer sets it off (#133). Resource bars stay on screen until you spend the resource for the first time (#105), come back by themselves after a `/reload`, and one player losing a resource power no longer takes every other holder's bar with it. The wraith's client and server now read its blocked-block list the same way (#109). Several fixes change what players feel without any visible change to the origin: power modifiers stopped adding another copy of themselves on every death and relog, the Sporeling's Fungal Contact heals only on mushroom blocks and mycelium as its description says, the Slime's tier-2 Sticky Aura slows things for the first time, and two powers that could never fire now do, one of them a Piglin downside. The Lumberjack pays its bonus planks for every wood rather than only oak. The three Dragon Survival origins can be picked at all now, and a random roll will not turn you into one. The in-game creator stops offering an operation that its own maths reads as an addition, the web editor's block view stops quietly rewriting the powers it loads, and both editors gained fields they could never author. Fish counts as meat for the Origins-compatible carnivore and vegetarian diets. Every config option and every entity has an English name, where the config screen had been drawing raw keys for a couple of hundred of them. The One Probe works on 26.1 and 26.2 for the first time, FTB Quests tag-marker rewards grant again on 26.1, and KubeJS scripts can read a player's resource values on 1.21.1 and 26.1.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Elytrian keeps its wings on its back (#130).** Wings drawn by a flight power appeared only while the player was gliding, so an origin whose whole body plan is wings looked wingless the moment it landed. Elytrian now shows them folded on its back whenever its flight power is active, and spreads them in a glide as it always has. The other flying origins are unchanged: Phantom, Hiveling and Draconic still show wings only while gliding, and Windwalker still shows none. The setting behind this is described under Pack Author Features.
- **The Rogue's Class Skill key goes to Step Assist.** A class gets exactly one Class Skill key, and it goes to the first power in the class that can be activated. The Rogue listed Stealth ahead of the Step Assist switch it gained in 2.2.26, so Stealth took the key and Step Assist could not be switched at all. Step Assist is now first. Stealth is still granted and works as before (sneak for ten seconds and you turn invisible), but it no longer has a key, so it stays on.
- **A toggle no key can reach is switched back on when you log in.** A Rogue who switched Stealth off before this release would otherwise be left with it off and no way to turn it back on short of changing class. At every login, any NeoOrigins toggle power whose switch is not bound to a key has its off state cleared, which returns it to on. Origins-format `origins:toggle` powers keep their state separately and are not included. That includes toggles set to start off with `default_off`, since without a key there is no way to switch those on either. A power counts as bound when it holds one of the six Skill slots, the Class Skill slot, or a named hotkey of its own. Two cases are left alone. Nothing is changed while Suppression is in effect, because Suppression switches toggles off on purpose, and a toggle that does have a key keeps whatever you last set it to.
- **Stealth and the Rogue are described by what they actually do.** Stealth's description promised that attacking from behind deals double damage, and the Rogue's promised devastating backstab damage. Neither was ever true: Stealth turns you invisible after ten seconds of sneaking and stops a mob picking you as a new target while you are invisible, and the separate Backstab power is a flat +2 attack damage while sneaking, whichever way you are facing. Both strings now say that. Nothing about combat changes. The two corrected strings are English for now, and the other eleven languages fall back to the English text rather than showing a stale promise.
- **The slime's bounce leaves jumps and short drops alone (#133).** The bounce triggered on an ordinary jump, and on a drop of a single block. It now needs the impact of a fall of four blocks or more: a jump and a drop of up to three blocks land normally, and anything from four blocks up still bounces. A jump off a ledge counts from the top of the jump, so jumping off a drop of more than two blocks still bounces. The threshold is `min_velocity` on `neoorigins:bounce_on_land`, and its default moved from 0.3 to 0.63.
- **A resource bar stays on screen until you have spent it once (#105).** Bars hide while they are full, so a bar that starts full was invisible from the moment the origin was picked, and a new player had no way to know the resource existed. A full bar now stays on screen until that resource drops below full for the first time, and from then on it hides when full as before. The reminder starts over each time your origins are re-sent to you, which includes joining, respawning and picking an origin. Bars set to `always_render` are unaffected.
- **Fish counts as meat for the carnivore and vegetarian diets.** The Origins-compatible `origins:carnivore` and `origins:vegetarian` diets both decide what is meat from the `neoorigins:meat_foods` tag, and that tag held no fish, so a carnivore origin from an Origins pack could not eat cod while a vegetarian one could. The meat tag now includes `neoorigins:fish_foods`, so fish is food for the carnivore and refused by the vegetarian. None of the built-in origins use either diet.
- **The ocean origins eat modded fish that sit outside the common tags.** Alex's Mobs raw and cooked catfish, blobfish, flying fish and cosmic cod, and Ocean's Delight's fugu slice, are fish that sit outside the fish tags this mod reads, so the ocean origins' fish-only diet refused them. They are now listed in `neoorigins:fish_foods` directly, which makes them food for Abyssal, Kraken, Merling and Siren, and, through the change above, for a carnivore.
- **An installed theme could crash the 1.21.1 client at boot.** A font file that points at another font, which is how a theme reuses the mod's parchment typeface, puts one TrueType provider into two fonts and so hands one FreeType face to two threads: the font manager finishes each font on its own worker. On 1.21.1 nothing guarded that face, and the client died during loading with a FreeType error, a native heap corruption, or an access violation in `freetype.dll`, differing from run to run. A client mixin now locks the face around both glyph reads, which is what 26.1 and 26.2 already do in vanilla. The theme template, which shipped exactly such a font file and therefore crashed the client the moment it was installed unmodified, no longer sets a font at all: it keeps Newsreader as before, and the recipe for shipping your own TTF moved to a placeholder file alongside it.
- **A theme pack could stop a 1.21.1 server loading its datapacks.** Both theme managers built their instance during class initialisation and handed the reload listener a parser that had not been created yet, so the listener's parser was null and the first JSON file it touched threw. A datapack carrying `data/<namespace>/neoorigins/active_theme.json` failed the whole server load with "Failed to load datapacks", and a resource pack carrying `assets/<namespace>/ui_themes/*.json` broke the client's resource reload. The theme template triggered both. Both managers now build their own parser. 26.1 and 26.2 read theme files a different way and never had this fault.
- **A theme with a missing panel texture draws the parchment panel instead of a checkerboard.** A theme whose `panel_background` names a file that no loaded pack ships used to bind the missing-texture checkerboard and stretch it across the entire origin screen panel, which is what the template did out of the box because it ships a placeholder where `panel.png` goes. The theme now keeps the parchment panel and its 9-slice geometry while keeping its own colours and font, and logs a single `[theming]` warning naming the path it could not find. Flat themes never draw a texture and are untouched.
- **Sneaking stops a step-assisted player at a ledge again (#134).** The game decides whether sneaking should hold you at an edge by looking for floor as far below your feet as your step height reaches. A step height that clears a full block therefore found the floor beneath a one-block drop, concluded there was no ledge, and let you walk off it. While you are sneaking, that one check now looks only as deep as your unmodified step height, and only for players whose step height one of our powers has changed. You still step up as high as the power allows, and Step Assist can stay on.
- **The slime's bounce stops killing a running player's speed (#133).** Every bounce set the player's sideways speed to zero, because the server was reading a movement value that the client never sends it and that is always zero on the server. A running slime stopped dead on every landing, which is also why a chain of bounces ended up happening on the spot. The bounce now carries the sideways speed you landed with.
- **The Slime's Sticky Aura slows what is near it.** The tier-2 aura wrote its effect as loose `effect`, `amplifier`, `duration` and `exclude_self` fields directly on the `area_of_effect` action, which reads none of them. With no entity, bientity or block action to run, the action compiled to nothing and the aura had never slowed anything. It now writes the effect the way the other built-in auras do: every second, everything within three blocks other than the Slime itself gets Slowness I for two seconds. It was the only shipped power written in that shape.
- **Power modifiers stop stacking on every death and relog.** Four kinds of modifier added a fresh copy of themselves each time a player respawned or logged back in, without removing the one already there: the native `modify_lava_speed`, and the Origins-compatible `modify_lava_speed`, `modify_xp_gain` and `modify_food`. On 26.1 and 26.2 `modify_xp_gain` had no effect at all before this release (see Compatibility), so there it never grew. A power balanced for one copy therefore got stronger with every death. Each one now replaces its own entry. A pack that was tuned against the grown value will find its powers back at the strength its file actually says.
- **A `/reload` no longer takes every online player's resource bars away.** A reload clears the registered resource information and rebuilds it from the datapack, but the native `neoorigins:resource` only registered itself when a power was granted or a player logged in, and the Origins-compatible `origins:resource` registered its backing only on grant. Every player already online therefore lost the bar until someone relogged: a plain resource dropped off the HUD entirely and a mana-backed one read as unbacked. Stored values were never affected. The sync that follows a reload now re-registers each online player's resources and re-sends their bars, and the compatible form registers its backing as it is parsed, so the reload itself restores it.
- **One player losing a resource power no longer takes it from everybody.** Resource information, mana backing and cooldown durations are keyed by the power rather than by the player, and are shared by everyone who holds it, but revoking the power from one player deleted the shared entry. Every other holder lost their bar at the same moment: a mana-backed bar vanished from the HUD and an Apoli resource lost its bounds, until the next relog or reload. A revoke now clears only that player's own state. Separately, the HUD sync was sending every mana-backed bar to every player because it walked the shared table; it now sends a bar only to players who hold the power. The value shown was always the player's own mana.
- **The Lumberjack's bonus planks cover every wood, not just oak.** The power set an `item_id` field that `craft_amount_bonus` never reads, so it fell back to the default output of oak planks and every other plank recipe paid nothing. The Lumberjack now names the `#minecraft:planks` tag and the bonus copies whatever you crafted, modded planks in that tag included.
- **The wraith's client and server agree about blocked blocks (#109).** A wraith that phases into a block it is barred from, such as obsidian or bedrock, is meant to be pushed back out by ordinary collision. The server stopped the phasing while the player was inside such a block, but the client kept phasing, so the two sides disagreed about whether the player was being pushed out at all. Both sides now use one rule for that decision and one reading of the blocked list.
- **Fungal Contact heals only on mushroom blocks and mycelium.** The Sporeling's healing power wrote its block list under a field the condition never reads, and a condition with no block list matches any block, so it healed 1 health every second everywhere. It now heals while you stand on, or have your feet inside, a red or brown mushroom block, a mushroom stem or mycelium, which is what its description has always said.
- **Mushroom Symbiosis and Soul Dread now work.** Both named a biome tag that does not exist, so neither could ever fire. Mushroom Symbiosis asked for `minecraft:is_mushroom`, and the mushroom biome tag is `c:is_mushroom`, so the Sporeling now gets its Regeneration in mushroom fields. Soul Dread asked for a tag called `minecraft:soul_sand_valley`, which is the name of a biome, and it now names the biome. Soul Dread is a Piglin downside, so this fix makes the Piglin weaker: Piglins now take the 0.5 damage a second in a Soul Sand Valley that the description promised.
- **The three Dragon Survival origins can be picked.** Cave Dragon, Forest Dragon and Sea Dragon shipped in no layer file at all. The picker builds its rows from the layer's own origin list and the server refuses a choice the layer does not offer, so none of the three could be chosen even with Dragon Survival installed, and only `/neoorigins set` reached them. They now sit in `neoorigins:origin`. Without Dragon Survival their `required_mods` gate keeps them unloaded and nothing changes for packs that do not have the mod.
- **A random origin will not turn you into a dragon.** With the dragons now listed in a layer that also allows random, rolling for an origin could land on one. Layers read `exclude_random` (described under Pack Author Features) and the shipped layer excludes the three dragons, which stay directly pickable. The same change made the Random button and the server's own random assignment draw from one pool: server assignment now honours layer conditions, content toggles and `unchoosable`, all of which it ignored before.
- **Power-granted wings show under a chestplate on 26.1 and 26.2 (#130).** So that it never draws a second pair on top of a real elytra, the wing layer steps aside when the chest slot holds one. On the 26.x lines its test for an elytra matched any armour worn in that slot, so wearing a chestplate hid the wings completely. It now steps aside only for an actual elytra, which is what 1.21.1 has always done.
- **`on_block` honours `inverted`.** An `on_block` whose block condition was a single block, a tag, or an `and`/`or` group ignored the `inverted` flag on that node, so a condition written as "not standing on stone" still matched stone. Every node now honours it, at the top and at any depth, the same way `in_block` already did. You still have to be on the ground for `on_block` to match, whether or not the block is inverted. One smaller change comes with it: an `or` group containing a block condition that cannot be read now fails as a whole, where it used to ignore that one entry.
- **An inline block condition applies `inverted` once instead of twice.** A condition written as a single node with the block and the flag together, `{"type": "block", "block": "stone", "inverted": true}`, was negated by the parser and then negated again by the compiler, so it matched stone. It now negates once. The wrapper form, where an outer node holds a nested block condition, was always correct: those are two separate nodes and each flag still applies to its own.
- **The `block` entity condition reads a root-level `tag`.** The condition documents a tag written at the top of the node, and packs write it that way, but the shared compiler only looked for one nested under `in_tag`. Such a node compiled to nothing, which made the entity condition permanently false and made a nested block condition match no block at all. The tag is now read where the documentation says to put it.
- **The in-game creator stops offering speed operations that turn into additions.** On `modify_lava_speed` and `modify_flight_speed`, the operation dropdown listed the attribute operations `add_value`, `add_multiplied_base` and `add_multiplied_total`. Those powers only understand `addition`, `multiply_base` and `multiply_total`, and read anything else as an addition, so picking the obvious multiplier silently produced an addition. The dropdown now offers the three the power reads. If you saved one of these powers from the in-game creator, check its `operation`: a file that already says `add_multiplied_base` or `add_multiplied_total` is still read as an addition. The same fix means the `change_resource` action and Cold Sweat's `modify_temperature` now offer `set` alongside `add`, and the `equipped_item` condition's slot now offers `accessory`.
- **The web editor's block view stops rewriting the powers it loads.** The block view rebuilds the powers it holds whenever the canvas changes, and anything a block had no widget for was dropped on the way. Loading the built-in powers and making no edit at all was enough to change some of them: the nested `inverted` flag came off Windwalker's Cloud Steps, the Qi Cultivator's Dantian Expansion and the Iron Monk's Stamina, and the bare `"tag": "minecraft:swords"` item condition came off Sword Immortal powers, so those no longer required a sword. Each block now keeps what it cannot display and writes it back unchanged, including a value its dropdown has no entry for, until you change that field yourself.
- **The web editor's built-in powers and origin templates match the mod again.** Both had fallen behind what the mod ships. The power catalogue still gave Elytrian's flight as `true`, and the origin templates were older still, with the Caveborn diets missing their tiers and the Rogue's Parkour missing the Step Assist toggle that now gates it. Both are regenerated, and a new check in the editor's tooling fails when either falls out of step with the mod.
- **The web editor says when a power type has no form.** Many of the power types the editor offers have no form of their own, so the form shows only the common fields. The note meant to explain this could never appear, and it pointed at the JSON Preview, which is read-only. It now appears for every such type and says what is true: the mod accepts the type, only the common fields can be set in the editor, fields already in an imported file are kept, and anything else has to be written in the power's JSON and imported.
- **The origin picker shows which unique origins are already taken (1.21.1).** When a pack marks an origin as unique, the server tracks who has claimed it and sent that list to the client, but nothing on the client read it. The picker offered a claimed origin anyway, let you confirm it, and the server's refusal arrived as a line of chat, leaving you on an empty layer with no picker to try again. Claimed origins are now shown as claimed, with the name of the player holding them; Confirm is disabled on them and the Random button skips them. The server remains the authority, and a refusal now resyncs you and reopens the picker rather than stranding you. Claims reach every online player as they change and on login, instead of only when a picker opens, so an open picker updates while you are looking at it. This one is on the 1.21.1 line only for 2.2.28; the client that reads the claims does not exist on 26.1 or 26.2 yet.
- **Every config option and every entity has an English name.** The in-game config screen looks a label up by the option's own name rather than by its full path, and 91 entries in the English file were written with the full path, so the screen never read them and drew the raw key instead. Together with options that had no entry at all, that left 234 labels unnamed on 1.21.1, 229 on 26.1 and 228 on 26.2: thirteen section titles including Hotkeys, HUD and Compatibility, the content toggles for nine origins, around 110 power-override sections and the 76 shared field names beneath them, and every client, gameplay and admin option that had been added without one. Nine entities, the black hole, tornado and thrown sword among them, had no name on any line and showed their registry id wherever the game named them. All of them are named now.
- **`render_elytra` takes `"never"`, `"flying"` or `"always"` (#130).** The field on `elytra_flight`, `natural_glide` and `flight` was a plain true or false: wings during a glide, or no wings. `"always"` draws the wings, folded, whenever the power is active, and spreads them in a glide. `"never"` and `"flying"` are the word forms of `false` and `true`, and both booleans keep their exact meaning, so existing packs and Origins imports are untouched. Defaults are unchanged: `"flying"` on `elytra_flight`, `"never"` on `natural_glide` and `flight`. The in-game creator and both web editor views offer the three as a dropdown, and a file written with `true` or `false` opens on the matching entry, with the creator's tooltip naming the real default. Saving writes the word. NeoOrigins 2.2.27 and earlier read only a boolean here, so a pack that has to load on an older version should keep `true` or `false`.
- **Layers take `exclude_random`.** This is the Origins-format list of origin ids that a random roll never lands on, while leaving them directly pickable. A layer file added on top of another adds to the list rather than replacing it. The shipped origin layer uses it for the three Dragon Survival origins.
- **`craft_amount_bonus` takes a `#tag` as its `output_item`.** The bonus then copies whatever was crafted rather than always producing the one named item, which is what a "more planks from logs" power needs in a world with more than one kind of wood. The default is still oak planks, and naming a single item behaves exactly as before.
- **Every block condition can be `inverted` in the editors.** With `on_block` fixed, `in_block`, `on_block` and the compatibility loader's block compiler all honour `inverted`, so each block-condition type in the schema now carries it as an optional flag, default `false`. The in-game creator and both web editor views can set it on any node.
- **`spawn_projectile_rain` offers `telegraph_ticks` in both editors.** The action has read the field since it shipped, and the documented example sets it, but no editor declared it, so the lead-in before the first projectile lands could only be authored by hand. It is now an integer field carrying the parser's own default of 14.
- **`persistent_effect` offers its root-level shorthand in both editors.** The power accepts a single `effect` written at the root as a one-entry list, with `ambient`, `show_particles` and `show_icon` beside it as defaults for every entry, and 36 shipped powers use that form, but only the root `amplifier` was ever declared. All four are now authorable, with the decode's defaults. The `status_effect` alias inherits them instead of carrying its own copies, and `stacking_status_effects` gains them too.
- **The bundled example packs and the theme template load on 26.1 and 26.2.** The packs in the repository that an author copies from all declared 1.21.1's pack formats, so on the 26.x lines they loaded as too old, and `slime-morph-example` declared a resource-pack format without the bounds the data-pack parser requires above 81, so it failed to load at all. Each now declares the format of the line it sits on, with `example-pack` and the theme template, which are both resource and data packs, declaring the full supported span. These sit in the repository rather than inside the jar, so nothing about a player's install changes.
- **Five power types stop being rewritten out of their own behaviour.** A salvage step meant for misspelled types was rewriting `neoorigins:action_on_kill`, `action_over_time`, `food_restriction`, `night_vision` and `status_effect` into their Origins-compatible forms before the alias table, which handles all five correctly, ever got the chance. The compatible readers ignore the fields those types document: an `action_on_kill` written exactly as the docs show it never fired at all, and an `action_over_time` lost `else_action`, `toggleable`, `default_off` and its `enabled` switch. Salvage now leaves alone any type the alias table already knows. Shipped content is unchanged: the 22 `night_vision` and 3 `food_restriction` powers load to exactly what they did before.
- **`origins-classes:more_planks_from_logs` covers every wood.** It translated to a bonus with no output named, which meant the default of oak planks, so every other plank recipe paid nothing. It now names the `#minecraft:planks` tag and pays in whatever you crafted. The bonus count is unchanged.
- **The compatibility loader reads four block condition fields it used to ignore.** `fluid`, `light_level`, `exposed_to_sky` and `movement_blocking` have compiled correctly in `in_block` and `on_block` since 2.2.24, but the Origins-compatible loader has its own block compiler, and there all four fell through to a branch that matches every block. That compiler serves `action_on_event` block filters, `prevent_block_use`, `prevent_sleep`, `block_collision` and the `area_of_effect` block filter, so a condition using any of the four was silently always true in all five. No shipped power writes any of them.
- **`origins:modify_xp_gain` changes the XP a player gains (26.1 and 26.2).** The power loaded on these lines, but nothing read it, so it never changed any XP. It now applies, as it always has on 1.21.1.
- **Config `power_overrides` reach the water-damage and slow-regeneration powers (26.1 and 26.2).** The overrides ran after the alias table had already read and removed the fields they target, so a server owner's `multiplier`, `damage_per_second` or `include_rain` for those powers was silently ignored. They now run first, as they always have on 1.21.1. A server that set one of these will see it take effect.
- **`/reload` does not restore some powers for players already online.** A reload clears the per-player tables behind `modify_lava_speed` (native and Origins-compatible) and the Origins-compatible `modify_xp_gain`, `modify_food`, `modify_crafting`, `prevent_item_use`, `prevent_block_use`, `prevent_entity_use`, `prevent_sleep` and `restrict_armor`, and nothing refills them until the player dies, relogs or is granted the power again. Among the built-in origins this affects the Draconic's Molten Stride, which stops speeding up lava swimming until the next death or relog. This is unchanged in 2.2.28.
- **The One Probe is supported on 26.1 and 26.2.** The integration was 1.21.1 only because The One Probe published no 26.x build. It now does, and the API and the handshake are unchanged, so the same provider runs on all three lines. EMI still has no 26.x build, so that integration stays on 1.21.1.
- **FTB Quests tag-marker grants work again on 26.1.** FTB Quests 26.1.2.x dropped the event and the Architectury layer our hook bound to, so with it installed the mod warned at every boot that tag-marker rewards were inert, and a quest tagged `neoorigins_loot_pool_grant:<table>` granted nothing at all. A typed listener now handles the quest-progress event that 26.1 posts on the NeoForge bus, loaded only when FTB Quests is present, and the older hook stays as the fallback. The 1.21.1 and 26.2 lines are unchanged.
- **KubeJS scripts can read a player's resource values (1.21.1 and 26.1).** `NeoOrigins.getResource(player, id)` returns the current value, or `null` when the player does not have that resource, so a missing resource never reads as an empty one. `NeoOrigins.hasResource(player, id)` says whether they have it. The id is the resource power's full id, the same one `/resource get` takes. A bar backed by Iron's Spells mana reports that player's live mana. Both are read-only. The 26.2 build does not bundle KubeJS support, so neither is available there. See [KUBEJS.md](docs/KUBEJS.md).
---
release
NeoOrigins v2.2.28 (MC 26.2)
v2.2.28+26.225 сент. 2026 г.74Minecraft: 26.2neoforge
Что нового
> A large fixes release, and one of them is a crash. On 1.21.1, installing a resource pack built from our own theme template could kill the client at boot, or stop a server loading its datapacks, and the template shipped in a state that triggered both. All three are fixed, and a theme whose panel texture is missing now falls back to the parchment panel instead of stretching the missing-texture checkerboard across the origin screen. Elytrian now wears its wings folded on its back instead of showing them only mid-glide (#130), through a new third setting on `render_elytra` that every editor offers as a dropdown, and on 26.1 and 26.2 a chestplate no longer hides power-granted wings. The Rogue's one Class Skill key now goes to Step Assist, so the switch the Rogue gained in 2.2.26 can finally be pressed, and sneaking stops a step-assisted player at a ledge again (#134). The slime's bounce keeps a running player's speed, and a jump or a short drop no longer sets it off (#133). Resource bars stay on screen until you spend the resource for the first time (#105), come back by themselves after a `/reload`, and one player losing a resource power no longer takes every other holder's bar with it. The wraith's client and server now read its blocked-block list the same way (#109). Several fixes change what players feel without any visible change to the origin: power modifiers stopped adding another copy of themselves on every death and relog, the Sporeling's Fungal Contact heals only on mushroom blocks and mycelium as its description says, the Slime's tier-2 Sticky Aura slows things for the first time, and two powers that could never fire now do, one of them a Piglin downside. The Lumberjack pays its bonus planks for every wood rather than only oak. The three Dragon Survival origins can be picked at all now, and a random roll will not turn you into one. The in-game creator stops offering an operation that its own maths reads as an addition, the web editor's block view stops quietly rewriting the powers it loads, and both editors gained fields they could never author. Fish counts as meat for the Origins-compatible carnivore and vegetarian diets. Every config option and every entity has an English name, where the config screen had been drawing raw keys for a couple of hundred of them. The One Probe works on 26.1 and 26.2 for the first time, FTB Quests tag-marker rewards grant again on 26.1, and KubeJS scripts can read a player's resource values on 1.21.1 and 26.1.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Elytrian keeps its wings on its back (#130).** Wings drawn by a flight power appeared only while the player was gliding, so an origin whose whole body plan is wings looked wingless the moment it landed. Elytrian now shows them folded on its back whenever its flight power is active, and spreads them in a glide as it always has. The other flying origins are unchanged: Phantom, Hiveling and Draconic still show wings only while gliding, and Windwalker still shows none. The setting behind this is described under Pack Author Features.
- **The Rogue's Class Skill key goes to Step Assist.** A class gets exactly one Class Skill key, and it goes to the first power in the class that can be activated. The Rogue listed Stealth ahead of the Step Assist switch it gained in 2.2.26, so Stealth took the key and Step Assist could not be switched at all. Step Assist is now first. Stealth is still granted and works as before (sneak for ten seconds and you turn invisible), but it no longer has a key, so it stays on.
- **A toggle no key can reach is switched back on when you log in.** A Rogue who switched Stealth off before this release would otherwise be left with it off and no way to turn it back on short of changing class. At every login, any NeoOrigins toggle power whose switch is not bound to a key has its off state cleared, which returns it to on. Origins-format `origins:toggle` powers keep their state separately and are not included. That includes toggles set to start off with `default_off`, since without a key there is no way to switch those on either. A power counts as bound when it holds one of the six Skill slots, the Class Skill slot, or a named hotkey of its own. Two cases are left alone. Nothing is changed while Suppression is in effect, because Suppression switches toggles off on purpose, and a toggle that does have a key keeps whatever you last set it to.
- **Stealth and the Rogue are described by what they actually do.** Stealth's description promised that attacking from behind deals double damage, and the Rogue's promised devastating backstab damage. Neither was ever true: Stealth turns you invisible after ten seconds of sneaking and stops a mob picking you as a new target while you are invisible, and the separate Backstab power is a flat +2 attack damage while sneaking, whichever way you are facing. Both strings now say that. Nothing about combat changes. The two corrected strings are English for now, and the other eleven languages fall back to the English text rather than showing a stale promise.
- **The slime's bounce leaves jumps and short drops alone (#133).** The bounce triggered on an ordinary jump, and on a drop of a single block. It now needs the impact of a fall of four blocks or more: a jump and a drop of up to three blocks land normally, and anything from four blocks up still bounces. A jump off a ledge counts from the top of the jump, so jumping off a drop of more than two blocks still bounces. The threshold is `min_velocity` on `neoorigins:bounce_on_land`, and its default moved from 0.3 to 0.63.
- **A resource bar stays on screen until you have spent it once (#105).** Bars hide while they are full, so a bar that starts full was invisible from the moment the origin was picked, and a new player had no way to know the resource existed. A full bar now stays on screen until that resource drops below full for the first time, and from then on it hides when full as before. The reminder starts over each time your origins are re-sent to you, which includes joining, respawning and picking an origin. Bars set to `always_render` are unaffected.
- **Fish counts as meat for the carnivore and vegetarian diets.** The Origins-compatible `origins:carnivore` and `origins:vegetarian` diets both decide what is meat from the `neoorigins:meat_foods` tag, and that tag held no fish, so a carnivore origin from an Origins pack could not eat cod while a vegetarian one could. The meat tag now includes `neoorigins:fish_foods`, so fish is food for the carnivore and refused by the vegetarian. None of the built-in origins use either diet.
- **The ocean origins eat modded fish that sit outside the common tags.** Alex's Mobs raw and cooked catfish, blobfish, flying fish and cosmic cod, and Ocean's Delight's fugu slice, are fish that sit outside the fish tags this mod reads, so the ocean origins' fish-only diet refused them. They are now listed in `neoorigins:fish_foods` directly, which makes them food for Abyssal, Kraken, Merling and Siren, and, through the change above, for a carnivore.
- **An installed theme could crash the 1.21.1 client at boot.** A font file that points at another font, which is how a theme reuses the mod's parchment typeface, puts one TrueType provider into two fonts and so hands one FreeType face to two threads: the font manager finishes each font on its own worker. On 1.21.1 nothing guarded that face, and the client died during loading with a FreeType error, a native heap corruption, or an access violation in `freetype.dll`, differing from run to run. A client mixin now locks the face around both glyph reads, which is what 26.1 and 26.2 already do in vanilla. The theme template, which shipped exactly such a font file and therefore crashed the client the moment it was installed unmodified, no longer sets a font at all: it keeps Newsreader as before, and the recipe for shipping your own TTF moved to a placeholder file alongside it.
- **A theme pack could stop a 1.21.1 server loading its datapacks.** Both theme managers built their instance during class initialisation and handed the reload listener a parser that had not been created yet, so the listener's parser was null and the first JSON file it touched threw. A datapack carrying `data/<namespace>/neoorigins/active_theme.json` failed the whole server load with "Failed to load datapacks", and a resource pack carrying `assets/<namespace>/ui_themes/*.json` broke the client's resource reload. The theme template triggered both. Both managers now build their own parser. 26.1 and 26.2 read theme files a different way and never had this fault.
- **A theme with a missing panel texture draws the parchment panel instead of a checkerboard.** A theme whose `panel_background` names a file that no loaded pack ships used to bind the missing-texture checkerboard and stretch it across the entire origin screen panel, which is what the template did out of the box because it ships a placeholder where `panel.png` goes. The theme now keeps the parchment panel and its 9-slice geometry while keeping its own colours and font, and logs a single `[theming]` warning naming the path it could not find. Flat themes never draw a texture and are untouched.
- **Sneaking stops a step-assisted player at a ledge again (#134).** The game decides whether sneaking should hold you at an edge by looking for floor as far below your feet as your step height reaches. A step height that clears a full block therefore found the floor beneath a one-block drop, concluded there was no ledge, and let you walk off it. While you are sneaking, that one check now looks only as deep as your unmodified step height, and only for players whose step height one of our powers has changed. You still step up as high as the power allows, and Step Assist can stay on.
- **The slime's bounce stops killing a running player's speed (#133).** Every bounce set the player's sideways speed to zero, because the server was reading a movement value that the client never sends it and that is always zero on the server. A running slime stopped dead on every landing, which is also why a chain of bounces ended up happening on the spot. The bounce now carries the sideways speed you landed with.
- **The Slime's Sticky Aura slows what is near it.** The tier-2 aura wrote its effect as loose `effect`, `amplifier`, `duration` and `exclude_self` fields directly on the `area_of_effect` action, which reads none of them. With no entity, bientity or block action to run, the action compiled to nothing and the aura had never slowed anything. It now writes the effect the way the other built-in auras do: every second, everything within three blocks other than the Slime itself gets Slowness I for two seconds. It was the only shipped power written in that shape.
- **Power modifiers stop stacking on every death and relog.** Four kinds of modifier added a fresh copy of themselves each time a player respawned or logged back in, without removing the one already there: the native `modify_lava_speed`, and the Origins-compatible `modify_lava_speed`, `modify_xp_gain` and `modify_food`. On 26.1 and 26.2 `modify_xp_gain` had no effect at all before this release (see Compatibility), so there it never grew. A power balanced for one copy therefore got stronger with every death. Each one now replaces its own entry. A pack that was tuned against the grown value will find its powers back at the strength its file actually says.
- **A `/reload` no longer takes every online player's resource bars away.** A reload clears the registered resource information and rebuilds it from the datapack, but the native `neoorigins:resource` only registered itself when a power was granted or a player logged in, and the Origins-compatible `origins:resource` registered its backing only on grant. Every player already online therefore lost the bar until someone relogged: a plain resource dropped off the HUD entirely and a mana-backed one read as unbacked. Stored values were never affected. The sync that follows a reload now re-registers each online player's resources and re-sends their bars, and the compatible form registers its backing as it is parsed, so the reload itself restores it.
- **One player losing a resource power no longer takes it from everybody.** Resource information, mana backing and cooldown durations are keyed by the power rather than by the player, and are shared by everyone who holds it, but revoking the power from one player deleted the shared entry. Every other holder lost their bar at the same moment: a mana-backed bar vanished from the HUD and an Apoli resource lost its bounds, until the next relog or reload. A revoke now clears only that player's own state. Separately, the HUD sync was sending every mana-backed bar to every player because it walked the shared table; it now sends a bar only to players who hold the power. The value shown was always the player's own mana.
- **The Lumberjack's bonus planks cover every wood, not just oak.** The power set an `item_id` field that `craft_amount_bonus` never reads, so it fell back to the default output of oak planks and every other plank recipe paid nothing. The Lumberjack now names the `#minecraft:planks` tag and the bonus copies whatever you crafted, modded planks in that tag included.
- **The wraith's client and server agree about blocked blocks (#109).** A wraith that phases into a block it is barred from, such as obsidian or bedrock, is meant to be pushed back out by ordinary collision. The server stopped the phasing while the player was inside such a block, but the client kept phasing, so the two sides disagreed about whether the player was being pushed out at all. Both sides now use one rule for that decision and one reading of the blocked list.
- **Fungal Contact heals only on mushroom blocks and mycelium.** The Sporeling's healing power wrote its block list under a field the condition never reads, and a condition with no block list matches any block, so it healed 1 health every second everywhere. It now heals while you stand on, or have your feet inside, a red or brown mushroom block, a mushroom stem or mycelium, which is what its description has always said.
- **Mushroom Symbiosis and Soul Dread now work.** Both named a biome tag that does not exist, so neither could ever fire. Mushroom Symbiosis asked for `minecraft:is_mushroom`, and the mushroom biome tag is `c:is_mushroom`, so the Sporeling now gets its Regeneration in mushroom fields. Soul Dread asked for a tag called `minecraft:soul_sand_valley`, which is the name of a biome, and it now names the biome. Soul Dread is a Piglin downside, so this fix makes the Piglin weaker: Piglins now take the 0.5 damage a second in a Soul Sand Valley that the description promised.
- **The three Dragon Survival origins can be picked.** Cave Dragon, Forest Dragon and Sea Dragon shipped in no layer file at all. The picker builds its rows from the layer's own origin list and the server refuses a choice the layer does not offer, so none of the three could be chosen even with Dragon Survival installed, and only `/neoorigins set` reached them. They now sit in `neoorigins:origin`. Without Dragon Survival their `required_mods` gate keeps them unloaded and nothing changes for packs that do not have the mod.
- **A random origin will not turn you into a dragon.** With the dragons now listed in a layer that also allows random, rolling for an origin could land on one. Layers read `exclude_random` (described under Pack Author Features) and the shipped layer excludes the three dragons, which stay directly pickable. The same change made the Random button and the server's own random assignment draw from one pool: server assignment now honours layer conditions, content toggles and `unchoosable`, all of which it ignored before.
- **Power-granted wings show under a chestplate on 26.1 and 26.2 (#130).** So that it never draws a second pair on top of a real elytra, the wing layer steps aside when the chest slot holds one. On the 26.x lines its test for an elytra matched any armour worn in that slot, so wearing a chestplate hid the wings completely. It now steps aside only for an actual elytra, which is what 1.21.1 has always done.
- **`on_block` honours `inverted`.** An `on_block` whose block condition was a single block, a tag, or an `and`/`or` group ignored the `inverted` flag on that node, so a condition written as "not standing on stone" still matched stone. Every node now honours it, at the top and at any depth, the same way `in_block` already did. You still have to be on the ground for `on_block` to match, whether or not the block is inverted. One smaller change comes with it: an `or` group containing a block condition that cannot be read now fails as a whole, where it used to ignore that one entry.
- **An inline block condition applies `inverted` once instead of twice.** A condition written as a single node with the block and the flag together, `{"type": "block", "block": "stone", "inverted": true}`, was negated by the parser and then negated again by the compiler, so it matched stone. It now negates once. The wrapper form, where an outer node holds a nested block condition, was always correct: those are two separate nodes and each flag still applies to its own.
- **The `block` entity condition reads a root-level `tag`.** The condition documents a tag written at the top of the node, and packs write it that way, but the shared compiler only looked for one nested under `in_tag`. Such a node compiled to nothing, which made the entity condition permanently false and made a nested block condition match no block at all. The tag is now read where the documentation says to put it.
- **The in-game creator stops offering speed operations that turn into additions.** On `modify_lava_speed` and `modify_flight_speed`, the operation dropdown listed the attribute operations `add_value`, `add_multiplied_base` and `add_multiplied_total`. Those powers only understand `addition`, `multiply_base` and `multiply_total`, and read anything else as an addition, so picking the obvious multiplier silently produced an addition. The dropdown now offers the three the power reads. If you saved one of these powers from the in-game creator, check its `operation`: a file that already says `add_multiplied_base` or `add_multiplied_total` is still read as an addition. The same fix means the `change_resource` action and Cold Sweat's `modify_temperature` now offer `set` alongside `add`, and the `equipped_item` condition's slot now offers `accessory`.
- **The web editor's block view stops rewriting the powers it loads.** The block view rebuilds the powers it holds whenever the canvas changes, and anything a block had no widget for was dropped on the way. Loading the built-in powers and making no edit at all was enough to change some of them: the nested `inverted` flag came off Windwalker's Cloud Steps, the Qi Cultivator's Dantian Expansion and the Iron Monk's Stamina, and the bare `"tag": "minecraft:swords"` item condition came off Sword Immortal powers, so those no longer required a sword. Each block now keeps what it cannot display and writes it back unchanged, including a value its dropdown has no entry for, until you change that field yourself.
- **The web editor's built-in powers and origin templates match the mod again.** Both had fallen behind what the mod ships. The power catalogue still gave Elytrian's flight as `true`, and the origin templates were older still, with the Caveborn diets missing their tiers and the Rogue's Parkour missing the Step Assist toggle that now gates it. Both are regenerated, and a new check in the editor's tooling fails when either falls out of step with the mod.
- **The web editor says when a power type has no form.** Many of the power types the editor offers have no form of their own, so the form shows only the common fields. The note meant to explain this could never appear, and it pointed at the JSON Preview, which is read-only. It now appears for every such type and says what is true: the mod accepts the type, only the common fields can be set in the editor, fields already in an imported file are kept, and anything else has to be written in the power's JSON and imported.
- **The origin picker shows which unique origins are already taken (1.21.1).** When a pack marks an origin as unique, the server tracks who has claimed it and sent that list to the client, but nothing on the client read it. The picker offered a claimed origin anyway, let you confirm it, and the server's refusal arrived as a line of chat, leaving you on an empty layer with no picker to try again. Claimed origins are now shown as claimed, with the name of the player holding them; Confirm is disabled on them and the Random button skips them. The server remains the authority, and a refusal now resyncs you and reopens the picker rather than stranding you. Claims reach every online player as they change and on login, instead of only when a picker opens, so an open picker updates while you are looking at it. This one is on the 1.21.1 line only for 2.2.28; the client that reads the claims does not exist on 26.1 or 26.2 yet.
- **Every config option and every entity has an English name.** The in-game config screen looks a label up by the option's own name rather than by its full path, and 91 entries in the English file were written with the full path, so the screen never read them and drew the raw key instead. Together with options that had no entry at all, that left 234 labels unnamed on 1.21.1, 229 on 26.1 and 228 on 26.2: thirteen section titles including Hotkeys, HUD and Compatibility, the content toggles for nine origins, around 110 power-override sections and the 76 shared field names beneath them, and every client, gameplay and admin option that had been added without one. Nine entities, the black hole, tornado and thrown sword among them, had no name on any line and showed their registry id wherever the game named them. All of them are named now.
- **`render_elytra` takes `"never"`, `"flying"` or `"always"` (#130).** The field on `elytra_flight`, `natural_glide` and `flight` was a plain true or false: wings during a glide, or no wings. `"always"` draws the wings, folded, whenever the power is active, and spreads them in a glide. `"never"` and `"flying"` are the word forms of `false` and `true`, and both booleans keep their exact meaning, so existing packs and Origins imports are untouched. Defaults are unchanged: `"flying"` on `elytra_flight`, `"never"` on `natural_glide` and `flight`. The in-game creator and both web editor views offer the three as a dropdown, and a file written with `true` or `false` opens on the matching entry, with the creator's tooltip naming the real default. Saving writes the word. NeoOrigins 2.2.27 and earlier read only a boolean here, so a pack that has to load on an older version should keep `true` or `false`.
- **Layers take `exclude_random`.** This is the Origins-format list of origin ids that a random roll never lands on, while leaving them directly pickable. A layer file added on top of another adds to the list rather than replacing it. The shipped origin layer uses it for the three Dragon Survival origins.
- **`craft_amount_bonus` takes a `#tag` as its `output_item`.** The bonus then copies whatever was crafted rather than always producing the one named item, which is what a "more planks from logs" power needs in a world with more than one kind of wood. The default is still oak planks, and naming a single item behaves exactly as before.
- **Every block condition can be `inverted` in the editors.** With `on_block` fixed, `in_block`, `on_block` and the compatibility loader's block compiler all honour `inverted`, so each block-condition type in the schema now carries it as an optional flag, default `false`. The in-game creator and both web editor views can set it on any node.
- **`spawn_projectile_rain` offers `telegraph_ticks` in both editors.** The action has read the field since it shipped, and the documented example sets it, but no editor declared it, so the lead-in before the first projectile lands could only be authored by hand. It is now an integer field carrying the parser's own default of 14.
- **`persistent_effect` offers its root-level shorthand in both editors.** The power accepts a single `effect` written at the root as a one-entry list, with `ambient`, `show_particles` and `show_icon` beside it as defaults for every entry, and 36 shipped powers use that form, but only the root `amplifier` was ever declared. All four are now authorable, with the decode's defaults. The `status_effect` alias inherits them instead of carrying its own copies, and `stacking_status_effects` gains them too.
- **The bundled example packs and the theme template load on 26.1 and 26.2.** The packs in the repository that an author copies from all declared 1.21.1's pack formats, so on the 26.x lines they loaded as too old, and `slime-morph-example` declared a resource-pack format without the bounds the data-pack parser requires above 81, so it failed to load at all. Each now declares the format of the line it sits on, with `example-pack` and the theme template, which are both resource and data packs, declaring the full supported span. These sit in the repository rather than inside the jar, so nothing about a player's install changes.
- **Five power types stop being rewritten out of their own behaviour.** A salvage step meant for misspelled types was rewriting `neoorigins:action_on_kill`, `action_over_time`, `food_restriction`, `night_vision` and `status_effect` into their Origins-compatible forms before the alias table, which handles all five correctly, ever got the chance. The compatible readers ignore the fields those types document: an `action_on_kill` written exactly as the docs show it never fired at all, and an `action_over_time` lost `else_action`, `toggleable`, `default_off` and its `enabled` switch. Salvage now leaves alone any type the alias table already knows. Shipped content is unchanged: the 22 `night_vision` and 3 `food_restriction` powers load to exactly what they did before.
- **`origins-classes:more_planks_from_logs` covers every wood.** It translated to a bonus with no output named, which meant the default of oak planks, so every other plank recipe paid nothing. It now names the `#minecraft:planks` tag and pays in whatever you crafted. The bonus count is unchanged.
- **The compatibility loader reads four block condition fields it used to ignore.** `fluid`, `light_level`, `exposed_to_sky` and `movement_blocking` have compiled correctly in `in_block` and `on_block` since 2.2.24, but the Origins-compatible loader has its own block compiler, and there all four fell through to a branch that matches every block. That compiler serves `action_on_event` block filters, `prevent_block_use`, `prevent_sleep`, `block_collision` and the `area_of_effect` block filter, so a condition using any of the four was silently always true in all five. No shipped power writes any of them.
- **`origins:modify_xp_gain` changes the XP a player gains (26.1 and 26.2).** The power loaded on these lines, but nothing read it, so it never changed any XP. It now applies, as it always has on 1.21.1.
- **Config `power_overrides` reach the water-damage and slow-regeneration powers (26.1 and 26.2).** The overrides ran after the alias table had already read and removed the fields they target, so a server owner's `multiplier`, `damage_per_second` or `include_rain` for those powers was silently ignored. They now run first, as they always have on 1.21.1. A server that set one of these will see it take effect.
- **`/reload` does not restore some powers for players already online.** A reload clears the per-player tables behind `modify_lava_speed` (native and Origins-compatible) and the Origins-compatible `modify_xp_gain`, `modify_food`, `modify_crafting`, `prevent_item_use`, `prevent_block_use`, `prevent_entity_use`, `prevent_sleep` and `restrict_armor`, and nothing refills them until the player dies, relogs or is granted the power again. Among the built-in origins this affects the Draconic's Molten Stride, which stops speeding up lava swimming until the next death or relog. This is unchanged in 2.2.28.
- **The One Probe is supported on 26.1 and 26.2.** The integration was 1.21.1 only because The One Probe published no 26.x build. It now does, and the API and the handshake are unchanged, so the same provider runs on all three lines. EMI still has no 26.x build, so that integration stays on 1.21.1.
- **FTB Quests tag-marker grants work again on 26.1.** FTB Quests 26.1.2.x dropped the event and the Architectury layer our hook bound to, so with it installed the mod warned at every boot that tag-marker rewards were inert, and a quest tagged `neoorigins_loot_pool_grant:<table>` granted nothing at all. A typed listener now handles the quest-progress event that 26.1 posts on the NeoForge bus, loaded only when FTB Quests is present, and the older hook stays as the fallback. The 1.21.1 and 26.2 lines are unchanged.
- **KubeJS scripts can read a player's resource values (1.21.1 and 26.1).** `NeoOrigins.getResource(player, id)` returns the current value, or `null` when the player does not have that resource, so a missing resource never reads as an empty one. `NeoOrigins.hasResource(player, id)` says whether they have it. The id is the resource power's full id, the same one `/resource get` takes. A bar backed by Iron's Spells mana reports that player's live mana. Both are read-only. The 26.2 build does not bundle KubeJS support, so neither is available there. See [KUBEJS.md](docs/KUBEJS.md).
---
release
NeoOrigins v2.2.28 (MC 26.1.x)
v2.2.28+26.125 сент. 2026 г.29Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A large fixes release, and one of them is a crash. On 1.21.1, installing a resource pack built from our own theme template could kill the client at boot, or stop a server loading its datapacks, and the template shipped in a state that triggered both. All three are fixed, and a theme whose panel texture is missing now falls back to the parchment panel instead of stretching the missing-texture checkerboard across the origin screen. Elytrian now wears its wings folded on its back instead of showing them only mid-glide (#130), through a new third setting on `render_elytra` that every editor offers as a dropdown, and on 26.1 and 26.2 a chestplate no longer hides power-granted wings. The Rogue's one Class Skill key now goes to Step Assist, so the switch the Rogue gained in 2.2.26 can finally be pressed, and sneaking stops a step-assisted player at a ledge again (#134). The slime's bounce keeps a running player's speed, and a jump or a short drop no longer sets it off (#133). Resource bars stay on screen until you spend the resource for the first time (#105), come back by themselves after a `/reload`, and one player losing a resource power no longer takes every other holder's bar with it. The wraith's client and server now read its blocked-block list the same way (#109). Several fixes change what players feel without any visible change to the origin: power modifiers stopped adding another copy of themselves on every death and relog, the Sporeling's Fungal Contact heals only on mushroom blocks and mycelium as its description says, the Slime's tier-2 Sticky Aura slows things for the first time, and two powers that could never fire now do, one of them a Piglin downside. The Lumberjack pays its bonus planks for every wood rather than only oak. The three Dragon Survival origins can be picked at all now, and a random roll will not turn you into one. The in-game creator stops offering an operation that its own maths reads as an addition, the web editor's block view stops quietly rewriting the powers it loads, and both editors gained fields they could never author. Fish counts as meat for the Origins-compatible carnivore and vegetarian diets. Every config option and every entity has an English name, where the config screen had been drawing raw keys for a couple of hundred of them. The One Probe works on 26.1 and 26.2 for the first time, FTB Quests tag-marker rewards grant again on 26.1, and KubeJS scripts can read a player's resource values on 1.21.1 and 26.1.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Elytrian keeps its wings on its back (#130).** Wings drawn by a flight power appeared only while the player was gliding, so an origin whose whole body plan is wings looked wingless the moment it landed. Elytrian now shows them folded on its back whenever its flight power is active, and spreads them in a glide as it always has. The other flying origins are unchanged: Phantom, Hiveling and Draconic still show wings only while gliding, and Windwalker still shows none. The setting behind this is described under Pack Author Features.
- **The Rogue's Class Skill key goes to Step Assist.** A class gets exactly one Class Skill key, and it goes to the first power in the class that can be activated. The Rogue listed Stealth ahead of the Step Assist switch it gained in 2.2.26, so Stealth took the key and Step Assist could not be switched at all. Step Assist is now first. Stealth is still granted and works as before (sneak for ten seconds and you turn invisible), but it no longer has a key, so it stays on.
- **A toggle no key can reach is switched back on when you log in.** A Rogue who switched Stealth off before this release would otherwise be left with it off and no way to turn it back on short of changing class. At every login, any NeoOrigins toggle power whose switch is not bound to a key has its off state cleared, which returns it to on. Origins-format `origins:toggle` powers keep their state separately and are not included. That includes toggles set to start off with `default_off`, since without a key there is no way to switch those on either. A power counts as bound when it holds one of the six Skill slots, the Class Skill slot, or a named hotkey of its own. Two cases are left alone. Nothing is changed while Suppression is in effect, because Suppression switches toggles off on purpose, and a toggle that does have a key keeps whatever you last set it to.
- **Stealth and the Rogue are described by what they actually do.** Stealth's description promised that attacking from behind deals double damage, and the Rogue's promised devastating backstab damage. Neither was ever true: Stealth turns you invisible after ten seconds of sneaking and stops a mob picking you as a new target while you are invisible, and the separate Backstab power is a flat +2 attack damage while sneaking, whichever way you are facing. Both strings now say that. Nothing about combat changes. The two corrected strings are English for now, and the other eleven languages fall back to the English text rather than showing a stale promise.
- **The slime's bounce leaves jumps and short drops alone (#133).** The bounce triggered on an ordinary jump, and on a drop of a single block. It now needs the impact of a fall of four blocks or more: a jump and a drop of up to three blocks land normally, and anything from four blocks up still bounces. A jump off a ledge counts from the top of the jump, so jumping off a drop of more than two blocks still bounces. The threshold is `min_velocity` on `neoorigins:bounce_on_land`, and its default moved from 0.3 to 0.63.
- **A resource bar stays on screen until you have spent it once (#105).** Bars hide while they are full, so a bar that starts full was invisible from the moment the origin was picked, and a new player had no way to know the resource existed. A full bar now stays on screen until that resource drops below full for the first time, and from then on it hides when full as before. The reminder starts over each time your origins are re-sent to you, which includes joining, respawning and picking an origin. Bars set to `always_render` are unaffected.
- **Fish counts as meat for the carnivore and vegetarian diets.** The Origins-compatible `origins:carnivore` and `origins:vegetarian` diets both decide what is meat from the `neoorigins:meat_foods` tag, and that tag held no fish, so a carnivore origin from an Origins pack could not eat cod while a vegetarian one could. The meat tag now includes `neoorigins:fish_foods`, so fish is food for the carnivore and refused by the vegetarian. None of the built-in origins use either diet.
- **The ocean origins eat modded fish that sit outside the common tags.** Alex's Mobs raw and cooked catfish, blobfish, flying fish and cosmic cod, and Ocean's Delight's fugu slice, are fish that sit outside the fish tags this mod reads, so the ocean origins' fish-only diet refused them. They are now listed in `neoorigins:fish_foods` directly, which makes them food for Abyssal, Kraken, Merling and Siren, and, through the change above, for a carnivore.
- **An installed theme could crash the 1.21.1 client at boot.** A font file that points at another font, which is how a theme reuses the mod's parchment typeface, puts one TrueType provider into two fonts and so hands one FreeType face to two threads: the font manager finishes each font on its own worker. On 1.21.1 nothing guarded that face, and the client died during loading with a FreeType error, a native heap corruption, or an access violation in `freetype.dll`, differing from run to run. A client mixin now locks the face around both glyph reads, which is what 26.1 and 26.2 already do in vanilla. The theme template, which shipped exactly such a font file and therefore crashed the client the moment it was installed unmodified, no longer sets a font at all: it keeps Newsreader as before, and the recipe for shipping your own TTF moved to a placeholder file alongside it.
- **A theme pack could stop a 1.21.1 server loading its datapacks.** Both theme managers built their instance during class initialisation and handed the reload listener a parser that had not been created yet, so the listener's parser was null and the first JSON file it touched threw. A datapack carrying `data/<namespace>/neoorigins/active_theme.json` failed the whole server load with "Failed to load datapacks", and a resource pack carrying `assets/<namespace>/ui_themes/*.json` broke the client's resource reload. The theme template triggered both. Both managers now build their own parser. 26.1 and 26.2 read theme files a different way and never had this fault.
- **A theme with a missing panel texture draws the parchment panel instead of a checkerboard.** A theme whose `panel_background` names a file that no loaded pack ships used to bind the missing-texture checkerboard and stretch it across the entire origin screen panel, which is what the template did out of the box because it ships a placeholder where `panel.png` goes. The theme now keeps the parchment panel and its 9-slice geometry while keeping its own colours and font, and logs a single `[theming]` warning naming the path it could not find. Flat themes never draw a texture and are untouched.
- **Sneaking stops a step-assisted player at a ledge again (#134).** The game decides whether sneaking should hold you at an edge by looking for floor as far below your feet as your step height reaches. A step height that clears a full block therefore found the floor beneath a one-block drop, concluded there was no ledge, and let you walk off it. While you are sneaking, that one check now looks only as deep as your unmodified step height, and only for players whose step height one of our powers has changed. You still step up as high as the power allows, and Step Assist can stay on.
- **The slime's bounce stops killing a running player's speed (#133).** Every bounce set the player's sideways speed to zero, because the server was reading a movement value that the client never sends it and that is always zero on the server. A running slime stopped dead on every landing, which is also why a chain of bounces ended up happening on the spot. The bounce now carries the sideways speed you landed with.
- **The Slime's Sticky Aura slows what is near it.** The tier-2 aura wrote its effect as loose `effect`, `amplifier`, `duration` and `exclude_self` fields directly on the `area_of_effect` action, which reads none of them. With no entity, bientity or block action to run, the action compiled to nothing and the aura had never slowed anything. It now writes the effect the way the other built-in auras do: every second, everything within three blocks other than the Slime itself gets Slowness I for two seconds. It was the only shipped power written in that shape.
- **Power modifiers stop stacking on every death and relog.** Four kinds of modifier added a fresh copy of themselves each time a player respawned or logged back in, without removing the one already there: the native `modify_lava_speed`, and the Origins-compatible `modify_lava_speed`, `modify_xp_gain` and `modify_food`. On 26.1 and 26.2 `modify_xp_gain` had no effect at all before this release (see Compatibility), so there it never grew. A power balanced for one copy therefore got stronger with every death. Each one now replaces its own entry. A pack that was tuned against the grown value will find its powers back at the strength its file actually says.
- **A `/reload` no longer takes every online player's resource bars away.** A reload clears the registered resource information and rebuilds it from the datapack, but the native `neoorigins:resource` only registered itself when a power was granted or a player logged in, and the Origins-compatible `origins:resource` registered its backing only on grant. Every player already online therefore lost the bar until someone relogged: a plain resource dropped off the HUD entirely and a mana-backed one read as unbacked. Stored values were never affected. The sync that follows a reload now re-registers each online player's resources and re-sends their bars, and the compatible form registers its backing as it is parsed, so the reload itself restores it.
- **One player losing a resource power no longer takes it from everybody.** Resource information, mana backing and cooldown durations are keyed by the power rather than by the player, and are shared by everyone who holds it, but revoking the power from one player deleted the shared entry. Every other holder lost their bar at the same moment: a mana-backed bar vanished from the HUD and an Apoli resource lost its bounds, until the next relog or reload. A revoke now clears only that player's own state. Separately, the HUD sync was sending every mana-backed bar to every player because it walked the shared table; it now sends a bar only to players who hold the power. The value shown was always the player's own mana.
- **The Lumberjack's bonus planks cover every wood, not just oak.** The power set an `item_id` field that `craft_amount_bonus` never reads, so it fell back to the default output of oak planks and every other plank recipe paid nothing. The Lumberjack now names the `#minecraft:planks` tag and the bonus copies whatever you crafted, modded planks in that tag included.
- **The wraith's client and server agree about blocked blocks (#109).** A wraith that phases into a block it is barred from, such as obsidian or bedrock, is meant to be pushed back out by ordinary collision. The server stopped the phasing while the player was inside such a block, but the client kept phasing, so the two sides disagreed about whether the player was being pushed out at all. Both sides now use one rule for that decision and one reading of the blocked list.
- **Fungal Contact heals only on mushroom blocks and mycelium.** The Sporeling's healing power wrote its block list under a field the condition never reads, and a condition with no block list matches any block, so it healed 1 health every second everywhere. It now heals while you stand on, or have your feet inside, a red or brown mushroom block, a mushroom stem or mycelium, which is what its description has always said.
- **Mushroom Symbiosis and Soul Dread now work.** Both named a biome tag that does not exist, so neither could ever fire. Mushroom Symbiosis asked for `minecraft:is_mushroom`, and the mushroom biome tag is `c:is_mushroom`, so the Sporeling now gets its Regeneration in mushroom fields. Soul Dread asked for a tag called `minecraft:soul_sand_valley`, which is the name of a biome, and it now names the biome. Soul Dread is a Piglin downside, so this fix makes the Piglin weaker: Piglins now take the 0.5 damage a second in a Soul Sand Valley that the description promised.
- **The three Dragon Survival origins can be picked.** Cave Dragon, Forest Dragon and Sea Dragon shipped in no layer file at all. The picker builds its rows from the layer's own origin list and the server refuses a choice the layer does not offer, so none of the three could be chosen even with Dragon Survival installed, and only `/neoorigins set` reached them. They now sit in `neoorigins:origin`. Without Dragon Survival their `required_mods` gate keeps them unloaded and nothing changes for packs that do not have the mod.
- **A random origin will not turn you into a dragon.** With the dragons now listed in a layer that also allows random, rolling for an origin could land on one. Layers read `exclude_random` (described under Pack Author Features) and the shipped layer excludes the three dragons, which stay directly pickable. The same change made the Random button and the server's own random assignment draw from one pool: server assignment now honours layer conditions, content toggles and `unchoosable`, all of which it ignored before.
- **Power-granted wings show under a chestplate on 26.1 and 26.2 (#130).** So that it never draws a second pair on top of a real elytra, the wing layer steps aside when the chest slot holds one. On the 26.x lines its test for an elytra matched any armour worn in that slot, so wearing a chestplate hid the wings completely. It now steps aside only for an actual elytra, which is what 1.21.1 has always done.
- **`on_block` honours `inverted`.** An `on_block` whose block condition was a single block, a tag, or an `and`/`or` group ignored the `inverted` flag on that node, so a condition written as "not standing on stone" still matched stone. Every node now honours it, at the top and at any depth, the same way `in_block` already did. You still have to be on the ground for `on_block` to match, whether or not the block is inverted. One smaller change comes with it: an `or` group containing a block condition that cannot be read now fails as a whole, where it used to ignore that one entry.
- **An inline block condition applies `inverted` once instead of twice.** A condition written as a single node with the block and the flag together, `{"type": "block", "block": "stone", "inverted": true}`, was negated by the parser and then negated again by the compiler, so it matched stone. It now negates once. The wrapper form, where an outer node holds a nested block condition, was always correct: those are two separate nodes and each flag still applies to its own.
- **The `block` entity condition reads a root-level `tag`.** The condition documents a tag written at the top of the node, and packs write it that way, but the shared compiler only looked for one nested under `in_tag`. Such a node compiled to nothing, which made the entity condition permanently false and made a nested block condition match no block at all. The tag is now read where the documentation says to put it.
- **The in-game creator stops offering speed operations that turn into additions.** On `modify_lava_speed` and `modify_flight_speed`, the operation dropdown listed the attribute operations `add_value`, `add_multiplied_base` and `add_multiplied_total`. Those powers only understand `addition`, `multiply_base` and `multiply_total`, and read anything else as an addition, so picking the obvious multiplier silently produced an addition. The dropdown now offers the three the power reads. If you saved one of these powers from the in-game creator, check its `operation`: a file that already says `add_multiplied_base` or `add_multiplied_total` is still read as an addition. The same fix means the `change_resource` action and Cold Sweat's `modify_temperature` now offer `set` alongside `add`, and the `equipped_item` condition's slot now offers `accessory`.
- **The web editor's block view stops rewriting the powers it loads.** The block view rebuilds the powers it holds whenever the canvas changes, and anything a block had no widget for was dropped on the way. Loading the built-in powers and making no edit at all was enough to change some of them: the nested `inverted` flag came off Windwalker's Cloud Steps, the Qi Cultivator's Dantian Expansion and the Iron Monk's Stamina, and the bare `"tag": "minecraft:swords"` item condition came off Sword Immortal powers, so those no longer required a sword. Each block now keeps what it cannot display and writes it back unchanged, including a value its dropdown has no entry for, until you change that field yourself.
- **The web editor's built-in powers and origin templates match the mod again.** Both had fallen behind what the mod ships. The power catalogue still gave Elytrian's flight as `true`, and the origin templates were older still, with the Caveborn diets missing their tiers and the Rogue's Parkour missing the Step Assist toggle that now gates it. Both are regenerated, and a new check in the editor's tooling fails when either falls out of step with the mod.
- **The web editor says when a power type has no form.** Many of the power types the editor offers have no form of their own, so the form shows only the common fields. The note meant to explain this could never appear, and it pointed at the JSON Preview, which is read-only. It now appears for every such type and says what is true: the mod accepts the type, only the common fields can be set in the editor, fields already in an imported file are kept, and anything else has to be written in the power's JSON and imported.
- **The origin picker shows which unique origins are already taken (1.21.1).** When a pack marks an origin as unique, the server tracks who has claimed it and sent that list to the client, but nothing on the client read it. The picker offered a claimed origin anyway, let you confirm it, and the server's refusal arrived as a line of chat, leaving you on an empty layer with no picker to try again. Claimed origins are now shown as claimed, with the name of the player holding them; Confirm is disabled on them and the Random button skips them. The server remains the authority, and a refusal now resyncs you and reopens the picker rather than stranding you. Claims reach every online player as they change and on login, instead of only when a picker opens, so an open picker updates while you are looking at it. This one is on the 1.21.1 line only for 2.2.28; the client that reads the claims does not exist on 26.1 or 26.2 yet.
- **Every config option and every entity has an English name.** The in-game config screen looks a label up by the option's own name rather than by its full path, and 91 entries in the English file were written with the full path, so the screen never read them and drew the raw key instead. Together with options that had no entry at all, that left 234 labels unnamed on 1.21.1, 229 on 26.1 and 228 on 26.2: thirteen section titles including Hotkeys, HUD and Compatibility, the content toggles for nine origins, around 110 power-override sections and the 76 shared field names beneath them, and every client, gameplay and admin option that had been added without one. Nine entities, the black hole, tornado and thrown sword among them, had no name on any line and showed their registry id wherever the game named them. All of them are named now.
- **`render_elytra` takes `"never"`, `"flying"` or `"always"` (#130).** The field on `elytra_flight`, `natural_glide` and `flight` was a plain true or false: wings during a glide, or no wings. `"always"` draws the wings, folded, whenever the power is active, and spreads them in a glide. `"never"` and `"flying"` are the word forms of `false` and `true`, and both booleans keep their exact meaning, so existing packs and Origins imports are untouched. Defaults are unchanged: `"flying"` on `elytra_flight`, `"never"` on `natural_glide` and `flight`. The in-game creator and both web editor views offer the three as a dropdown, and a file written with `true` or `false` opens on the matching entry, with the creator's tooltip naming the real default. Saving writes the word. NeoOrigins 2.2.27 and earlier read only a boolean here, so a pack that has to load on an older version should keep `true` or `false`.
- **Layers take `exclude_random`.** This is the Origins-format list of origin ids that a random roll never lands on, while leaving them directly pickable. A layer file added on top of another adds to the list rather than replacing it. The shipped origin layer uses it for the three Dragon Survival origins.
- **`craft_amount_bonus` takes a `#tag` as its `output_item`.** The bonus then copies whatever was crafted rather than always producing the one named item, which is what a "more planks from logs" power needs in a world with more than one kind of wood. The default is still oak planks, and naming a single item behaves exactly as before.
- **Every block condition can be `inverted` in the editors.** With `on_block` fixed, `in_block`, `on_block` and the compatibility loader's block compiler all honour `inverted`, so each block-condition type in the schema now carries it as an optional flag, default `false`. The in-game creator and both web editor views can set it on any node.
- **`spawn_projectile_rain` offers `telegraph_ticks` in both editors.** The action has read the field since it shipped, and the documented example sets it, but no editor declared it, so the lead-in before the first projectile lands could only be authored by hand. It is now an integer field carrying the parser's own default of 14.
- **`persistent_effect` offers its root-level shorthand in both editors.** The power accepts a single `effect` written at the root as a one-entry list, with `ambient`, `show_particles` and `show_icon` beside it as defaults for every entry, and 36 shipped powers use that form, but only the root `amplifier` was ever declared. All four are now authorable, with the decode's defaults. The `status_effect` alias inherits them instead of carrying its own copies, and `stacking_status_effects` gains them too.
- **The bundled example packs and the theme template load on 26.1 and 26.2.** The packs in the repository that an author copies from all declared 1.21.1's pack formats, so on the 26.x lines they loaded as too old, and `slime-morph-example` declared a resource-pack format without the bounds the data-pack parser requires above 81, so it failed to load at all. Each now declares the format of the line it sits on, with `example-pack` and the theme template, which are both resource and data packs, declaring the full supported span. These sit in the repository rather than inside the jar, so nothing about a player's install changes.
- **Five power types stop being rewritten out of their own behaviour.** A salvage step meant for misspelled types was rewriting `neoorigins:action_on_kill`, `action_over_time`, `food_restriction`, `night_vision` and `status_effect` into their Origins-compatible forms before the alias table, which handles all five correctly, ever got the chance. The compatible readers ignore the fields those types document: an `action_on_kill` written exactly as the docs show it never fired at all, and an `action_over_time` lost `else_action`, `toggleable`, `default_off` and its `enabled` switch. Salvage now leaves alone any type the alias table already knows. Shipped content is unchanged: the 22 `night_vision` and 3 `food_restriction` powers load to exactly what they did before.
- **`origins-classes:more_planks_from_logs` covers every wood.** It translated to a bonus with no output named, which meant the default of oak planks, so every other plank recipe paid nothing. It now names the `#minecraft:planks` tag and pays in whatever you crafted. The bonus count is unchanged.
- **The compatibility loader reads four block condition fields it used to ignore.** `fluid`, `light_level`, `exposed_to_sky` and `movement_blocking` have compiled correctly in `in_block` and `on_block` since 2.2.24, but the Origins-compatible loader has its own block compiler, and there all four fell through to a branch that matches every block. That compiler serves `action_on_event` block filters, `prevent_block_use`, `prevent_sleep`, `block_collision` and the `area_of_effect` block filter, so a condition using any of the four was silently always true in all five. No shipped power writes any of them.
- **`origins:modify_xp_gain` changes the XP a player gains (26.1 and 26.2).** The power loaded on these lines, but nothing read it, so it never changed any XP. It now applies, as it always has on 1.21.1.
- **Config `power_overrides` reach the water-damage and slow-regeneration powers (26.1 and 26.2).** The overrides ran after the alias table had already read and removed the fields they target, so a server owner's `multiplier`, `damage_per_second` or `include_rain` for those powers was silently ignored. They now run first, as they always have on 1.21.1. A server that set one of these will see it take effect.
- **`/reload` does not restore some powers for players already online.** A reload clears the per-player tables behind `modify_lava_speed` (native and Origins-compatible) and the Origins-compatible `modify_xp_gain`, `modify_food`, `modify_crafting`, `prevent_item_use`, `prevent_block_use`, `prevent_entity_use`, `prevent_sleep` and `restrict_armor`, and nothing refills them until the player dies, relogs or is granted the power again. Among the built-in origins this affects the Draconic's Molten Stride, which stops speeding up lava swimming until the next death or relog. This is unchanged in 2.2.28.
- **The One Probe is supported on 26.1 and 26.2.** The integration was 1.21.1 only because The One Probe published no 26.x build. It now does, and the API and the handshake are unchanged, so the same provider runs on all three lines. EMI still has no 26.x build, so that integration stays on 1.21.1.
- **FTB Quests tag-marker grants work again on 26.1.** FTB Quests 26.1.2.x dropped the event and the Architectury layer our hook bound to, so with it installed the mod warned at every boot that tag-marker rewards were inert, and a quest tagged `neoorigins_loot_pool_grant:<table>` granted nothing at all. A typed listener now handles the quest-progress event that 26.1 posts on the NeoForge bus, loaded only when FTB Quests is present, and the older hook stays as the fallback. The 1.21.1 and 26.2 lines are unchanged.
- **KubeJS scripts can read a player's resource values (1.21.1 and 26.1).** `NeoOrigins.getResource(player, id)` returns the current value, or `null` when the player does not have that resource, so a missing resource never reads as an empty one. `NeoOrigins.hasResource(player, id)` says whether they have it. The id is the resource power's full id, the same one `/resource get` takes. A bar backed by Iron's Spells mana reports that player's live mana. Both are read-only. The 26.2 build does not bundle KubeJS support, so neither is available there. See [KUBEJS.md](docs/KUBEJS.md).
---
release
NeoOrigins v2.2.27 (MC 1.21.1)
v2.2.27+1.21.18 сент. 2026 г.7,8 тыс.Minecraft: 1.21.1neoforge
Что нового
> A hotfix for a startup crash on 26.1 and 26.2. A recent NeoForge update moved the code that our `ignore_fluid` power attaches itself to. When that attachment point isn't where the mod expects it, the game refuses to start rather than carry on without the power, so servers on a current NeoForge failed during boot with an error that gave no hint of the real cause (#131). Both 26.x jars are fixed. It isn't a 2.2.26 regression: the same code shipped in 2.2.25 and earlier, and every one of those builds fails the same way on a current NeoForge. Minecraft 1.21.1 was never in reach of it, and is republished unchanged so the three versions stay on one number.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **26.1 and 26.2 servers start again on current NeoForge (#131).** At NeoForge 26.2.0.69, backported to 26.1.2.100, the block scan our `ignore_fluid` power wraps moved out of `EntityFluidInteraction.update(Entity, boolean)` and into a new overload beside it. The old signature stayed, so nothing looked missing, but the attachment point had gone with the body, and startup failed with a "Scanned 0 target(s)" line. The power now attaches to whichever of the two overloads holds the scan, so one build works on both sides of the change; what it does once attached is unchanged. Supported-NeoForge floors are deliberately left where they were. Confirmed against a stock dedicated server at the newest NeoForge on each line.
- **The in-game creators' numeric fields survive current NeoForge (26.2).** NeoForge removed a text-field helper at 26.2.0.52 that the origin and mob creators used on every field taking a number, so on anything newer, opening a tab with one on it would have thrown. Those fields filter their own input now. Minecraft 26.1 never lost the method and is unchanged.
release
NeoOrigins v2.2.27 (MC 26.2)
v2.2.27+26.28 сент. 2026 г.365Minecraft: 26.2neoforge
Что нового
> A hotfix for a startup crash on 26.1 and 26.2. A recent NeoForge update moved the code that our `ignore_fluid` power attaches itself to. When that attachment point isn't where the mod expects it, the game refuses to start rather than carry on without the power, so servers on a current NeoForge failed during boot with an error that gave no hint of the real cause (#131). Both 26.x jars are fixed. It isn't a 2.2.26 regression: the same code shipped in 2.2.25 and earlier, and every one of those builds fails the same way on a current NeoForge. Minecraft 1.21.1 was never in reach of it, and is republished unchanged so the three versions stay on one number.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **26.1 and 26.2 servers start again on current NeoForge (#131).** At NeoForge 26.2.0.69, backported to 26.1.2.100, the block scan our `ignore_fluid` power wraps moved out of `EntityFluidInteraction.update(Entity, boolean)` and into a new overload beside it. The old signature stayed, so nothing looked missing, but the attachment point had gone with the body, and startup failed with a "Scanned 0 target(s)" line. The power now attaches to whichever of the two overloads holds the scan, so one build works on both sides of the change; what it does once attached is unchanged. Supported-NeoForge floors are deliberately left where they were. Confirmed against a stock dedicated server at the newest NeoForge on each line.
- **The in-game creators' numeric fields survive current NeoForge (26.2).** NeoForge removed a text-field helper at 26.2.0.52 that the origin and mob creators used on every field taking a number, so on anything newer, opening a tab with one on it would have thrown. Those fields filter their own input now. Minecraft 26.1 never lost the method and is unchanged.
release
NeoOrigins v2.2.27 (MC 26.1.x)
v2.2.27+26.18 сент. 2026 г.174Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A hotfix for a startup crash on 26.1 and 26.2. A recent NeoForge update moved the code that our `ignore_fluid` power attaches itself to. When that attachment point isn't where the mod expects it, the game refuses to start rather than carry on without the power, so servers on a current NeoForge failed during boot with an error that gave no hint of the real cause (#131). Both 26.x jars are fixed. It isn't a 2.2.26 regression: the same code shipped in 2.2.25 and earlier, and every one of those builds fails the same way on a current NeoForge. Minecraft 1.21.1 was never in reach of it, and is republished unchanged so the three versions stay on one number.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **26.1 and 26.2 servers start again on current NeoForge (#131).** At NeoForge 26.2.0.69, backported to 26.1.2.100, the block scan our `ignore_fluid` power wraps moved out of `EntityFluidInteraction.update(Entity, boolean)` and into a new overload beside it. The old signature stayed, so nothing looked missing, but the attachment point had gone with the body, and startup failed with a "Scanned 0 target(s)" line. The power now attaches to whichever of the two overloads holds the scan, so one build works on both sides of the change; what it does once attached is unchanged. Supported-NeoForge floors are deliberately left where they were. Confirmed against a stock dedicated server at the newest NeoForge on each line.
- **The in-game creators' numeric fields survive current NeoForge (26.2).** NeoForge removed a text-field helper at 26.2.0.52 that the origin and mob creators used on every field taking a number, so on anything newer, opening a tab with one on it would have thrown. Those fields filter their own input now. Minecraft 26.1 never lost the method and is unchanged.
release
NeoOrigins v2.2.26 (MC 1.21.1)
v2.2.26+1.21.16 сент. 2026 г.1,2 тыс.Minecraft: 1.21.1neoforge
Что нового
> A compatibility and origin-content release, led by a startup failure. Installing The One Probe alongside NeoOrigins was enough to be refused at launch, over a version bound that compared our lower bound against the wrong part of TOP's version string. It had never protected anything, and it is gone. Six new pack-author capabilities follow, most of them out of getting one legacy Origins pack to run untouched: a morph can play one of the mob's own animations, or run one of the entity events the game uses to make a mob swing, sparkle or shake; `pose` holds the player prone, crouched or upright, which is what a crawling or a serpentine origin needs; `prevent_entity_render` hides entities from a single player; `using_effective_tool` asks whether the swing a player is making is a productive one; and `mod_food_nutrition` changes what a meal is worth as it goes down. The origin picker gains two more shapes for the two things people kept asking for (#127): a carousel for anyone who preferred the original mod's chooser, and a grid of cards for anyone who wanted a whole layer visible at once, with the two-panel screen unchanged as the default. Dragon Survival no longer fights it for the screen at join either: whichever mod loses that race now has its screen held and reopened instead of dropped. The Caveborn get copper and emerald diets filling the two gaps in the ore ladder, water breathing and fire resistance to go with them, a wash of the ore's own colour for as long as its effect runs, and descriptions that finally admit the diets refuse on a full stomach. All seven of their diets are rebuilt on common tags, so a modded metal or stone is food without a pack touching anything, and what you eat is now worth what it is: a block feeds twice what an ingot does and holds its effect three times as long, a nugget is worth almost nothing, and ore goes down in creative mode the way bread always has. A pack written for 1.19 or 1.20 gets four more of its breakages repaired as the file is read, with no edit to the zip, and four legacy power mappings that dropped their power silently now land, with the rest walked end to end so none of them can. Alongside those: declining an evolution keeps it declined, fire-immune origins stop burning on campfires and blazes (#129), a fire-resistant helmet shades without wearing out, a slime rehydrates from a water cauldron and from a water bottle, the step-up ability gained an off switch for everyone it kept walking up the block they meant to step down from (#123), the web editor's form view stops refusing to switch off a setting that defaults to on while its block canvas stops writing back fields nobody ever set, an event name a pack guessed at costs it a hook rather than the whole power, a legacy repeating action that names no interval paces itself at Apoli's once a second instead of every tick, the in-game creator checks its ids as strictly as the web editor always has, and the reference has been re-read against the loader in the places it had drifted, gaining pages for the two config files that never had one.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **The origin picker comes in three shapes now (#127).** It had one: a scrolling list on the left, details on the right. Players who came from the original Origins mod kept asking for its one-at-a-time chooser back, and others wanted a whole layer visible at once. Both are choices rather than replacements. The client setting `ui.picker_layout` takes `TWO_PANEL`, the default and unchanged; `CAROUSEL`, one origin at a time with arrows to step through them; and `GRID`, a wall of origin cards that fits as many as your window allows and pages the rest. A card carries the icon, name and impact dots but has no room for a description, so clicking one opens the same full detail read the other layouts use, and Back returns you to the wall. The search box filters the wall as you type, and the arrow keys page it unless the box has focus. The carousel is a NeoOrigins screen shaped like the original rather than a copy of it, so it keeps whatever theme you are running instead of the old dirt-background window, and browsing in it *is* selecting: Confirm always applies to whatever is on screen. Layout and skin are independent. `theme_override` and `classic_picker_style` still control colour and font, and any skin works with any layout. See [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **A fire-resistant helmet shades you without wearing out.** Origins that burn in daylight wear down the helmet protecting them, which is right for an ordinary hat and wrong for one that already survives lava. Netherite helmets now shade for free, the way unbreakable ones always did. It keys off the item's own fire-resistant property rather than a list of names, so a modded helmet that grants itself the same property is covered without us naming it.
- **Declining an evolution keeps it declined.** The prompt to evolve was re-offered on every kill after the requirement was met, so refusing it bought a few seconds of quiet and nothing more, and a player near their next tier spent the rest of the session being asked. A decline is now remembered against the tier it was made at, and nothing re-offers that tier: not more kills, not a relog. It stays quiet until you ask for it yourself with `/neoorigins evolve accept`, an operator sets your tier, or you spend an Orb of Origin, which resets the ladder to zero outright. The tier is not lost by declining it, only muted, and accepting clears the record so the tier above it prompts normally once its own threshold is reached. See [EVOLUTION.md](docs/EVOLUTION.md).
- **The Caveborn's diets say they will not go down on a full stomach.** All eight of them (the Caveborn's seven ores and the Nether origin's fungal diet) refuse when the hunger bar is already full, which is deliberate and matches ordinary food. Nothing said so, and the refusal is completely silent: no message, no eating animation, no sound, so a player at full hunger reads it as the power being broken rather than as being full. Every one of those descriptions now ends by saying it, in all twelve languages the mod ships. The stone diet's list also gained cobbled deepslate, which it has always eaten and never mentioned.
- **The Caveborn eats copper, and copper lets them breathe.** The diet ladder jumped straight from stone to iron, skipping the ore a player turns up more of than any other on the way down. Copper now feeds for 3 hunger and 0.6 saturation, which places it neatly between stone and iron, and eating it grants Water Breathing I for a minute. The effect is picked for the gap it fills rather than for the flavour: a Caveborn sees in the dark, ignores the drop and mines bare-handed, but a flooded ravine or a drowned mineshaft stopped them the same as anybody, and copper is what they are already picking up on the way to one. Ingots, raw copper, both ores and both kinds of copper block all count. Like the other six diets it is a tag, `neoorigins:caveborn_eat_copper`, so a pack adds a modded copper to it without replacing the power.
- **The Caveborn takes on the colour of the ore they ate.** Six of the seven diets grant an effect, and while one was running there was nothing about the player that showed which one, least of all to anybody looking at them from the other end of the shaft. The model is now washed in that ore's own colour for as long as its effect lasts, sampled from the item rather than picked by hand: copper orange, iron pale grey, gold yellow, diamond cyan, emerald green, netherite a dark brown. Eat two and the colours average. Nothing about the buffs changes, and each of the six is its own switch in `power_overrides.toml`, from `caveborn_copper_tint` through `caveborn_netherite_tint`, so a server that wants the diets without the colour can turn off as many of them as it likes. Stone has no tint, having no effect to signal. See [ORIGINS.md](docs/ORIGINS.md).
- **Emerald is the seventh diet, and it buys a trip to the surface.** The Caveborn's one real cost is that daylight burns them, and nothing in the origin ever answered it: you either stayed under or you took the damage. Emerald now feeds for 7 hunger and 1.4 saturation, filling the gap the ladder had left between diamond and netherite, and eating one grants Fire Resistance for five minutes. The sunlight damage was always dealt as fire, so this cancels it outright rather than blunting it, and it covers lava on the way back down, which is the other thing that kills miners. Emeralds, both emerald ores and blocks of emerald all count, through `neoorigins:caveborn_eat_emerald`. You will still catch fire: Fire Resistance cancels the damage but does not put the flames out, and the sunlight power re-lights you every second you are exposed, so those five minutes above ground are spent visibly alight and entirely unharmed. Step into shade or water and the burn runs out on its own. Emerald is the one Caveborn diet with a renewable supply, since a villager will trade for it.
- **A block of ore feeds a Caveborn like a block, and a nugget like a nugget.** Every form of a material was worth the same meal, so a raw iron block and a single ingot both restored 4 hunger, and the block was worth eating only if you had nothing else to hand. The nugget was the inverse and the worse half of it: nine nuggets restored 36 hunger where the ingot they make restored 4, and nether gold ore drops nuggets rather than ingots, so the least valuable form of gold in the game was by a wide margin the most efficient food in the origin. What you eat is now worth what it is. A block feeds twice what an ingot or gem does and holds its effect three times as long; a nugget feeds 1 hunger with no saturation and buys fifteen seconds. A block is deliberately not worth the nine that a crafting recipe would suggest, because hunger caps at 20 and most of that food would be discarded the moment it was granted, so the duration is where the value went instead. The arithmetic that matters is that an ingot at 4 hunger and 6.4 saturation now stays ahead of the nine nuggets you could split it into, which is the comparison the old numbers had backwards. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **The step-up ability has an off switch (#123).** An origin or class that steps a full block does it whether you want it to or not, and holding shift does not suppress it, so edging up to a drop or lowering yourself onto a ledge walks you straight up the block you were working around. The game offers no way to ask for a step height that yields to sneaking, so the answer is a switch rather than a rule. The Explorer's *Climber's Step*, the Rogue's *Parkour* and the Scout's *Tracker's Stride* now share a *Step Assist* ability that turns the step height off and back on, with a low note for off and a high one for on. It defaults to on, so nothing changes for anyone who never presses it, and the state is saved with the rest of your toggles rather than springing back on at the next login. With it off you climb blocks by jumping, the same as everybody else.
- **Fire-immune origins stop burning on campfires and blazes.** (#129) The immunity checked four damage types by name (standing in fire, being on fire, lava and magma blocks), which left out campfires and both kinds of fireball, so an origin that is supposed to be unburnable took full damage from a blaze and cooked on a campfire like anyone else. It now asks the game's own `minecraft:is_fire` tag instead of a hand-written list, which covers those cases, agrees with the matching condition that was already using the tag, and picks up fire damage added by other mods without further work.
- **The web editor's form view can turn a default-on setting off.** Any boolean whose default is `true` could not be set to `false` from the form view: the row drew itself unchecked while the power actually behaved as switched on, and ticking the box and clearing it again wrote nothing at all, so the setting looked changed and was not. An unset field now seeds from the schema's declared default rather than a flat `false`. This affected 68 default-true booleans across the shipped power, action and condition schemas.
- **The block editor stops writing fields you never set.** A block widget has to display something, so an optional field the power does not carry gets drawn with a stand-in, and the canvas was writing every one of those back when it saved. One drag of an unrelated block was enough to turn a damage-halving power into total immunity, because `modify_damage` came back carrying `set_total: 0`, a field whose own reference entry says to leave it out if you want the multiplied value kept. Nothing on screen looked any different. A leaf still equal to the stand-in the widget had to show is now left out on the way back, and the fields the loaded file genuinely carried are tracked alongside it, so an author who deliberately means a zero keeps it. Powers the canvas cannot draw are put back at their original position rather than at the end, since the order powers are written in is authored data too.
- **An `area_of_effect` inside a lingering cloud stays with the cloud (#125).** The interval action a lingering area runs is executed as the caster, which is right for kill credit and for anything that spends a resource, but it also meant an area effect nested inside it measured its radius from wherever the caster was standing at that moment. Walk away from your own cloud and the damage walked with you, leaving the cloud drawing particles over nothing. The action still runs as the caster; an `area_of_effect` inside it now centres on the cloud.
- **The Merchant's restocked trades stop showing as sold out.** The class refills nearby villagers' trades on a timer, but it refilled them server-side only. A trade's sold-out cross is drawn from the copy of the offers the client was handed when the screen opened, so a trade that had just been refilled kept its cross, and the only way to clear it was to close the villager and open it again. The refill now resends the offers to whoever has that villager open, which is what vanilla's own restock does. It sends nothing when nothing was actually refilled, so an open trading screen no longer takes a packet every couple of seconds for the life of the interaction.
- **Ore goes down in creative mode, the way bread always has.** A Caveborn in creative could not eat any of their seven diets, while every vanilla food in the game ate normally, and because the refusal is silent it read as the power being broken rather than as a rule. Our gate asked whether the hunger bar had room, and creative mode is precisely the case where it never does. It now asks the game's own question instead, which is invulnerable or always-edible or genuinely hungry, at both places that had to know, so the two can no longer drift apart. Fixing that surfaced the other half of the same problem: the meal took one from the stack unconditionally, where vanilla food leaves a creative player's stack alone. It now spends the item through the same call vanilla uses, which declines to spend anything for a player with infinite materials. Both halves apply to every `edible_item` power, not only to the Caveborn's.
- **A slime rehydrates from a water cauldron and from a water bottle.** The moisture bar refilled from water, rain and bubble columns, which is the game's own in-water test, and a water cauldron does not answer to it: a cauldron is a block carrying a level, not a body of water. A slime standing in a full cauldron therefore dried out at exactly the rate of one standing on bare stone, which is the opposite of what anyone builds a cauldron for. Standing in one now refills at the same rate open water does. Drinking a water bottle tops the bar up as well, by half its length, which gives a drying slime something it can carry rather than a source it has to reach. Neither of these is new ground, and that is the point: `breath_out_of_fluid` has handled the cauldron and the bottle for aquatic origins for some time, and the moisture bar simply never got the same treatment. The bottle amount is `water_bottle_refill` on the power, so a pack can retune it or set it to 0 to leave water bottles out of it entirely. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:pose` holds the player prone, crouched or upright.** A forced pose is the missing piece for a crawling origin, a serpent that never stands, or a form that cannot fit through a full-height door: `"pose": "swimming"` puts the player flat, which carries the one-block hitbox and the crawl animation everywhere, not only in water. It is a power rather than an action because the pose has to be held and then released, and it takes the usual `condition`, plus `toggleable` and `default_off` and a HUD icon, so a pack can hand the switch to the player. Clearance is deliberately not checked: a forced crawl fits through gaps the player otherwise could not, and whether that is too strong is the pack's call. Releasing it hands the player back to the game, which does check, so nobody ends up standing inside a ceiling. Sleeping, gliding and spin-attack are not offered: those poses carry behaviour a pose alone cannot deliver. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:prevent_entity_render` hides entities from the player who has it.** Every living entity matching `entity_condition` stops being drawn for that player alone; everyone else sees it normally and the entity itself is untouched, so it still moves, still attacks and still blocks the way. Pair it with something that applies glowing for an origin that sees only what it has marked. The condition is evaluated on the server, which is what lets it use `status_effect` and `nbt`: a client is never told another entity's effects, so a client-side check would have quietly matched nothing. The hidden set refreshes every five ticks over living entities within view distance, capped at 1024 per player. `origins:prevent_entity_render` maps onto it, so a legacy pack using it works now rather than loading it as an unsupported no-op.
- **A morph can play the mob's own animations.** `neoorigins:trigger_morph_animation` names a triggerable animation on the GeckoLib model a player is morphed into, and it plays for everyone who can see them. It needs no dependency and no packet: GeckoLib's own trigger call already routes a client-side entity straight into its animation manager, and the morph is a real client-side entity rather than a static model, so it takes that path for free. One hard limit worth knowing before you plan around it: the only reachable names are the ones the mob's author explicitly registered as triggerable; an unregistered name does nothing at all and logs nothing; and there is no way to discover the list from JSON. Vanilla mobs are not GeckoLib models and do nothing here. AzureLib is shaped the same way and could follow; Citadel is not. See [ACTIONS.md](docs/ACTIONS.md).
- **A morph can run the mob's entity events.** `neoorigins:morph_entity_event` fires the hook the server normally uses to tell clients a mob just did something, whether that is an iron golem's attack swing, a villager's angry particles or a wolf shaking off water, so a morph reacts like the mob instead of only sharing its silhouette. The names come from Minecraft's own table rather than a hand-copied list, so they track the game version, and a raw `id` byte is there for modded mobs with events of their own. Three limits are documented rather than papered over: events whose sound plays through the entity itself are silent on a morph, events that set a countdown for the mob's own tick to drain hold that pose instead of playing through it, and particle events that read the mob's movement draw their particles streaking in from the world origin instead. The death byte is refused outright, because on a morph it would fire a client-side death for an entity that was never in the world.
- **`set_block` places where you aimed.** It was an entity action only, and it placed at the target's feet, so a right-click power aimed at a block changed the ground the player was standing on instead of the block they clicked. It now resolves the position from whatever context it runs in (a block or bonemeal interaction, a projectile or raycast hit, a `block_action_at` or `offset` wrapper), and falls back to the actor's own position when there is no block context, which is what it always did. It is also a block-target verb now, so it can be named directly inside `block_target_action` alongside `strip`, `till`, `path`, `grow` and `transform_block`. The `keep` field, which places only into air, was never documented.
- **`item_condition` gates right-click powers instead of being dropped.** Apoli's `action_on_block_use` and `action_on_entity_use` both take an `item_condition` meaning "only with this in hand", and the translator never copied it, so a power that was supposed to fire only while holding a specific item fired for whatever the player happened to be carrying. It is carried across now, along with Apoli's newer `held_item_condition` spelling, and the gate reads the stack out of the interaction rather than only out of a food context. Copying the field alone would have made every one of those powers fail instead, since the gate fails closed and had nothing to read. `action_on_block_break`, `wake_up` and `bonemeal` carry no item gate across. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:using_effective_tool` asks whether the swing you are making is a productive one.** It matches Apoli's condition of the same name and takes no fields. It answers two things at once, and the first is the half that is easy to get wrong: it is true only while the player is part-way through breaking a block *and* holding a tool that will actually yield its drops. It is false whenever the player is not mid-break, so it cannot be used to ask "am I holding a pickaxe". A power gated on it fires during mining and at no other time, which makes it the right gate for a mining-flavoured effect and the wrong one for an equipment check. See [CONDITIONS.md](docs/CONDITIONS.md).
- **`edible_item` can pay a different amount for one part of its set.** The type read a list of items and tags and paid one number for all of them, so anything whose worth varies by form (an ore against its block, an ingot against its nugget) needed a second power, a second tag and a second copy of every field it shared with the first. The new `tiers` list puts those bands inside the one power. Each entry carries its own `items` or `tags` and its own `nutrition`, with `saturation` optional and inherited from the power when it is left out. First match wins, so write the narrow bands first, and anything matching none of them falls back to the power's own values. Bands match alongside the top-level lists rather than within them, so a tier can introduce items the power never otherwise mentions. One thing to know before you tune one: saturation is restored as nutrition times the modifier times two, so a band that doubles both grants four times the saturation, which is almost never what was meant. Leaving `saturation` off is the right default. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **All seven Caveborn diet tags are built out of common tags.** The stone diet listed its ten blocks inside the power, so it was the one diet a pack could not extend without replacing the whole file, and the other six listed vanilla item ids, so a modded metal was not food until somebody added it by hand. Every one of them is a tag now, and every one is a union of NeoForge's `c:` tags: the six materials take their `ingots/`, `nuggets/`, `gems/`, `raw_materials/`, `ores/` and `storage_blocks/` entries, and stone takes `#c:stones` and `#c:cobblestones` alongside basalt and blackstone. A modded metal or stone that registers itself where mods normally do is edible with no pack work at all. `netherite_scrap` is the one literal id left in the set, since NeoForge publishes no common tag for that item. The rebuild closed a gap nobody had reported as such: the refined storage blocks were in none of the old lists, only the raw ones, so a Caveborn could eat a raw iron block and not an iron block. Adding your own item to a tag works exactly as before, and it lands in the matching value band if there is one. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`mod_food_nutrition` changes what a meal is worth as it is eaten.** Nutrition could be retuned only through the legacy `origins:modify_food` power, so a pack working in the native vocabulary had no way to reach it and no event to hang a condition on. `action_on_event` now carries a `mod_food_nutrition` event that fires for any food actually eaten, with the item itself in context, so `food_item_in_tag` and `food_item_id` both gate it. It runs after `modify_food` and on whatever that left behind, so a pack can use either or both and neither needs the other to be present. The result is rounded and floored at zero. See [EVENTS.md](docs/EVENTS.md).
- **The in-game creator checks your ids the way the web editor does.** The generated schemas have always carried a pattern for each id-shaped string field, and only the web editor read them: the in-game creator's text rows took anything and left the mistake to surface at load, far from the field that caused it. Each text row now checks its value against the schema's own pattern as you type and shows the same inline complaint the web editor would. It advises rather than blocks, deliberately: the loader is more forgiving than the patterns in a few places (a particle or dimension written without its `minecraft:` prefix loads fine), and an editor that refuses what the game accepts is the failure shape 2.2.26 already removed once. Nothing you can load is ever locked out of saving.
- **`model_color` stacks, and can be switched off from the config.** Two tints active at once resolved to whichever one the capability set happened to hand over first, which is not something a pack can predict or arrange around, so an origin with more than one conditional tint had a colour nobody could design. Overlapping tints now average their channels: two produce their midpoint, three their mean, and every client watching sees the same thing. The type also honours the shared `enabled` flag, so a server owner can drop a single tint from `power_overrides.toml` while leaving the power that carries it in place.
- **Four legacy power mappings that never landed now do.** `origins:aquatic`, `origins:conduit_power_on_land` and `origins:nether_spawn` were each mapped onto a NeoOrigins type that does not exist, so a legacy pack using any of them had the power silently dropped: nothing failed, nothing was logged, the origin simply came up missing an ability. `origins:creative_flight` was worse in a quieter way. It named a type that does exist, just the wrong one, and had done so for five months. All four are retargeted, and every remaining legacy mapping has been walked end to end on both sides rather than only on the name a pack writes, so the mappings that ship are the ones that resolve.
- **An `action_on_event` that names an event which does not exist no longer costs the whole power.** An unrecognised `event` fails the power's decode outright, so a pack that guessed a plausible spelling did not end up with a hook that misbehaved, it ended up with nothing, the ability simply missing from the origin with no sign of why. `item_use_start` is the common guess, and it now resolves to `item_use`, which already fires at exactly that moment for anything with a use duration: a shield going up, a bow drawn, food raised. The accepted spellings are offered by both editors as well, so a pack the game loads is never marked invalid on the way in. A name matching nothing at all still fails loudly rather than being quietly swallowed. Only a spelling whose target already fires at the same instant is ever added this way, since a name pointed at a different moment would load and then do the wrong thing, which is worse than the refusal it replaced. See [EVENTS.md](docs/EVENTS.md).
- **A pack that writes `neoorigins:` where it meant `origins:` is salvaged rather than dropped.** The compatibility power types answer to `origins:` and `apace:` and nothing else, so an author writing `neoorigins:action_on_item_use` got the power dropped outright, with no line in the log explaining why. It is an easy mistake to make, since the mod is called NeoOrigins and every other type they write really does start with `neoorigins:`. Such a type is now rewritten back to `origins:`, but only when the name is one the compatibility layer actually handles and there is no native type of that name, so the 34 names that exist in both vocabularies keep resolving natively. The "unknown power type" warning is more useful too: powers, actions and conditions share a namespace and a naming style, so it now tells you which of the three an unrecognised id actually belongs to.
- **The loot function 1.20.5 deleted no longer takes the whole table down with it.** `minecraft:set_nbt` is gone, and a loot table naming it fails to parse outright, which cascades into every function and advancement that referenced the table, so items a legacy pack was supposed to hand out simply never arrived, with the failure logged somewhere far from the cause. It is retargeted to `minecraft:set_custom_data`, which takes the identical field, as the file is read. It is not an NBT-to-components converter and does not pretend to be: a blob carrying a key that became a real data component is left exactly as it was and reported, so the table still fails, but it fails loudly instead of quietly handing out an item with its enchantments missing.
- **A legacy `starting_equipment` written with a singular `stack` grants it.** Packs in the wild are written with both spellings; NeoOrigins read only the plural, so a power using the singular was skipped and gave the player nothing, without an error. Both spellings are read now, with the plural winning where a pack has somehow written both. See [COMPATIBILITY.md](docs/COMPATIBILITY.md).
- **Item NBT paths that step through the deleted `tag` field are repointed.** 1.20.5 removed `tag` from item stacks, and this is the worst shape of breakage a pack can carry: a path like `SelectedItem.tag.Foo` still parses and still runs; it just resolves to nothing, so neither the command parser nor a load-time check can see anything wrong and the pack fails silently in game. Both spellings are repaired (the dot path, including subscripts, and the brace form inside a selector), and this one runs unconditionally rather than behind a parse check, because on 1.21 no item stack carries a `tag` field in any context, so there is no valid path of that shape to break. Quoted text is skipped and the commands whose payload is free text are excluded, so a `tellraw` that happens to mention one is left alone.
- **`set_block` reaches legacy packs that used it as a block action.** In Apoli it is a block action and places at the block the power was aimed at. Because the translator flattens a block action into an entity action, adding the block-side verb alone would not have reached these packs at all; the fix is the context resolution above, which is what makes the flattened form land in the right place.
- **A legacy repeating action that names no `interval` fires once a second, not twenty times.** Apoli's `action_over_time` defaults its interval to 20 ticks, and packs lean on that: leaving the field out is normal upstream. Our compatibility layer defaulted it to 1, so such a power ran its action on every tick, which is twenty heals, twenty particle bursts or twenty command executions a second, and a pack tuned around the upstream pace ran twenty times hot with nothing in its file to show why. The default is now 20, matching Apoli and matching our own `condition_passive`, which has said 20 all along. A power that writes its own `interval` is untouched.
- **The compat layer's night-vision and diet mappings outlive the alias table.** Five well-known Origins powers (`night_vision`, `cat_vision`, `water_vision`, `carnivore`, `vegetarian`) were compiled into two retired NeoOrigins type names that only still load because the legacy remap catches them on the way in, and that remap is scheduled to go. They now emit the canonical forms directly: an ambient, particle-free `persistent_effect` for the visions, and an event-cancelling `action_on_event` diet gate for the two food rules, each byte-matching what the remap produced. Nothing changes in game, which is the point: when the aliases retire, these five keep working instead of being the surprise.
- **Two condition ids that never existed stop being claimed as supported.** `neoorigins:lava` and `neoorigins:water` sat in the compat condition catalogue with no implementation behind them, put there by a build-time audit that misread the fluid ids inside `submerged_in` and `fluid_height` as condition types. A pack writing one was told nothing, since the id was "known", and the condition then failed anyway. Both are gone, the audit no longer manufactures them, and writing one now earns the ordinary unknown-type warning that points you at `in_water`, `in_lava` and `submerged_in`, which are the conditions that exist.
- **The game starts again if you have The One Probe installed.** This one blocked the mod outright rather than degrading it, and it took no unusual setup to hit: installing TOP alongside NeoOrigins was enough. TOP publishes its version as `1.21_neo-12.0.8`, and NeoForge compares version ranges piece by piece from the left, so our lower bound of 12 was tested against the leading `1` of the Minecraft version and failed every time. The `12.0.8` was never reached. The message named the right numbers and still made no sense to read: "only supports theoneprobe 12 or above. Currently, theoneprobe is 1.21_neo-12.0.8". NeoForge enforces a range even on an optional dependency, so this was a hard stop at startup. The bound is gone, and it was never doing anything: the integration is already behind a check for whether TOP is loaded, with every TOP-specific reference confined to its own package, so an old or missing TOP cannot reach the code either way.
- **Dragon Survival and the origin picker stop knocking each other off the screen.** Both mods open a screen when you join, Dragon Survival when its species-choice setting is on and NeoOrigins because the server asked for a pick, and whichever arrived second replaced the first. That is how players were being thrown out of the origin picker, and because it was a race, which screen you lost was not even consistent between joins. The old setting was a plain on/off switch whose two positions were "leave the race alone" and "cancel Dragon Survival's screen outright", so neither of them was what most people wanted. It is now `compat.dragon_species_screens`, with three positions: `DEFER`, the new default, holds Dragon Survival's screen back and opens it the moment the origin picker is finished, so neither mod loses its screen; `SUPPRESS` cancels species screens, as the old "on" did; `ALLOW` never interferes, as the old "off" did. The interception runs both ways, so it does not matter which mod wins the race. Under `DEFER` and `ALLOW`, a species screen you opened yourself (from an altar, the inventory button or a command) is left alone; only one that would trample the picker is caught. Dragon Survival's appearance editor, skins, abilities and inventory are never touched under any setting. It is a client setting, so nothing changes on the server or in Dragon Survival's own config. See [COMPATIBILITY.md](docs/COMPATIBILITY.md).
- **Three client-config defaults were documented as their opposites.** `hud_ability_display` defaults to `COOLDOWNS_AND_TOGGLES` and was written as `ALL_ACTIVE_ABILITIES`, `default_sort` defaults to `MANUAL` and was written as `CLASS`, and `always_show_icon` was described as having no effect under the default mode when the default mode is exactly where it matters. All three are the shape of error that costs nothing at load and shows up as a HUD or a picker that does not look the way the page said it would. See [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **Origin layers merge additively, not by replacement.** The cookbook told authors that a second pack's layer file replaces the `origins` array and that they should therefore copy the full list across, which is both wrong and the opposite of the sentence immediately before it in the same paragraph. Layers merge by appending, deduplicated by id, with `"replace": true` as the opt-out. Copying the full list was at best redundant and at worst a maintenance trap, since the copy goes stale the moment the original pack adds an origin. The ordering rule is spelled out alongside it: display order comes from each origin's own `order` field, not from position in the array. See [COOKBOOK.md](docs/COOKBOOK.md).
- **The legacy-pack repairs are written down.** [COMPATIBILITY.md](docs/COMPATIBILITY.md) gains a section covering every syntax-level repair applied while a 1.19/1.20 pack is read, what each one does, and what is deliberately not covered. That last part is the one that matters when a pack still misbehaves. `SkullOwner` is called out by name: it became the profile component, it is not in the mapped set, and a legacy pack handing out a named player head gets a blank one with no warning.
- **`starting_equipment`'s plural form is documented.** The type has taken a `stacks` array for some time and the reference described only the single-item shape, so multi-item kits were being written as several powers. The two shapes do not combine, since a non-empty `stacks` ignores the root item entirely, and one `grant_id` seals the whole bundle, so a single bad item id is worth planning around. Both are now spelled out with a worked example. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`prevent_entity_render` and the evolution prompt describe what the code does.** The former hides living entities only, so boats, minecarts, item frames and dropped items were never candidates despite the page saying every entity was. The latter had no written description of when the prompt appears or what declining does; [EVOLUTION.md](docs/EVOLUTION.md) now has one, and [KUBEJS.md](docs/KUBEJS.md) lists the `evolutionDeclined` event beside it with the conditions under which it fires.
- **An Orb of Origin does reset your evolution, whatever the page said.** [EVOLUTION.md](docs/EVOLUTION.md) claimed the orb left essence kills, tier and a declined tier untouched, and that only two things could clear a decline. Spending an orb clears all three fields, so three things clear a decline, not two. This is worth calling out rather than quietly fixing, because the cookbook had it right on the same page-set: the two documents contradicted each other, and if you planned around the wrong one, an orb has been resetting more than you expected all along.
- **A native `active_ability` can use a named hotkey, whatever the reference said.** [POWER_TYPES.md](docs/POWER_TYPES.md) and [API.md](docs/API.md) both stated it could not, and sent authors off to rewrite the power as an Apoli-style `origins:active_self` to get one. It was never true: `key` is not on the codec, but the loader reads it out of the power's own JSON for every active power, native ones included, and binds it like any other. Both denials are gone and `key` now has a row in the `active_ability` table. `neoorigins:toggle` went the other way and has lost the field: it declared `key`, so both editors offered it and the schema accepted it, but a toggle is not an active power and a keypress had nothing to run even once it arrived. The toggle section says so now, and points at the `active_ability` that flips it.
- **The power reference's field tables were re-read against the codecs.** Four sections listed fields the codec never reads or carried no table at all, and three types had no section anywhere: `apugli:action_on_jump`, `apugli:action_on_target_death` and `action_over_time`. Eleven fields were marked required that are not, and each now says what actually happens instead, which is rarely nothing: a modifier seam given neither `modifier` nor `modifiers` is not refused by the schema, but the loader drops the whole power rather than leaving the multiplier sitting at 1.0. Two entries were simply false. `biome_buff` with no `biome_tag` does not apply everywhere, it applies nowhere, the default being an empty tag that matches no biome; and the root `amplifier` on the `persistent_effect` family overrides the first `effects` entry alone rather than cascading onto all of them, winning even over one that entry sets for itself. `enabled`, the per-power kill switch, is written up on the six types that take it. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **The rest of the reference was re-read against the code, not against the older prose.** Four more claims did not survive it. The Caveborn's diet section listed five eating powers when there are seven. The copper tint was described as green-orange; it is orange. The burning-under-Emerald-Reprieve note explained itself with a rule about fire immunity that is not how the game works: Fire Resistance cancels fire damage and never puts the fire out, and it is the sunlight power re-lighting you each second that keeps you alight. And the compatibility page promised that a Dragon Survival species screen you opened yourself always behaves as it would without NeoOrigins installed, which holds under `DEFER` and `ALLOW` but not under `SUPPRESS`. Two sentences describing what Apoli itself declares have been rewritten to describe only what NeoOrigins does, since we cannot verify the first kind and that is exactly how the others got in.
- **`gameplay.toml` and `admin.toml` have reference pages at last.** Two of the four config files had none, so the options between them (the Orb's XP cost formula, random assignment, the evolution kill thresholds, ocean-origin survival tuning, the command-power blacklist, dimension restrictions) were configurable and written down nowhere but the file's own comments. [GAMEPLAY_CONFIG.md](docs/GAMEPLAY_CONFIG.md) and [ADMIN_CONFIG.md](docs/ADMIN_CONFIG.md) now cover every section, key, default and range. [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md) also stops calling all four files server configs, because only `content.toml` is one: it alone is synced to clients and overridable per world, while the other three load early, apply to the whole install, and enforce server-side. The distinction decides where you edit and whether a per-world copy will be honoured, which is exactly the thing to get right on a page about config files.
- **The event contexts say what a handler is actually handed.** Eight of them had drifted: `hit_taken`, `kill` and `projectile_hit` all carry the live, cancellable event in their context and the page did not say so; `death`'s context *is* the event; `land` has a second dispatch site (a per-tick ground-contact detector for landings the fall path never sees) where the context is empty and `cancel_event` deliberately does nothing; and the paragraph on `mod_break_speed` described a removed event as though it still fired. Alongside them, `add_velocity` gains its missing `space` row with all eight Apoli reference frames, `dash` its `set_velocity`, and `spawn_projectile`'s count admits it defaults to 1 for a plain projectile and 2 for an orb trail. See [EVENTS.md](docs/EVENTS.md) and [ACTIONS.md](docs/ACTIONS.md).
- **The API index is exhaustive again, and now provably.** [API.md](docs/API.md) promises a complete list of everything registered, and it had fallen to roughly two thirds on conditions and actions: 21 conditions, 17 actions and 17 events were registered, working and listed nowhere, so a reader took the absence as the feature not existing, which is the same failure 2.2.25 fixed for power types. All four lists were regenerated from the registries (122 power types, 108 conditions, 95 actions, 51 events, with the 26.2 build counting two types and one action fewer, the KubeJS-backed ids it does not ship) and verified by script in both directions, so an id in the code is on the page and an id on the page is in the code, with zero exceptions either way. The page's description of how legacy packs are translated was corrected in the same pass: `origins:` and `apace:` go through the translator, `apoli:` and `apugli:` are canonicalized to `origins:` first, and the legacy alias table covers only the odd cross-mod id rather than being the pipeline itself.
release
NeoOrigins v2.2.26 (MC 26.2)
v2.2.26+26.26 сент. 2026 г.54Minecraft: 26.2neoforge
Что нового
> A compatibility and origin-content release, led by a startup failure. Installing The One Probe alongside NeoOrigins was enough to be refused at launch, over a version bound that compared our lower bound against the wrong part of TOP's version string. It had never protected anything, and it is gone. Six new pack-author capabilities follow, most of them out of getting one legacy Origins pack to run untouched: a morph can play one of the mob's own animations, or run one of the entity events the game uses to make a mob swing, sparkle or shake; `pose` holds the player prone, crouched or upright, which is what a crawling or a serpentine origin needs; `prevent_entity_render` hides entities from a single player; `using_effective_tool` asks whether the swing a player is making is a productive one; and `mod_food_nutrition` changes what a meal is worth as it goes down. The origin picker gains two more shapes for the two things people kept asking for (#127): a carousel for anyone who preferred the original mod's chooser, and a grid of cards for anyone who wanted a whole layer visible at once, with the two-panel screen unchanged as the default. Dragon Survival no longer fights it for the screen at join either: whichever mod loses that race now has its screen held and reopened instead of dropped. The Caveborn get copper and emerald diets filling the two gaps in the ore ladder, water breathing and fire resistance to go with them, a wash of the ore's own colour for as long as its effect runs, and descriptions that finally admit the diets refuse on a full stomach. All seven of their diets are rebuilt on common tags, so a modded metal or stone is food without a pack touching anything, and what you eat is now worth what it is: a block feeds twice what an ingot does and holds its effect three times as long, a nugget is worth almost nothing, and ore goes down in creative mode the way bread always has. A pack written for 1.19 or 1.20 gets four more of its breakages repaired as the file is read, with no edit to the zip, and four legacy power mappings that dropped their power silently now land, with the rest walked end to end so none of them can. Alongside those: declining an evolution keeps it declined, fire-immune origins stop burning on campfires and blazes (#129), a fire-resistant helmet shades without wearing out, a slime rehydrates from a water cauldron and from a water bottle, the step-up ability gained an off switch for everyone it kept walking up the block they meant to step down from (#123), the web editor's form view stops refusing to switch off a setting that defaults to on while its block canvas stops writing back fields nobody ever set, an event name a pack guessed at costs it a hook rather than the whole power, a legacy repeating action that names no interval paces itself at Apoli's once a second instead of every tick, the in-game creator checks its ids as strictly as the web editor always has, and the reference has been re-read against the loader in the places it had drifted, gaining pages for the two config files that never had one.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **The origin picker comes in three shapes now (#127).** It had one: a scrolling list on the left, details on the right. Players who came from the original Origins mod kept asking for its one-at-a-time chooser back, and others wanted a whole layer visible at once. Both are choices rather than replacements. The client setting `ui.picker_layout` takes `TWO_PANEL`, the default and unchanged; `CAROUSEL`, one origin at a time with arrows to step through them; and `GRID`, a wall of origin cards that fits as many as your window allows and pages the rest. A card carries the icon, name and impact dots but has no room for a description, so clicking one opens the same full detail read the other layouts use, and Back returns you to the wall. The search box filters the wall as you type, and the arrow keys page it unless the box has focus. The carousel is a NeoOrigins screen shaped like the original rather than a copy of it, so it keeps whatever theme you are running instead of the old dirt-background window, and browsing in it *is* selecting: Confirm always applies to whatever is on screen. Layout and skin are independent. `theme_override` and `classic_picker_style` still control colour and font, and any skin works with any layout. See [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **A fire-resistant helmet shades you without wearing out.** Origins that burn in daylight wear down the helmet protecting them, which is right for an ordinary hat and wrong for one that already survives lava. Netherite helmets now shade for free, the way unbreakable ones always did. It keys off the item's own fire-resistant property rather than a list of names, so a modded helmet that grants itself the same property is covered without us naming it.
- **Declining an evolution keeps it declined.** The prompt to evolve was re-offered on every kill after the requirement was met, so refusing it bought a few seconds of quiet and nothing more, and a player near their next tier spent the rest of the session being asked. A decline is now remembered against the tier it was made at, and nothing re-offers that tier: not more kills, not a relog. It stays quiet until you ask for it yourself with `/neoorigins evolve accept`, an operator sets your tier, or you spend an Orb of Origin, which resets the ladder to zero outright. The tier is not lost by declining it, only muted, and accepting clears the record so the tier above it prompts normally once its own threshold is reached. See [EVOLUTION.md](docs/EVOLUTION.md).
- **The Caveborn's diets say they will not go down on a full stomach.** All eight of them (the Caveborn's seven ores and the Nether origin's fungal diet) refuse when the hunger bar is already full, which is deliberate and matches ordinary food. Nothing said so, and the refusal is completely silent: no message, no eating animation, no sound, so a player at full hunger reads it as the power being broken rather than as being full. Every one of those descriptions now ends by saying it, in all twelve languages the mod ships. The stone diet's list also gained cobbled deepslate, which it has always eaten and never mentioned.
- **The Caveborn eats copper, and copper lets them breathe.** The diet ladder jumped straight from stone to iron, skipping the ore a player turns up more of than any other on the way down. Copper now feeds for 3 hunger and 0.6 saturation, which places it neatly between stone and iron, and eating it grants Water Breathing I for a minute. The effect is picked for the gap it fills rather than for the flavour: a Caveborn sees in the dark, ignores the drop and mines bare-handed, but a flooded ravine or a drowned mineshaft stopped them the same as anybody, and copper is what they are already picking up on the way to one. Ingots, raw copper, both ores and both kinds of copper block all count. Like the other six diets it is a tag, `neoorigins:caveborn_eat_copper`, so a pack adds a modded copper to it without replacing the power.
- **The Caveborn takes on the colour of the ore they ate.** Six of the seven diets grant an effect, and while one was running there was nothing about the player that showed which one, least of all to anybody looking at them from the other end of the shaft. The model is now washed in that ore's own colour for as long as its effect lasts, sampled from the item rather than picked by hand: copper orange, iron pale grey, gold yellow, diamond cyan, emerald green, netherite a dark brown. Eat two and the colours average. Nothing about the buffs changes, and each of the six is its own switch in `power_overrides.toml`, from `caveborn_copper_tint` through `caveborn_netherite_tint`, so a server that wants the diets without the colour can turn off as many of them as it likes. Stone has no tint, having no effect to signal. See [ORIGINS.md](docs/ORIGINS.md).
- **Emerald is the seventh diet, and it buys a trip to the surface.** The Caveborn's one real cost is that daylight burns them, and nothing in the origin ever answered it: you either stayed under or you took the damage. Emerald now feeds for 7 hunger and 1.4 saturation, filling the gap the ladder had left between diamond and netherite, and eating one grants Fire Resistance for five minutes. The sunlight damage was always dealt as fire, so this cancels it outright rather than blunting it, and it covers lava on the way back down, which is the other thing that kills miners. Emeralds, both emerald ores and blocks of emerald all count, through `neoorigins:caveborn_eat_emerald`. You will still catch fire: Fire Resistance cancels the damage but does not put the flames out, and the sunlight power re-lights you every second you are exposed, so those five minutes above ground are spent visibly alight and entirely unharmed. Step into shade or water and the burn runs out on its own. Emerald is the one Caveborn diet with a renewable supply, since a villager will trade for it.
- **A block of ore feeds a Caveborn like a block, and a nugget like a nugget.** Every form of a material was worth the same meal, so a raw iron block and a single ingot both restored 4 hunger, and the block was worth eating only if you had nothing else to hand. The nugget was the inverse and the worse half of it: nine nuggets restored 36 hunger where the ingot they make restored 4, and nether gold ore drops nuggets rather than ingots, so the least valuable form of gold in the game was by a wide margin the most efficient food in the origin. What you eat is now worth what it is. A block feeds twice what an ingot or gem does and holds its effect three times as long; a nugget feeds 1 hunger with no saturation and buys fifteen seconds. A block is deliberately not worth the nine that a crafting recipe would suggest, because hunger caps at 20 and most of that food would be discarded the moment it was granted, so the duration is where the value went instead. The arithmetic that matters is that an ingot at 4 hunger and 6.4 saturation now stays ahead of the nine nuggets you could split it into, which is the comparison the old numbers had backwards. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **The step-up ability has an off switch (#123).** An origin or class that steps a full block does it whether you want it to or not, and holding shift does not suppress it, so edging up to a drop or lowering yourself onto a ledge walks you straight up the block you were working around. The game offers no way to ask for a step height that yields to sneaking, so the answer is a switch rather than a rule. The Explorer's *Climber's Step*, the Rogue's *Parkour* and the Scout's *Tracker's Stride* now share a *Step Assist* ability that turns the step height off and back on, with a low note for off and a high one for on. It defaults to on, so nothing changes for anyone who never presses it, and the state is saved with the rest of your toggles rather than springing back on at the next login. With it off you climb blocks by jumping, the same as everybody else.
- **Fire-immune origins stop burning on campfires and blazes.** (#129) The immunity checked four damage types by name (standing in fire, being on fire, lava and magma blocks), which left out campfires and both kinds of fireball, so an origin that is supposed to be unburnable took full damage from a blaze and cooked on a campfire like anyone else. It now asks the game's own `minecraft:is_fire` tag instead of a hand-written list, which covers those cases, agrees with the matching condition that was already using the tag, and picks up fire damage added by other mods without further work.
- **The web editor's form view can turn a default-on setting off.** Any boolean whose default is `true` could not be set to `false` from the form view: the row drew itself unchecked while the power actually behaved as switched on, and ticking the box and clearing it again wrote nothing at all, so the setting looked changed and was not. An unset field now seeds from the schema's declared default rather than a flat `false`. This affected 68 default-true booleans across the shipped power, action and condition schemas.
- **The block editor stops writing fields you never set.** A block widget has to display something, so an optional field the power does not carry gets drawn with a stand-in, and the canvas was writing every one of those back when it saved. One drag of an unrelated block was enough to turn a damage-halving power into total immunity, because `modify_damage` came back carrying `set_total: 0`, a field whose own reference entry says to leave it out if you want the multiplied value kept. Nothing on screen looked any different. A leaf still equal to the stand-in the widget had to show is now left out on the way back, and the fields the loaded file genuinely carried are tracked alongside it, so an author who deliberately means a zero keeps it. Powers the canvas cannot draw are put back at their original position rather than at the end, since the order powers are written in is authored data too.
- **An `area_of_effect` inside a lingering cloud stays with the cloud (#125).** The interval action a lingering area runs is executed as the caster, which is right for kill credit and for anything that spends a resource, but it also meant an area effect nested inside it measured its radius from wherever the caster was standing at that moment. Walk away from your own cloud and the damage walked with you, leaving the cloud drawing particles over nothing. The action still runs as the caster; an `area_of_effect` inside it now centres on the cloud.
- **The Merchant's restocked trades stop showing as sold out.** The class refills nearby villagers' trades on a timer, but it refilled them server-side only. A trade's sold-out cross is drawn from the copy of the offers the client was handed when the screen opened, so a trade that had just been refilled kept its cross, and the only way to clear it was to close the villager and open it again. The refill now resends the offers to whoever has that villager open, which is what vanilla's own restock does. It sends nothing when nothing was actually refilled, so an open trading screen no longer takes a packet every couple of seconds for the life of the interaction.
- **Ore goes down in creative mode, the way bread always has.** A Caveborn in creative could not eat any of their seven diets, while every vanilla food in the game ate normally, and because the refusal is silent it read as the power being broken rather than as a rule. Our gate asked whether the hunger bar had room, and creative mode is precisely the case where it never does. It now asks the game's own question instead, which is invulnerable or always-edible or genuinely hungry, at both places that had to know, so the two can no longer drift apart. Fixing that surfaced the other half of the same problem: the meal took one from the stack unconditionally, where vanilla food leaves a creative player's stack alone. It now spends the item through the same call vanilla uses, which declines to spend anything for a player with infinite materials. Both halves apply to every `edible_item` power, not only to the Caveborn's.
- **A slime rehydrates from a water cauldron and from a water bottle.** The moisture bar refilled from water, rain and bubble columns, which is the game's own in-water test, and a water cauldron does not answer to it: a cauldron is a block carrying a level, not a body of water. A slime standing in a full cauldron therefore dried out at exactly the rate of one standing on bare stone, which is the opposite of what anyone builds a cauldron for. Standing in one now refills at the same rate open water does. Drinking a water bottle tops the bar up as well, by half its length, which gives a drying slime something it can carry rather than a source it has to reach. Neither of these is new ground, and that is the point: `breath_out_of_fluid` has handled the cauldron and the bottle for aquatic origins for some time, and the moisture bar simply never got the same treatment. The bottle amount is `water_bottle_refill` on the power, so a pack can retune it or set it to 0 to leave water bottles out of it entirely. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:pose` holds the player prone, crouched or upright.** A forced pose is the missing piece for a crawling origin, a serpent that never stands, or a form that cannot fit through a full-height door: `"pose": "swimming"` puts the player flat, which carries the one-block hitbox and the crawl animation everywhere, not only in water. It is a power rather than an action because the pose has to be held and then released, and it takes the usual `condition`, plus `toggleable` and `default_off` and a HUD icon, so a pack can hand the switch to the player. Clearance is deliberately not checked: a forced crawl fits through gaps the player otherwise could not, and whether that is too strong is the pack's call. Releasing it hands the player back to the game, which does check, so nobody ends up standing inside a ceiling. Sleeping, gliding and spin-attack are not offered: those poses carry behaviour a pose alone cannot deliver. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:prevent_entity_render` hides entities from the player who has it.** Every living entity matching `entity_condition` stops being drawn for that player alone; everyone else sees it normally and the entity itself is untouched, so it still moves, still attacks and still blocks the way. Pair it with something that applies glowing for an origin that sees only what it has marked. The condition is evaluated on the server, which is what lets it use `status_effect` and `nbt`: a client is never told another entity's effects, so a client-side check would have quietly matched nothing. The hidden set refreshes every five ticks over living entities within view distance, capped at 1024 per player. `origins:prevent_entity_render` maps onto it, so a legacy pack using it works now rather than loading it as an unsupported no-op.
- **A morph can play the mob's own animations.** `neoorigins:trigger_morph_animation` names a triggerable animation on the GeckoLib model a player is morphed into, and it plays for everyone who can see them. It needs no dependency and no packet: GeckoLib's own trigger call already routes a client-side entity straight into its animation manager, and the morph is a real client-side entity rather than a static model, so it takes that path for free. One hard limit worth knowing before you plan around it: the only reachable names are the ones the mob's author explicitly registered as triggerable; an unregistered name does nothing at all and logs nothing; and there is no way to discover the list from JSON. Vanilla mobs are not GeckoLib models and do nothing here. AzureLib is shaped the same way and could follow; Citadel is not. See [ACTIONS.md](docs/ACTIONS.md).
- **A morph can run the mob's entity events.** `neoorigins:morph_entity_event` fires the hook the server normally uses to tell clients a mob just did something, whether that is an iron golem's attack swing, a villager's angry particles or a wolf shaking off water, so a morph reacts like the mob instead of only sharing its silhouette. The names come from Minecraft's own table rather than a hand-copied list, so they track the game version, and a raw `id` byte is there for modded mobs with events of their own. Three limits are documented rather than papered over: events whose sound plays through the entity itself are silent on a morph, events that set a countdown for the mob's own tick to drain hold that pose instead of playing through it, and particle events that read the mob's movement draw their particles streaking in from the world origin instead. The death byte is refused outright, because on a morph it would fire a client-side death for an entity that was never in the world.
- **`set_block` places where you aimed.** It was an entity action only, and it placed at the target's feet, so a right-click power aimed at a block changed the ground the player was standing on instead of the block they clicked. It now resolves the position from whatever context it runs in (a block or bonemeal interaction, a projectile or raycast hit, a `block_action_at` or `offset` wrapper), and falls back to the actor's own position when there is no block context, which is what it always did. It is also a block-target verb now, so it can be named directly inside `block_target_action` alongside `strip`, `till`, `path`, `grow` and `transform_block`. The `keep` field, which places only into air, was never documented.
- **`item_condition` gates right-click powers instead of being dropped.** Apoli's `action_on_block_use` and `action_on_entity_use` both take an `item_condition` meaning "only with this in hand", and the translator never copied it, so a power that was supposed to fire only while holding a specific item fired for whatever the player happened to be carrying. It is carried across now, along with Apoli's newer `held_item_condition` spelling, and the gate reads the stack out of the interaction rather than only out of a food context. Copying the field alone would have made every one of those powers fail instead, since the gate fails closed and had nothing to read. `action_on_block_break`, `wake_up` and `bonemeal` carry no item gate across. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:using_effective_tool` asks whether the swing you are making is a productive one.** It matches Apoli's condition of the same name and takes no fields. It answers two things at once, and the first is the half that is easy to get wrong: it is true only while the player is part-way through breaking a block *and* holding a tool that will actually yield its drops. It is false whenever the player is not mid-break, so it cannot be used to ask "am I holding a pickaxe". A power gated on it fires during mining and at no other time, which makes it the right gate for a mining-flavoured effect and the wrong one for an equipment check. See [CONDITIONS.md](docs/CONDITIONS.md).
- **`edible_item` can pay a different amount for one part of its set.** The type read a list of items and tags and paid one number for all of them, so anything whose worth varies by form (an ore against its block, an ingot against its nugget) needed a second power, a second tag and a second copy of every field it shared with the first. The new `tiers` list puts those bands inside the one power. Each entry carries its own `items` or `tags` and its own `nutrition`, with `saturation` optional and inherited from the power when it is left out. First match wins, so write the narrow bands first, and anything matching none of them falls back to the power's own values. Bands match alongside the top-level lists rather than within them, so a tier can introduce items the power never otherwise mentions. One thing to know before you tune one: saturation is restored as nutrition times the modifier times two, so a band that doubles both grants four times the saturation, which is almost never what was meant. Leaving `saturation` off is the right default. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **All seven Caveborn diet tags are built out of common tags.** The stone diet listed its ten blocks inside the power, so it was the one diet a pack could not extend without replacing the whole file, and the other six listed vanilla item ids, so a modded metal was not food until somebody added it by hand. Every one of them is a tag now, and every one is a union of NeoForge's `c:` tags: the six materials take their `ingots/`, `nuggets/`, `gems/`, `raw_materials/`, `ores/` and `storage_blocks/` entries, and stone takes `#c:stones` and `#c:cobblestones` alongside basalt and blackstone. A modded metal or stone that registers itself where mods normally do is edible with no pack work at all. `netherite_scrap` is the one literal id left in the set, since NeoForge publishes no common tag for that item. The rebuild closed a gap nobody had reported as such: the refined storage blocks were in none of the old lists, only the raw ones, so a Caveborn could eat a raw iron block and not an iron block. Adding your own item to a tag works exactly as before, and it lands in the matching value band if there is one. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`mod_food_nutrition` changes what a meal is worth as it is eaten.** Nutrition could be retuned only through the legacy `origins:modify_food` power, so a pack working in the native vocabulary had no way to reach it and no event to hang a condition on. `action_on_event` now carries a `mod_food_nutrition` event that fires for any food actually eaten, with the item itself in context, so `food_item_in_tag` and `food_item_id` both gate it. It runs after `modify_food` and on whatever that left behind, so a pack can use either or both and neither needs the other to be present. The result is rounded and floored at zero. See [EVENTS.md](docs/EVENTS.md).
- **The in-game creator checks your ids the way the web editor does.** The generated schemas have always carried a pattern for each id-shaped string field, and only the web editor read them: the in-game creator's text rows took anything and left the mistake to surface at load, far from the field that caused it. Each text row now checks its value against the schema's own pattern as you type and shows the same inline complaint the web editor would. It advises rather than blocks, deliberately: the loader is more forgiving than the patterns in a few places (a particle or dimension written without its `minecraft:` prefix loads fine), and an editor that refuses what the game accepts is the failure shape 2.2.26 already removed once. Nothing you can load is ever locked out of saving.
- **`model_color` stacks, and can be switched off from the config.** Two tints active at once resolved to whichever one the capability set happened to hand over first, which is not something a pack can predict or arrange around, so an origin with more than one conditional tint had a colour nobody could design. Overlapping tints now average their channels: two produce their midpoint, three their mean, and every client watching sees the same thing. The type also honours the shared `enabled` flag, so a server owner can drop a single tint from `power_overrides.toml` while leaving the power that carries it in place.
- **Four legacy power mappings that never landed now do.** `origins:aquatic`, `origins:conduit_power_on_land` and `origins:nether_spawn` were each mapped onto a NeoOrigins type that does not exist, so a legacy pack using any of them had the power silently dropped: nothing failed, nothing was logged, the origin simply came up missing an ability. `origins:creative_flight` was worse in a quieter way. It named a type that does exist, just the wrong one, and had done so for five months. All four are retargeted, and every remaining legacy mapping has been walked end to end on both sides rather than only on the name a pack writes, so the mappings that ship are the ones that resolve.
- **An `action_on_event` that names an event which does not exist no longer costs the whole power.** An unrecognised `event` fails the power's decode outright, so a pack that guessed a plausible spelling did not end up with a hook that misbehaved, it ended up with nothing, the ability simply missing from the origin with no sign of why. `item_use_start` is the common guess, and it now resolves to `item_use`, which already fires at exactly that moment for anything with a use duration: a shield going up, a bow drawn, food raised. The accepted spellings are offered by both editors as well, so a pack the game loads is never marked invalid on the way in. A name matching nothing at all still fails loudly rather than being quietly swallowed. Only a spelling whose target already fires at the same instant is ever added this way, since a name pointed at a different moment would load and then do the wrong thing, which is worse than the refusal it replaced. See [EVENTS.md](docs/EVENTS.md).
- **A pack that writes `neoorigins:` where it meant `origins:` is salvaged rather than dropped.** The compatibility power types answer to `origins:` and `apace:` and nothing else, so an author writing `neoorigins:action_on_item_use` got the power dropped outright, with no line in the log explaining why. It is an easy mistake to make, since the mod is called NeoOrigins and every other type they write really does start with `neoorigins:`. Such a type is now rewritten back to `origins:`, but only when the name is one the compatibility layer actually handles and there is no native type of that name, so the 34 names that exist in both vocabularies keep resolving natively. The "unknown power type" warning is more useful too: powers, actions and conditions share a namespace and a naming style, so it now tells you which of the three an unrecognised id actually belongs to.
- **The loot function 1.20.5 deleted no longer takes the whole table down with it.** `minecraft:set_nbt` is gone, and a loot table naming it fails to parse outright, which cascades into every function and advancement that referenced the table, so items a legacy pack was supposed to hand out simply never arrived, with the failure logged somewhere far from the cause. It is retargeted to `minecraft:set_custom_data`, which takes the identical field, as the file is read. It is not an NBT-to-components converter and does not pretend to be: a blob carrying a key that became a real data component is left exactly as it was and reported, so the table still fails, but it fails loudly instead of quietly handing out an item with its enchantments missing.
- **A legacy `starting_equipment` written with a singular `stack` grants it.** Packs in the wild are written with both spellings; NeoOrigins read only the plural, so a power using the singular was skipped and gave the player nothing, without an error. Both spellings are read now, with the plural winning where a pack has somehow written both. See [COMPATIBILITY.md](docs/COMPATIBILITY.md).
- **Item NBT paths that step through the deleted `tag` field are repointed.** 1.20.5 removed `tag` from item stacks, and this is the worst shape of breakage a pack can carry: a path like `SelectedItem.tag.Foo` still parses and still runs; it just resolves to nothing, so neither the command parser nor a load-time check can see anything wrong and the pack fails silently in game. Both spellings are repaired (the dot path, including subscripts, and the brace form inside a selector), and this one runs unconditionally rather than behind a parse check, because on 1.21 no item stack carries a `tag` field in any context, so there is no valid path of that shape to break. Quoted text is skipped and the commands whose payload is free text are excluded, so a `tellraw` that happens to mention one is left alone.
- **`set_block` reaches legacy packs that used it as a block action.** In Apoli it is a block action and places at the block the power was aimed at. Because the translator flattens a block action into an entity action, adding the block-side verb alone would not have reached these packs at all; the fix is the context resolution above, which is what makes the flattened form land in the right place.
- **A legacy repeating action that names no `interval` fires once a second, not twenty times.** Apoli's `action_over_time` defaults its interval to 20 ticks, and packs lean on that: leaving the field out is normal upstream. Our compatibility layer defaulted it to 1, so such a power ran its action on every tick, which is twenty heals, twenty particle bursts or twenty command executions a second, and a pack tuned around the upstream pace ran twenty times hot with nothing in its file to show why. The default is now 20, matching Apoli and matching our own `condition_passive`, which has said 20 all along. A power that writes its own `interval` is untouched.
- **The compat layer's night-vision and diet mappings outlive the alias table.** Five well-known Origins powers (`night_vision`, `cat_vision`, `water_vision`, `carnivore`, `vegetarian`) were compiled into two retired NeoOrigins type names that only still load because the legacy remap catches them on the way in, and that remap is scheduled to go. They now emit the canonical forms directly: an ambient, particle-free `persistent_effect` for the visions, and an event-cancelling `action_on_event` diet gate for the two food rules, each byte-matching what the remap produced. Nothing changes in game, which is the point: when the aliases retire, these five keep working instead of being the surprise.
- **Two condition ids that never existed stop being claimed as supported.** `neoorigins:lava` and `neoorigins:water` sat in the compat condition catalogue with no implementation behind them, put there by a build-time audit that misread the fluid ids inside `submerged_in` and `fluid_height` as condition types. A pack writing one was told nothing, since the id was "known", and the condition then failed anyway. Both are gone, the audit no longer manufactures them, and writing one now earns the ordinary unknown-type warning that points you at `in_water`, `in_lava` and `submerged_in`, which are the conditions that exist.
- **The game starts again if you have The One Probe installed.** This one blocked the mod outright rather than degrading it, and it took no unusual setup to hit: installing TOP alongside NeoOrigins was enough. TOP publishes its version as `1.21_neo-12.0.8`, and NeoForge compares version ranges piece by piece from the left, so our lower bound of 12 was tested against the leading `1` of the Minecraft version and failed every time. The `12.0.8` was never reached. The message named the right numbers and still made no sense to read: "only supports theoneprobe 12 or above. Currently, theoneprobe is 1.21_neo-12.0.8". NeoForge enforces a range even on an optional dependency, so this was a hard stop at startup. The bound is gone, and it was never doing anything: the integration is already behind a check for whether TOP is loaded, with every TOP-specific reference confined to its own package, so an old or missing TOP cannot reach the code either way.
- **Dragon Survival and the origin picker stop knocking each other off the screen.** Both mods open a screen when you join, Dragon Survival when its species-choice setting is on and NeoOrigins because the server asked for a pick, and whichever arrived second replaced the first. That is how players were being thrown out of the origin picker, and because it was a race, which screen you lost was not even consistent between joins. The old setting was a plain on/off switch whose two positions were "leave the race alone" and "cancel Dragon Survival's screen outright", so neither of them was what most people wanted. It is now `compat.dragon_species_screens`, with three positions: `DEFER`, the new default, holds Dragon Survival's screen back and opens it the moment the origin picker is finished, so neither mod loses its screen; `SUPPRESS` cancels species screens, as the old "on" did; `ALLOW` never interferes, as the old "off" did. The interception runs both ways, so it does not matter which mod wins the race. Under `DEFER` and `ALLOW`, a species screen you opened yourself (from an altar, the inventory button or a command) is left alone; only one that would trample the picker is caught. Dragon Survival's appearance editor, skins, abilities and inventory are never touched under any setting. It is a client setting, so nothing changes on the server or in Dragon Survival's own config. See [COMPATIBILITY.md](docs/COMPATIBILITY.md).
- **Three client-config defaults were documented as their opposites.** `hud_ability_display` defaults to `COOLDOWNS_AND_TOGGLES` and was written as `ALL_ACTIVE_ABILITIES`, `default_sort` defaults to `MANUAL` and was written as `CLASS`, and `always_show_icon` was described as having no effect under the default mode when the default mode is exactly where it matters. All three are the shape of error that costs nothing at load and shows up as a HUD or a picker that does not look the way the page said it would. See [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **Origin layers merge additively, not by replacement.** The cookbook told authors that a second pack's layer file replaces the `origins` array and that they should therefore copy the full list across, which is both wrong and the opposite of the sentence immediately before it in the same paragraph. Layers merge by appending, deduplicated by id, with `"replace": true` as the opt-out. Copying the full list was at best redundant and at worst a maintenance trap, since the copy goes stale the moment the original pack adds an origin. The ordering rule is spelled out alongside it: display order comes from each origin's own `order` field, not from position in the array. See [COOKBOOK.md](docs/COOKBOOK.md).
- **The legacy-pack repairs are written down.** [COMPATIBILITY.md](docs/COMPATIBILITY.md) gains a section covering every syntax-level repair applied while a 1.19/1.20 pack is read, what each one does, and what is deliberately not covered. That last part is the one that matters when a pack still misbehaves. `SkullOwner` is called out by name: it became the profile component, it is not in the mapped set, and a legacy pack handing out a named player head gets a blank one with no warning.
- **`starting_equipment`'s plural form is documented.** The type has taken a `stacks` array for some time and the reference described only the single-item shape, so multi-item kits were being written as several powers. The two shapes do not combine, since a non-empty `stacks` ignores the root item entirely, and one `grant_id` seals the whole bundle, so a single bad item id is worth planning around. Both are now spelled out with a worked example. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`prevent_entity_render` and the evolution prompt describe what the code does.** The former hides living entities only, so boats, minecarts, item frames and dropped items were never candidates despite the page saying every entity was. The latter had no written description of when the prompt appears or what declining does; [EVOLUTION.md](docs/EVOLUTION.md) now has one, and [KUBEJS.md](docs/KUBEJS.md) lists the `evolutionDeclined` event beside it with the conditions under which it fires.
- **An Orb of Origin does reset your evolution, whatever the page said.** [EVOLUTION.md](docs/EVOLUTION.md) claimed the orb left essence kills, tier and a declined tier untouched, and that only two things could clear a decline. Spending an orb clears all three fields, so three things clear a decline, not two. This is worth calling out rather than quietly fixing, because the cookbook had it right on the same page-set: the two documents contradicted each other, and if you planned around the wrong one, an orb has been resetting more than you expected all along.
- **A native `active_ability` can use a named hotkey, whatever the reference said.** [POWER_TYPES.md](docs/POWER_TYPES.md) and [API.md](docs/API.md) both stated it could not, and sent authors off to rewrite the power as an Apoli-style `origins:active_self` to get one. It was never true: `key` is not on the codec, but the loader reads it out of the power's own JSON for every active power, native ones included, and binds it like any other. Both denials are gone and `key` now has a row in the `active_ability` table. `neoorigins:toggle` went the other way and has lost the field: it declared `key`, so both editors offered it and the schema accepted it, but a toggle is not an active power and a keypress had nothing to run even once it arrived. The toggle section says so now, and points at the `active_ability` that flips it.
- **The power reference's field tables were re-read against the codecs.** Four sections listed fields the codec never reads or carried no table at all, and three types had no section anywhere: `apugli:action_on_jump`, `apugli:action_on_target_death` and `action_over_time`. Eleven fields were marked required that are not, and each now says what actually happens instead, which is rarely nothing: a modifier seam given neither `modifier` nor `modifiers` is not refused by the schema, but the loader drops the whole power rather than leaving the multiplier sitting at 1.0. Two entries were simply false. `biome_buff` with no `biome_tag` does not apply everywhere, it applies nowhere, the default being an empty tag that matches no biome; and the root `amplifier` on the `persistent_effect` family overrides the first `effects` entry alone rather than cascading onto all of them, winning even over one that entry sets for itself. `enabled`, the per-power kill switch, is written up on the six types that take it. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **The rest of the reference was re-read against the code, not against the older prose.** Four more claims did not survive it. The Caveborn's diet section listed five eating powers when there are seven. The copper tint was described as green-orange; it is orange. The burning-under-Emerald-Reprieve note explained itself with a rule about fire immunity that is not how the game works: Fire Resistance cancels fire damage and never puts the fire out, and it is the sunlight power re-lighting you each second that keeps you alight. And the compatibility page promised that a Dragon Survival species screen you opened yourself always behaves as it would without NeoOrigins installed, which holds under `DEFER` and `ALLOW` but not under `SUPPRESS`. Two sentences describing what Apoli itself declares have been rewritten to describe only what NeoOrigins does, since we cannot verify the first kind and that is exactly how the others got in.
- **`gameplay.toml` and `admin.toml` have reference pages at last.** Two of the four config files had none, so the options between them (the Orb's XP cost formula, random assignment, the evolution kill thresholds, ocean-origin survival tuning, the command-power blacklist, dimension restrictions) were configurable and written down nowhere but the file's own comments. [GAMEPLAY_CONFIG.md](docs/GAMEPLAY_CONFIG.md) and [ADMIN_CONFIG.md](docs/ADMIN_CONFIG.md) now cover every section, key, default and range. [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md) also stops calling all four files server configs, because only `content.toml` is one: it alone is synced to clients and overridable per world, while the other three load early, apply to the whole install, and enforce server-side. The distinction decides where you edit and whether a per-world copy will be honoured, which is exactly the thing to get right on a page about config files.
- **The event contexts say what a handler is actually handed.** Eight of them had drifted: `hit_taken`, `kill` and `projectile_hit` all carry the live, cancellable event in their context and the page did not say so; `death`'s context *is* the event; `land` has a second dispatch site (a per-tick ground-contact detector for landings the fall path never sees) where the context is empty and `cancel_event` deliberately does nothing; and the paragraph on `mod_break_speed` described a removed event as though it still fired. Alongside them, `add_velocity` gains its missing `space` row with all eight Apoli reference frames, `dash` its `set_velocity`, and `spawn_projectile`'s count admits it defaults to 1 for a plain projectile and 2 for an orb trail. See [EVENTS.md](docs/EVENTS.md) and [ACTIONS.md](docs/ACTIONS.md).
- **The API index is exhaustive again, and now provably.** [API.md](docs/API.md) promises a complete list of everything registered, and it had fallen to roughly two thirds on conditions and actions: 21 conditions, 17 actions and 17 events were registered, working and listed nowhere, so a reader took the absence as the feature not existing, which is the same failure 2.2.25 fixed for power types. All four lists were regenerated from the registries (122 power types, 108 conditions, 95 actions, 51 events, with the 26.2 build counting two types and one action fewer, the KubeJS-backed ids it does not ship) and verified by script in both directions, so an id in the code is on the page and an id on the page is in the code, with zero exceptions either way. The page's description of how legacy packs are translated was corrected in the same pass: `origins:` and `apace:` go through the translator, `apoli:` and `apugli:` are canonicalized to `origins:` first, and the legacy alias table covers only the odd cross-mod id rather than being the pipeline itself.
release
NeoOrigins v2.2.26 (MC 26.1.x)
v2.2.26+26.16 сент. 2026 г.38Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A compatibility and origin-content release, led by a startup failure. Installing The One Probe alongside NeoOrigins was enough to be refused at launch, over a version bound that compared our lower bound against the wrong part of TOP's version string. It had never protected anything, and it is gone. Six new pack-author capabilities follow, most of them out of getting one legacy Origins pack to run untouched: a morph can play one of the mob's own animations, or run one of the entity events the game uses to make a mob swing, sparkle or shake; `pose` holds the player prone, crouched or upright, which is what a crawling or a serpentine origin needs; `prevent_entity_render` hides entities from a single player; `using_effective_tool` asks whether the swing a player is making is a productive one; and `mod_food_nutrition` changes what a meal is worth as it goes down. The origin picker gains two more shapes for the two things people kept asking for (#127): a carousel for anyone who preferred the original mod's chooser, and a grid of cards for anyone who wanted a whole layer visible at once, with the two-panel screen unchanged as the default. Dragon Survival no longer fights it for the screen at join either: whichever mod loses that race now has its screen held and reopened instead of dropped. The Caveborn get copper and emerald diets filling the two gaps in the ore ladder, water breathing and fire resistance to go with them, a wash of the ore's own colour for as long as its effect runs, and descriptions that finally admit the diets refuse on a full stomach. All seven of their diets are rebuilt on common tags, so a modded metal or stone is food without a pack touching anything, and what you eat is now worth what it is: a block feeds twice what an ingot does and holds its effect three times as long, a nugget is worth almost nothing, and ore goes down in creative mode the way bread always has. A pack written for 1.19 or 1.20 gets four more of its breakages repaired as the file is read, with no edit to the zip, and four legacy power mappings that dropped their power silently now land, with the rest walked end to end so none of them can. Alongside those: declining an evolution keeps it declined, fire-immune origins stop burning on campfires and blazes (#129), a fire-resistant helmet shades without wearing out, a slime rehydrates from a water cauldron and from a water bottle, the step-up ability gained an off switch for everyone it kept walking up the block they meant to step down from (#123), the web editor's form view stops refusing to switch off a setting that defaults to on while its block canvas stops writing back fields nobody ever set, an event name a pack guessed at costs it a hook rather than the whole power, a legacy repeating action that names no interval paces itself at Apoli's once a second instead of every tick, the in-game creator checks its ids as strictly as the web editor always has, and the reference has been re-read against the loader in the places it had drifted, gaining pages for the two config files that never had one.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **The origin picker comes in three shapes now (#127).** It had one: a scrolling list on the left, details on the right. Players who came from the original Origins mod kept asking for its one-at-a-time chooser back, and others wanted a whole layer visible at once. Both are choices rather than replacements. The client setting `ui.picker_layout` takes `TWO_PANEL`, the default and unchanged; `CAROUSEL`, one origin at a time with arrows to step through them; and `GRID`, a wall of origin cards that fits as many as your window allows and pages the rest. A card carries the icon, name and impact dots but has no room for a description, so clicking one opens the same full detail read the other layouts use, and Back returns you to the wall. The search box filters the wall as you type, and the arrow keys page it unless the box has focus. The carousel is a NeoOrigins screen shaped like the original rather than a copy of it, so it keeps whatever theme you are running instead of the old dirt-background window, and browsing in it *is* selecting: Confirm always applies to whatever is on screen. Layout and skin are independent. `theme_override` and `classic_picker_style` still control colour and font, and any skin works with any layout. See [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **A fire-resistant helmet shades you without wearing out.** Origins that burn in daylight wear down the helmet protecting them, which is right for an ordinary hat and wrong for one that already survives lava. Netherite helmets now shade for free, the way unbreakable ones always did. It keys off the item's own fire-resistant property rather than a list of names, so a modded helmet that grants itself the same property is covered without us naming it.
- **Declining an evolution keeps it declined.** The prompt to evolve was re-offered on every kill after the requirement was met, so refusing it bought a few seconds of quiet and nothing more, and a player near their next tier spent the rest of the session being asked. A decline is now remembered against the tier it was made at, and nothing re-offers that tier: not more kills, not a relog. It stays quiet until you ask for it yourself with `/neoorigins evolve accept`, an operator sets your tier, or you spend an Orb of Origin, which resets the ladder to zero outright. The tier is not lost by declining it, only muted, and accepting clears the record so the tier above it prompts normally once its own threshold is reached. See [EVOLUTION.md](docs/EVOLUTION.md).
- **The Caveborn's diets say they will not go down on a full stomach.** All eight of them (the Caveborn's seven ores and the Nether origin's fungal diet) refuse when the hunger bar is already full, which is deliberate and matches ordinary food. Nothing said so, and the refusal is completely silent: no message, no eating animation, no sound, so a player at full hunger reads it as the power being broken rather than as being full. Every one of those descriptions now ends by saying it, in all twelve languages the mod ships. The stone diet's list also gained cobbled deepslate, which it has always eaten and never mentioned.
- **The Caveborn eats copper, and copper lets them breathe.** The diet ladder jumped straight from stone to iron, skipping the ore a player turns up more of than any other on the way down. Copper now feeds for 3 hunger and 0.6 saturation, which places it neatly between stone and iron, and eating it grants Water Breathing I for a minute. The effect is picked for the gap it fills rather than for the flavour: a Caveborn sees in the dark, ignores the drop and mines bare-handed, but a flooded ravine or a drowned mineshaft stopped them the same as anybody, and copper is what they are already picking up on the way to one. Ingots, raw copper, both ores and both kinds of copper block all count. Like the other six diets it is a tag, `neoorigins:caveborn_eat_copper`, so a pack adds a modded copper to it without replacing the power.
- **The Caveborn takes on the colour of the ore they ate.** Six of the seven diets grant an effect, and while one was running there was nothing about the player that showed which one, least of all to anybody looking at them from the other end of the shaft. The model is now washed in that ore's own colour for as long as its effect lasts, sampled from the item rather than picked by hand: copper orange, iron pale grey, gold yellow, diamond cyan, emerald green, netherite a dark brown. Eat two and the colours average. Nothing about the buffs changes, and each of the six is its own switch in `power_overrides.toml`, from `caveborn_copper_tint` through `caveborn_netherite_tint`, so a server that wants the diets without the colour can turn off as many of them as it likes. Stone has no tint, having no effect to signal. See [ORIGINS.md](docs/ORIGINS.md).
- **Emerald is the seventh diet, and it buys a trip to the surface.** The Caveborn's one real cost is that daylight burns them, and nothing in the origin ever answered it: you either stayed under or you took the damage. Emerald now feeds for 7 hunger and 1.4 saturation, filling the gap the ladder had left between diamond and netherite, and eating one grants Fire Resistance for five minutes. The sunlight damage was always dealt as fire, so this cancels it outright rather than blunting it, and it covers lava on the way back down, which is the other thing that kills miners. Emeralds, both emerald ores and blocks of emerald all count, through `neoorigins:caveborn_eat_emerald`. You will still catch fire: Fire Resistance cancels the damage but does not put the flames out, and the sunlight power re-lights you every second you are exposed, so those five minutes above ground are spent visibly alight and entirely unharmed. Step into shade or water and the burn runs out on its own. Emerald is the one Caveborn diet with a renewable supply, since a villager will trade for it.
- **A block of ore feeds a Caveborn like a block, and a nugget like a nugget.** Every form of a material was worth the same meal, so a raw iron block and a single ingot both restored 4 hunger, and the block was worth eating only if you had nothing else to hand. The nugget was the inverse and the worse half of it: nine nuggets restored 36 hunger where the ingot they make restored 4, and nether gold ore drops nuggets rather than ingots, so the least valuable form of gold in the game was by a wide margin the most efficient food in the origin. What you eat is now worth what it is. A block feeds twice what an ingot or gem does and holds its effect three times as long; a nugget feeds 1 hunger with no saturation and buys fifteen seconds. A block is deliberately not worth the nine that a crafting recipe would suggest, because hunger caps at 20 and most of that food would be discarded the moment it was granted, so the duration is where the value went instead. The arithmetic that matters is that an ingot at 4 hunger and 6.4 saturation now stays ahead of the nine nuggets you could split it into, which is the comparison the old numbers had backwards. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **The step-up ability has an off switch (#123).** An origin or class that steps a full block does it whether you want it to or not, and holding shift does not suppress it, so edging up to a drop or lowering yourself onto a ledge walks you straight up the block you were working around. The game offers no way to ask for a step height that yields to sneaking, so the answer is a switch rather than a rule. The Explorer's *Climber's Step*, the Rogue's *Parkour* and the Scout's *Tracker's Stride* now share a *Step Assist* ability that turns the step height off and back on, with a low note for off and a high one for on. It defaults to on, so nothing changes for anyone who never presses it, and the state is saved with the rest of your toggles rather than springing back on at the next login. With it off you climb blocks by jumping, the same as everybody else.
- **Fire-immune origins stop burning on campfires and blazes.** (#129) The immunity checked four damage types by name (standing in fire, being on fire, lava and magma blocks), which left out campfires and both kinds of fireball, so an origin that is supposed to be unburnable took full damage from a blaze and cooked on a campfire like anyone else. It now asks the game's own `minecraft:is_fire` tag instead of a hand-written list, which covers those cases, agrees with the matching condition that was already using the tag, and picks up fire damage added by other mods without further work.
- **The web editor's form view can turn a default-on setting off.** Any boolean whose default is `true` could not be set to `false` from the form view: the row drew itself unchecked while the power actually behaved as switched on, and ticking the box and clearing it again wrote nothing at all, so the setting looked changed and was not. An unset field now seeds from the schema's declared default rather than a flat `false`. This affected 68 default-true booleans across the shipped power, action and condition schemas.
- **The block editor stops writing fields you never set.** A block widget has to display something, so an optional field the power does not carry gets drawn with a stand-in, and the canvas was writing every one of those back when it saved. One drag of an unrelated block was enough to turn a damage-halving power into total immunity, because `modify_damage` came back carrying `set_total: 0`, a field whose own reference entry says to leave it out if you want the multiplied value kept. Nothing on screen looked any different. A leaf still equal to the stand-in the widget had to show is now left out on the way back, and the fields the loaded file genuinely carried are tracked alongside it, so an author who deliberately means a zero keeps it. Powers the canvas cannot draw are put back at their original position rather than at the end, since the order powers are written in is authored data too.
- **An `area_of_effect` inside a lingering cloud stays with the cloud (#125).** The interval action a lingering area runs is executed as the caster, which is right for kill credit and for anything that spends a resource, but it also meant an area effect nested inside it measured its radius from wherever the caster was standing at that moment. Walk away from your own cloud and the damage walked with you, leaving the cloud drawing particles over nothing. The action still runs as the caster; an `area_of_effect` inside it now centres on the cloud.
- **The Merchant's restocked trades stop showing as sold out.** The class refills nearby villagers' trades on a timer, but it refilled them server-side only. A trade's sold-out cross is drawn from the copy of the offers the client was handed when the screen opened, so a trade that had just been refilled kept its cross, and the only way to clear it was to close the villager and open it again. The refill now resends the offers to whoever has that villager open, which is what vanilla's own restock does. It sends nothing when nothing was actually refilled, so an open trading screen no longer takes a packet every couple of seconds for the life of the interaction.
- **Ore goes down in creative mode, the way bread always has.** A Caveborn in creative could not eat any of their seven diets, while every vanilla food in the game ate normally, and because the refusal is silent it read as the power being broken rather than as a rule. Our gate asked whether the hunger bar had room, and creative mode is precisely the case where it never does. It now asks the game's own question instead, which is invulnerable or always-edible or genuinely hungry, at both places that had to know, so the two can no longer drift apart. Fixing that surfaced the other half of the same problem: the meal took one from the stack unconditionally, where vanilla food leaves a creative player's stack alone. It now spends the item through the same call vanilla uses, which declines to spend anything for a player with infinite materials. Both halves apply to every `edible_item` power, not only to the Caveborn's.
- **A slime rehydrates from a water cauldron and from a water bottle.** The moisture bar refilled from water, rain and bubble columns, which is the game's own in-water test, and a water cauldron does not answer to it: a cauldron is a block carrying a level, not a body of water. A slime standing in a full cauldron therefore dried out at exactly the rate of one standing on bare stone, which is the opposite of what anyone builds a cauldron for. Standing in one now refills at the same rate open water does. Drinking a water bottle tops the bar up as well, by half its length, which gives a drying slime something it can carry rather than a source it has to reach. Neither of these is new ground, and that is the point: `breath_out_of_fluid` has handled the cauldron and the bottle for aquatic origins for some time, and the moisture bar simply never got the same treatment. The bottle amount is `water_bottle_refill` on the power, so a pack can retune it or set it to 0 to leave water bottles out of it entirely. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:pose` holds the player prone, crouched or upright.** A forced pose is the missing piece for a crawling origin, a serpent that never stands, or a form that cannot fit through a full-height door: `"pose": "swimming"` puts the player flat, which carries the one-block hitbox and the crawl animation everywhere, not only in water. It is a power rather than an action because the pose has to be held and then released, and it takes the usual `condition`, plus `toggleable` and `default_off` and a HUD icon, so a pack can hand the switch to the player. Clearance is deliberately not checked: a forced crawl fits through gaps the player otherwise could not, and whether that is too strong is the pack's call. Releasing it hands the player back to the game, which does check, so nobody ends up standing inside a ceiling. Sleeping, gliding and spin-attack are not offered: those poses carry behaviour a pose alone cannot deliver. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:prevent_entity_render` hides entities from the player who has it.** Every living entity matching `entity_condition` stops being drawn for that player alone; everyone else sees it normally and the entity itself is untouched, so it still moves, still attacks and still blocks the way. Pair it with something that applies glowing for an origin that sees only what it has marked. The condition is evaluated on the server, which is what lets it use `status_effect` and `nbt`: a client is never told another entity's effects, so a client-side check would have quietly matched nothing. The hidden set refreshes every five ticks over living entities within view distance, capped at 1024 per player. `origins:prevent_entity_render` maps onto it, so a legacy pack using it works now rather than loading it as an unsupported no-op.
- **A morph can play the mob's own animations.** `neoorigins:trigger_morph_animation` names a triggerable animation on the GeckoLib model a player is morphed into, and it plays for everyone who can see them. It needs no dependency and no packet: GeckoLib's own trigger call already routes a client-side entity straight into its animation manager, and the morph is a real client-side entity rather than a static model, so it takes that path for free. One hard limit worth knowing before you plan around it: the only reachable names are the ones the mob's author explicitly registered as triggerable; an unregistered name does nothing at all and logs nothing; and there is no way to discover the list from JSON. Vanilla mobs are not GeckoLib models and do nothing here. AzureLib is shaped the same way and could follow; Citadel is not. See [ACTIONS.md](docs/ACTIONS.md).
- **A morph can run the mob's entity events.** `neoorigins:morph_entity_event` fires the hook the server normally uses to tell clients a mob just did something, whether that is an iron golem's attack swing, a villager's angry particles or a wolf shaking off water, so a morph reacts like the mob instead of only sharing its silhouette. The names come from Minecraft's own table rather than a hand-copied list, so they track the game version, and a raw `id` byte is there for modded mobs with events of their own. Three limits are documented rather than papered over: events whose sound plays through the entity itself are silent on a morph, events that set a countdown for the mob's own tick to drain hold that pose instead of playing through it, and particle events that read the mob's movement draw their particles streaking in from the world origin instead. The death byte is refused outright, because on a morph it would fire a client-side death for an entity that was never in the world.
- **`set_block` places where you aimed.** It was an entity action only, and it placed at the target's feet, so a right-click power aimed at a block changed the ground the player was standing on instead of the block they clicked. It now resolves the position from whatever context it runs in (a block or bonemeal interaction, a projectile or raycast hit, a `block_action_at` or `offset` wrapper), and falls back to the actor's own position when there is no block context, which is what it always did. It is also a block-target verb now, so it can be named directly inside `block_target_action` alongside `strip`, `till`, `path`, `grow` and `transform_block`. The `keep` field, which places only into air, was never documented.
- **`item_condition` gates right-click powers instead of being dropped.** Apoli's `action_on_block_use` and `action_on_entity_use` both take an `item_condition` meaning "only with this in hand", and the translator never copied it, so a power that was supposed to fire only while holding a specific item fired for whatever the player happened to be carrying. It is carried across now, along with Apoli's newer `held_item_condition` spelling, and the gate reads the stack out of the interaction rather than only out of a food context. Copying the field alone would have made every one of those powers fail instead, since the gate fails closed and had nothing to read. `action_on_block_break`, `wake_up` and `bonemeal` carry no item gate across. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`neoorigins:using_effective_tool` asks whether the swing you are making is a productive one.** It matches Apoli's condition of the same name and takes no fields. It answers two things at once, and the first is the half that is easy to get wrong: it is true only while the player is part-way through breaking a block *and* holding a tool that will actually yield its drops. It is false whenever the player is not mid-break, so it cannot be used to ask "am I holding a pickaxe". A power gated on it fires during mining and at no other time, which makes it the right gate for a mining-flavoured effect and the wrong one for an equipment check. See [CONDITIONS.md](docs/CONDITIONS.md).
- **`edible_item` can pay a different amount for one part of its set.** The type read a list of items and tags and paid one number for all of them, so anything whose worth varies by form (an ore against its block, an ingot against its nugget) needed a second power, a second tag and a second copy of every field it shared with the first. The new `tiers` list puts those bands inside the one power. Each entry carries its own `items` or `tags` and its own `nutrition`, with `saturation` optional and inherited from the power when it is left out. First match wins, so write the narrow bands first, and anything matching none of them falls back to the power's own values. Bands match alongside the top-level lists rather than within them, so a tier can introduce items the power never otherwise mentions. One thing to know before you tune one: saturation is restored as nutrition times the modifier times two, so a band that doubles both grants four times the saturation, which is almost never what was meant. Leaving `saturation` off is the right default. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **All seven Caveborn diet tags are built out of common tags.** The stone diet listed its ten blocks inside the power, so it was the one diet a pack could not extend without replacing the whole file, and the other six listed vanilla item ids, so a modded metal was not food until somebody added it by hand. Every one of them is a tag now, and every one is a union of NeoForge's `c:` tags: the six materials take their `ingots/`, `nuggets/`, `gems/`, `raw_materials/`, `ores/` and `storage_blocks/` entries, and stone takes `#c:stones` and `#c:cobblestones` alongside basalt and blackstone. A modded metal or stone that registers itself where mods normally do is edible with no pack work at all. `netherite_scrap` is the one literal id left in the set, since NeoForge publishes no common tag for that item. The rebuild closed a gap nobody had reported as such: the refined storage blocks were in none of the old lists, only the raw ones, so a Caveborn could eat a raw iron block and not an iron block. Adding your own item to a tag works exactly as before, and it lands in the matching value band if there is one. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`mod_food_nutrition` changes what a meal is worth as it is eaten.** Nutrition could be retuned only through the legacy `origins:modify_food` power, so a pack working in the native vocabulary had no way to reach it and no event to hang a condition on. `action_on_event` now carries a `mod_food_nutrition` event that fires for any food actually eaten, with the item itself in context, so `food_item_in_tag` and `food_item_id` both gate it. It runs after `modify_food` and on whatever that left behind, so a pack can use either or both and neither needs the other to be present. The result is rounded and floored at zero. See [EVENTS.md](docs/EVENTS.md).
- **The in-game creator checks your ids the way the web editor does.** The generated schemas have always carried a pattern for each id-shaped string field, and only the web editor read them: the in-game creator's text rows took anything and left the mistake to surface at load, far from the field that caused it. Each text row now checks its value against the schema's own pattern as you type and shows the same inline complaint the web editor would. It advises rather than blocks, deliberately: the loader is more forgiving than the patterns in a few places (a particle or dimension written without its `minecraft:` prefix loads fine), and an editor that refuses what the game accepts is the failure shape 2.2.26 already removed once. Nothing you can load is ever locked out of saving.
- **`model_color` stacks, and can be switched off from the config.** Two tints active at once resolved to whichever one the capability set happened to hand over first, which is not something a pack can predict or arrange around, so an origin with more than one conditional tint had a colour nobody could design. Overlapping tints now average their channels: two produce their midpoint, three their mean, and every client watching sees the same thing. The type also honours the shared `enabled` flag, so a server owner can drop a single tint from `power_overrides.toml` while leaving the power that carries it in place.
- **Four legacy power mappings that never landed now do.** `origins:aquatic`, `origins:conduit_power_on_land` and `origins:nether_spawn` were each mapped onto a NeoOrigins type that does not exist, so a legacy pack using any of them had the power silently dropped: nothing failed, nothing was logged, the origin simply came up missing an ability. `origins:creative_flight` was worse in a quieter way. It named a type that does exist, just the wrong one, and had done so for five months. All four are retargeted, and every remaining legacy mapping has been walked end to end on both sides rather than only on the name a pack writes, so the mappings that ship are the ones that resolve.
- **An `action_on_event` that names an event which does not exist no longer costs the whole power.** An unrecognised `event` fails the power's decode outright, so a pack that guessed a plausible spelling did not end up with a hook that misbehaved, it ended up with nothing, the ability simply missing from the origin with no sign of why. `item_use_start` is the common guess, and it now resolves to `item_use`, which already fires at exactly that moment for anything with a use duration: a shield going up, a bow drawn, food raised. The accepted spellings are offered by both editors as well, so a pack the game loads is never marked invalid on the way in. A name matching nothing at all still fails loudly rather than being quietly swallowed. Only a spelling whose target already fires at the same instant is ever added this way, since a name pointed at a different moment would load and then do the wrong thing, which is worse than the refusal it replaced. See [EVENTS.md](docs/EVENTS.md).
- **A pack that writes `neoorigins:` where it meant `origins:` is salvaged rather than dropped.** The compatibility power types answer to `origins:` and `apace:` and nothing else, so an author writing `neoorigins:action_on_item_use` got the power dropped outright, with no line in the log explaining why. It is an easy mistake to make, since the mod is called NeoOrigins and every other type they write really does start with `neoorigins:`. Such a type is now rewritten back to `origins:`, but only when the name is one the compatibility layer actually handles and there is no native type of that name, so the 34 names that exist in both vocabularies keep resolving natively. The "unknown power type" warning is more useful too: powers, actions and conditions share a namespace and a naming style, so it now tells you which of the three an unrecognised id actually belongs to.
- **The loot function 1.20.5 deleted no longer takes the whole table down with it.** `minecraft:set_nbt` is gone, and a loot table naming it fails to parse outright, which cascades into every function and advancement that referenced the table, so items a legacy pack was supposed to hand out simply never arrived, with the failure logged somewhere far from the cause. It is retargeted to `minecraft:set_custom_data`, which takes the identical field, as the file is read. It is not an NBT-to-components converter and does not pretend to be: a blob carrying a key that became a real data component is left exactly as it was and reported, so the table still fails, but it fails loudly instead of quietly handing out an item with its enchantments missing.
- **A legacy `starting_equipment` written with a singular `stack` grants it.** Packs in the wild are written with both spellings; NeoOrigins read only the plural, so a power using the singular was skipped and gave the player nothing, without an error. Both spellings are read now, with the plural winning where a pack has somehow written both. See [COMPATIBILITY.md](docs/COMPATIBILITY.md).
- **Item NBT paths that step through the deleted `tag` field are repointed.** 1.20.5 removed `tag` from item stacks, and this is the worst shape of breakage a pack can carry: a path like `SelectedItem.tag.Foo` still parses and still runs; it just resolves to nothing, so neither the command parser nor a load-time check can see anything wrong and the pack fails silently in game. Both spellings are repaired (the dot path, including subscripts, and the brace form inside a selector), and this one runs unconditionally rather than behind a parse check, because on 1.21 no item stack carries a `tag` field in any context, so there is no valid path of that shape to break. Quoted text is skipped and the commands whose payload is free text are excluded, so a `tellraw` that happens to mention one is left alone.
- **`set_block` reaches legacy packs that used it as a block action.** In Apoli it is a block action and places at the block the power was aimed at. Because the translator flattens a block action into an entity action, adding the block-side verb alone would not have reached these packs at all; the fix is the context resolution above, which is what makes the flattened form land in the right place.
- **A legacy repeating action that names no `interval` fires once a second, not twenty times.** Apoli's `action_over_time` defaults its interval to 20 ticks, and packs lean on that: leaving the field out is normal upstream. Our compatibility layer defaulted it to 1, so such a power ran its action on every tick, which is twenty heals, twenty particle bursts or twenty command executions a second, and a pack tuned around the upstream pace ran twenty times hot with nothing in its file to show why. The default is now 20, matching Apoli and matching our own `condition_passive`, which has said 20 all along. A power that writes its own `interval` is untouched.
- **The compat layer's night-vision and diet mappings outlive the alias table.** Five well-known Origins powers (`night_vision`, `cat_vision`, `water_vision`, `carnivore`, `vegetarian`) were compiled into two retired NeoOrigins type names that only still load because the legacy remap catches them on the way in, and that remap is scheduled to go. They now emit the canonical forms directly: an ambient, particle-free `persistent_effect` for the visions, and an event-cancelling `action_on_event` diet gate for the two food rules, each byte-matching what the remap produced. Nothing changes in game, which is the point: when the aliases retire, these five keep working instead of being the surprise.
- **Two condition ids that never existed stop being claimed as supported.** `neoorigins:lava` and `neoorigins:water` sat in the compat condition catalogue with no implementation behind them, put there by a build-time audit that misread the fluid ids inside `submerged_in` and `fluid_height` as condition types. A pack writing one was told nothing, since the id was "known", and the condition then failed anyway. Both are gone, the audit no longer manufactures them, and writing one now earns the ordinary unknown-type warning that points you at `in_water`, `in_lava` and `submerged_in`, which are the conditions that exist.
- **The game starts again if you have The One Probe installed.** This one blocked the mod outright rather than degrading it, and it took no unusual setup to hit: installing TOP alongside NeoOrigins was enough. TOP publishes its version as `1.21_neo-12.0.8`, and NeoForge compares version ranges piece by piece from the left, so our lower bound of 12 was tested against the leading `1` of the Minecraft version and failed every time. The `12.0.8` was never reached. The message named the right numbers and still made no sense to read: "only supports theoneprobe 12 or above. Currently, theoneprobe is 1.21_neo-12.0.8". NeoForge enforces a range even on an optional dependency, so this was a hard stop at startup. The bound is gone, and it was never doing anything: the integration is already behind a check for whether TOP is loaded, with every TOP-specific reference confined to its own package, so an old or missing TOP cannot reach the code either way.
- **Dragon Survival and the origin picker stop knocking each other off the screen.** Both mods open a screen when you join, Dragon Survival when its species-choice setting is on and NeoOrigins because the server asked for a pick, and whichever arrived second replaced the first. That is how players were being thrown out of the origin picker, and because it was a race, which screen you lost was not even consistent between joins. The old setting was a plain on/off switch whose two positions were "leave the race alone" and "cancel Dragon Survival's screen outright", so neither of them was what most people wanted. It is now `compat.dragon_species_screens`, with three positions: `DEFER`, the new default, holds Dragon Survival's screen back and opens it the moment the origin picker is finished, so neither mod loses its screen; `SUPPRESS` cancels species screens, as the old "on" did; `ALLOW` never interferes, as the old "off" did. The interception runs both ways, so it does not matter which mod wins the race. Under `DEFER` and `ALLOW`, a species screen you opened yourself (from an altar, the inventory button or a command) is left alone; only one that would trample the picker is caught. Dragon Survival's appearance editor, skins, abilities and inventory are never touched under any setting. It is a client setting, so nothing changes on the server or in Dragon Survival's own config. See [COMPATIBILITY.md](docs/COMPATIBILITY.md).
- **Three client-config defaults were documented as their opposites.** `hud_ability_display` defaults to `COOLDOWNS_AND_TOGGLES` and was written as `ALL_ACTIVE_ABILITIES`, `default_sort` defaults to `MANUAL` and was written as `CLASS`, and `always_show_icon` was described as having no effect under the default mode when the default mode is exactly where it matters. All three are the shape of error that costs nothing at load and shows up as a HUD or a picker that does not look the way the page said it would. See [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **Origin layers merge additively, not by replacement.** The cookbook told authors that a second pack's layer file replaces the `origins` array and that they should therefore copy the full list across, which is both wrong and the opposite of the sentence immediately before it in the same paragraph. Layers merge by appending, deduplicated by id, with `"replace": true` as the opt-out. Copying the full list was at best redundant and at worst a maintenance trap, since the copy goes stale the moment the original pack adds an origin. The ordering rule is spelled out alongside it: display order comes from each origin's own `order` field, not from position in the array. See [COOKBOOK.md](docs/COOKBOOK.md).
- **The legacy-pack repairs are written down.** [COMPATIBILITY.md](docs/COMPATIBILITY.md) gains a section covering every syntax-level repair applied while a 1.19/1.20 pack is read, what each one does, and what is deliberately not covered. That last part is the one that matters when a pack still misbehaves. `SkullOwner` is called out by name: it became the profile component, it is not in the mapped set, and a legacy pack handing out a named player head gets a blank one with no warning.
- **`starting_equipment`'s plural form is documented.** The type has taken a `stacks` array for some time and the reference described only the single-item shape, so multi-item kits were being written as several powers. The two shapes do not combine, since a non-empty `stacks` ignores the root item entirely, and one `grant_id` seals the whole bundle, so a single bad item id is worth planning around. Both are now spelled out with a worked example. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **`prevent_entity_render` and the evolution prompt describe what the code does.** The former hides living entities only, so boats, minecarts, item frames and dropped items were never candidates despite the page saying every entity was. The latter had no written description of when the prompt appears or what declining does; [EVOLUTION.md](docs/EVOLUTION.md) now has one, and [KUBEJS.md](docs/KUBEJS.md) lists the `evolutionDeclined` event beside it with the conditions under which it fires.
- **An Orb of Origin does reset your evolution, whatever the page said.** [EVOLUTION.md](docs/EVOLUTION.md) claimed the orb left essence kills, tier and a declined tier untouched, and that only two things could clear a decline. Spending an orb clears all three fields, so three things clear a decline, not two. This is worth calling out rather than quietly fixing, because the cookbook had it right on the same page-set: the two documents contradicted each other, and if you planned around the wrong one, an orb has been resetting more than you expected all along.
- **A native `active_ability` can use a named hotkey, whatever the reference said.** [POWER_TYPES.md](docs/POWER_TYPES.md) and [API.md](docs/API.md) both stated it could not, and sent authors off to rewrite the power as an Apoli-style `origins:active_self` to get one. It was never true: `key` is not on the codec, but the loader reads it out of the power's own JSON for every active power, native ones included, and binds it like any other. Both denials are gone and `key` now has a row in the `active_ability` table. `neoorigins:toggle` went the other way and has lost the field: it declared `key`, so both editors offered it and the schema accepted it, but a toggle is not an active power and a keypress had nothing to run even once it arrived. The toggle section says so now, and points at the `active_ability` that flips it.
- **The power reference's field tables were re-read against the codecs.** Four sections listed fields the codec never reads or carried no table at all, and three types had no section anywhere: `apugli:action_on_jump`, `apugli:action_on_target_death` and `action_over_time`. Eleven fields were marked required that are not, and each now says what actually happens instead, which is rarely nothing: a modifier seam given neither `modifier` nor `modifiers` is not refused by the schema, but the loader drops the whole power rather than leaving the multiplier sitting at 1.0. Two entries were simply false. `biome_buff` with no `biome_tag` does not apply everywhere, it applies nowhere, the default being an empty tag that matches no biome; and the root `amplifier` on the `persistent_effect` family overrides the first `effects` entry alone rather than cascading onto all of them, winning even over one that entry sets for itself. `enabled`, the per-power kill switch, is written up on the six types that take it. See [POWER_TYPES.md](docs/POWER_TYPES.md).
- **The rest of the reference was re-read against the code, not against the older prose.** Four more claims did not survive it. The Caveborn's diet section listed five eating powers when there are seven. The copper tint was described as green-orange; it is orange. The burning-under-Emerald-Reprieve note explained itself with a rule about fire immunity that is not how the game works: Fire Resistance cancels fire damage and never puts the fire out, and it is the sunlight power re-lighting you each second that keeps you alight. And the compatibility page promised that a Dragon Survival species screen you opened yourself always behaves as it would without NeoOrigins installed, which holds under `DEFER` and `ALLOW` but not under `SUPPRESS`. Two sentences describing what Apoli itself declares have been rewritten to describe only what NeoOrigins does, since we cannot verify the first kind and that is exactly how the others got in.
- **`gameplay.toml` and `admin.toml` have reference pages at last.** Two of the four config files had none, so the options between them (the Orb's XP cost formula, random assignment, the evolution kill thresholds, ocean-origin survival tuning, the command-power blacklist, dimension restrictions) were configurable and written down nowhere but the file's own comments. [GAMEPLAY_CONFIG.md](docs/GAMEPLAY_CONFIG.md) and [ADMIN_CONFIG.md](docs/ADMIN_CONFIG.md) now cover every section, key, default and range. [CONTENT_CONFIG.md](docs/CONTENT_CONFIG.md) also stops calling all four files server configs, because only `content.toml` is one: it alone is synced to clients and overridable per world, while the other three load early, apply to the whole install, and enforce server-side. The distinction decides where you edit and whether a per-world copy will be honoured, which is exactly the thing to get right on a page about config files.
- **The event contexts say what a handler is actually handed.** Eight of them had drifted: `hit_taken`, `kill` and `projectile_hit` all carry the live, cancellable event in their context and the page did not say so; `death`'s context *is* the event; `land` has a second dispatch site (a per-tick ground-contact detector for landings the fall path never sees) where the context is empty and `cancel_event` deliberately does nothing; and the paragraph on `mod_break_speed` described a removed event as though it still fired. Alongside them, `add_velocity` gains its missing `space` row with all eight Apoli reference frames, `dash` its `set_velocity`, and `spawn_projectile`'s count admits it defaults to 1 for a plain projectile and 2 for an orb trail. See [EVENTS.md](docs/EVENTS.md) and [ACTIONS.md](docs/ACTIONS.md).
- **The API index is exhaustive again, and now provably.** [API.md](docs/API.md) promises a complete list of everything registered, and it had fallen to roughly two thirds on conditions and actions: 21 conditions, 17 actions and 17 events were registered, working and listed nowhere, so a reader took the absence as the feature not existing, which is the same failure 2.2.25 fixed for power types. All four lists were regenerated from the registries (122 power types, 108 conditions, 95 actions, 51 events, with the 26.2 build counting two types and one action fewer, the KubeJS-backed ids it does not ship) and verified by script in both directions, so an id in the code is on the page and an id on the page is in the code, with zero exceptions either way. The page's description of how legacy packs are translated was corrected in the same pass: `origins:` and `apace:` go through the translator, `apoli:` and `apugli:` are canonicalized to `origins:` first, and the legacy alias table covers only the odd cross-mod id rather than being the pipeline itself.
release
NeoOrigins v2.2.25 (MC 1.21.1)
v2.2.25+1.21.123 авг. 2026 г.7,3 тыс.Minecraft: 1.21.1neoforge
Что нового
## v2.2.25
> A documentation release, with a run of server-reported fixes riding along. The API reference index linked barely half of its power types. `entity_model`, `restrict_items` and `creative_flight` were documented in full and reachable from nowhere, so a reader who looked one up found nothing and reasonably concluded the feature did not exist. Every type has a row now. The verification pass that followed went back over the reference against the code rather than against the older prose, and it turned into the larger half of the release: fifteen summaries were wrong or misleading about what their class does, five documented fields do not exist under those names, six defaults were wrong, and one power type advertised three verbs that all silently teleport the player somewhere random. The fixes are unrelated to each other and all came from live servers. An invisibility power with a condition on it hid the body and left the armor and held item floating — the unconditional ones always worked, which is why it survived so long. A misconfigured `attribute_modifier` could fill an operator's log for as long as a player held the power, several lines a second, with a message that never said what was wrong. An origin with an empty slot in its power list did not load at all. And a keep-inventory origin dropped the armor it had just promised to keep, but only once your inventory was full, which is what made it look random. A second pass over the older reports found three of them worse than described: a grounded player wearing wings was cutting the elytra sound off for everyone gliding past, the clamp that keeps a phasing origin out of the few blocks it is barred from was collided against every block in range instead, and a player being ridden was the one person in the world who could not see their own rider. Two editor corrections close gaps left open in 2.2.24, and on the compatibility side an Artifacts umbrella finally keeps the sun and the rain off.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
### Changes
- **Ore counts as food for the Caveborn.** The four tags listing what a Caveborn can eat besides stone held ingots, nuggets, gems, raw metal and netherite scrap, and no ore at all, so a Caveborn standing at a freshly exposed vein had nothing in front of it that it could eat. Iron, gold and diamond ore now qualify, along with their deepslate forms, and so do nether gold ore, ancient debris and the raw iron and raw gold blocks. One thing worth knowing: ore is a placeable block. Aiming at a surface places it, as it always did, so eating one means aiming where it cannot be placed. That is the same rule the Caveborn's stone diet has always followed. [ORIGINS.md](docs/ORIGINS.md) lists the tags.
- **The four aquatic origins say what keeps them from drying out.** Dries Out told you two things — air ticks down while you are out of water, and staying too long suffocates you — so every way of stopping the drain was something you had to be told about or stumble into. The description now names them — rain, standing in a water cauldron, Water Breathing, and an active conduit nearby. Abyssal, Kraken, Merling and Siren all read the same, in every language the mod ships. [POWER_TYPES.md](docs/POWER_TYPES.md) says the same beside the type.
### Bug Fixes
- **An invisibility power with a condition hides armor and held items, not only the body.** Powers that turn invisibility on unconditionally were always fine, which is what kept this hidden. The armor-hiding flag was read from the condition-gated capability set, and it only reached the client when something else triggered a power sync — never at the moment the condition itself flipped. So a conditioned power froze the flag at whatever it was worth at the last sync: the body vanished on cue, and the boots and the sword stayed. The flag now comes from the power itself rather than from its live condition state, which is what it always meant ("hide the armor *when* invisible"), and the client already re-checks whether you are actually invisible before hiding anything. Invisibility itself is unchanged. Cosmetic elytra wings and morph state are left alone on purpose: nothing on the client re-checks those, so treating them the same way would draw wings on a player whose condition is not met.
- **A misconfigured `attribute_modifier` reports once instead of every few ticks.** The power re-tries the attachment whenever it should be active and is not. That is the right behaviour while the attachment can still succeed, and a permanent log flood once it cannot. Naming something that is not an attribute is the common way to get there, and the old message never said so. It does now. If the id is a mob effect — `haste`, `night_vision` and friends are the usual ones — it can never resolve as an attribute, and what the effect actually wants is an `apply_effect` action. The warning also names the prefixes that were tried, and repeats for the same id are suppressed.
- **An origin with an empty entry in its power list loads instead of vanishing.** A single `null` in `powers` failed the whole origin, so it never reached the picker, and all you got was one line repeating "not a string" once per empty slot, naming the origin but neither the field nor the position that caused it. The empty entries are now dropped and the origin loads with every power actually named in it, with one warning giving the origin id and how many were skipped. `upgrades` and the `add` / `remove` lists inside `tier_powers` are covered the same way. A trailing comma or a deleted line in a hand-edited file is the usual cause, so it is still worth fixing the file rather than leaving it to the warning.
- **The creator keybinds stop writing a server warning on every press.** `Player X requested the mob creator without permission` was a keybind collision, not something to act on. The open-creator keys ship unbound, the client sends a packet per press, and the server logged each refusal at warning level — so a player whose key overlapped something they use in normal play filled the operator's log just by playing. Both open paths log at debug now. Refusing a save or an apply still warns, on purpose: those are only reachable from inside the creator screen, so a refusal there is worth an operator's attention.
- **The elytra loop stops when you land, rather than starting again twenty times a second.** True of every origin that flies without an elytra in its chest slot. The guard that ends a flight ran its whole body on every tick the player was on the ground, in water or riding, instead of only on the tick the flight actually ended. On your own client that meant the fall-flying flag going on and straight back off once per tick, and the client starts a fresh elytra sound on the rising edge, so the loops stacked and got louder the longer you stood still. The server side reached further than the player it belonged to: it was broadcasting a stop-sound to every player within 64 blocks, twenty times a second, so standing on the ground with wings silenced the elytra of anyone genuinely gliding past. Both halves now fire once, when flight ends.
- **A phasing origin stops sticking inside ordinary blocks.** Phasing powers carry a short list of blocks they are *not* allowed through, and the clamp that enforces it asked the game's general-purpose collision routine to check the player against that list. That routine always adds the surrounding world to whatever list it is handed, so the clamp collided the player against every block within reach — the exact opposite of a blacklist — and a Wraith that strayed near one blocked block froze solid in stone it was entitled to walk through. The clamp now checks the listed blocks and nothing else. The Wraith's own description has been corrected alongside it: it said the Wraith cannot pass obsidian at all, where the apex form is stopped only by bedrock.
- **A player being ridden can see who is riding them.** Everyone else could. A player is never in their own tracking list, so the update naming their passengers was the one packet that never reached them, and their own client went on drawing an empty back until something unrelated forced a refresh. Consent-based mounts already worked around this by resending it by hand, but that is not the only way to end up ridden: the Apoli-compatible mount action, the built-in one, the `mount` power and summoned minions all take a seat directly, and none had that workaround. The resend now happens where a passenger is seated, so every route is covered.
- **Keep-inventory puts everything back where it was, instead of dropping your armor once your bag is full.** Reported from a live server, and the fullness is the whole of it. Everything kept at death went back through the routine that adds an item to your inventory, and that routine only fills the main thirty-six slots. With the wildcard `*` covering every slot you have, the first thirty-six kept stacks refilled the main inventory, and the four armor pieces and the offhand item had nowhere left to go, so the power dropped them on the floor — the one outcome it exists to prevent, and it only happened to players carrying enough to trigger it, which is why it looked arbitrary. Even with room to spare it was never quite right, since armor came back loose in the bag rather than worn. Kept items now return to the exact slot they were taken from, which is empty by construction, because dying is what emptied it. Armor comes back on, the hotbar keeps its layout, and a full inventory can no longer push anything onto the ground.
- **An origin that cannot find its spawn dimension says which one it wanted.** A `spawn_location` naming a dimension that no loaded world provides gave up without a word, which in game reads as picking the origin and simply not being moved, and in the log reads as nothing at all. The warning now names the dimension and the player, so a typo or a missing mod is the first thing you see rather than something to go hunting for.
- **An active conduit keeps an aquatic origin from drying out on land.** The exemption had been in place for months and could never once have fired. The game only hands Conduit Power to a player who is already in water or rain, so an Abyssal, Kraken, Merling or Siren standing on dry ground beside a conduit was never given the effect the exemption goes looking for. The one case that appeared to work was walking ashore near one: the effect carried out of the water, lasted about thirteen seconds, then lapsed with nothing to renew it. That is why it read as working sometimes rather than never. A conduit now reaches a drying-out player anywhere inside the radius it already uses for everything else, and the bubble row refills while you stand in it instead of holding at whatever it had drained down to. Pack authors get the same reprieve in `attribute_modifier`'s `on_land` condition, which was written to stand down under Conduit Power and never once had the occasion to. It does now — for a player whose origin also carries a drying-out power, since that is who a conduit reaches on dry land. An origin without one is unchanged. See [POWER_TYPES.md](docs/POWER_TYPES.md).
### Pack Author Features
- **Block conditions written as `all_of` and `any_of` stop being marked invalid.** Both are the Apoli 2.9+ spellings of `and` and `or`, and the loader has always read them. The block condition catalogue behind the editors, and the generated schema, listed only the short pair, producing the one failure shape an author cannot debug from inside the game: the file works, and the editor says it does not. 2.2.24 documented the workaround of writing `and` and `or` there instead, which you no longer need. Both spellings are now in the catalogue, the schema and the editor pickers, and nothing you have already written changes behaviour. See [CONDITIONS.md](docs/CONDITIONS.md).
- **`status_effect`'s `ambient` and `show_particles` advertise the loader's real defaults.** They were declared the wrong way round — `ambient` as defaulting to false and `show_particles` to true, where the loader does the opposite. A form field or a generated schema told you the inverse of what omitting the key would do. These two are exactly the pair where a wrong default costs nothing at load and shows up only as particles you did not expect, once you are already in game. The reference tables were right all along and are unchanged.
- **The example pack drops a `tick_action` power that never fired.** The Specter's Dimensional Escape declared `action_type: teleport_on_damage` on a type that dispatches nothing, so the origin advertised a teleport that could not happen, and it was the only worked example of the type an author had to copy. It is removed rather than rewritten, since `condition_passive` is what to copy for anything that runs on an interval. The Specter's other nine powers are unchanged. [MIGRATION.md](docs/MIGRATION.md) says what to write instead.
### Compatibility (Mod Integrations)
- **An Artifacts umbrella keeps the sun and the rain off.** Origins that burn in daylight and origins that take rain damage both look for an umbrella before they hurt you, but only Vampires Need Umbrellas ever counted as one, so an Artifacts umbrella held in plain sight did nothing. It works now, held in either hand or worn in a trinket slot, and one umbrella covers both weaknesses rather than only the one it was carried for. What counts as an umbrella is a new `neoorigins:umbrellas` item tag, so a pack can add any other mod's umbrella to it without touching code. [COMPATIBILITY.md](docs/COMPATIBILITY.md) documents the tag.
- **Keep-inventory covers trinket slots, and a kept trinket waits for its slot rather than being dumped in your bag.** On 26.1 and 26.2 the coverage is new: `slots` took only the vanilla categories there, so a Curios ring matched nothing and dropped on death like anything else. All three versions now read `curio`, `accessory` or `trinket` as meaning every trinket slot, or a specific slot id such as `ring` or `necklace`, and the wildcard `*` includes them. A kept trinket goes back into the slot it died in. Those mods rebuild their slot counts on their own schedule after a respawn, so a slot that is not writable the instant you land is usually a matter of timing rather than a slot that is genuinely gone: the trinket is held and retried for three seconds instead of being given up on, and only after that does it fall back to your inventory, and to the ground only if that is full as well. Logging out part-way through settles it the same way rather than losing it. Curios is read on every supported version; Accessories on 1.21.1 only, as it has no 26.1 or 26.2 build. [POWER_TYPES.md](docs/POWER_TYPES.md) documents the slot names.
- **`equipped_item` with `equipment_slot: accessory` reads your trinkets on 26.1 and 26.2.** 1.21.1 already did. A slot name the mapper does not recognise falls through to the mainhand, so on those two versions the condition quietly answered about whatever the player happened to be holding. It never errored and never logged, which is the hardest kind of wrong condition to find: the file looks correct, and the power simply behaves as though you had asked about the held item. It now inspects equipped trinkets, with an optional `slot_type` to narrow to a single named slot. [CONDITIONS.md](docs/CONDITIONS.md) documents both fields.
### Documentation
- **The API reference index lists every power type.** It listed barely half of them, so a reader looking up `entity_model`, `restrict_items` or `creative_flight` found no row and no link. Every documented type has one now, including a new group for the mod-compatibility types. Four rows were wrong rather than missing: `sneaky`, `stealth`, `no_projectile_divergence` and `tick_action` sat under retired aliases, but none is an alias: all four are registered types with their own implementations. They move to their live categories, and `night_vision`'s replacement is named correctly as `persistent_effect`. See [API.md](docs/API.md).
- **Fifteen power-type summaries corrected against the code.** Each was re-read against its implementation class rather than against the older prose. The ones that change what you would write: `tick_action` dispatches nothing at all, so "run an action on a repeating interval" described a feature that is not there; `no_projectile_divergence` pointed at `minecraft:projectile_accuracy`, an attribute that does not exist, so the suggested modifier could never resolve; `wraith_phase` never grants flight; `mount` needs no consent unless the server config asks for it; and `loot_pool_grant` fires once per `grant_id`. The rest tighten wording that was true and misleading — `modify_flight_speed` leaves elytra gliding alone, `mob_behavior` adds goals rather than replacing the vanilla AI, `restrict_items` has two independent opt-ins, `extra_inventory` sizes in slots rather than rows, and `slime_level_hp` tracks the current level rather than resetting on death. [POWER_TYPES.md](docs/POWER_TYPES.md) carries all fifteen.
- **Field tables and examples the loader does not match.** Five documented fields do not exist under the names given: `knockback_modifier`'s `direction`, `thorns_aura`'s `reflect_ratio` (the real key is `return_ratio`), `action_on_hit_taken`'s `amount`, `persistent_effect`'s `refresh_interval`, and the enchantment item condition's `min_level` (the real keys are `comparison` and `compare_to`). Worse, `action_on_hit_taken` advertised `restore_health`, `restore_hunger` and `grant_effect`, none of which has an implementation: all three fall through to the default and teleport the player somewhere random — and the worked example asked for `grant_effect`, so it did the one thing its own title said it would not. Six defaults were wrong, and `explode`'s `destruction_type` was documented backwards: absent means no blocks break, not the reverse. The `action_on_event` example used `slot` and `item` on an equipped-item condition, which reads `equipment_slot` and `item_condition`, so it matched any mainhand item rather than the wooden sword it claimed to test. The corrections span [POWER_TYPES.md](docs/POWER_TYPES.md), [CONDITIONS.md](docs/CONDITIONS.md) and [ACTIONS.md](docs/ACTIONS.md).
- **The pack folder layout shows every folder a pack can carry.** It listed three, so morphs, entity groups, mob origins and global powers were invisible to anyone reading the pack reference, and the morph feature was documented in full and reachable from nowhere else. The layout now shows all of them, each pointing at its own doc, with a note that the original Origins mod layout still loads unchanged. A hand-written `morph.schema.json` comes with it, so the editors read morph files like every other type. See [PACK_FORMAT.md](docs/PACK_FORMAT.md).
- **`action_over_time` and `tick_action` point somewhere useful.** `action_over_time` was a registered alias mentioned nowhere at all — not in the reference, not in the retired table, not in the migration guide. It loaded and ran exactly as written, and an author who inherited one had nothing to read about it. It has a migration entry now, alongside the other types that fold into `condition_passive`. `tick_action` pointed at `action_on_event`, where `condition_passive` is the closer replacement and takes the same interval field. See [MIGRATION.md](docs/MIGRATION.md).
- **Four reference links that never resolved.** The links to `condition_passive`, `block_target_action` and the cookbook's toggleable-abilities recipe all landed at the top of the page instead of at the section, with the cookbook link broken in two different files. All four now land on the section they name.
- **What holds off a dry-out, said the same way everywhere it is written down.** The origin list had *Dries Out* as damage out of water in hot biomes, where the power is not biome-gated at all: air drains anywhere on land, and you suffocate when it empties. The power type reference named Water Breathing and Conduit Power without ever saying that rain, a bubble column or standing in a water cauldron counts as being in the water — and it read as though those reprieves applied to `fluid: lava` as well, which is the bare check with none of them. The cookbook's moisture note gains Water Breathing and Create's backtank beside the rest. [ORIGINS.md](docs/ORIGINS.md), [POWER_TYPES.md](docs/POWER_TYPES.md) and [COOKBOOK.md](docs/COOKBOOK.md) now agree.
- **The mob origin schema is published alongside the other four.** `mob_origin.schema.json` sits in the schema folder, in the README's table and in its IDE-validator mapping, and in the API reference's validator list, so an editor pointed at `data/*/origins/mob_origins/*.json` now checks the file the way it already checked origins, layers, powers and morphs. See [schema/README.md](docs/schema/README.md).
- **Attribution for the bundled spectral sword travels with the mod.** The blades `spawn_sword_rain` summons are a third-party model under Creative Commons Attribution 4.0, and that licence asks for credit to travel with the file. A `CREDITS.md` at the root names the author, the source and the licence it is used under, and points at the bundled font licensing beside it.
release
NeoOrigins v2.2.25 (MC 26.2)
v2.2.25+26.223 авг. 2026 г.351Minecraft: 26.2neoforge
Что нового
> A documentation release with a handful of server-reported fixes and one compatibility addition riding along. The API reference index linked barely half of its power types, so `entity_model`, `restrict_items` and `creative_flight` were fully documented and reachable from nowhere: a reader who looked one up found nothing and reasonably concluded the feature did not exist. Every type has a row now. A verification pass then went back over the reference against the code rather than against the older prose, and the result is the larger half of this release: fifteen summaries were wrong or misleading about what their class does, five documented fields do not exist under those names, six defaults were wrong, and one power type advertised three verbs that all silently teleport the player somewhere random instead.
>
> The fixes are unrelated to each other and all came from live servers. An invisibility power with a condition on it hid the body and left the armor and held item floating, which is why it survived so long: the unconditional ones always worked. A misconfigured `attribute_modifier` could fill an operator's log for as long as a player held the power, several lines a second, with a message that never said what was actually wrong. And an origin with an empty slot in its power list did not load at all: absent from the picker, with the log naming neither the origin's fields nor the slot. A keep-inventory origin dropped the armor it had just promised to keep, though only once the player's inventory was full, which is what made it read as random.
>
> A second pass over the older reports found three of them worse than described. A grounded player wearing wings was not only hearing the elytra loop restart under their own feet, they were cutting the sound off for everyone gliding past them. The clamp that keeps a phasing origin out of the few blocks it is not allowed through was collided against every block in range instead, so a Wraith near one blocked block stuck fast in ordinary stone. And a player being ridden was the one person in the world who could not see their own rider.
>
> Two editor corrections close gaps left open in 2.2.24. Block conditions written as `all_of` / `any_of` no longer get marked invalid by an editor when the game reads them perfectly well, and `status_effect`'s two particle fields stop advertising the opposite of the loader's real defaults.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Ore counts as food for the Caveborn.** The four tags listing what a Caveborn can eat besides stone held ingots, nuggets, gems, raw metal and netherite scrap, and no ore whatsoever, so a Caveborn standing at a freshly exposed vein had nothing in front of it that it could eat. Iron, gold and diamond ore now qualify along with their deepslate forms, and so do nether gold ore, ancient debris and the raw iron and raw gold blocks. Worth knowing: ore is a placeable block, so aiming at a surface places it as it always did, and eating one means aiming where it cannot be placed. That is the same rule the Caveborn's stone diet has always followed.
- **An Artifacts umbrella keeps the sun and the rain off.** Origins that burn in daylight and origins that take rain damage both look for an umbrella before they hurt you, but only Vampires Need Umbrellas ever counted as one, so an Artifacts umbrella held in plain sight did nothing to help. It works now, held in either hand or worn in a trinket slot, and one umbrella covers both weaknesses rather than only the one it was carried for. What counts as an umbrella is a new `neoorigins:umbrellas` item tag, so a pack can add any other mod's umbrella to it without touching code.
- **The four aquatic origins say what keeps them from drying out.** Dries Out told you only that air ticks down while you are out of water and that staying too long suffocates you, so every way of stopping the drain was something you had to be told about or stumble into. The description now names them: rain, standing in a water cauldron, Water Breathing, and an active conduit nearby. Abyssal, Kraken, Merling and Siren all read the same, in every language the mod ships.
- **An invisibility power with a condition hides armor and held items, not only the body.** Powers that turn invisibility on unconditionally were always fine, which is what kept this hidden. The armor-hiding flag was read from the condition-gated capability set and only sent to the client when something else triggered a power sync, never at the moment the condition itself flipped, so a conditioned power froze the flag at whatever it was worth at the last sync: the body vanished on cue and the boots and the sword stayed. The flag now comes from the power itself rather than from its live condition state, which is what it always meant ("hide the armor *when* invisible"), and the client already re-checks whether you are actually invisible before hiding anything. Invisibility itself is unchanged. Cosmetic elytra wings and morph state are deliberately left as they were: nothing on the client re-checks those, so treating them the same way would draw wings on a player whose condition is not met.
- **A misconfigured `attribute_modifier` reports once instead of every few ticks.** The power re-tries the attachment whenever it should be active and is not. That is the right behaviour while the attachment can still succeed, and a permanent log flood once it cannot. Naming something that is not an attribute is the common way to reach that state, and the old message did not say so. It does now: if the id is a mob effect (`haste`, `night_vision` and friends are the usual ones), it can never resolve as an attribute, and the effect wants an `apply_effect` action instead. The warning also names the prefixes that were tried, and repeats for the same id are suppressed.
- **An origin with an empty entry in its power list loads instead of vanishing.** A single `null` in `powers` failed the whole origin, so it never reached the picker, leaving a single line that repeated "not a string" once per empty slot, naming the origin but neither the field nor the position that caused it. The empty entries are now dropped and the origin loads with every power actually named in it, with one warning giving the origin id and how many were skipped. `upgrades` and the `add` / `remove` lists inside `tier_powers` are covered the same way. A trailing comma or a deleted line in a hand-edited file is the usual cause, so it is still worth fixing the file rather than leaving it to the warning.
- **The creator keybinds stop writing a server warning on every press.** `Player X requested the mob creator without permission` was a keybind collision rather than anything to act on: the open-creator keys ship unbound, the client sends a packet per press, and the server logged each refusal at warning level, so a player whose key overlapped something they use in normal play filled the operator's log by playing normally. Both open paths log at debug now. Refusing a save or an apply still warns, on purpose: those are only reachable from inside the creator screen, so a refusal there is worth an operator's attention.
- **The elytra loop stops when you land, rather than starting again twenty times a second.** True of every origin that flies without an elytra in its chest slot. The guard that ends a flight ran its whole body on every tick the player was on the ground, in water or riding, instead of only on the tick the flight actually ended. On your own client that meant the fall-flying flag being switched on and straight back off once per tick, and the client starts a fresh elytra sound on the rising edge, so the loops stacked and got louder the longer you stood still. The server side reached further than the player it belonged to: it was broadcasting a stop-sound to every player within 64 blocks, twenty times a second, so standing on the ground with wings silenced the elytra of anyone genuinely gliding past. Both halves now fire once, when flight ends.
- **A phasing origin stops sticking inside ordinary blocks.** Phasing powers carry a short list of blocks they are *not* allowed through, and the clamp that enforces it was asking the game's general-purpose collision routine to check the player against that list. That routine always adds the surrounding world to whatever list it is handed, so the clamp collided the player against every block within reach, which is the exact opposite of a blacklist, and a Wraith that strayed near one blocked block froze solid in stone it was entitled to walk through. The clamp now checks the listed blocks and nothing else. The Wraith's own description has been corrected alongside it: it said the Wraith cannot pass obsidian at all, where the apex form is stopped only by bedrock.
- **A player being ridden can see who is riding them.** Everyone else could. A player is never in their own tracking list, so the update naming their passengers was the one packet that never reached them, and their own client went on drawing an empty back until something unrelated forced a refresh. Consent-based mounts already worked around this by resending it by hand, but that is not the only way to end up ridden: the Apoli-compatible mount action, the built-in one, the `mount` power and summoned minions all take a seat directly and had no such workaround. The resend now happens where a passenger is seated, so every route is covered.
- **Keep-inventory puts everything back where it was, instead of dropping your armor once your bag is full.** Reported from a live server, and the fullness is the whole of it: everything kept at death went back through the routine that adds an item to your inventory, and that routine only fills the main thirty-six slots. With the wildcard `*` covering every slot you have, the first thirty-six kept stacks refilled the main inventory, and the four armor pieces and the offhand item had nowhere left to go, so the power dropped them on the floor. That is the one outcome it exists to prevent, and it only happened to players carrying enough to trigger it, which is why it looked arbitrary. Even with room to spare it was never quite right, since armor came back loose in the bag rather than worn. Kept items now return to the exact slot they were taken from, which is empty by construction because dying is what emptied it: armor comes back on, the hotbar keeps its layout, and a full inventory can no longer push anything onto the ground.
- **Keep-inventory covers trinket slots, and a kept trinket waits for its slot rather than being dumped in your bag.** On 26.1 and 26.2 the coverage is new: `slots` took only the vanilla categories there, so a Curios ring matched nothing and dropped on death like anything else. All three versions now read `curio`, `accessory` or `trinket` as meaning every trinket slot, or a specific slot id such as `ring` or `necklace`, and the wildcard `*` includes them. A kept trinket goes back into the slot it died in. Those mods rebuild their slot counts on their own schedule after a respawn, so a slot that is not writable the instant you land is usually a matter of timing rather than a slot that is genuinely gone: the trinket is held and retried for three seconds instead of being given up on, and only after that does it fall back to your inventory, and to the ground only if that is full as well. Logging out part-way through settles it the same way rather than losing it. Curios is read on every supported version; Accessories on 1.21.1 only, as it has no 26.1 or 26.2 build.
- **An origin that cannot find its spawn dimension says which one it wanted.** A `spawn_location` naming a dimension that no loaded world provides gave up without a word, which reads in game as picking the origin and simply not being moved, and reads in the log as nothing at all. The warning now names the dimension and the player, so a typo or a missing mod is the first thing you see rather than something to go hunting for.
- **An active conduit keeps an aquatic origin from drying out on land.** The exemption had been in place for months and could never once have fired: the game only hands Conduit Power to a player who is already in water or rain, so an Abyssal, Kraken, Merling or Siren standing on dry ground beside a conduit was never given the effect the exemption goes looking for. The one case that appeared to work was walking ashore near one, where the effect carried out of the water lasted about thirteen seconds and then lapsed with nothing to renew it, which is why it read as working sometimes rather than never. A conduit now reaches a drying-out player anywhere inside the radius it already uses for everything else, and the bubble row refills while you stand in it instead of holding at whatever it had drained down to. Pack authors see the same reprieve in `attribute_modifier`'s `on_land` condition, which was written to stand down under Conduit Power and never once had the occasion to: it now does, for a player whose origin also carries a drying-out power, since that is who a conduit reaches on dry land. An origin without one is unchanged.
- **Block conditions written as `all_of` and `any_of` stop being marked invalid.** Both are the Apoli 2.9+ spellings of `and` and `or`, and the loader has always read them; the block condition catalogue behind the editors and the generated schema listed only the short pair. The effect was the one failure shape an author cannot debug from inside the game: the file works, and the editor says it does not. 2.2.24 documented the workaround of writing `and` and `or` there instead, which is no longer necessary. Both spellings are now in the catalogue, the schema and the editor pickers, and nothing you have already written changes behaviour.
- **`status_effect`'s `ambient` and `show_particles` advertise the loader's real defaults.** They were declared the wrong way round, `ambient` as defaulting to false and `show_particles` to true where the loader does the opposite, so a form field or a generated schema told you the inverse of what omitting the key would do. These two are exactly the pair where a wrong default costs nothing at load and shows up only as particles you did not expect once you are in game. The reference tables were already right and are unchanged.
- **`equipped_item` with `equipment_slot: accessory` reads your trinkets on 26.1 and 26.2.** 1.21.1 already did. A slot name the mapper does not recognise falls through to the mainhand, so on those two versions the condition quietly answered about whatever the player happened to be holding. It never errored and never logged, which is the hardest kind of wrong condition to find: the file looks correct and the power simply behaves as though you had asked about the held item. It now inspects equipped trinkets, with an optional `slot_type` to narrow to a single named slot.
- **The example pack drops a `tick_action` power that never fired.** The Specter's Dimensional Escape declared `action_type: teleport_on_damage` on a type that dispatches nothing, so the origin advertised a teleport that could not happen, and it was the only worked example of the type an author had to copy. It is removed rather than rewritten, since `condition_passive` is what to copy for anything that runs on an interval. The Specter's other nine powers are unchanged.
- **The API reference index lists every power type.** It listed barely half of them, so a reader looking up `entity_model`, `restrict_items` or `creative_flight` found no row and no link. Every documented type has one now, including a new group for the mod-compatibility types. Four rows were wrong rather than missing: `sneaky`, `stealth`, `no_projectile_divergence` and `tick_action` sat under retired aliases, but none is an alias and all four are registered types with their own implementations. They move to their live categories, and `night_vision`'s replacement is named correctly as `persistent_effect`.
- **Fifteen power-type summaries corrected against the code.** Each was re-read against its implementation class rather than against the older prose. The ones that change what you would write: `tick_action` dispatches nothing at all, so "run an action on a repeating interval" described a feature that is not there; `no_projectile_divergence` pointed at `minecraft:projectile_accuracy`, an attribute that does not exist, so the suggested modifier could never resolve; `wraith_phase` never grants flight; `mount` needs no consent unless the server config asks for it; and `loot_pool_grant` fires once per `grant_id`. The rest tighten wording that was true and misleading: `modify_flight_speed` leaves elytra gliding alone, `mob_behavior` adds goals rather than replacing the vanilla AI, `restrict_items` has two independent opt-ins, `extra_inventory` sizes in slots rather than rows, and `slime_level_hp` tracks the current level rather than resetting on death.
- **Field tables and examples the loader does not match.** Five documented fields do not exist under the names given: `knockback_modifier`'s `direction`, `thorns_aura`'s `reflect_ratio` (the real key is `return_ratio`), `action_on_hit_taken`'s `amount`, `persistent_effect`'s `refresh_interval`, and the enchantment item condition's `min_level` (the real keys are `comparison` and `compare_to`). Worse, `action_on_hit_taken` advertised `restore_health`, `restore_hunger` and `grant_effect`, none of which has an implementation: all three fall through to the default and teleport the player somewhere random, and the worked example asked for `grant_effect`, so it did the one thing its own title said it would not. Six defaults were wrong, and `explode`'s `destruction_type` was documented backwards: absent means no blocks break, not the reverse. The `action_on_event` example used `slot` and `item` on an equipped-item condition, which reads `equipment_slot` and `item_condition`, so it matched any mainhand item rather than the wooden sword it claimed to test.
- **The pack folder layout shows every folder a pack can carry.** It listed three, so morphs, entity groups, mob origins and global powers were invisible to anyone reading the pack reference: the morph feature was documented in full and reachable from nowhere else. The layout now shows all of them, each pointing at its own doc, with a note that the original Origins mod layout still loads unchanged. A hand-written `morph.schema.json` comes with it, so the editors read morph files like every other type.
- **`action_over_time` and `tick_action` point somewhere useful.** `action_over_time` was a registered alias mentioned nowhere at all, not in the reference, not in the retired table, not in the migration guide: it loaded and ran exactly as written, and an author who inherited one had nothing to read about it. It has a migration entry now, alongside the other types that fold into `condition_passive`. `tick_action` pointed at `action_on_event`, where `condition_passive` is the closer replacement and takes the same interval field.
- **Four reference links that never resolved.** The links to `condition_passive`, `block_target_action` and the cookbook's toggleable-abilities recipe all landed at the top of the page instead of at the section, with the cookbook link broken in two different files.
- **What holds off a dry-out, said the same way everywhere it is written down.** The origin list had *Dries Out* as damage out of water in hot biomes, where the power is not biome-gated at all: air drains anywhere on land and you suffocate when it empties. The power type reference named Water Breathing and Conduit Power without ever saying that rain, a bubble column or standing in a water cauldron counts as being in the water, and it read as though those reprieves applied to `fluid: lava` as well, which is the bare check with none of them. The cookbook's moisture note gains Water Breathing and Create's backtank beside the rest.
- **The mob origin schema is published alongside the other four.** `mob_origin.schema.json` sits in the schema folder, in the README's table and in its IDE-validator mapping, and in the API reference's validator list, so an editor pointed at `data/*/origins/mob_origins/*.json` checks the file the way it already checked origins, layers, powers and morphs.
- **Attribution for the bundled spectral sword travels with the mod.** The blades `spawn_sword_rain` summons are a third-party model under Creative Commons Attribution 4.0, and that licence asks for credit to travel with the file. A `CREDITS.md` at the root names the author, the source and the licence it is used under, and points at the bundled font licensing beside it.
release
NeoOrigins v2.2.25 (MC 26.1.x)
v2.2.25+26.123 авг. 2026 г.146Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A documentation release with a handful of server-reported fixes and one compatibility addition riding along. The API reference index linked barely half of its power types, so `entity_model`, `restrict_items` and `creative_flight` were fully documented and reachable from nowhere: a reader who looked one up found nothing and reasonably concluded the feature did not exist. Every type has a row now. A verification pass then went back over the reference against the code rather than against the older prose, and the result is the larger half of this release: fifteen summaries were wrong or misleading about what their class does, five documented fields do not exist under those names, six defaults were wrong, and one power type advertised three verbs that all silently teleport the player somewhere random instead.
>
> The fixes are unrelated to each other and all came from live servers. An invisibility power with a condition on it hid the body and left the armor and held item floating, which is why it survived so long: the unconditional ones always worked. A misconfigured `attribute_modifier` could fill an operator's log for as long as a player held the power, several lines a second, with a message that never said what was actually wrong. And an origin with an empty slot in its power list did not load at all: absent from the picker, with the log naming neither the origin's fields nor the slot. A keep-inventory origin dropped the armor it had just promised to keep, though only once the player's inventory was full, which is what made it read as random.
>
> A second pass over the older reports found three of them worse than described. A grounded player wearing wings was not only hearing the elytra loop restart under their own feet, they were cutting the sound off for everyone gliding past them. The clamp that keeps a phasing origin out of the few blocks it is not allowed through was collided against every block in range instead, so a Wraith near one blocked block stuck fast in ordinary stone. And a player being ridden was the one person in the world who could not see their own rider.
>
> Two editor corrections close gaps left open in 2.2.24. Block conditions written as `all_of` / `any_of` no longer get marked invalid by an editor when the game reads them perfectly well, and `status_effect`'s two particle fields stop advertising the opposite of the loader's real defaults.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Ore counts as food for the Caveborn.** The four tags listing what a Caveborn can eat besides stone held ingots, nuggets, gems, raw metal and netherite scrap, and no ore whatsoever, so a Caveborn standing at a freshly exposed vein had nothing in front of it that it could eat. Iron, gold and diamond ore now qualify along with their deepslate forms, and so do nether gold ore, ancient debris and the raw iron and raw gold blocks. Worth knowing: ore is a placeable block, so aiming at a surface places it as it always did, and eating one means aiming where it cannot be placed. That is the same rule the Caveborn's stone diet has always followed.
- **An Artifacts umbrella keeps the sun and the rain off.** Origins that burn in daylight and origins that take rain damage both look for an umbrella before they hurt you, but only Vampires Need Umbrellas ever counted as one, so an Artifacts umbrella held in plain sight did nothing to help. It works now, held in either hand or worn in a trinket slot, and one umbrella covers both weaknesses rather than only the one it was carried for. What counts as an umbrella is a new `neoorigins:umbrellas` item tag, so a pack can add any other mod's umbrella to it without touching code.
- **The four aquatic origins say what keeps them from drying out.** Dries Out told you only that air ticks down while you are out of water and that staying too long suffocates you, so every way of stopping the drain was something you had to be told about or stumble into. The description now names them: rain, standing in a water cauldron, Water Breathing, and an active conduit nearby. Abyssal, Kraken, Merling and Siren all read the same, in every language the mod ships.
- **An invisibility power with a condition hides armor and held items, not only the body.** Powers that turn invisibility on unconditionally were always fine, which is what kept this hidden. The armor-hiding flag was read from the condition-gated capability set and only sent to the client when something else triggered a power sync, never at the moment the condition itself flipped, so a conditioned power froze the flag at whatever it was worth at the last sync: the body vanished on cue and the boots and the sword stayed. The flag now comes from the power itself rather than from its live condition state, which is what it always meant ("hide the armor *when* invisible"), and the client already re-checks whether you are actually invisible before hiding anything. Invisibility itself is unchanged. Cosmetic elytra wings and morph state are deliberately left as they were: nothing on the client re-checks those, so treating them the same way would draw wings on a player whose condition is not met.
- **A misconfigured `attribute_modifier` reports once instead of every few ticks.** The power re-tries the attachment whenever it should be active and is not. That is the right behaviour while the attachment can still succeed, and a permanent log flood once it cannot. Naming something that is not an attribute is the common way to reach that state, and the old message did not say so. It does now: if the id is a mob effect (`haste`, `night_vision` and friends are the usual ones), it can never resolve as an attribute, and the effect wants an `apply_effect` action instead. The warning also names the prefixes that were tried, and repeats for the same id are suppressed.
- **An origin with an empty entry in its power list loads instead of vanishing.** A single `null` in `powers` failed the whole origin, so it never reached the picker, leaving a single line that repeated "not a string" once per empty slot, naming the origin but neither the field nor the position that caused it. The empty entries are now dropped and the origin loads with every power actually named in it, with one warning giving the origin id and how many were skipped. `upgrades` and the `add` / `remove` lists inside `tier_powers` are covered the same way. A trailing comma or a deleted line in a hand-edited file is the usual cause, so it is still worth fixing the file rather than leaving it to the warning.
- **The creator keybinds stop writing a server warning on every press.** `Player X requested the mob creator without permission` was a keybind collision rather than anything to act on: the open-creator keys ship unbound, the client sends a packet per press, and the server logged each refusal at warning level, so a player whose key overlapped something they use in normal play filled the operator's log by playing normally. Both open paths log at debug now. Refusing a save or an apply still warns, on purpose: those are only reachable from inside the creator screen, so a refusal there is worth an operator's attention.
- **The elytra loop stops when you land, rather than starting again twenty times a second.** True of every origin that flies without an elytra in its chest slot. The guard that ends a flight ran its whole body on every tick the player was on the ground, in water or riding, instead of only on the tick the flight actually ended. On your own client that meant the fall-flying flag being switched on and straight back off once per tick, and the client starts a fresh elytra sound on the rising edge, so the loops stacked and got louder the longer you stood still. The server side reached further than the player it belonged to: it was broadcasting a stop-sound to every player within 64 blocks, twenty times a second, so standing on the ground with wings silenced the elytra of anyone genuinely gliding past. Both halves now fire once, when flight ends.
- **A phasing origin stops sticking inside ordinary blocks.** Phasing powers carry a short list of blocks they are *not* allowed through, and the clamp that enforces it was asking the game's general-purpose collision routine to check the player against that list. That routine always adds the surrounding world to whatever list it is handed, so the clamp collided the player against every block within reach, which is the exact opposite of a blacklist, and a Wraith that strayed near one blocked block froze solid in stone it was entitled to walk through. The clamp now checks the listed blocks and nothing else. The Wraith's own description has been corrected alongside it: it said the Wraith cannot pass obsidian at all, where the apex form is stopped only by bedrock.
- **A player being ridden can see who is riding them.** Everyone else could. A player is never in their own tracking list, so the update naming their passengers was the one packet that never reached them, and their own client went on drawing an empty back until something unrelated forced a refresh. Consent-based mounts already worked around this by resending it by hand, but that is not the only way to end up ridden: the Apoli-compatible mount action, the built-in one, the `mount` power and summoned minions all take a seat directly and had no such workaround. The resend now happens where a passenger is seated, so every route is covered.
- **Keep-inventory puts everything back where it was, instead of dropping your armor once your bag is full.** Reported from a live server, and the fullness is the whole of it: everything kept at death went back through the routine that adds an item to your inventory, and that routine only fills the main thirty-six slots. With the wildcard `*` covering every slot you have, the first thirty-six kept stacks refilled the main inventory, and the four armor pieces and the offhand item had nowhere left to go, so the power dropped them on the floor. That is the one outcome it exists to prevent, and it only happened to players carrying enough to trigger it, which is why it looked arbitrary. Even with room to spare it was never quite right, since armor came back loose in the bag rather than worn. Kept items now return to the exact slot they were taken from, which is empty by construction because dying is what emptied it: armor comes back on, the hotbar keeps its layout, and a full inventory can no longer push anything onto the ground.
- **Keep-inventory covers trinket slots, and a kept trinket waits for its slot rather than being dumped in your bag.** On 26.1 and 26.2 the coverage is new: `slots` took only the vanilla categories there, so a Curios ring matched nothing and dropped on death like anything else. All three versions now read `curio`, `accessory` or `trinket` as meaning every trinket slot, or a specific slot id such as `ring` or `necklace`, and the wildcard `*` includes them. A kept trinket goes back into the slot it died in. Those mods rebuild their slot counts on their own schedule after a respawn, so a slot that is not writable the instant you land is usually a matter of timing rather than a slot that is genuinely gone: the trinket is held and retried for three seconds instead of being given up on, and only after that does it fall back to your inventory, and to the ground only if that is full as well. Logging out part-way through settles it the same way rather than losing it. Curios is read on every supported version; Accessories on 1.21.1 only, as it has no 26.1 or 26.2 build.
- **An origin that cannot find its spawn dimension says which one it wanted.** A `spawn_location` naming a dimension that no loaded world provides gave up without a word, which reads in game as picking the origin and simply not being moved, and reads in the log as nothing at all. The warning now names the dimension and the player, so a typo or a missing mod is the first thing you see rather than something to go hunting for.
- **An active conduit keeps an aquatic origin from drying out on land.** The exemption had been in place for months and could never once have fired: the game only hands Conduit Power to a player who is already in water or rain, so an Abyssal, Kraken, Merling or Siren standing on dry ground beside a conduit was never given the effect the exemption goes looking for. The one case that appeared to work was walking ashore near one, where the effect carried out of the water lasted about thirteen seconds and then lapsed with nothing to renew it, which is why it read as working sometimes rather than never. A conduit now reaches a drying-out player anywhere inside the radius it already uses for everything else, and the bubble row refills while you stand in it instead of holding at whatever it had drained down to. Pack authors see the same reprieve in `attribute_modifier`'s `on_land` condition, which was written to stand down under Conduit Power and never once had the occasion to: it now does, for a player whose origin also carries a drying-out power, since that is who a conduit reaches on dry land. An origin without one is unchanged.
- **Block conditions written as `all_of` and `any_of` stop being marked invalid.** Both are the Apoli 2.9+ spellings of `and` and `or`, and the loader has always read them; the block condition catalogue behind the editors and the generated schema listed only the short pair. The effect was the one failure shape an author cannot debug from inside the game: the file works, and the editor says it does not. 2.2.24 documented the workaround of writing `and` and `or` there instead, which is no longer necessary. Both spellings are now in the catalogue, the schema and the editor pickers, and nothing you have already written changes behaviour.
- **`status_effect`'s `ambient` and `show_particles` advertise the loader's real defaults.** They were declared the wrong way round, `ambient` as defaulting to false and `show_particles` to true where the loader does the opposite, so a form field or a generated schema told you the inverse of what omitting the key would do. These two are exactly the pair where a wrong default costs nothing at load and shows up only as particles you did not expect once you are in game. The reference tables were already right and are unchanged.
- **`equipped_item` with `equipment_slot: accessory` reads your trinkets on 26.1 and 26.2.** 1.21.1 already did. A slot name the mapper does not recognise falls through to the mainhand, so on those two versions the condition quietly answered about whatever the player happened to be holding. It never errored and never logged, which is the hardest kind of wrong condition to find: the file looks correct and the power simply behaves as though you had asked about the held item. It now inspects equipped trinkets, with an optional `slot_type` to narrow to a single named slot.
- **The example pack drops a `tick_action` power that never fired.** The Specter's Dimensional Escape declared `action_type: teleport_on_damage` on a type that dispatches nothing, so the origin advertised a teleport that could not happen, and it was the only worked example of the type an author had to copy. It is removed rather than rewritten, since `condition_passive` is what to copy for anything that runs on an interval. The Specter's other nine powers are unchanged.
- **The API reference index lists every power type.** It listed barely half of them, so a reader looking up `entity_model`, `restrict_items` or `creative_flight` found no row and no link. Every documented type has one now, including a new group for the mod-compatibility types. Four rows were wrong rather than missing: `sneaky`, `stealth`, `no_projectile_divergence` and `tick_action` sat under retired aliases, but none is an alias and all four are registered types with their own implementations. They move to their live categories, and `night_vision`'s replacement is named correctly as `persistent_effect`.
- **Fifteen power-type summaries corrected against the code.** Each was re-read against its implementation class rather than against the older prose. The ones that change what you would write: `tick_action` dispatches nothing at all, so "run an action on a repeating interval" described a feature that is not there; `no_projectile_divergence` pointed at `minecraft:projectile_accuracy`, an attribute that does not exist, so the suggested modifier could never resolve; `wraith_phase` never grants flight; `mount` needs no consent unless the server config asks for it; and `loot_pool_grant` fires once per `grant_id`. The rest tighten wording that was true and misleading: `modify_flight_speed` leaves elytra gliding alone, `mob_behavior` adds goals rather than replacing the vanilla AI, `restrict_items` has two independent opt-ins, `extra_inventory` sizes in slots rather than rows, and `slime_level_hp` tracks the current level rather than resetting on death.
- **Field tables and examples the loader does not match.** Five documented fields do not exist under the names given: `knockback_modifier`'s `direction`, `thorns_aura`'s `reflect_ratio` (the real key is `return_ratio`), `action_on_hit_taken`'s `amount`, `persistent_effect`'s `refresh_interval`, and the enchantment item condition's `min_level` (the real keys are `comparison` and `compare_to`). Worse, `action_on_hit_taken` advertised `restore_health`, `restore_hunger` and `grant_effect`, none of which has an implementation: all three fall through to the default and teleport the player somewhere random, and the worked example asked for `grant_effect`, so it did the one thing its own title said it would not. Six defaults were wrong, and `explode`'s `destruction_type` was documented backwards: absent means no blocks break, not the reverse. The `action_on_event` example used `slot` and `item` on an equipped-item condition, which reads `equipment_slot` and `item_condition`, so it matched any mainhand item rather than the wooden sword it claimed to test.
- **The pack folder layout shows every folder a pack can carry.** It listed three, so morphs, entity groups, mob origins and global powers were invisible to anyone reading the pack reference: the morph feature was documented in full and reachable from nowhere else. The layout now shows all of them, each pointing at its own doc, with a note that the original Origins mod layout still loads unchanged. A hand-written `morph.schema.json` comes with it, so the editors read morph files like every other type.
- **`action_over_time` and `tick_action` point somewhere useful.** `action_over_time` was a registered alias mentioned nowhere at all, not in the reference, not in the retired table, not in the migration guide: it loaded and ran exactly as written, and an author who inherited one had nothing to read about it. It has a migration entry now, alongside the other types that fold into `condition_passive`. `tick_action` pointed at `action_on_event`, where `condition_passive` is the closer replacement and takes the same interval field.
- **Four reference links that never resolved.** The links to `condition_passive`, `block_target_action` and the cookbook's toggleable-abilities recipe all landed at the top of the page instead of at the section, with the cookbook link broken in two different files.
- **What holds off a dry-out, said the same way everywhere it is written down.** The origin list had *Dries Out* as damage out of water in hot biomes, where the power is not biome-gated at all: air drains anywhere on land and you suffocate when it empties. The power type reference named Water Breathing and Conduit Power without ever saying that rain, a bubble column or standing in a water cauldron counts as being in the water, and it read as though those reprieves applied to `fluid: lava` as well, which is the bare check with none of them. The cookbook's moisture note gains Water Breathing and Create's backtank beside the rest.
- **The mob origin schema is published alongside the other four.** `mob_origin.schema.json` sits in the schema folder, in the README's table and in its IDE-validator mapping, and in the API reference's validator list, so an editor pointed at `data/*/origins/mob_origins/*.json` checks the file the way it already checked origins, layers, powers and morphs.
- **Attribution for the bundled spectral sword travels with the mod.** The blades `spawn_sword_rain` summons are a third-party model under Creative Commons Attribution 4.0, and that licence asks for credit to travel with the file. A `CREDITS.md` at the root names the author, the source and the licence it is used under, and points at the bundled font licensing beside it.
release
NeoOrigins v2.2.24 (MC 1.21.1)
v2.2.24+1.21.113 авг. 2026 г.5,9 тыс.Minecraft: 1.21.1neoforge
Что нового
> A corrective release. The ocean origins hold their depth instead of sinking the moment they stop swimming, four flying origins that glided bare-backed get wings, Sword Immortal can no longer fly empty-handed, and night-vision powers finally say which key toggles them. Most of the rest were failing quietly rather than visibly, which is why none had been reported: the Herbalist's bone meal growth never reached the client and never spent the bone meal, AppleSkin previewed vanilla's food values on every diet origin, two powers of one type shared a single toggle, ten tier night-vision powers each held an ability slot they had no business holding, and `origins:remove_enchantment` had never been implemented at all. On the compatibility side, two opposite failure shapes are closed: biome conditions that failed closed and could never fire anywhere, and item and block conditions that failed open and matched everything handed to them. Legacy packs load with their origins unchanged. KubeJS scripting also reaches the Minecraft 26.1 build, with scripts moving across unchanged.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Ocean origins hold their depth instead of sinking when they stop swimming.** Holding station used to mean swimming to hold it. A new shared power, *Neutral Buoyancy*, goes to Merling, Siren, Kraken and Abyssal: `-0.08` on `minecraft:gravity` as an `add_value`, conditioned on being fully submerged. That lands the attribute on exactly `0.0`, and vanilla skips its in-water descent entirely at zero base gravity, so depth holds cleanly rather than trading a sink for a slow float up. Swimming down is unaffected, and puddles and shallows do not trigger it. Conditioned modifiers re-evaluate every five ticks, so expect up to a quarter-second lag at the surface. See [COOKBOOK.md](docs/COOKBOOK.md).
- **Night-vision powers say how to switch them off.** Night vision deliberately has no entry in the HUD ability cluster, because it is not one of the six numbered skills, so nothing in game ever pointed at the key that toggles it and players reasonably concluded there was no toggle at all. Twenty-two power descriptions now end with "Toggle with the Night Vision key (default K)." — worded for the binding rather than the letter, since it is rebindable. Worth knowing alongside it: the setting is remembered per player rather than per origin, so switching it off on one origin and later picking another that has night vision starts you with it already off.
- **Ten tier night-vision powers stop taking up a numbered ability slot.** `persistent_effect` defaults `toggleable` to true, and these ten never declared it, so each claimed one of the six skill slots and answered to a stray skill-key press — the exact failure the base night-vision powers force `toggleable: false` to avoid, and one that reads to a player as night vision switching itself off for no reason. One tier power each on Wraith, Arachnid, Caveborn, Darkness Mage, Feline, Necromancer, Sculkborn, Sporeling, Sylvan and Umbral now sets it explicitly, matching the four conduit powers that always had. They are passive tier buffs, and the Night Vision key remains their off-switch.
- **Elytrian, Phantom, Hiveling and Draconic fly with visible wings.** True of every built-in origin that flies without an elytra in its chest slot. The renderer was never at fault: `neoorigins:natural_glide` and `neoorigins:flight` simply had no way to ask for wings. Both now take the same `render_elytra` and `texture_location` pair `elytra_flight` already carried, so a pack can put wings on either and point them at its own texture. They default to `false` rather than `elytra_flight`'s `true`, deliberately — these types have shipped wingless their whole life, and defaulting them on would put an elytra on the back of every existing pack that uses them. Windwalker's Sky Dancer stays bare on purpose. [POWER_TYPES.md](docs/POWER_TYPES.md) documents both.
- **The Herbalist's extra bone meal growth shows up straight away instead of after a rejoin.** Bone mealing grass placed one plant and the rest appeared only after a relog. The handler grew the blocks and let vanilla carry on, but vanilla re-checked the target against the live world, found the space filled and returned PASS — and NeoForge replays an item's block changes only on success, so the blocks were there the whole time with no client told. That same PASS also skipped the bone meal being spent, giving a Herbalist unlimited bone meal on grass. The handler now cancels the event, does the work and claims success, keeping vanilla's success roll so the power is exactly as strong as before.
- **Two powers of the same type on one origin stop sharing a single toggle.** Pressing either keybind switched both on. Toggle state was keyed off the power's config rather than the power itself, so two powers that happened to agree collapsed into one flag. The reach was wider than the report: `condition_passive` keyed the same way, `persistent_effect` keyed off its effect ids so two tiers of one buff collided, and seven more types including `stealth`, `flight` and `phantom_form` keyed off the class name alone and so collided unconditionally. Keys are now the power's own resource id. Flags already saved in a world are still read, so a power you had switched off stays off.
- **A `gameplay.toml` written before 2.2.22 has its air drain rate corrected on the next start.** `[ocean_origins] drain_rate_ticks` shipped as `10` up to 2.2.21 and became `1` in 2.2.22, but the config system only rewrites a key that is missing or out of range, and `10` sits well inside the declared 1 to 1200 — so every install that had ever run 2.2.21 kept it. The correction reasons from the file rather than the value, since `10` is a legitimate setting. `gameplay.toml` now carries a `config_version`, and an unstamped file holding exactly `10` is moved to `1`, stamped and logged. Any other value survives, and once stamped the setting is yours again: put it back to `10` and it stays.
- **AppleSkin previews a diet origin's real food values rather than vanilla's.** True of every origin that changes what food is worth. `modify_food_nutrition` never rewrites the item's food data — it corrects hunger and saturation server-side at the moment of eating — so there was nothing on the stack for AppleSkin to read, and an aquatic origin holding a cod was shown vanilla's 2 and 0.4. A new bridge answers AppleSkin's event with the origin-adjusted values, leaving the vanilla figure in place for its usual struck-through comparison. The nutrition-to-saturation scaling now lives in one place called by both the real eat and the preview, so the number shown and the number received cannot drift apart. AppleSkin remains optional.
- **Sword Immortal's flight and Flickering Slash need the sword in hand.** A Sword Immortal could fly empty-handed, which the origin's own description rules out. Seven of its ten powers already carried the requirement, and Immortal Body carries none precisely because it is the fall-immune mortal left when you are disarmed; the other two could not, because `neoorigins:creative_flight` and `neoorigins:active_dash` had no `condition` field for one to go in. Both take one now. On the flight it is re-checked every tick rather than at takeoff, so sheathing mid-air strips the ability there and then and the drop is real — pair a conditional flight with fall-damage immunity if it should be survivable. A blocked dash spends no cooldown. Defaults to absent, so existing powers of both types are unchanged. [POWER_TYPES.md](docs/POWER_TYPES.md) documents the field on both.
- **The in-game editor gives list fields a row of real entry boxes instead of a single raw JSON box.** Adding one entity type meant typing the brackets and quotes yourself. Thirty-four fields were affected across the schema-driven forms: a power's `items`, `tags`, `entity_types`, `damage_types`, `slots` and `hands`, plus the id lists on actions, conditions and item actions. The add-and-remove widget was already in the mod but unreachable, because the layer that reads schemas into the editor's field model never carried across the element pattern the check looks for. The model now carries it, reaching all thirty-four at once. The origin creator is hand-built and the web editor reads the schema directly, so neither was ever affected.
- **The schemas stop advertising fewer verbs than the parsers accept.** Working verbs looked unsupported unless you already knew they existed. Block conditions accept ten where the list named four, gaining `adjacent`, `block_state`, `height` and `offset`; item conditions accept thirteen where the list named seven, gaining `all_of`, `amount`, `any_of`, `custom_data`, `food` and `name`. All of them already worked if you wrote them, so nothing you have written changes behaviour. Both the list and its validating pattern now come from the editors' own catalogue rather than being maintained by hand beside it. One gap stays open, better said here than found in an editor: the block condition catalogue does not carry `all_of` and `any_of`, so a block condition written that way works in game while the editors mark the file invalid — write `and` and `or` there instead.
- **`origins:remove_enchantment` works, so a legacy Remove Curse power removes curses.** The verb had never been implemented, so the item action parser fell through to its no-op default and the power loaded, gated and ticked while doing nothing, with no error to say so. Both field shapes are accepted, since the docs describe a singular `enchantment` string while real packs commonly write a plural `enchantments` array and both are valid upstream. `reset_repair_cost` is read either on the action or on the enclosing `equipped_item_action`, true in either position winning. An unregistered id matches nothing, and a malformed one warns and is skipped rather than taking the power down. Enchanted books go through vanilla's own dispatch.
- **`levels` weakens an enchantment instead of stripping it outright.** The first implementation covered three of upstream's four fields and dropped the fourth silently, which is worse than not supporting the verb at all: a pack asking to knock one level off Sharpness V got the whole enchantment torn off while everything looked correct from the pack side. `levels` now reduces each named enchantment by that many and deletes it only at zero or below, matching upstream. Omitting the field still removes outright, since that is what older packs rely on. Nothing is clamped — `0` subtracts nothing and a negative raises the level, both of which are what upstream's plain subtraction does.
- **A biome-gated power fires in the biome it names.** `origins:biome` accepts a nested `condition` with its own small grammar, where `in_tag` means the biome is in a biome tag rather than anything about entity types. Only `temperature` had ever been implemented, so every other verb failed closed and a power written that way never activated in any biome at all, `in_tag` being much the most common of them. Now parsed: `in_tag`, `precipitation`, `high_humidity`, `constant`, `not`, a nested `biome` form for or-lists of exact ids, and `all_of` / `any_of` as the Apoli 2.9 spellings of `and` / `or`, each honouring `inverted`. Two details if you write them: `precipitation` answers for your block rather than the biome as a whole, and `high_humidity` keeps Apoli's `0.85` verbatim. An unknown sub-type still fails closed, which stays right here.
- **Five item conditions that were passing every stack instead of checking it.** An unimplemented item condition returned true — it accepted every stack rather than refusing it — so a herbivore restriction written against a verb we lack permitted meat while the power loaded, gated and ticked in apparent good order. That is the quieter failure of the two, and why these went unreported for so long. `armor_value`, `meat`, `constant`, `harvest_level` and `durability` are all implemented now. Two are worth knowing precisely: `armor_value` is what one stack confers rather than the wearer's total, and `meat` resolves through the NeoForge common food tags, so modded meats count. The honest limit: a verb still outside the list goes on passing, since flipping that default would make every unimplemented condition block everything across packs that work today.
- **Four block conditions that were matching every block, and the fallback that hid them.** An unimplemented verb compiled to nothing, which `in_block`, `in_block_anywhere` and the narrow `neoorigins:block` check all read as "match anything", while `on_block` discarded the filter outright and turned "standing on X" into "standing on anything". `inverted` was no protection, since inversion applies only to a condition that compiled, and it logged at debug with no warning — so a pack reload came back clean while `light_level`, `exposed_to_sky`, `movement_blocking` and `fluid` sat silently always-true: a sun-sensitive origin's slowness and blindness fired in the dark exactly as in the sun. All four verbs are implemented, since closing the fail-open alone would have swung those powers from always on to never on, and an unknown verb now matches nothing. The docs also stop calling `in_block_anywhere` an alias of `in_block`: the first samples one block, the second counts every position the hitbox overlaps. See [CONDITIONS.md](docs/CONDITIONS.md).
- **KubeJS scripting reaches the Minecraft 26.1 build.** It was 1.21.1 only because KubeJS had published nothing for 26.1, not because anything was tied to that version. The whole surface is on both builds now: the `NeoOrigins` and `NeoOriginsEvents` globals, all fifteen events, `registerCallback` with the `neoorigins:kubejs_callback` action behind it, and the two JavaScript-backed power types `neoorigins:js_custom` and `neoorigins:js_active`. Scripts move across without porting. Two install notes that are KubeJS's requirements rather than ours: the 26.1 build wants NeoForge 26.1.2.84 or newer before KubeJS will load at all, and on 1.21.1 `registerPower` needs Rhino `2101.2.8-build.91` or newer. **The 26.2 build does not get this and cannot yet**, since KubeJS has published nothing past Minecraft 26.1.2 to build against — and an unrecognised power `type` is dropped whole, so a `js_custom` power copied into a 26.2 pack never appears on the origin and nothing in game says why. [KUBEJS.md](docs/KUBEJS.md) documents the whole surface.
- **Air drain is counted per air point, not per bubble.** `drain_rate_ticks` is ticks per single air point, and the HUD draws 300 air as 10 bubbles, so one bubble is 30 points: at `1` a bubble lasts 1.5 seconds and the full bar 15; at `10`, 15 seconds and 150. Reading it as ticks per bubble puts you out by a factor of thirty, which is where both reports came from. If your bar genuinely empties slower than the table says, an install predating 2.2.22 still holds the old default of `10`, which this release moves for you on the next start. [POWER_TYPES.md](docs/POWER_TYPES.md) carries the arithmetic beside the table.
release
NeoOrigins v2.2.24 (MC 26.2)
v2.2.24+26.213 авг. 2026 г.248Minecraft: 26.2neoforge
Что нового
> A corrective release. The ocean origins hold their depth instead of sinking the moment they stop swimming, four flying origins that glided bare-backed get wings, Sword Immortal can no longer fly empty-handed, and night-vision powers finally say which key toggles them. Most of the rest were failing quietly rather than visibly, which is why none had been reported: the Herbalist's bone meal growth never reached the client and never spent the bone meal, AppleSkin previewed vanilla's food values on every diet origin, two powers of one type shared a single toggle, ten tier night-vision powers each held an ability slot they had no business holding, and `origins:remove_enchantment` had never been implemented at all. On the compatibility side, two opposite failure shapes are closed: biome conditions that failed closed and could never fire anywhere, and item and block conditions that failed open and matched everything handed to them. Legacy packs load with their origins unchanged. KubeJS scripting also reaches the Minecraft 26.1 build, with scripts moving across unchanged.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Ocean origins hold their depth instead of sinking when they stop swimming.** Holding station used to mean swimming to hold it. A new shared power, *Neutral Buoyancy*, goes to Merling, Siren, Kraken and Abyssal: `-0.08` on `minecraft:gravity` as an `add_value`, conditioned on being fully submerged. That lands the attribute on exactly `0.0`, and vanilla skips its in-water descent entirely at zero base gravity, so depth holds cleanly rather than trading a sink for a slow float up. Swimming down is unaffected, and puddles and shallows do not trigger it. Conditioned modifiers re-evaluate every five ticks, so expect up to a quarter-second lag at the surface. See [COOKBOOK.md](docs/COOKBOOK.md).
- **Night-vision powers say how to switch them off.** Night vision deliberately has no entry in the HUD ability cluster, because it is not one of the six numbered skills, so nothing in game ever pointed at the key that toggles it and players reasonably concluded there was no toggle at all. Twenty-two power descriptions now end with "Toggle with the Night Vision key (default K)." — worded for the binding rather than the letter, since it is rebindable. Worth knowing alongside it: the setting is remembered per player rather than per origin, so switching it off on one origin and later picking another that has night vision starts you with it already off.
- **Ten tier night-vision powers stop taking up a numbered ability slot.** `persistent_effect` defaults `toggleable` to true, and these ten never declared it, so each claimed one of the six skill slots and answered to a stray skill-key press — the exact failure the base night-vision powers force `toggleable: false` to avoid, and one that reads to a player as night vision switching itself off for no reason. One tier power each on Wraith, Arachnid, Caveborn, Darkness Mage, Feline, Necromancer, Sculkborn, Sporeling, Sylvan and Umbral now sets it explicitly, matching the four conduit powers that always had. They are passive tier buffs, and the Night Vision key remains their off-switch.
- **Elytrian, Phantom, Hiveling and Draconic fly with visible wings.** True of every built-in origin that flies without an elytra in its chest slot. The renderer was never at fault: `neoorigins:natural_glide` and `neoorigins:flight` simply had no way to ask for wings. Both now take the same `render_elytra` and `texture_location` pair `elytra_flight` already carried, so a pack can put wings on either and point them at its own texture. They default to `false` rather than `elytra_flight`'s `true`, deliberately — these types have shipped wingless their whole life, and defaulting them on would put an elytra on the back of every existing pack that uses them. Windwalker's Sky Dancer stays bare on purpose. [POWER_TYPES.md](docs/POWER_TYPES.md) documents both.
- **The Herbalist's extra bone meal growth shows up straight away instead of after a rejoin.** Bone mealing grass placed one plant and the rest appeared only after a relog. The handler grew the blocks and let vanilla carry on, but vanilla re-checked the target against the live world, found the space filled and returned PASS — and NeoForge replays an item's block changes only on success, so the blocks were there the whole time with no client told. That same PASS also skipped the bone meal being spent, giving a Herbalist unlimited bone meal on grass. The handler now cancels the event, does the work and claims success, keeping vanilla's success roll so the power is exactly as strong as before.
- **Two powers of the same type on one origin stop sharing a single toggle.** Pressing either keybind switched both on. Toggle state was keyed off the power's config rather than the power itself, so two powers that happened to agree collapsed into one flag. The reach was wider than the report: `condition_passive` keyed the same way, `persistent_effect` keyed off its effect ids so two tiers of one buff collided, and seven more types including `stealth`, `flight` and `phantom_form` keyed off the class name alone and so collided unconditionally. Keys are now the power's own resource id. Flags already saved in a world are still read, so a power you had switched off stays off.
- **A `gameplay.toml` written before 2.2.22 has its air drain rate corrected on the next start.** `[ocean_origins] drain_rate_ticks` shipped as `10` up to 2.2.21 and became `1` in 2.2.22, but the config system only rewrites a key that is missing or out of range, and `10` sits well inside the declared 1 to 1200 — so every install that had ever run 2.2.21 kept it. The correction reasons from the file rather than the value, since `10` is a legitimate setting. `gameplay.toml` now carries a `config_version`, and an unstamped file holding exactly `10` is moved to `1`, stamped and logged. Any other value survives, and once stamped the setting is yours again: put it back to `10` and it stays.
- **AppleSkin previews a diet origin's real food values rather than vanilla's.** True of every origin that changes what food is worth. `modify_food_nutrition` never rewrites the item's food data — it corrects hunger and saturation server-side at the moment of eating — so there was nothing on the stack for AppleSkin to read, and an aquatic origin holding a cod was shown vanilla's 2 and 0.4. A new bridge answers AppleSkin's event with the origin-adjusted values, leaving the vanilla figure in place for its usual struck-through comparison. The nutrition-to-saturation scaling now lives in one place called by both the real eat and the preview, so the number shown and the number received cannot drift apart. AppleSkin remains optional.
- **Sword Immortal's flight and Flickering Slash need the sword in hand.** A Sword Immortal could fly empty-handed, which the origin's own description rules out. Seven of its ten powers already carried the requirement, and Immortal Body carries none precisely because it is the fall-immune mortal left when you are disarmed; the other two could not, because `neoorigins:creative_flight` and `neoorigins:active_dash` had no `condition` field for one to go in. Both take one now. On the flight it is re-checked every tick rather than at takeoff, so sheathing mid-air strips the ability there and then and the drop is real — pair a conditional flight with fall-damage immunity if it should be survivable. A blocked dash spends no cooldown. Defaults to absent, so existing powers of both types are unchanged. [POWER_TYPES.md](docs/POWER_TYPES.md) documents the field on both.
- **The in-game editor gives list fields a row of real entry boxes instead of a single raw JSON box.** Adding one entity type meant typing the brackets and quotes yourself. Thirty-four fields were affected across the schema-driven forms: a power's `items`, `tags`, `entity_types`, `damage_types`, `slots` and `hands`, plus the id lists on actions, conditions and item actions. The add-and-remove widget was already in the mod but unreachable, because the layer that reads schemas into the editor's field model never carried across the element pattern the check looks for. The model now carries it, reaching all thirty-four at once. The origin creator is hand-built and the web editor reads the schema directly, so neither was ever affected.
- **The schemas stop advertising fewer verbs than the parsers accept.** Working verbs looked unsupported unless you already knew they existed. Block conditions accept ten where the list named four, gaining `adjacent`, `block_state`, `height` and `offset`; item conditions accept thirteen where the list named seven, gaining `all_of`, `amount`, `any_of`, `custom_data`, `food` and `name`. All of them already worked if you wrote them, so nothing you have written changes behaviour. Both the list and its validating pattern now come from the editors' own catalogue rather than being maintained by hand beside it. One gap stays open, better said here than found in an editor: the block condition catalogue does not carry `all_of` and `any_of`, so a block condition written that way works in game while the editors mark the file invalid — write `and` and `or` there instead.
- **`origins:remove_enchantment` works, so a legacy Remove Curse power removes curses.** The verb had never been implemented, so the item action parser fell through to its no-op default and the power loaded, gated and ticked while doing nothing, with no error to say so. Both field shapes are accepted, since the docs describe a singular `enchantment` string while real packs commonly write a plural `enchantments` array and both are valid upstream. `reset_repair_cost` is read either on the action or on the enclosing `equipped_item_action`, true in either position winning. An unregistered id matches nothing, and a malformed one warns and is skipped rather than taking the power down. Enchanted books go through vanilla's own dispatch.
- **`levels` weakens an enchantment instead of stripping it outright.** The first implementation covered three of upstream's four fields and dropped the fourth silently, which is worse than not supporting the verb at all: a pack asking to knock one level off Sharpness V got the whole enchantment torn off while everything looked correct from the pack side. `levels` now reduces each named enchantment by that many and deletes it only at zero or below, matching upstream. Omitting the field still removes outright, since that is what older packs rely on. Nothing is clamped — `0` subtracts nothing and a negative raises the level, both of which are what upstream's plain subtraction does.
- **A biome-gated power fires in the biome it names.** `origins:biome` accepts a nested `condition` with its own small grammar, where `in_tag` means the biome is in a biome tag rather than anything about entity types. Only `temperature` had ever been implemented, so every other verb failed closed and a power written that way never activated in any biome at all, `in_tag` being much the most common of them. Now parsed: `in_tag`, `precipitation`, `high_humidity`, `constant`, `not`, a nested `biome` form for or-lists of exact ids, and `all_of` / `any_of` as the Apoli 2.9 spellings of `and` / `or`, each honouring `inverted`. Two details if you write them: `precipitation` answers for your block rather than the biome as a whole, and `high_humidity` keeps Apoli's `0.85` verbatim. An unknown sub-type still fails closed, which stays right here.
- **Five item conditions that were passing every stack instead of checking it.** An unimplemented item condition returned true — it accepted every stack rather than refusing it — so a herbivore restriction written against a verb we lack permitted meat while the power loaded, gated and ticked in apparent good order. That is the quieter failure of the two, and why these went unreported for so long. `armor_value`, `meat`, `constant`, `harvest_level` and `durability` are all implemented now. Two are worth knowing precisely: `armor_value` is what one stack confers rather than the wearer's total, and `meat` resolves through the NeoForge common food tags, so modded meats count. The honest limit: a verb still outside the list goes on passing, since flipping that default would make every unimplemented condition block everything across packs that work today.
- **Four block conditions that were matching every block, and the fallback that hid them.** An unimplemented verb compiled to nothing, which `in_block`, `in_block_anywhere` and the narrow `neoorigins:block` check all read as "match anything", while `on_block` discarded the filter outright and turned "standing on X" into "standing on anything". `inverted` was no protection, since inversion applies only to a condition that compiled, and it logged at debug with no warning — so a pack reload came back clean while `light_level`, `exposed_to_sky`, `movement_blocking` and `fluid` sat silently always-true: a sun-sensitive origin's slowness and blindness fired in the dark exactly as in the sun. All four verbs are implemented, since closing the fail-open alone would have swung those powers from always on to never on, and an unknown verb now matches nothing. The docs also stop calling `in_block_anywhere` an alias of `in_block`: the first samples one block, the second counts every position the hitbox overlaps. See [CONDITIONS.md](docs/CONDITIONS.md).
- **KubeJS scripting reaches the Minecraft 26.1 build.** It was 1.21.1 only because KubeJS had published nothing for 26.1, not because anything was tied to that version. The whole surface is on both builds now: the `NeoOrigins` and `NeoOriginsEvents` globals, all fifteen events, `registerCallback` with the `neoorigins:kubejs_callback` action behind it, and the two JavaScript-backed power types `neoorigins:js_custom` and `neoorigins:js_active`. Scripts move across without porting. Two install notes that are KubeJS's requirements rather than ours: the 26.1 build wants NeoForge 26.1.2.84 or newer before KubeJS will load at all, and on 1.21.1 `registerPower` needs Rhino `2101.2.8-build.91` or newer. **The 26.2 build does not get this and cannot yet**, since KubeJS has published nothing past Minecraft 26.1.2 to build against — and an unrecognised power `type` is dropped whole, so a `js_custom` power copied into a 26.2 pack never appears on the origin and nothing in game says why. [KUBEJS.md](docs/KUBEJS.md) documents the whole surface.
- **Air drain is counted per air point, not per bubble.** `drain_rate_ticks` is ticks per single air point, and the HUD draws 300 air as 10 bubbles, so one bubble is 30 points: at `1` a bubble lasts 1.5 seconds and the full bar 15; at `10`, 15 seconds and 150. Reading it as ticks per bubble puts you out by a factor of thirty, which is where both reports came from. If your bar genuinely empties slower than the table says, an install predating 2.2.22 still holds the old default of `10`, which this release moves for you on the next start. [POWER_TYPES.md](docs/POWER_TYPES.md) carries the arithmetic beside the table.
release
NeoOrigins v2.2.24 (MC 26.1.x)
v2.2.24+26.113 авг. 2026 г.155Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A corrective release. The ocean origins hold their depth instead of sinking the moment they stop swimming, four flying origins that glided bare-backed get wings, Sword Immortal can no longer fly empty-handed, and night-vision powers finally say which key toggles them. Most of the rest were failing quietly rather than visibly, which is why none had been reported: the Herbalist's bone meal growth never reached the client and never spent the bone meal, AppleSkin previewed vanilla's food values on every diet origin, two powers of one type shared a single toggle, ten tier night-vision powers each held an ability slot they had no business holding, and `origins:remove_enchantment` had never been implemented at all. On the compatibility side, two opposite failure shapes are closed: biome conditions that failed closed and could never fire anywhere, and item and block conditions that failed open and matched everything handed to them. Legacy packs load with their origins unchanged. KubeJS scripting also reaches the Minecraft 26.1 build, with scripts moving across unchanged.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Ocean origins hold their depth instead of sinking when they stop swimming.** Holding station used to mean swimming to hold it. A new shared power, *Neutral Buoyancy*, goes to Merling, Siren, Kraken and Abyssal: `-0.08` on `minecraft:gravity` as an `add_value`, conditioned on being fully submerged. That lands the attribute on exactly `0.0`, and vanilla skips its in-water descent entirely at zero base gravity, so depth holds cleanly rather than trading a sink for a slow float up. Swimming down is unaffected, and puddles and shallows do not trigger it. Conditioned modifiers re-evaluate every five ticks, so expect up to a quarter-second lag at the surface. See [COOKBOOK.md](docs/COOKBOOK.md).
- **Night-vision powers say how to switch them off.** Night vision deliberately has no entry in the HUD ability cluster, because it is not one of the six numbered skills, so nothing in game ever pointed at the key that toggles it and players reasonably concluded there was no toggle at all. Twenty-two power descriptions now end with "Toggle with the Night Vision key (default K)." — worded for the binding rather than the letter, since it is rebindable. Worth knowing alongside it: the setting is remembered per player rather than per origin, so switching it off on one origin and later picking another that has night vision starts you with it already off.
- **Ten tier night-vision powers stop taking up a numbered ability slot.** `persistent_effect` defaults `toggleable` to true, and these ten never declared it, so each claimed one of the six skill slots and answered to a stray skill-key press — the exact failure the base night-vision powers force `toggleable: false` to avoid, and one that reads to a player as night vision switching itself off for no reason. One tier power each on Wraith, Arachnid, Caveborn, Darkness Mage, Feline, Necromancer, Sculkborn, Sporeling, Sylvan and Umbral now sets it explicitly, matching the four conduit powers that always had. They are passive tier buffs, and the Night Vision key remains their off-switch.
- **Elytrian, Phantom, Hiveling and Draconic fly with visible wings.** True of every built-in origin that flies without an elytra in its chest slot. The renderer was never at fault: `neoorigins:natural_glide` and `neoorigins:flight` simply had no way to ask for wings. Both now take the same `render_elytra` and `texture_location` pair `elytra_flight` already carried, so a pack can put wings on either and point them at its own texture. They default to `false` rather than `elytra_flight`'s `true`, deliberately — these types have shipped wingless their whole life, and defaulting them on would put an elytra on the back of every existing pack that uses them. Windwalker's Sky Dancer stays bare on purpose. [POWER_TYPES.md](docs/POWER_TYPES.md) documents both.
- **The Herbalist's extra bone meal growth shows up straight away instead of after a rejoin.** Bone mealing grass placed one plant and the rest appeared only after a relog. The handler grew the blocks and let vanilla carry on, but vanilla re-checked the target against the live world, found the space filled and returned PASS — and NeoForge replays an item's block changes only on success, so the blocks were there the whole time with no client told. That same PASS also skipped the bone meal being spent, giving a Herbalist unlimited bone meal on grass. The handler now cancels the event, does the work and claims success, keeping vanilla's success roll so the power is exactly as strong as before.
- **Two powers of the same type on one origin stop sharing a single toggle.** Pressing either keybind switched both on. Toggle state was keyed off the power's config rather than the power itself, so two powers that happened to agree collapsed into one flag. The reach was wider than the report: `condition_passive` keyed the same way, `persistent_effect` keyed off its effect ids so two tiers of one buff collided, and seven more types including `stealth`, `flight` and `phantom_form` keyed off the class name alone and so collided unconditionally. Keys are now the power's own resource id. Flags already saved in a world are still read, so a power you had switched off stays off.
- **A `gameplay.toml` written before 2.2.22 has its air drain rate corrected on the next start.** `[ocean_origins] drain_rate_ticks` shipped as `10` up to 2.2.21 and became `1` in 2.2.22, but the config system only rewrites a key that is missing or out of range, and `10` sits well inside the declared 1 to 1200 — so every install that had ever run 2.2.21 kept it. The correction reasons from the file rather than the value, since `10` is a legitimate setting. `gameplay.toml` now carries a `config_version`, and an unstamped file holding exactly `10` is moved to `1`, stamped and logged. Any other value survives, and once stamped the setting is yours again: put it back to `10` and it stays.
- **AppleSkin previews a diet origin's real food values rather than vanilla's.** True of every origin that changes what food is worth. `modify_food_nutrition` never rewrites the item's food data — it corrects hunger and saturation server-side at the moment of eating — so there was nothing on the stack for AppleSkin to read, and an aquatic origin holding a cod was shown vanilla's 2 and 0.4. A new bridge answers AppleSkin's event with the origin-adjusted values, leaving the vanilla figure in place for its usual struck-through comparison. The nutrition-to-saturation scaling now lives in one place called by both the real eat and the preview, so the number shown and the number received cannot drift apart. AppleSkin remains optional.
- **Sword Immortal's flight and Flickering Slash need the sword in hand.** A Sword Immortal could fly empty-handed, which the origin's own description rules out. Seven of its ten powers already carried the requirement, and Immortal Body carries none precisely because it is the fall-immune mortal left when you are disarmed; the other two could not, because `neoorigins:creative_flight` and `neoorigins:active_dash` had no `condition` field for one to go in. Both take one now. On the flight it is re-checked every tick rather than at takeoff, so sheathing mid-air strips the ability there and then and the drop is real — pair a conditional flight with fall-damage immunity if it should be survivable. A blocked dash spends no cooldown. Defaults to absent, so existing powers of both types are unchanged. [POWER_TYPES.md](docs/POWER_TYPES.md) documents the field on both.
- **The in-game editor gives list fields a row of real entry boxes instead of a single raw JSON box.** Adding one entity type meant typing the brackets and quotes yourself. Thirty-four fields were affected across the schema-driven forms: a power's `items`, `tags`, `entity_types`, `damage_types`, `slots` and `hands`, plus the id lists on actions, conditions and item actions. The add-and-remove widget was already in the mod but unreachable, because the layer that reads schemas into the editor's field model never carried across the element pattern the check looks for. The model now carries it, reaching all thirty-four at once. The origin creator is hand-built and the web editor reads the schema directly, so neither was ever affected.
- **The schemas stop advertising fewer verbs than the parsers accept.** Working verbs looked unsupported unless you already knew they existed. Block conditions accept ten where the list named four, gaining `adjacent`, `block_state`, `height` and `offset`; item conditions accept thirteen where the list named seven, gaining `all_of`, `amount`, `any_of`, `custom_data`, `food` and `name`. All of them already worked if you wrote them, so nothing you have written changes behaviour. Both the list and its validating pattern now come from the editors' own catalogue rather than being maintained by hand beside it. One gap stays open, better said here than found in an editor: the block condition catalogue does not carry `all_of` and `any_of`, so a block condition written that way works in game while the editors mark the file invalid — write `and` and `or` there instead.
- **`origins:remove_enchantment` works, so a legacy Remove Curse power removes curses.** The verb had never been implemented, so the item action parser fell through to its no-op default and the power loaded, gated and ticked while doing nothing, with no error to say so. Both field shapes are accepted, since the docs describe a singular `enchantment` string while real packs commonly write a plural `enchantments` array and both are valid upstream. `reset_repair_cost` is read either on the action or on the enclosing `equipped_item_action`, true in either position winning. An unregistered id matches nothing, and a malformed one warns and is skipped rather than taking the power down. Enchanted books go through vanilla's own dispatch.
- **`levels` weakens an enchantment instead of stripping it outright.** The first implementation covered three of upstream's four fields and dropped the fourth silently, which is worse than not supporting the verb at all: a pack asking to knock one level off Sharpness V got the whole enchantment torn off while everything looked correct from the pack side. `levels` now reduces each named enchantment by that many and deletes it only at zero or below, matching upstream. Omitting the field still removes outright, since that is what older packs rely on. Nothing is clamped — `0` subtracts nothing and a negative raises the level, both of which are what upstream's plain subtraction does.
- **A biome-gated power fires in the biome it names.** `origins:biome` accepts a nested `condition` with its own small grammar, where `in_tag` means the biome is in a biome tag rather than anything about entity types. Only `temperature` had ever been implemented, so every other verb failed closed and a power written that way never activated in any biome at all, `in_tag` being much the most common of them. Now parsed: `in_tag`, `precipitation`, `high_humidity`, `constant`, `not`, a nested `biome` form for or-lists of exact ids, and `all_of` / `any_of` as the Apoli 2.9 spellings of `and` / `or`, each honouring `inverted`. Two details if you write them: `precipitation` answers for your block rather than the biome as a whole, and `high_humidity` keeps Apoli's `0.85` verbatim. An unknown sub-type still fails closed, which stays right here.
- **Five item conditions that were passing every stack instead of checking it.** An unimplemented item condition returned true — it accepted every stack rather than refusing it — so a herbivore restriction written against a verb we lack permitted meat while the power loaded, gated and ticked in apparent good order. That is the quieter failure of the two, and why these went unreported for so long. `armor_value`, `meat`, `constant`, `harvest_level` and `durability` are all implemented now. Two are worth knowing precisely: `armor_value` is what one stack confers rather than the wearer's total, and `meat` resolves through the NeoForge common food tags, so modded meats count. The honest limit: a verb still outside the list goes on passing, since flipping that default would make every unimplemented condition block everything across packs that work today.
- **Four block conditions that were matching every block, and the fallback that hid them.** An unimplemented verb compiled to nothing, which `in_block`, `in_block_anywhere` and the narrow `neoorigins:block` check all read as "match anything", while `on_block` discarded the filter outright and turned "standing on X" into "standing on anything". `inverted` was no protection, since inversion applies only to a condition that compiled, and it logged at debug with no warning — so a pack reload came back clean while `light_level`, `exposed_to_sky`, `movement_blocking` and `fluid` sat silently always-true: a sun-sensitive origin's slowness and blindness fired in the dark exactly as in the sun. All four verbs are implemented, since closing the fail-open alone would have swung those powers from always on to never on, and an unknown verb now matches nothing. The docs also stop calling `in_block_anywhere` an alias of `in_block`: the first samples one block, the second counts every position the hitbox overlaps. See [CONDITIONS.md](docs/CONDITIONS.md).
- **KubeJS scripting reaches the Minecraft 26.1 build.** It was 1.21.1 only because KubeJS had published nothing for 26.1, not because anything was tied to that version. The whole surface is on both builds now: the `NeoOrigins` and `NeoOriginsEvents` globals, all fifteen events, `registerCallback` with the `neoorigins:kubejs_callback` action behind it, and the two JavaScript-backed power types `neoorigins:js_custom` and `neoorigins:js_active`. Scripts move across without porting. Two install notes that are KubeJS's requirements rather than ours: the 26.1 build wants NeoForge 26.1.2.84 or newer before KubeJS will load at all, and on 1.21.1 `registerPower` needs Rhino `2101.2.8-build.91` or newer. **The 26.2 build does not get this and cannot yet**, since KubeJS has published nothing past Minecraft 26.1.2 to build against — and an unrecognised power `type` is dropped whole, so a `js_custom` power copied into a 26.2 pack never appears on the origin and nothing in game says why. [KUBEJS.md](docs/KUBEJS.md) documents the whole surface.
- **Air drain is counted per air point, not per bubble.** `drain_rate_ticks` is ticks per single air point, and the HUD draws 300 air as 10 bubbles, so one bubble is 30 points: at `1` a bubble lasts 1.5 seconds and the full bar 15; at `10`, 15 seconds and 150. Reading it as ticks per bubble puts you out by a factor of thirty, which is where both reports came from. If your bar genuinely empties slower than the table says, an install predating 2.2.22 still holds the old default of `10`, which this release moves for you on the next start. [POWER_TYPES.md](docs/POWER_TYPES.md) carries the arithmetic beside the table.
release
NeoOrigins v2.2.23 (MC 1.21.1)
v2.2.23+1.21.17 авг. 2026 г.3,1 тыс.Minecraft: 1.21.1neoforge
Что нового
> Two new tools for pack authors, a pass over the ocean origins, and a fix for a bug that quietly undid part of your origin. `neoorigins:ignore_fluid` generalises `ignore_water` into a power that removes a fluid from the player's world outright: no buoyancy, no drag, no current push, no drowning, no lava burn, no fog, no swim pose, for modded fluids as much as vanilla ones. It gets there by intercepting fluid **detection** rather than each effect in turn, which is why third-party mods fall away with it. `neoorigins:suppression` is the first status effect NeoOrigins has ever registered: a ready-made ability lock to hang a boss mechanic, a debuff zone, or a PvP counter on. And size powers now stack across the origin and class layers, where picking a class used to wipe the origin layer's size instead of adding to it, so a Golem who took Titan stood at 1.25 rather than 1.55.
>
> The aquatic origins get the pass they have been owed. Two vanilla rules were quietly undoing their signature abilities the moment they left the seafloor, so they swam and mined at their best while standing on a block and worst while genuinely swimming, which is the wrong way round. Both are corrected. Merling can see in the dark from tier 0 rather than tier 2, Siren's Beached penalty stops following her into the water, and the night vision key no longer claims success on the forty-nine built-in origins that have no night vision to toggle. Alongside them, `breath_out_of_fluid` honours the drain rate you author, which it had been parsing and then discarding for every custom origin that set one.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`neoorigins:ignore_fluid` makes a fluid stop existing for the player.** `ignore_water` removes water's speed penalty and its current pushing, and nothing else: you still float, still drown, still see the blue. The new power removes the fluid entirely. No buoyancy, no drag, no current push, no drowning, no lava burn, no fog or screen overlay, no swim pose. It works by intercepting fluid **detection** rather than cancelling each behaviour one at a time: the body scan that feeds buoyancy, drag, `isInWater()`, `isInLava()` and the swim pose hands back an empty fluid state for an ignored fluid, as does the eye scan behind drowning and the air bar, the camera query behind fog and the underwater distortion, and the block's own `entityInside`, which is how modded fluids deliver their damage. Because every vanilla fluid behaviour reads those same values, they all fall away together, and so do most third-party mods, since they ask the same standard questions. `ignore_water` is unchanged and still supported: reach for it when you only want the movement penalty gone, and for this when you want the fluid to stop registering at all.
- **Naming a fluid covers its whole type, and a bad id costs you nothing.** `fluid` takes a fluid id (`"minecraft:lava"`), a fluid tag (`"#c:milk"`), or an array of either; `fluids` is the plural spelling, and both keys are read and merged, so it does not matter which one you reach for. An entry without a namespace gets `minecraft:`. Naming any fluid of a type ignores the type, so `"minecraft:water"` also covers `minecraft:flowing_water`, which is what makes poured buckets work. If you give neither key the power defaults to water and lava, so a marker-only entry is never a silent no-op. An unknown or misspelled id is dropped quietly rather than failing the datapack load, which matters because the whole point is naming fluids from mods that may not be installed: parsing never touches the fluid registry, so an id for an absent mod cannot throw at load or during login sync. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and worked examples.
- **What `ignore_fluid` deliberately does not reach.** Fluid rendering is untouched: the fluid still draws normally, you simply pass through it as if it were air. A mod that runs its own `level.getFluidState(pos)` check per tick, rather than asking the entity whether it is in a fluid, is doing its own detection and cannot be intercepted from here. The same goes for anything keyed off the block state rather than the fluid state. And one side effect is intended rather than tolerated: the `entityInside` guard is keyed on the block's fluid state, so a *waterlogged* block's own behaviour is suppressed too while you ignore water, which in practice means bubble columns stop pushing you. That is the honest reading of "water does not affect me". On Minecraft 26.1 and 26.2 there is a further limit, and it is worth reading before you write the pack: those versions track entity fluid interaction only for fluids in the `minecraft:water` and `minecraft:lava` tags, so an entry naming a fluid outside them is accepted and syncs its capability but drives nothing on the movement side. The `entityInside` guard still fires there, so a modded fluid's own damage is still cancelled even where its buoyancy and drag are not. The field shape is identical on every branch on purpose, so a pack written for 1.21.1 loads and validates unchanged on 26.x; just do not expect a modded fluid to stop pushing you there.
- **`neoorigins:suppression`: a status effect that locks a player out of their abilities.** The mod has never registered a status effect of its own before; this is the first, and it exists so you do not have to build an ability lock out of parts. While a player holds it, every active, keybind, and toggle power refuses to fire. A key press or a click in the power GUI gets an action bar line and a short sound, because an input that does nothing needs to come with a reason: unlike a cooldown, there is nothing on the HUD telling the player why. Refusals the player did not ask for stay silent, since `neoorigins:activate_power` and continuous held-key bindings can both fire every tick and announcing those would flood the action bar. A toggle power that is already on when the effect lands is forced off rather than left on and locked, which would otherwise strand a player mid-transformation with the one key that undoes it refused. The amplifier carries no meaning and is reserved. Delivery is `/effect` and the `neoorigins:apply_effect` action and nothing else: no brewing recipe, no tipped arrow, and no potion item, because a craftable ability lock is a balance decision that belongs to your pack rather than one the mod should make for every world.
- **Passive powers are left to you, because you can already gate them.** Suppression covers actives, keybinds, and toggles only. That is not an oversight and it is not a first instalment: put a `power_condition` on a passive that tests `neoorigins:has_effect` for `neoorigins:suppression` and leave the mode at its `DENY` default, and the power switches off for exactly as long as the effect is held. Building passive suppression into the effect would have duplicated a surface that already works. `has_effect` and `status_effect` resolve the new effect by id like any other, so nothing else was needed to reach it. See [COOKBOOK.md](docs/COOKBOOK.md) for the worked example.
- **Ocean origins keep their swim bonus when they leave the seafloor.** Reported on Discord: aquatic origins sink and swim badly unless they are walking along the bottom. That is exactly what the numbers said should happen. Every ocean origin's swim bonus, and the shared Natural Swimmer power on top of it, is built on `minecraft:water_movement_efficiency`, and vanilla halves that attribute outright whenever the swimmer is not on the ground. So the entire swim kit ran at half strength in open water and full strength only while the player was standing on a block, which inverts what an ocean origin is meant to feel like. A new shared power, *Open Water*, carries `+0.25 neoforge:swim_speed`, an attribute vanilla reads in the same pass with no such condition, and it is granted to Merling, Siren, Kraken, and Abyssal beside their existing speed powers rather than in place of them. Nothing about `water_movement_efficiency` changes, so bottom-walking is as fast as it ever was and this only lifts the mid-water case that was lagging behind it. The figure is deliberately short of parity: cancelling the halving outright would take roughly `+0.55`, and `swim_speed` is not water-gated, so that would have shown up as a land movement change as well. About `+0.21` restores non-sprint terminal velocity underwater, and `+0.25` clears that with a little room, matches the magnitude Merling's own tier 1 bonus uses, and lifts the vertical swim impulse, which is the part that reads as sinking when it is missing. Pack authors reach the same attribute: `neoforge:swim_speed` resolves straight from datapack JSON in `attribute_modifier`, with no alias needed, and [COOKBOOK.md](docs/COOKBOOK.md) now sets out when to reach for it and when for `water_movement_efficiency`.
- **Aquatic origins mine at full speed while they are actually swimming.** Also reported on Discord, and both halves of the report were accurate: Aqua Affinity says these origins mine at full speed submerged, and they did, but only with their feet planted on a block. Vanilla charges two independent penalties. The first is the submerged-mining attribute, applied when the eyes are in water, which `underwater_mining_speed` has always cancelled. The second is a flat divide by five a few lines later for anyone off the ground, and nothing in the mod touched it, so an aquatic origin paid a fifth of its speed for the whole time it was genuinely swimming and got the full rate only in the one posture the power was least meant for. That fifth is now refunded, gated on all three of eyes in water, off the ground, and holding the power. The off-ground penalty on dry land is a separate anti-cheese rule about mining out of a jump and is deliberately left alone. The correction reads the same synced value the client holds, so break progress is predicted correctly rather than the local player watching the slow animation while the server runs the fast one. Affects Merling, Siren, Kraken, and Abyssal, plus any pack origin using `underwater_mining_speed`.
- **Merling sees in the dark from tier 0, as Siren already did.** Reported as the night vision keybind doing nothing on a fresh Merling while working on a Siren. Both are ocean origins that spawn in deep water, so the difference read as a bug rather than a design line, and it was neither: Siren's base power list carried night vision and Merling's carried none at all. Merling only picked it up at tier 2, folded into the Ascended Conduit alongside water breathing and haste, which left two tiers of swimming around a pitch-black ocean floor with no way to see. *Deep Sight* is now a base power, a straight copy of Siren's Ocean Eyes, and it retires at tier 2 where the conduit takes over, mirroring how Caveborn swaps its base night vision for the ascended one. There is no gap: the same tier overlay that removes the base power grants the conduit, so night vision is continuous from tier 0 upward.
- **Size powers now stack across the origin and class layers instead of the last pick winning.** A Golem (1.3) who takes the Titan class (1.25) should stand at 1.55, and did not: whichever layer was picked most recently took effect and the other was lost, in both directions. The two obvious explanations were both wrong, which is part of what kept this alive. The modifier ids are already namespaced per power, so the origin and class layers were never colliding, and the maths was already additive: the JSON authors an absolute `"scale": 1.3`, but the power converts that to a delta and adds it, so the operation was correct too. The fault was in removal. Revoking any one size power cleared **every** `neoorigins:size_*` modifier on scale and on both interaction ranges, and the layer-change step then re-granted only the layer that had actually changed, so the other layer's size was gone for good. That also explains why it looked intermittent: the first time you were granted two size layers they really did stack, and the collapse only happened when you re-picked. The over-broad sweep was not careless, it was guarding a real bug. A power whose JSON is deleted or renamed leaves a modifier behind that nothing owns, and players were once left permanently rescaled by it. So rather than narrowing the sweep and reopening that, the two jobs are now separate: revoking a power clears only the modifiers that power itself created, and the sweep for genuinely orphaned modifiers moved to the layer-change step, which is the one place that knows the full set of powers a player still has and can therefore tell an orphan from another layer's live modifier. Twelve built-in size powers are affected: Golem, Kraken, Inchling, Tiny, Dwarf, Hiveling, Gorgon, Draconic, Breeze, Caveborn, Warden, and the Titan class. Reported on Discord.
- **On Minecraft 26.1 and 26.2, changing any layer wiped every other layer's `attribute_modifier` bonuses.** Found while porting the fix above, unreported and considerably wider than the size bug. Those two versions had no per-layer sweep at all and cleared every origin-owned attribute modifier whenever any layer changed, so picking a class stripped the max health, armour, and reach your origin granted, and picking an origin stripped the class's, until you relogged. Both branches now use the same targeted sweep as 1.21.1. Players on 26.1 and 26.2 will notice bonuses persisting that used to quietly disappear.
- **`breath_out_of_fluid` honours the drain rate you authored.** Reported on Discord: a custom origin built in the web editor always dried out in about twenty seconds whatever the field said, twenty ticks and two ticks alike. The power parsed the field correctly and then threw it away. A tick handler overwrote it with the global `[ocean_origins] drain_rate_ticks` config on every pass, so the authored value reached nothing and every custom origin dried out at the server's rate instead of its own. The override was deliberate rather than an oversight, but it was too broad: it was written to drive the four built-in aquatic origins from one config option, and it caught custom powers on the way past. The interval is now resolved per power in the same priority order `breath_in_fluid` already uses, `air_loss_per_second` first, then `drain_interval_ticks`, then `drain_rate` as the legacy spelling, and the config applies only when none of the three is present. That last clause is the whole fix. The four built-in `*_dries_out` powers author no drain field at all, so they still track the config exactly as #120 left them, while an origin that names a value gets the value it named; where several such powers apply at once, the tightest interval wins. The schema is what made this reportable rather than merely wrong: it advertised `drain_rate` with a default of forty and a description of what it would do, with nothing to say it was inert, and the editor builds its form from the schema. All three keys are described now, and [POWER_TYPES.md](docs/POWER_TYPES.md) carries the arithmetic, so land time in seconds is roughly `(300 * drain_interval_ticks) / 20` and the number stays checkable against the behaviour.
- **Siren's Beached penalty no longer follows her into the water.** The power carried a fifteen percent movement penalty with no condition on it, so a Siren swam fifteen percent slower than every other ocean origin as well as walking that much slower. It is called Beached and described as a land penalty, which is what the other three ocean origins actually do: Merling, Kraken, and Abyssal all carry `"condition": "on_land"` on the same power, and Siren was the odd one out, with the penalty landing hardest exactly where the origin is supposed to be strong. It is gated on land now. Its description also said ten percent while the value has always been `-0.15`, so the text is corrected to fifteen rather than the value being changed: Merling is the one at ten percent, and the two were most likely copied and only half edited.
- **The night vision key no longer reports success on origins that have none.** Pressing it flipped the stored flag and printed a green "Night vision on" whatever you were playing, with no check that your origin had any night vision to switch. That flag is read in exactly one place, when deciding whether to apply a night vision effect an origin actually specifies, so on an origin without one the key was reporting success for an operation that could not have an effect. Forty-nine of the seventy-eight built-in origins are in that position, so this was the common case rather than the corner one. The key now refuses with a message when there is nothing to toggle, leaves the flag untouched, and re-sends the current state, so a client that has drifted still resyncs. A power gated on a condition still counts as owning night vision, since the question is whether the origin has it rather than whether it happens to be lit at that moment: otherwise a Caveborn who walked into daylight would be told they had none. The admin kill switch is unaffected and still takes precedence, so a server that has turned night vision off gives its own message regardless of what the player is playing.
- **A parameterised particle named by bare id no longer takes the whole power down with it.** Found while boot-testing this release against a third-party pack, unreported and not new to this cycle. `mrt_chemist:immunity-shot` failed to load on Minecraft 26.1 and 26.2 with "missing or unknown 'particle' field" while loading fine on 1.21.1, and the pack does nothing unusual: it writes `"particle": "minecraft:dragon_breath"`. Minecraft 26 reclassified four particles that took no arguments on 1.21.1 into parameterised ones, `dragon_breath`, `effect`, `instant_effect` and `flash`, and the power accepted an argument-free particle only by bare id. So on those versions the four stopped resolving, and because the particle field is required, the failure dropped the entire power rather than just its decoration. A parameterised particle named with no arguments now falls back to its plainest form, opaque white at unit scale with no delay, which for those four is what they looked like before the reclassification, so a pack written for 1.21.1 renders unchanged on 26.x. The same fallback picks up `entity_effect`, `dust`, `sculk_charge` and `shriek`, which are parameterised on every version and were equally unusable bare. Particles that need a referent rather than a decoration, `block`, `item` and `vibration`, still require the object or inline-argument form: there is no honest default for which block, so those stay an error and say so.
- **The Blazeling entries described a version of the origin that has not shipped since 2.2.** Checked against the live JSON rather than against the previous text, and four of its powers were wrong: Blaze Scales is +6 max health, not natural armour; Nether-Born grants Speed in the Nether, not faster healing; and Internal Heat costs you hunger twenty-five percent faster, so it is a drawback rather than the passive warmth aura it was written up as. The tier table was wrong in both directions too. The second tier was listed as granting Fire Resistance, which 2.2 replaced with +4 max health, and its removal entry named a power that no longer exists, so it read as removing nothing; the third tier was described as removing the Evolved health bonus when it removes the Ascended one. [ORIGINS.md](docs/ORIGINS.md) and [EVOLUTION.md](docs/EVOLUTION.md) now match what the origin actually grants.
- **An `on_fire` condition can never be true on a fire-immune origin.** Worth knowing before you build a mechanic on it. Fire-immune players have their remaining fire ticks zeroed every tick, which was done deliberately to stop the burning overlay flickering on origins that cannot burn, and `on_fire` reads that same counter. So on Blazeling, or on anything else carrying `prevent_action: fire`, a power gated on `on_fire` is not merely unlikely to fire, it is structurally dead. [CONDITIONS.md](docs/CONDITIONS.md) says so now, and points at `in_lava` or a dimension test as the workable alternatives.
- **`modify_reach` scales by default, whatever the cookbook said.** [COOKBOOK.md](docs/COOKBOOK.md) had claimed since v1.14 that reach only scales when explicitly enabled. The field has defaulted to `true` on every branch for as long as it has existed, so anyone who wrote a size power expecting reach to stay put has been getting scaled reach the whole time. Corrected.
- **How the two layers stack is now written down.** The bug above was possible partly because nothing said what the intended behaviour was. [POWER_TYPES.md](docs/POWER_TYPES.md) now states the stacking rule under both `size_scaling` and `attribute_modifier`, [CLASSES.md](docs/CLASSES.md) has a section on how a class layer combines with the origin layer rather than replacing it, and [COOKBOOK.md](docs/COOKBOOK.md) gains the cross-layer pitfall as a worked case.
release
NeoOrigins v2.2.23 (MC 26.2)
v2.2.23+26.27 авг. 2026 г.133Minecraft: 26.2neoforge
Что нового
> Two new tools for pack authors, a pass over the ocean origins, and a fix for a bug that quietly undid part of your origin. `neoorigins:ignore_fluid` generalises `ignore_water` into a power that removes a fluid from the player's world outright: no buoyancy, no drag, no current push, no drowning, no lava burn, no fog, no swim pose, for modded fluids as much as vanilla ones. It gets there by intercepting fluid **detection** rather than each effect in turn, which is why third-party mods fall away with it. `neoorigins:suppression` is the first status effect NeoOrigins has ever registered: a ready-made ability lock to hang a boss mechanic, a debuff zone, or a PvP counter on. And size powers now stack across the origin and class layers, where picking a class used to wipe the origin layer's size instead of adding to it, so a Golem who took Titan stood at 1.25 rather than 1.55.
>
> The aquatic origins get the pass they have been owed. Two vanilla rules were quietly undoing their signature abilities the moment they left the seafloor, so they swam and mined at their best while standing on a block and worst while genuinely swimming, which is the wrong way round. Both are corrected. Merling can see in the dark from tier 0 rather than tier 2, Siren's Beached penalty stops following her into the water, and the night vision key no longer claims success on the forty-nine built-in origins that have no night vision to toggle. Alongside them, `breath_out_of_fluid` honours the drain rate you author, which it had been parsing and then discarding for every custom origin that set one.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`neoorigins:ignore_fluid` makes a fluid stop existing for the player.** `ignore_water` removes water's speed penalty and its current pushing, and nothing else: you still float, still drown, still see the blue. The new power removes the fluid entirely. No buoyancy, no drag, no current push, no drowning, no lava burn, no fog or screen overlay, no swim pose. It works by intercepting fluid **detection** rather than cancelling each behaviour one at a time: the body scan that feeds buoyancy, drag, `isInWater()`, `isInLava()` and the swim pose hands back an empty fluid state for an ignored fluid, as does the eye scan behind drowning and the air bar, the camera query behind fog and the underwater distortion, and the block's own `entityInside`, which is how modded fluids deliver their damage. Because every vanilla fluid behaviour reads those same values, they all fall away together, and so do most third-party mods, since they ask the same standard questions. `ignore_water` is unchanged and still supported: reach for it when you only want the movement penalty gone, and for this when you want the fluid to stop registering at all.
- **Naming a fluid covers its whole type, and a bad id costs you nothing.** `fluid` takes a fluid id (`"minecraft:lava"`), a fluid tag (`"#c:milk"`), or an array of either; `fluids` is the plural spelling, and both keys are read and merged, so it does not matter which one you reach for. An entry without a namespace gets `minecraft:`. Naming any fluid of a type ignores the type, so `"minecraft:water"` also covers `minecraft:flowing_water`, which is what makes poured buckets work. If you give neither key the power defaults to water and lava, so a marker-only entry is never a silent no-op. An unknown or misspelled id is dropped quietly rather than failing the datapack load, which matters because the whole point is naming fluids from mods that may not be installed: parsing never touches the fluid registry, so an id for an absent mod cannot throw at load or during login sync. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and worked examples.
- **What `ignore_fluid` deliberately does not reach.** Fluid rendering is untouched: the fluid still draws normally, you simply pass through it as if it were air. A mod that runs its own `level.getFluidState(pos)` check per tick, rather than asking the entity whether it is in a fluid, is doing its own detection and cannot be intercepted from here. The same goes for anything keyed off the block state rather than the fluid state. And one side effect is intended rather than tolerated: the `entityInside` guard is keyed on the block's fluid state, so a *waterlogged* block's own behaviour is suppressed too while you ignore water, which in practice means bubble columns stop pushing you. That is the honest reading of "water does not affect me". On Minecraft 26.1 and 26.2 there is a further limit, and it is worth reading before you write the pack: those versions track entity fluid interaction only for fluids in the `minecraft:water` and `minecraft:lava` tags, so an entry naming a fluid outside them is accepted and syncs its capability but drives nothing on the movement side. The `entityInside` guard still fires there, so a modded fluid's own damage is still cancelled even where its buoyancy and drag are not. The field shape is identical on every branch on purpose, so a pack written for 1.21.1 loads and validates unchanged on 26.x; just do not expect a modded fluid to stop pushing you there.
- **`neoorigins:suppression`: a status effect that locks a player out of their abilities.** The mod has never registered a status effect of its own before; this is the first, and it exists so you do not have to build an ability lock out of parts. While a player holds it, every active, keybind, and toggle power refuses to fire. A key press or a click in the power GUI gets an action bar line and a short sound, because an input that does nothing needs to come with a reason: unlike a cooldown, there is nothing on the HUD telling the player why. Refusals the player did not ask for stay silent, since `neoorigins:activate_power` and continuous held-key bindings can both fire every tick and announcing those would flood the action bar. A toggle power that is already on when the effect lands is forced off rather than left on and locked, which would otherwise strand a player mid-transformation with the one key that undoes it refused. The amplifier carries no meaning and is reserved. Delivery is `/effect` and the `neoorigins:apply_effect` action and nothing else: no brewing recipe, no tipped arrow, and no potion item, because a craftable ability lock is a balance decision that belongs to your pack rather than one the mod should make for every world.
- **Passive powers are left to you, because you can already gate them.** Suppression covers actives, keybinds, and toggles only. That is not an oversight and it is not a first instalment: put a `power_condition` on a passive that tests `neoorigins:has_effect` for `neoorigins:suppression` and leave the mode at its `DENY` default, and the power switches off for exactly as long as the effect is held. Building passive suppression into the effect would have duplicated a surface that already works. `has_effect` and `status_effect` resolve the new effect by id like any other, so nothing else was needed to reach it. See [COOKBOOK.md](docs/COOKBOOK.md) for the worked example.
- **Ocean origins keep their swim bonus when they leave the seafloor.** Reported on Discord: aquatic origins sink and swim badly unless they are walking along the bottom. That is exactly what the numbers said should happen. Every ocean origin's swim bonus, and the shared Natural Swimmer power on top of it, is built on `minecraft:water_movement_efficiency`, and vanilla halves that attribute outright whenever the swimmer is not on the ground. So the entire swim kit ran at half strength in open water and full strength only while the player was standing on a block, which inverts what an ocean origin is meant to feel like. A new shared power, *Open Water*, carries `+0.25 neoforge:swim_speed`, an attribute vanilla reads in the same pass with no such condition, and it is granted to Merling, Siren, Kraken, and Abyssal beside their existing speed powers rather than in place of them. Nothing about `water_movement_efficiency` changes, so bottom-walking is as fast as it ever was and this only lifts the mid-water case that was lagging behind it. The figure is deliberately short of parity: cancelling the halving outright would take roughly `+0.55`, and `swim_speed` is not water-gated, so that would have shown up as a land movement change as well. About `+0.21` restores non-sprint terminal velocity underwater, and `+0.25` clears that with a little room, matches the magnitude Merling's own tier 1 bonus uses, and lifts the vertical swim impulse, which is the part that reads as sinking when it is missing. Pack authors reach the same attribute: `neoforge:swim_speed` resolves straight from datapack JSON in `attribute_modifier`, with no alias needed, and [COOKBOOK.md](docs/COOKBOOK.md) now sets out when to reach for it and when for `water_movement_efficiency`.
- **Aquatic origins mine at full speed while they are actually swimming.** Also reported on Discord, and both halves of the report were accurate: Aqua Affinity says these origins mine at full speed submerged, and they did, but only with their feet planted on a block. Vanilla charges two independent penalties. The first is the submerged-mining attribute, applied when the eyes are in water, which `underwater_mining_speed` has always cancelled. The second is a flat divide by five a few lines later for anyone off the ground, and nothing in the mod touched it, so an aquatic origin paid a fifth of its speed for the whole time it was genuinely swimming and got the full rate only in the one posture the power was least meant for. That fifth is now refunded, gated on all three of eyes in water, off the ground, and holding the power. The off-ground penalty on dry land is a separate anti-cheese rule about mining out of a jump and is deliberately left alone. The correction reads the same synced value the client holds, so break progress is predicted correctly rather than the local player watching the slow animation while the server runs the fast one. Affects Merling, Siren, Kraken, and Abyssal, plus any pack origin using `underwater_mining_speed`.
- **Merling sees in the dark from tier 0, as Siren already did.** Reported as the night vision keybind doing nothing on a fresh Merling while working on a Siren. Both are ocean origins that spawn in deep water, so the difference read as a bug rather than a design line, and it was neither: Siren's base power list carried night vision and Merling's carried none at all. Merling only picked it up at tier 2, folded into the Ascended Conduit alongside water breathing and haste, which left two tiers of swimming around a pitch-black ocean floor with no way to see. *Deep Sight* is now a base power, a straight copy of Siren's Ocean Eyes, and it retires at tier 2 where the conduit takes over, mirroring how Caveborn swaps its base night vision for the ascended one. There is no gap: the same tier overlay that removes the base power grants the conduit, so night vision is continuous from tier 0 upward.
- **Size powers now stack across the origin and class layers instead of the last pick winning.** A Golem (1.3) who takes the Titan class (1.25) should stand at 1.55, and did not: whichever layer was picked most recently took effect and the other was lost, in both directions. The two obvious explanations were both wrong, which is part of what kept this alive. The modifier ids are already namespaced per power, so the origin and class layers were never colliding, and the maths was already additive: the JSON authors an absolute `"scale": 1.3`, but the power converts that to a delta and adds it, so the operation was correct too. The fault was in removal. Revoking any one size power cleared **every** `neoorigins:size_*` modifier on scale and on both interaction ranges, and the layer-change step then re-granted only the layer that had actually changed, so the other layer's size was gone for good. That also explains why it looked intermittent: the first time you were granted two size layers they really did stack, and the collapse only happened when you re-picked. The over-broad sweep was not careless, it was guarding a real bug. A power whose JSON is deleted or renamed leaves a modifier behind that nothing owns, and players were once left permanently rescaled by it. So rather than narrowing the sweep and reopening that, the two jobs are now separate: revoking a power clears only the modifiers that power itself created, and the sweep for genuinely orphaned modifiers moved to the layer-change step, which is the one place that knows the full set of powers a player still has and can therefore tell an orphan from another layer's live modifier. Twelve built-in size powers are affected: Golem, Kraken, Inchling, Tiny, Dwarf, Hiveling, Gorgon, Draconic, Breeze, Caveborn, Warden, and the Titan class. Reported on Discord.
- **On Minecraft 26.1 and 26.2, changing any layer wiped every other layer's `attribute_modifier` bonuses.** Found while porting the fix above, unreported and considerably wider than the size bug. Those two versions had no per-layer sweep at all and cleared every origin-owned attribute modifier whenever any layer changed, so picking a class stripped the max health, armour, and reach your origin granted, and picking an origin stripped the class's, until you relogged. Both branches now use the same targeted sweep as 1.21.1. Players on 26.1 and 26.2 will notice bonuses persisting that used to quietly disappear.
- **`breath_out_of_fluid` honours the drain rate you authored.** Reported on Discord: a custom origin built in the web editor always dried out in about twenty seconds whatever the field said, twenty ticks and two ticks alike. The power parsed the field correctly and then threw it away. A tick handler overwrote it with the global `[ocean_origins] drain_rate_ticks` config on every pass, so the authored value reached nothing and every custom origin dried out at the server's rate instead of its own. The override was deliberate rather than an oversight, but it was too broad: it was written to drive the four built-in aquatic origins from one config option, and it caught custom powers on the way past. The interval is now resolved per power in the same priority order `breath_in_fluid` already uses, `air_loss_per_second` first, then `drain_interval_ticks`, then `drain_rate` as the legacy spelling, and the config applies only when none of the three is present. That last clause is the whole fix. The four built-in `*_dries_out` powers author no drain field at all, so they still track the config exactly as #120 left them, while an origin that names a value gets the value it named; where several such powers apply at once, the tightest interval wins. The schema is what made this reportable rather than merely wrong: it advertised `drain_rate` with a default of forty and a description of what it would do, with nothing to say it was inert, and the editor builds its form from the schema. All three keys are described now, and [POWER_TYPES.md](docs/POWER_TYPES.md) carries the arithmetic, so land time in seconds is roughly `(300 * drain_interval_ticks) / 20` and the number stays checkable against the behaviour.
- **Siren's Beached penalty no longer follows her into the water.** The power carried a fifteen percent movement penalty with no condition on it, so a Siren swam fifteen percent slower than every other ocean origin as well as walking that much slower. It is called Beached and described as a land penalty, which is what the other three ocean origins actually do: Merling, Kraken, and Abyssal all carry `"condition": "on_land"` on the same power, and Siren was the odd one out, with the penalty landing hardest exactly where the origin is supposed to be strong. It is gated on land now. Its description also said ten percent while the value has always been `-0.15`, so the text is corrected to fifteen rather than the value being changed: Merling is the one at ten percent, and the two were most likely copied and only half edited.
- **The night vision key no longer reports success on origins that have none.** Pressing it flipped the stored flag and printed a green "Night vision on" whatever you were playing, with no check that your origin had any night vision to switch. That flag is read in exactly one place, when deciding whether to apply a night vision effect an origin actually specifies, so on an origin without one the key was reporting success for an operation that could not have an effect. Forty-nine of the seventy-eight built-in origins are in that position, so this was the common case rather than the corner one. The key now refuses with a message when there is nothing to toggle, leaves the flag untouched, and re-sends the current state, so a client that has drifted still resyncs. A power gated on a condition still counts as owning night vision, since the question is whether the origin has it rather than whether it happens to be lit at that moment: otherwise a Caveborn who walked into daylight would be told they had none. The admin kill switch is unaffected and still takes precedence, so a server that has turned night vision off gives its own message regardless of what the player is playing.
- **A parameterised particle named by bare id no longer takes the whole power down with it.** Found while boot-testing this release against a third-party pack, unreported and not new to this cycle. `mrt_chemist:immunity-shot` failed to load on Minecraft 26.1 and 26.2 with "missing or unknown 'particle' field" while loading fine on 1.21.1, and the pack does nothing unusual: it writes `"particle": "minecraft:dragon_breath"`. Minecraft 26 reclassified four particles that took no arguments on 1.21.1 into parameterised ones, `dragon_breath`, `effect`, `instant_effect` and `flash`, and the power accepted an argument-free particle only by bare id. So on those versions the four stopped resolving, and because the particle field is required, the failure dropped the entire power rather than just its decoration. A parameterised particle named with no arguments now falls back to its plainest form, opaque white at unit scale with no delay, which for those four is what they looked like before the reclassification, so a pack written for 1.21.1 renders unchanged on 26.x. The same fallback picks up `entity_effect`, `dust`, `sculk_charge` and `shriek`, which are parameterised on every version and were equally unusable bare. Particles that need a referent rather than a decoration, `block`, `item` and `vibration`, still require the object or inline-argument form: there is no honest default for which block, so those stay an error and say so.
- **The Blazeling entries described a version of the origin that has not shipped since 2.2.** Checked against the live JSON rather than against the previous text, and four of its powers were wrong: Blaze Scales is +6 max health, not natural armour; Nether-Born grants Speed in the Nether, not faster healing; and Internal Heat costs you hunger twenty-five percent faster, so it is a drawback rather than the passive warmth aura it was written up as. The tier table was wrong in both directions too. The second tier was listed as granting Fire Resistance, which 2.2 replaced with +4 max health, and its removal entry named a power that no longer exists, so it read as removing nothing; the third tier was described as removing the Evolved health bonus when it removes the Ascended one. [ORIGINS.md](docs/ORIGINS.md) and [EVOLUTION.md](docs/EVOLUTION.md) now match what the origin actually grants.
- **An `on_fire` condition can never be true on a fire-immune origin.** Worth knowing before you build a mechanic on it. Fire-immune players have their remaining fire ticks zeroed every tick, which was done deliberately to stop the burning overlay flickering on origins that cannot burn, and `on_fire` reads that same counter. So on Blazeling, or on anything else carrying `prevent_action: fire`, a power gated on `on_fire` is not merely unlikely to fire, it is structurally dead. [CONDITIONS.md](docs/CONDITIONS.md) says so now, and points at `in_lava` or a dimension test as the workable alternatives.
- **`modify_reach` scales by default, whatever the cookbook said.** [COOKBOOK.md](docs/COOKBOOK.md) had claimed since v1.14 that reach only scales when explicitly enabled. The field has defaulted to `true` on every branch for as long as it has existed, so anyone who wrote a size power expecting reach to stay put has been getting scaled reach the whole time. Corrected.
- **How the two layers stack is now written down.** The bug above was possible partly because nothing said what the intended behaviour was. [POWER_TYPES.md](docs/POWER_TYPES.md) now states the stacking rule under both `size_scaling` and `attribute_modifier`, [CLASSES.md](docs/CLASSES.md) has a section on how a class layer combines with the origin layer rather than replacing it, and [COOKBOOK.md](docs/COOKBOOK.md) gains the cross-layer pitfall as a worked case.
release
NeoOrigins v2.2.23 (MC 26.1.x)
v2.2.23+26.17 авг. 2026 г.71Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> Two new tools for pack authors, a pass over the ocean origins, and a fix for a bug that quietly undid part of your origin. `neoorigins:ignore_fluid` generalises `ignore_water` into a power that removes a fluid from the player's world outright: no buoyancy, no drag, no current push, no drowning, no lava burn, no fog, no swim pose, for modded fluids as much as vanilla ones. It gets there by intercepting fluid **detection** rather than each effect in turn, which is why third-party mods fall away with it. `neoorigins:suppression` is the first status effect NeoOrigins has ever registered: a ready-made ability lock to hang a boss mechanic, a debuff zone, or a PvP counter on. And size powers now stack across the origin and class layers, where picking a class used to wipe the origin layer's size instead of adding to it, so a Golem who took Titan stood at 1.25 rather than 1.55.
>
> The aquatic origins get the pass they have been owed. Two vanilla rules were quietly undoing their signature abilities the moment they left the seafloor, so they swam and mined at their best while standing on a block and worst while genuinely swimming, which is the wrong way round. Both are corrected. Merling can see in the dark from tier 0 rather than tier 2, Siren's Beached penalty stops following her into the water, and the night vision key no longer claims success on the forty-nine built-in origins that have no night vision to toggle. Alongside them, `breath_out_of_fluid` honours the drain rate you author, which it had been parsing and then discarding for every custom origin that set one.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`neoorigins:ignore_fluid` makes a fluid stop existing for the player.** `ignore_water` removes water's speed penalty and its current pushing, and nothing else: you still float, still drown, still see the blue. The new power removes the fluid entirely. No buoyancy, no drag, no current push, no drowning, no lava burn, no fog or screen overlay, no swim pose. It works by intercepting fluid **detection** rather than cancelling each behaviour one at a time: the body scan that feeds buoyancy, drag, `isInWater()`, `isInLava()` and the swim pose hands back an empty fluid state for an ignored fluid, as does the eye scan behind drowning and the air bar, the camera query behind fog and the underwater distortion, and the block's own `entityInside`, which is how modded fluids deliver their damage. Because every vanilla fluid behaviour reads those same values, they all fall away together, and so do most third-party mods, since they ask the same standard questions. `ignore_water` is unchanged and still supported: reach for it when you only want the movement penalty gone, and for this when you want the fluid to stop registering at all.
- **Naming a fluid covers its whole type, and a bad id costs you nothing.** `fluid` takes a fluid id (`"minecraft:lava"`), a fluid tag (`"#c:milk"`), or an array of either; `fluids` is the plural spelling, and both keys are read and merged, so it does not matter which one you reach for. An entry without a namespace gets `minecraft:`. Naming any fluid of a type ignores the type, so `"minecraft:water"` also covers `minecraft:flowing_water`, which is what makes poured buckets work. If you give neither key the power defaults to water and lava, so a marker-only entry is never a silent no-op. An unknown or misspelled id is dropped quietly rather than failing the datapack load, which matters because the whole point is naming fluids from mods that may not be installed: parsing never touches the fluid registry, so an id for an absent mod cannot throw at load or during login sync. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and worked examples.
- **What `ignore_fluid` deliberately does not reach.** Fluid rendering is untouched: the fluid still draws normally, you simply pass through it as if it were air. A mod that runs its own `level.getFluidState(pos)` check per tick, rather than asking the entity whether it is in a fluid, is doing its own detection and cannot be intercepted from here. The same goes for anything keyed off the block state rather than the fluid state. And one side effect is intended rather than tolerated: the `entityInside` guard is keyed on the block's fluid state, so a *waterlogged* block's own behaviour is suppressed too while you ignore water, which in practice means bubble columns stop pushing you. That is the honest reading of "water does not affect me". On Minecraft 26.1 and 26.2 there is a further limit, and it is worth reading before you write the pack: those versions track entity fluid interaction only for fluids in the `minecraft:water` and `minecraft:lava` tags, so an entry naming a fluid outside them is accepted and syncs its capability but drives nothing on the movement side. The `entityInside` guard still fires there, so a modded fluid's own damage is still cancelled even where its buoyancy and drag are not. The field shape is identical on every branch on purpose, so a pack written for 1.21.1 loads and validates unchanged on 26.x; just do not expect a modded fluid to stop pushing you there.
- **`neoorigins:suppression`: a status effect that locks a player out of their abilities.** The mod has never registered a status effect of its own before; this is the first, and it exists so you do not have to build an ability lock out of parts. While a player holds it, every active, keybind, and toggle power refuses to fire. A key press or a click in the power GUI gets an action bar line and a short sound, because an input that does nothing needs to come with a reason: unlike a cooldown, there is nothing on the HUD telling the player why. Refusals the player did not ask for stay silent, since `neoorigins:activate_power` and continuous held-key bindings can both fire every tick and announcing those would flood the action bar. A toggle power that is already on when the effect lands is forced off rather than left on and locked, which would otherwise strand a player mid-transformation with the one key that undoes it refused. The amplifier carries no meaning and is reserved. Delivery is `/effect` and the `neoorigins:apply_effect` action and nothing else: no brewing recipe, no tipped arrow, and no potion item, because a craftable ability lock is a balance decision that belongs to your pack rather than one the mod should make for every world.
- **Passive powers are left to you, because you can already gate them.** Suppression covers actives, keybinds, and toggles only. That is not an oversight and it is not a first instalment: put a `power_condition` on a passive that tests `neoorigins:has_effect` for `neoorigins:suppression` and leave the mode at its `DENY` default, and the power switches off for exactly as long as the effect is held. Building passive suppression into the effect would have duplicated a surface that already works. `has_effect` and `status_effect` resolve the new effect by id like any other, so nothing else was needed to reach it. See [COOKBOOK.md](docs/COOKBOOK.md) for the worked example.
- **Ocean origins keep their swim bonus when they leave the seafloor.** Reported on Discord: aquatic origins sink and swim badly unless they are walking along the bottom. That is exactly what the numbers said should happen. Every ocean origin's swim bonus, and the shared Natural Swimmer power on top of it, is built on `minecraft:water_movement_efficiency`, and vanilla halves that attribute outright whenever the swimmer is not on the ground. So the entire swim kit ran at half strength in open water and full strength only while the player was standing on a block, which inverts what an ocean origin is meant to feel like. A new shared power, *Open Water*, carries `+0.25 neoforge:swim_speed`, an attribute vanilla reads in the same pass with no such condition, and it is granted to Merling, Siren, Kraken, and Abyssal beside their existing speed powers rather than in place of them. Nothing about `water_movement_efficiency` changes, so bottom-walking is as fast as it ever was and this only lifts the mid-water case that was lagging behind it. The figure is deliberately short of parity: cancelling the halving outright would take roughly `+0.55`, and `swim_speed` is not water-gated, so that would have shown up as a land movement change as well. About `+0.21` restores non-sprint terminal velocity underwater, and `+0.25` clears that with a little room, matches the magnitude Merling's own tier 1 bonus uses, and lifts the vertical swim impulse, which is the part that reads as sinking when it is missing. Pack authors reach the same attribute: `neoforge:swim_speed` resolves straight from datapack JSON in `attribute_modifier`, with no alias needed, and [COOKBOOK.md](docs/COOKBOOK.md) now sets out when to reach for it and when for `water_movement_efficiency`.
- **Aquatic origins mine at full speed while they are actually swimming.** Also reported on Discord, and both halves of the report were accurate: Aqua Affinity says these origins mine at full speed submerged, and they did, but only with their feet planted on a block. Vanilla charges two independent penalties. The first is the submerged-mining attribute, applied when the eyes are in water, which `underwater_mining_speed` has always cancelled. The second is a flat divide by five a few lines later for anyone off the ground, and nothing in the mod touched it, so an aquatic origin paid a fifth of its speed for the whole time it was genuinely swimming and got the full rate only in the one posture the power was least meant for. That fifth is now refunded, gated on all three of eyes in water, off the ground, and holding the power. The off-ground penalty on dry land is a separate anti-cheese rule about mining out of a jump and is deliberately left alone. The correction reads the same synced value the client holds, so break progress is predicted correctly rather than the local player watching the slow animation while the server runs the fast one. Affects Merling, Siren, Kraken, and Abyssal, plus any pack origin using `underwater_mining_speed`.
- **Merling sees in the dark from tier 0, as Siren already did.** Reported as the night vision keybind doing nothing on a fresh Merling while working on a Siren. Both are ocean origins that spawn in deep water, so the difference read as a bug rather than a design line, and it was neither: Siren's base power list carried night vision and Merling's carried none at all. Merling only picked it up at tier 2, folded into the Ascended Conduit alongside water breathing and haste, which left two tiers of swimming around a pitch-black ocean floor with no way to see. *Deep Sight* is now a base power, a straight copy of Siren's Ocean Eyes, and it retires at tier 2 where the conduit takes over, mirroring how Caveborn swaps its base night vision for the ascended one. There is no gap: the same tier overlay that removes the base power grants the conduit, so night vision is continuous from tier 0 upward.
- **Size powers now stack across the origin and class layers instead of the last pick winning.** A Golem (1.3) who takes the Titan class (1.25) should stand at 1.55, and did not: whichever layer was picked most recently took effect and the other was lost, in both directions. The two obvious explanations were both wrong, which is part of what kept this alive. The modifier ids are already namespaced per power, so the origin and class layers were never colliding, and the maths was already additive: the JSON authors an absolute `"scale": 1.3`, but the power converts that to a delta and adds it, so the operation was correct too. The fault was in removal. Revoking any one size power cleared **every** `neoorigins:size_*` modifier on scale and on both interaction ranges, and the layer-change step then re-granted only the layer that had actually changed, so the other layer's size was gone for good. That also explains why it looked intermittent: the first time you were granted two size layers they really did stack, and the collapse only happened when you re-picked. The over-broad sweep was not careless, it was guarding a real bug. A power whose JSON is deleted or renamed leaves a modifier behind that nothing owns, and players were once left permanently rescaled by it. So rather than narrowing the sweep and reopening that, the two jobs are now separate: revoking a power clears only the modifiers that power itself created, and the sweep for genuinely orphaned modifiers moved to the layer-change step, which is the one place that knows the full set of powers a player still has and can therefore tell an orphan from another layer's live modifier. Twelve built-in size powers are affected: Golem, Kraken, Inchling, Tiny, Dwarf, Hiveling, Gorgon, Draconic, Breeze, Caveborn, Warden, and the Titan class. Reported on Discord.
- **On Minecraft 26.1 and 26.2, changing any layer wiped every other layer's `attribute_modifier` bonuses.** Found while porting the fix above, unreported and considerably wider than the size bug. Those two versions had no per-layer sweep at all and cleared every origin-owned attribute modifier whenever any layer changed, so picking a class stripped the max health, armour, and reach your origin granted, and picking an origin stripped the class's, until you relogged. Both branches now use the same targeted sweep as 1.21.1. Players on 26.1 and 26.2 will notice bonuses persisting that used to quietly disappear.
- **`breath_out_of_fluid` honours the drain rate you authored.** Reported on Discord: a custom origin built in the web editor always dried out in about twenty seconds whatever the field said, twenty ticks and two ticks alike. The power parsed the field correctly and then threw it away. A tick handler overwrote it with the global `[ocean_origins] drain_rate_ticks` config on every pass, so the authored value reached nothing and every custom origin dried out at the server's rate instead of its own. The override was deliberate rather than an oversight, but it was too broad: it was written to drive the four built-in aquatic origins from one config option, and it caught custom powers on the way past. The interval is now resolved per power in the same priority order `breath_in_fluid` already uses, `air_loss_per_second` first, then `drain_interval_ticks`, then `drain_rate` as the legacy spelling, and the config applies only when none of the three is present. That last clause is the whole fix. The four built-in `*_dries_out` powers author no drain field at all, so they still track the config exactly as #120 left them, while an origin that names a value gets the value it named; where several such powers apply at once, the tightest interval wins. The schema is what made this reportable rather than merely wrong: it advertised `drain_rate` with a default of forty and a description of what it would do, with nothing to say it was inert, and the editor builds its form from the schema. All three keys are described now, and [POWER_TYPES.md](docs/POWER_TYPES.md) carries the arithmetic, so land time in seconds is roughly `(300 * drain_interval_ticks) / 20` and the number stays checkable against the behaviour.
- **Siren's Beached penalty no longer follows her into the water.** The power carried a fifteen percent movement penalty with no condition on it, so a Siren swam fifteen percent slower than every other ocean origin as well as walking that much slower. It is called Beached and described as a land penalty, which is what the other three ocean origins actually do: Merling, Kraken, and Abyssal all carry `"condition": "on_land"` on the same power, and Siren was the odd one out, with the penalty landing hardest exactly where the origin is supposed to be strong. It is gated on land now. Its description also said ten percent while the value has always been `-0.15`, so the text is corrected to fifteen rather than the value being changed: Merling is the one at ten percent, and the two were most likely copied and only half edited.
- **The night vision key no longer reports success on origins that have none.** Pressing it flipped the stored flag and printed a green "Night vision on" whatever you were playing, with no check that your origin had any night vision to switch. That flag is read in exactly one place, when deciding whether to apply a night vision effect an origin actually specifies, so on an origin without one the key was reporting success for an operation that could not have an effect. Forty-nine of the seventy-eight built-in origins are in that position, so this was the common case rather than the corner one. The key now refuses with a message when there is nothing to toggle, leaves the flag untouched, and re-sends the current state, so a client that has drifted still resyncs. A power gated on a condition still counts as owning night vision, since the question is whether the origin has it rather than whether it happens to be lit at that moment: otherwise a Caveborn who walked into daylight would be told they had none. The admin kill switch is unaffected and still takes precedence, so a server that has turned night vision off gives its own message regardless of what the player is playing.
- **A parameterised particle named by bare id no longer takes the whole power down with it.** Found while boot-testing this release against a third-party pack, unreported and not new to this cycle. `mrt_chemist:immunity-shot` failed to load on Minecraft 26.1 and 26.2 with "missing or unknown 'particle' field" while loading fine on 1.21.1, and the pack does nothing unusual: it writes `"particle": "minecraft:dragon_breath"`. Minecraft 26 reclassified four particles that took no arguments on 1.21.1 into parameterised ones, `dragon_breath`, `effect`, `instant_effect` and `flash`, and the power accepted an argument-free particle only by bare id. So on those versions the four stopped resolving, and because the particle field is required, the failure dropped the entire power rather than just its decoration. A parameterised particle named with no arguments now falls back to its plainest form, opaque white at unit scale with no delay, which for those four is what they looked like before the reclassification, so a pack written for 1.21.1 renders unchanged on 26.x. The same fallback picks up `entity_effect`, `dust`, `sculk_charge` and `shriek`, which are parameterised on every version and were equally unusable bare. Particles that need a referent rather than a decoration, `block`, `item` and `vibration`, still require the object or inline-argument form: there is no honest default for which block, so those stay an error and say so.
- **The Blazeling entries described a version of the origin that has not shipped since 2.2.** Checked against the live JSON rather than against the previous text, and four of its powers were wrong: Blaze Scales is +6 max health, not natural armour; Nether-Born grants Speed in the Nether, not faster healing; and Internal Heat costs you hunger twenty-five percent faster, so it is a drawback rather than the passive warmth aura it was written up as. The tier table was wrong in both directions too. The second tier was listed as granting Fire Resistance, which 2.2 replaced with +4 max health, and its removal entry named a power that no longer exists, so it read as removing nothing; the third tier was described as removing the Evolved health bonus when it removes the Ascended one. [ORIGINS.md](docs/ORIGINS.md) and [EVOLUTION.md](docs/EVOLUTION.md) now match what the origin actually grants.
- **An `on_fire` condition can never be true on a fire-immune origin.** Worth knowing before you build a mechanic on it. Fire-immune players have their remaining fire ticks zeroed every tick, which was done deliberately to stop the burning overlay flickering on origins that cannot burn, and `on_fire` reads that same counter. So on Blazeling, or on anything else carrying `prevent_action: fire`, a power gated on `on_fire` is not merely unlikely to fire, it is structurally dead. [CONDITIONS.md](docs/CONDITIONS.md) says so now, and points at `in_lava` or a dimension test as the workable alternatives.
- **`modify_reach` scales by default, whatever the cookbook said.** [COOKBOOK.md](docs/COOKBOOK.md) had claimed since v1.14 that reach only scales when explicitly enabled. The field has defaulted to `true` on every branch for as long as it has existed, so anyone who wrote a size power expecting reach to stay put has been getting scaled reach the whole time. Corrected.
- **How the two layers stack is now written down.** The bug above was possible partly because nothing said what the intended behaviour was. [POWER_TYPES.md](docs/POWER_TYPES.md) now states the stacking rule under both `size_scaling` and `attribute_modifier`, [CLASSES.md](docs/CLASSES.md) has a section on how a class layer combines with the origin layer rather than replacing it, and [COOKBOOK.md](docs/COOKBOOK.md) gains the cross-layer pitfall as a worked case.
release
NeoOrigins v2.2.22 (MC 1.21.1)
v2.2.22+1.21.13 авг. 2026 г.2,5 тыс.Minecraft: 1.21.1neoforge
Что нового
> A legacy-compatibility and morphing release. The headline: two compatibility actions that packs lean on constantly turn out never to have worked. `apply_effect` resolved its effect id only from a bare string, but two hundred and fourteen of the two hundred and twenty-eight uses in the pack corpus nest it in an object, so those powers loaded, appeared on the origin, and applied nothing at all; `origins:choice` read the wrong key for its wrapped action, so it rolled a branch and then ran nothing. Both are fixed. Legacy 1.20-era packs also have their `.mcfunction` files rewritten as they are read, which took a Fairytale Origins test install from forty-two failed function loads down to nine (#118), and `entity_model` grows from a bare model swap into a full morph system with datapack-defined morphs, matching hitboxes, borrowed entity sounds, skin overrides, and first-person arms. Plus ten more legacy Apoli conditions understood instead of failing closed, real editor forms for twenty-nine alias power types that used to render as raw JSON, and three stability fixes: ocean origins no longer hang the server while picking a spawn point, `origins:lava_vision` no longer paints the whole screen a flat colour (#121), and aquatic origins dry out on land in the fifteen seconds vanilla fish get rather than two and a half minutes (#120), though an existing config file keeps the old value until you edit it.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`entity_model` is now a full morph system, not just a model swap.** The power previously took a single `entity_type` and rendered you as that model. It now describes a whole morph. `nbt` selects a variant (sheep colour, villager profession, slime size); `scale` (default `1.0`) sizes both model and hitbox; `hitbox` (default `true`) swaps your actual collision box and eye height to match, so a slime morph really does fit where a slime fits; `render_held_item` and `render_armor` (both default `true`) control whether your gear draws on the morph; `first_person` (default `"item"`) chooses what you see in your own hands, accepting `"item"`, `"arm"` for the morph's own limb, or `"hidden"`; and `arm` names an explicit bone if the automatic search picks the wrong one. Morph state is broadcast to every client tracking you, so other players see the morph too, not just you.
- **Datapack-defined morphs.** A file at `data/<namespace>/neoorigins/morphs/<name>.json` declares a reusable morph, and a power references it with `"morph": "<id>"` instead of spelling every field out inline. A bare name resolves to `neoorigins:<name>`, and a file whose id matches a built-in overrides it. Ten morphs ship built in (slime, magma cube, sheep, cat, villager, creeper, zombie, skeleton, enderman, and spider), and all are datapack-overridable. An unknown morph id logs a one-time warning and resolves to no morph rather than failing the power. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the full field reference.
- **Morphs can borrow the entity's sounds and reskin the player.** `entity_sounds` (default `true`) makes your hurt, death, fall, swim, and splash sounds come from the morph's entity type. A `sounds` object overrides any of them individually by sound-event id (`hurt`, `death`, `fall_small`, `fall_big`, `swim`, `splash`, `splash_high_speed`). For player-shaped morphs, a `skin` block sets `texture`, `cape`, and `elytra` asset ids and a `model` of `"slim"` or `"wide"`; anything left unset falls through to the player's real skin, so you can restyle only the parts you care about. Step sounds still come from the block underfoot, as in vanilla.
- **Twenty-nine legacy alias power types now have real editor forms.** Legacy types carried by the compatibility layer (the four persistent-effect aliases, seven `condition_passive` aliases, fourteen `action_on_event` aliases, and four stragglers) had no schema branch of their own, so both the web editor and the in-game editor fell back to a raw-JSON box and left the author to spell every field from memory. All twenty-nine are now modelled, and the allowlist that exempted them is empty. Alongside that: the power type picker is grouped by namespace and reads compatibility types straight off the parser rather than the native registry alone, so nothing is missing from the list; scalar-or-array reference fields (roughly twenty of them) render as proper pickers in both editors instead of raw JSON; and the top-level `enabled` kill switch and `action_on_event`'s `hit_dealt` event are declared where they were being read but not described. The thirty-one native types that fall back to codec reflection, among them `multiple`, `status_effect`, `glow`, and `night_vision`, get their display name, description, hidden flag, and `required_mods` rows back. Those keys belong to no power's config record, so the fallback path had never offered them even though a datapack could always write them by hand.
- **The schemas no longer reject JSON the mod itself accepts.** Three separate cases where the editors flagged a perfectly good file as invalid. The layer schema never declared `standalone`, took `name` as a plain string only, and allowed only bare-id or single-object origin entries, while the layer loader accepts all three of the shapes it left out. The item-condition schema demanded a `type` that the parser has never needed, so the typeless `id` / `item` / `tag` shorthand, which NeoOrigins' own Jianxian powers use, failed the mod's own schema. And `prevent_action` declared its two enums in lowercase only, though the power upper-cases before matching, so the sixteen shipped powers written in `SCREAMING_CASE` were all reported invalid while working perfectly in game. All three now describe what the loader actually does.
- **The web editor imports upstream Origins-layout packs.** The importer matched only the editor's own native layout, so every pack laid out the Origins way failed at the origin step. It now tries native then compatibility layouts for origins, layers, and powers, the same pairing the server-side loaders already use, with the compatibility pattern excluding sibling directories, so `origins/powers/foo.json` no longer imports as an origin called `powers/foo`. Three ways it used to lose data are fixed alongside. It read only the nine origin fields the Identity tab covers and discarded the other six, so a round trip through the editor silently stripped evolution tiers, spawn placement, required mods, the special flag, and Figura model keys. Fifty-eight of the seventy-eight shipped origins carry tier powers, so that was the normal case, not an edge one. Unmapped keys now ride along and are written back verbatim, and the import says what it carried. A name written as `{"text": "Asura"}` was flattened to an empty string, which blanked the name and description of six of NeoOrigins' own origins on import. And importing a built-in power threw on a Svelte proxy and appended nothing at all.
- **`lava_vision` can set its fog distances directly.** The power took only a multiplicative `strength`, which scales both of vanilla's lava fog distances at once, so there was no way to say "fog starts at zero blocks and ends at fifteen". Two optional fields, `start` and `end`, now set those two distances in blocks outright, and either may be given on its own, with the plane you leave out still scaled by `strength`. Values that cannot describe a fog volume, a multiplier of zero or less, or an `end` at or before `start`, are discarded rather than applied, so a malformed field can no longer blank the screen. When more than one active power grants lava vision the most generous of each is taken: the largest multiplier, the nearest start, the furthest end. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference.
- **Wiring up a spare orb is documented.** The four inert orbs (gold, pink, purple, and teal) ship with no behaviour on purpose, for datapacks to bind. A new worked recipe walks the whole path end to end: a custom origin layer, an `action_on_event` power that opens the layer picker scoped to it, the global-power grant that makes the orb work whatever your origin is, and a crafting recipe for the orb itself. See [COOKBOOK.md](docs/COOKBOOK.md) § 16.
- **Night vision has its own toggle key, default `K`.** Community feedback asked for night vision to be switchable on any origin that grants it. The switch is a player-level flag rather than a property of one power, so a single keypress covers every tier of a multi-tier origin, and it defaults to on, so nothing changes for players who never press the key. It is deliberately its own keybind rather than an active ability: an earlier attempt spent a skill slot on it and let a stray skill keypress silently disable night vision, which testers reported as "night vision doesn't work". The server stays authoritative: the client asks for a flip and only updates once the server echoes it back, so the admin kill switch cannot be talked around. The key is listed in [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **Aquatic origins dry out ten times faster on land (#120).** `[ocean_origins] drain_rate_ticks` shipped at `10`, meaning one air point lost every ten ticks out of a supply of three hundred: two and a half minutes of standing on dry land before drowning damage even begins. Vanilla cod and salmon lose one air point per tick, so fifteen seconds, and the power is written to mirror them. The default is now `1`. The config comment is what produced the wrong number: it correctly described vanilla fish, then recommended `16` as the fish-comparable setting, which is four minutes. It now gives the arithmetic instead. Land time in seconds is roughly `(300 * value) / 20`, so the number stays checkable against the behaviour. If you have run the pack before, note that config files are written once and **never re-defaulted**: an existing `config/neoorigins/gameplay.toml` keeps `drain_rate_ticks = 10` until you edit that line by hand or delete the file and let it regenerate. If fifteen seconds is too harsh for your pack, raise the number (`2` is thirty seconds, `4` is a minute) or set `dries_out = false` to switch the mechanic off entirely.
- **Ocean origins no longer lock up the server while looking for somewhere to spawn.** Five aquatic origins, plus Forest Dragon and Enderian, find their spawn point by asking the world for the nearest matching biome, and that search ran on the server thread at a radius of 12800 blocks with a sixteen-block step: around thirty million climate samples in the worst case, with nothing able to interrupt it. Under ordinary worldgen an ocean sits a few hundred blocks out and the search finishes in milliseconds, which is exactly why this never surfaced in testing. Install a biome or terrain mod that pushes oceans away from world spawn, or one whose own oceans are not in the `minecraft:is_ocean` tag, and the search runs to exhaustion instead: the server thread stops responding and Minecraft's sixty-second watchdog kills the server, with nothing thrown, so it reads as a crash with no cause. The search now runs on a worker thread with a five-second budget, bounded by vanilla `/locate biome`'s own numbers (radius 6400, horizontal step 32, vertical step 64), about twenty-seven times fewer samples. One consequence worth knowing: a matching biome that exists only between 6400 and 12800 blocks out is no longer found, and the player spawns normally with a line in the log. `[spawn_location] teleports_enabled = false` still disables the whole path.
- **Origin spawn teleports no longer freeze the server while terrain generates.** Once a spawn point was found, the step that turns it into a standable position force-loaded chunks a block at a time, and each of those loads blocks the server thread until the chunk exists. Landing in ungenerated terrain on a pack with worldgen mods installed therefore meant twenty to thirty seconds of a completely unresponsive server before the player was placed. The chunks that step needs are now requested up front through the ordinary chunk ticket system and polled once per tick, so the server keeps running while they generate and the placement happens only once they are all present. If they have not arrived within thirty seconds the teleport is abandoned and the player spawns normally. Placement passes over a candidate column whose clearance check would read outside the loaded area, rather than generating more chunks for it. Because the teleport now lands a generation-time later rather than on the next tick, a player who changes dimension while it is still waiting is left where they are instead of being pulled away.
- **Two hot server paths stop doing work for players who cannot trigger them.** Every monster spawn attempt walked every player in the level and every power they held looking for a spawn-warding power that almost nobody has; that scan is now gated on a cheap per-dimension probe, and the distance check it does reach dropped a square root. Separately, the capability lookup that six server mixins call per tick and per block walked the whole power list and allocated a set on every call; it now consults a cached union of the static capabilities first, used purely as a negative filter: a capability the cache does not contain cannot come from any of those powers, while one it does contain still runs the full live scan, so the shortcut can never answer yes on its own.
- **Six built-in origins granted the same status effect from two powers at once after a tier upgrade.** When a tier adds a power that supersedes a base one, the tier's `remove` list is what tears the old power down, and in six cases it was missing an entry. Abyssal at apex kept both its base night vision and water breathing alongside the apex conduit power that already granted them; Caveborn kept an iron-eating haste bonus underneath permanent apex haste; Verdant kept a forest regeneration power underneath permanent apex regeneration; and Kraken, Merling, and Water Mage each kept a conditional water-breathing power underneath an unconditional one. This was not merely redundant. A conditional power clears its own effect when its condition goes false, so stepping out of the water as an Abyssal at apex would strip the permanent water breathing that the apex power was maintaining. All six now remove the superseded power on upgrade, and a new test walks every built-in origin at every tier to stop it recurring.
- **Blacksmith armour toughness now applies per armour slot.** A full set of quality-crafted armour granted a single toughness bonus instead of one per piece, because all four pieces shared one attribute-modifier id and the game deduplicates modifiers by id. Each slot now carries its own id, so head, chest, legs, and feet stack independently. Mining speed and attack damage were never affected, since only one held item is ever in play.
- **Shift-clicking a quality craft no longer loses the buff.** Taking a crafted item with shift-click distributes it into your inventory before the crafted-item event fires, so the quality bonus was applied to a stack that had already been merged away and vanished. The buff is now applied to the result slot as it is assembled, which covers both the click-take and shift-click paths. Applying it twice is harmless, so nothing double-dips.
- **Legacy attribute rewriting no longer corrupts unrelated text.** The compatibility layer rewrites 1.20-era attribute ids, but the rule matched `generic.` anywhere in a line rather than only in attribute positions, so `playsound minecraft:entity.generic.extinguish_fire` was mangled into nonsense, and the same applied to quoted text in `tellraw` and `say`. Matching is now anchored to the attribute argument of the `attribute` command and to attribute-modifier NBT fields, and skips quoted strings entirely. On Minecraft 1.21.1 the rewrite is gone altogether: 1.21.1 still spells attributes `generic.armor`, and the prefix drop only landed in 1.21.2, so stripping it there turned a valid id into an invalid one.
- **Gravity Mage's Repulse pushes at the strength it was authored with.** The power asks for a knockback strength of 2.5, but it spells that field `knockback_strength` while the alias it routes through reads `strength`, so the field was inert and the ability has been pushing at the 1.0 fallback since it shipped. The name is an easy one to get wrong: Ground Slam and Tidal Wave both genuinely declare a `knockback_strength` field, so it looks right by analogy, and only Repulse goes through the alias. Fixed by making the authored intent the thing that runs, which means this is a live balance change: Repulse now pushes two and a half times as hard as it did.
- **Two Jianxian sword glows were invisible.** `glow_alpha` is a 0-255 integer, and both powers authored it as an 0-1 fraction, which floored to zero. Zero is a legal value rather than "unset", so it was accepted instead of falling back to the default, and the halos never drew at all. Converted to the intended fractions of 255, so Sword Qi and Heaven-Severing Slash gain the glow their author asked for.
- **Commands run by `execute_command` are no longer rewritten when they already work.** The legacy-command rewriter is a set of heuristics meant to run only on commands that fail to parse, and the chat path has guarded it that way since #92. The `execute_command` action skipped that guard and rewrote everything it was given, so a pack issuing a perfectly valid modern command could have it altered underneath it. It now parses the command first and leaves it alone if it already works.
- **`apply_effect` never applied anything in the shape almost every pack writes.** Apoli's documented shape nests the effect in an object: `"effect": {"effect": "minecraft:speed", "duration": 200, "amplifier": 1}`. The compatibility parser resolved the effect id only from a bare `"effect"` string, so every nested use fell straight through to a silent no-op. Of the two hundred and twenty-eight `apply_effect` uses in the pack corpus, two hundred and fourteen are that shape, spread over a hundred and twenty-four files, and not one of them did anything: the power loaded, the origin listed it, and no effect was ever applied. The remaining fourteen use the `effects[]` array, which the parser truncated to the first entry, so a jellyfish sting that should poison and weaken and slow only poisoned. Between the two, no `apply_effect` in the corpus took a path the parser handled correctly. Effect resolution now lives in one place that reads all three shapes and returns every effect asked for rather than the first, and the nested object supplies its own duration, amplifier, and display flags, because that is where authors put them. The target-entity path used by `target_action` and `area_of_effect` shares that resolver, so it no longer carries its own copy of both bugs. When nothing resolves, the parser warns and names the three shapes it accepts instead of returning quietly. That silence is the only reason this survived as long as it did.
- **`origins:choice` rolled a branch and then ran nothing.** Each entry in a weighted `choice` is a wrapper record rather than an action, and Apoli keys the wrapped action `element`. The parser read `action` instead, so every branch resolved to a no-op whichever way the roll went, and a power built entirely out of random outcomes looked like it was simply unlucky every time. `element` is now read, `action` stays accepted as a synonym so anything authored against NeoOrigins' own documentation keeps working, and `element` wins when an entry carries both.
- **Legacy `.mcfunction` files are now translated as they are read (#118).** A function file that fails to compile never runs at all, and never reaches the hook where legacy commands were previously repaired, so packs shipping 1.20 command syntax inside their functions lost those functions silently. Function contents are now rewritten at pack-read time, before the game parses them. Item NBT in `give`, `item replace`, and `item modify` becomes a data-component patch, covering custom names and lore, enchantments, potions, unbreakable, damage, repair cost, custom model data, and hidden tooltip flags, with anything unrecognised preserved under `custom_data`. `clear` is translated as a subset match rather than a component patch, since it takes an item predicate. And 1.20 particle arguments are converted to their 1.21 form for `dust`, `dust_color_transition`, `block`, `item`, and `entity_effect`. On a Fairytale Origins test install this took failed function loads from forty-two down to nine on 1.21.1, and most of what remains there needs mods that were not installed. Minecraft 26.1 and 26.2 carry seven more failures on top of those nine, in command shapes that changed after 1.21.1 and are not rewritten yet: the `generic.` attribute prefix, the split of `minecraft:potion` into thrown and lingering entities, and `gamerule`.
- **Three more legacy power types are implemented: `modify_healing`, `modify_status_effect_duration`, and `action_on_death`.** All three are authored in six packs in the corpus, and all three were rejected by the schema and dropped by the loader. `modify_healing` scales all healing, matching Apoli's contract rather than natural regeneration alone; `modify_status_effect_duration` multiplies the duration of effects as they are applied; and `action_on_death` fires with the killer available, so it can pair with a `bientity_action`. Their modifier maths reads the 1.16-era `multiply_base` and `multiply_total` spellings these packs actually use, rather than only the modern Apoli names. Reading only the modern names would have left every real use silently doing nothing. All four namespace spellings of each type are declared, so the editors get real forms for them too.
- **1.20-style particle strings are accepted in power JSON.** A `particle` field written the old way, as `"minecraft:dust 0.1 0.5 0.1 1"` with its arguments in one string, previously failed the whole power to load. The leading particle id is now used and the power loads.
- **Ten more legacy conditions are understood instead of failing closed, and two actions accept shapes they were rejecting.** When the compatibility layer meets a type it does not know, it refuses to activate the power rather than firing it unconditionally: safe, but the power does nothing. Newly supported: `statistic` tests a vanilla statistic with `comparison` and `compare_to`; `nearby_entities` counts entities by type or tag within `distance` (default `16`) with an optional `bientity_condition` filter; `near_villager` counts real villagers nearby; `nbt` matches a partial NBT tree on the target; `in_tag` matches the target's entity type against a tag; `can_see` tests unobstructed line of sight; `block_state` tests a single blockstate property; `height` tests a block's Y coordinate; `adjacent` counts matching face neighbours; and `always_active` is an unconditional true. On the action side, `and` now accepts a single action as well as a list, and `area_of_effect` accepts both an object-shaped `shape` and Apoli's standard `bientity_action` field. See [CONDITIONS.md](docs/CONDITIONS.md) and [ACTIONS.md](docs/ACTIONS.md) for the field references.
- **`origins:lava_vision` whited out the screen (#121).** Origins' `s` and `v` fields are absolute replacements for vanilla's two lava fog distances, measured in blocks, not multipliers. The translator mapped `s` onto NeoOrigins' multiplicative `strength` and discarded `v`, so the ordinary authoring of `{"s": 0, "v": 15}`, which means "fog starts at zero blocks and ends at fifteen", arrived as a strength of zero: both fog planes scaled to nothing, every pixel fully fogged, a flat sheet of colour. They now map to the power's new `start` and `end`. The screen came out sky blue rather than lava orange because of a second fault in the same path: the fog handler asked whether the player's body was in lava rather than whether the camera was, so standing in a one-block puddle with your eyes in air let it hijack ordinary atmospheric fog. It now runs only when the camera is genuinely in lava. Both faults were reachable on Minecraft 1.21.1 alone, since 26.1 and 26.2 have not drawn lava fog at all since the 26.1 render rework stubbed the handler out. That stub is lifted this release as well, so all three builds run the same fixed path rather than two of them running none of it.
- **`origins:water_vision` is no longer translated into lava vision.** It was routed onto `lava_vision`, which is not remotely what it does, and inherited the whiteout above along the way. Upstream it is not a power type at all: it is an instance of `origins:toggle_night_vision`. It now becomes NeoOrigins' `night_vision` gated on a `submerged_in` water condition, which is what the original power actually gives the player.
- **`apugli:action_on_jump` and `apugli:action_on_target_death` load at all.** Both were registered as aliases onto `action_on_event`, and neither ever reached the alias table: the loader rewrites `apugli:` to `origins:` before the alias pass runs, and then drops any power it cannot route, so by the time the table was asked, it was being asked about an id it has never held. A pack shipping either one lost the whole power without a word. The authored id is now kept in reserve and offered to the alias table on the drop path only, so nothing that already loaded changes route.
- **`prevent_entity_use` no longer blocks every interaction.** The power ignored its `entity_condition` and `bientity_condition`, so once granted it blocked the player from using any entity at all rather than only the ones the pack named. Those conditions are now compiled and tested against the entity you interact with, and if they cannot be compiled the power is refused with a warning instead of over-blocking.
- **`/power has` is registered.** Legacy packs test for a power with `power has <target> <power>` inside their functions, and NeoOrigins registered `grant`, `revoke`, and `remove` but not `has`, so any function containing it failed to compile and was lost entirely. It now returns a result usable with `execute if` and `store result`, and resolves multiple-power ids the same way `grant` does.
- **The Blacksmith class can now craft quality gear at modded workstations.** `quality_equipment` gains an `intercept_menus` list of menu-type ids whose result slot should also grant the quality buff, and the built-in Blacksmith power opts into Overgeared's four smithing anvils. Detection is entirely data-driven, with no compile-time dependency: an id for a mod that is not installed simply never matches, so the list is harmless either way, and pack authors can add workstations from any mod without a code change.
- **The `damage` action's `damage_type` field is documented.** It has been read since 2.0.x and the editors describe it, but [ACTIONS.md](docs/ACTIONS.md) still listed `source.name` as the only way to choose a damage source. `damage_type` resolves against the damage-type registry, so unlike the fixed keyword list it reaches datapack-defined types.
- **[THEMING.md](docs/THEMING.md) now matches the theming code.** The field table had gone stale: `flat` and `panel_color` have been parsed since the classic skin came back, but neither was listed, so there was no documented route to building a flat theme at all. The page also never mentioned `classic_picker_style`, the accessibility option that outranks every theme. A pack ships a theme, a player has that option turned on, and the theme has no visible effect, with nothing on the page to explain the symptom. And the bundled-font section named two files that do not exist: the assets are lowercased on disk, because NeoForge's resource-path validator rejects uppercase path segments, so anyone following the old names was chasing a missing file.
release
NeoOrigins v2.2.22 (MC 26.2)
v2.2.22+26.23 авг. 2026 г.135Minecraft: 26.2neoforge
Что нового
> A legacy-compatibility and morphing release. The headline: two compatibility actions that packs lean on constantly turn out never to have worked. `apply_effect` resolved its effect id only from a bare string, but two hundred and fourteen of the two hundred and twenty-eight uses in the pack corpus nest it in an object, so those powers loaded, appeared on the origin, and applied nothing at all; `origins:choice` read the wrong key for its wrapped action, so it rolled a branch and then ran nothing. Both are fixed. Legacy 1.20-era packs also have their `.mcfunction` files rewritten as they are read, which took a Fairytale Origins test install from forty-two failed function loads down to nine (#118), and `entity_model` grows from a bare model swap into a full morph system with datapack-defined morphs, matching hitboxes, borrowed entity sounds, skin overrides, and first-person arms. Plus ten more legacy Apoli conditions understood instead of failing closed, real editor forms for twenty-nine alias power types that used to render as raw JSON, and three stability fixes: ocean origins no longer hang the server while picking a spawn point, `origins:lava_vision` no longer paints the whole screen a flat colour (#121), and aquatic origins dry out on land in the fifteen seconds vanilla fish get rather than two and a half minutes (#120), though an existing config file keeps the old value until you edit it.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`entity_model` is now a full morph system, not just a model swap.** The power previously took a single `entity_type` and rendered you as that model. It now describes a whole morph. `nbt` selects a variant (sheep colour, villager profession, slime size); `scale` (default `1.0`) sizes both model and hitbox; `hitbox` (default `true`) swaps your actual collision box and eye height to match, so a slime morph really does fit where a slime fits; `render_held_item` and `render_armor` (both default `true`) control whether your gear draws on the morph; `first_person` (default `"item"`) chooses what you see in your own hands, accepting `"item"`, `"arm"` for the morph's own limb, or `"hidden"`; and `arm` names an explicit bone if the automatic search picks the wrong one. Morph state is broadcast to every client tracking you, so other players see the morph too, not just you.
- **Datapack-defined morphs.** A file at `data/<namespace>/neoorigins/morphs/<name>.json` declares a reusable morph, and a power references it with `"morph": "<id>"` instead of spelling every field out inline. A bare name resolves to `neoorigins:<name>`, and a file whose id matches a built-in overrides it. Ten morphs ship built in (slime, magma cube, sheep, cat, villager, creeper, zombie, skeleton, enderman, and spider), and all are datapack-overridable. An unknown morph id logs a one-time warning and resolves to no morph rather than failing the power. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the full field reference.
- **Morphs can borrow the entity's sounds and reskin the player.** `entity_sounds` (default `true`) makes your hurt, death, fall, swim, and splash sounds come from the morph's entity type. A `sounds` object overrides any of them individually by sound-event id (`hurt`, `death`, `fall_small`, `fall_big`, `swim`, `splash`, `splash_high_speed`). For player-shaped morphs, a `skin` block sets `texture`, `cape`, and `elytra` asset ids and a `model` of `"slim"` or `"wide"`; anything left unset falls through to the player's real skin, so you can restyle only the parts you care about. Step sounds still come from the block underfoot, as in vanilla.
- **Twenty-nine legacy alias power types now have real editor forms.** Legacy types carried by the compatibility layer (the four persistent-effect aliases, seven `condition_passive` aliases, fourteen `action_on_event` aliases, and four stragglers) had no schema branch of their own, so both the web editor and the in-game editor fell back to a raw-JSON box and left the author to spell every field from memory. All twenty-nine are now modelled, and the allowlist that exempted them is empty. Alongside that: the power type picker is grouped by namespace and reads compatibility types straight off the parser rather than the native registry alone, so nothing is missing from the list; scalar-or-array reference fields (roughly twenty of them) render as proper pickers in both editors instead of raw JSON; and the top-level `enabled` kill switch and `action_on_event`'s `hit_dealt` event are declared where they were being read but not described. The thirty-one native types that fall back to codec reflection, among them `multiple`, `status_effect`, `glow`, and `night_vision`, get their display name, description, hidden flag, and `required_mods` rows back. Those keys belong to no power's config record, so the fallback path had never offered them even though a datapack could always write them by hand.
- **The schemas no longer reject JSON the mod itself accepts.** Three separate cases where the editors flagged a perfectly good file as invalid. The layer schema never declared `standalone`, took `name` as a plain string only, and allowed only bare-id or single-object origin entries, while the layer loader accepts all three of the shapes it left out. The item-condition schema demanded a `type` that the parser has never needed, so the typeless `id` / `item` / `tag` shorthand, which NeoOrigins' own Jianxian powers use, failed the mod's own schema. And `prevent_action` declared its two enums in lowercase only, though the power upper-cases before matching, so the sixteen shipped powers written in `SCREAMING_CASE` were all reported invalid while working perfectly in game. All three now describe what the loader actually does.
- **The web editor imports upstream Origins-layout packs.** The importer matched only the editor's own native layout, so every pack laid out the Origins way failed at the origin step. It now tries native then compatibility layouts for origins, layers, and powers, the same pairing the server-side loaders already use, with the compatibility pattern excluding sibling directories, so `origins/powers/foo.json` no longer imports as an origin called `powers/foo`. Three ways it used to lose data are fixed alongside. It read only the nine origin fields the Identity tab covers and discarded the other six, so a round trip through the editor silently stripped evolution tiers, spawn placement, required mods, the special flag, and Figura model keys. Fifty-eight of the seventy-eight shipped origins carry tier powers, so that was the normal case, not an edge one. Unmapped keys now ride along and are written back verbatim, and the import says what it carried. A name written as `{"text": "Asura"}` was flattened to an empty string, which blanked the name and description of six of NeoOrigins' own origins on import. And importing a built-in power threw on a Svelte proxy and appended nothing at all.
- **`lava_vision` can set its fog distances directly.** The power took only a multiplicative `strength`, which scales both of vanilla's lava fog distances at once, so there was no way to say "fog starts at zero blocks and ends at fifteen". Two optional fields, `start` and `end`, now set those two distances in blocks outright, and either may be given on its own, with the plane you leave out still scaled by `strength`. Values that cannot describe a fog volume, a multiplier of zero or less, or an `end` at or before `start`, are discarded rather than applied, so a malformed field can no longer blank the screen. When more than one active power grants lava vision the most generous of each is taken: the largest multiplier, the nearest start, the furthest end. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference.
- **Wiring up a spare orb is documented.** The four inert orbs (gold, pink, purple, and teal) ship with no behaviour on purpose, for datapacks to bind. A new worked recipe walks the whole path end to end: a custom origin layer, an `action_on_event` power that opens the layer picker scoped to it, the global-power grant that makes the orb work whatever your origin is, and a crafting recipe for the orb itself. See [COOKBOOK.md](docs/COOKBOOK.md) § 16.
- **Night vision has its own toggle key, default `K`.** Community feedback asked for night vision to be switchable on any origin that grants it. The switch is a player-level flag rather than a property of one power, so a single keypress covers every tier of a multi-tier origin, and it defaults to on, so nothing changes for players who never press the key. It is deliberately its own keybind rather than an active ability: an earlier attempt spent a skill slot on it and let a stray skill keypress silently disable night vision, which testers reported as "night vision doesn't work". The server stays authoritative: the client asks for a flip and only updates once the server echoes it back, so the admin kill switch cannot be talked around. The key is listed in [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **Aquatic origins dry out ten times faster on land (#120).** `[ocean_origins] drain_rate_ticks` shipped at `10`, meaning one air point lost every ten ticks out of a supply of three hundred: two and a half minutes of standing on dry land before drowning damage even begins. Vanilla cod and salmon lose one air point per tick, so fifteen seconds, and the power is written to mirror them. The default is now `1`. The config comment is what produced the wrong number: it correctly described vanilla fish, then recommended `16` as the fish-comparable setting, which is four minutes. It now gives the arithmetic instead. Land time in seconds is roughly `(300 * value) / 20`, so the number stays checkable against the behaviour. If you have run the pack before, note that config files are written once and **never re-defaulted**: an existing `config/neoorigins/gameplay.toml` keeps `drain_rate_ticks = 10` until you edit that line by hand or delete the file and let it regenerate. If fifteen seconds is too harsh for your pack, raise the number (`2` is thirty seconds, `4` is a minute) or set `dries_out = false` to switch the mechanic off entirely.
- **Ocean origins no longer lock up the server while looking for somewhere to spawn.** Five aquatic origins, plus Forest Dragon and Enderian, find their spawn point by asking the world for the nearest matching biome, and that search ran on the server thread at a radius of 12800 blocks with a sixteen-block step: around thirty million climate samples in the worst case, with nothing able to interrupt it. Under ordinary worldgen an ocean sits a few hundred blocks out and the search finishes in milliseconds, which is exactly why this never surfaced in testing. Install a biome or terrain mod that pushes oceans away from world spawn, or one whose own oceans are not in the `minecraft:is_ocean` tag, and the search runs to exhaustion instead: the server thread stops responding and Minecraft's sixty-second watchdog kills the server, with nothing thrown, so it reads as a crash with no cause. The search now runs on a worker thread with a five-second budget, bounded by vanilla `/locate biome`'s own numbers (radius 6400, horizontal step 32, vertical step 64), about twenty-seven times fewer samples. One consequence worth knowing: a matching biome that exists only between 6400 and 12800 blocks out is no longer found, and the player spawns normally with a line in the log. `[spawn_location] teleports_enabled = false` still disables the whole path.
- **Origin spawn teleports no longer freeze the server while terrain generates.** Once a spawn point was found, the step that turns it into a standable position force-loaded chunks a block at a time, and each of those loads blocks the server thread until the chunk exists. Landing in ungenerated terrain on a pack with worldgen mods installed therefore meant twenty to thirty seconds of a completely unresponsive server before the player was placed. The chunks that step needs are now requested up front through the ordinary chunk ticket system and polled once per tick, so the server keeps running while they generate and the placement happens only once they are all present. If they have not arrived within thirty seconds the teleport is abandoned and the player spawns normally. Placement passes over a candidate column whose clearance check would read outside the loaded area, rather than generating more chunks for it. Because the teleport now lands a generation-time later rather than on the next tick, a player who changes dimension while it is still waiting is left where they are instead of being pulled away.
- **Two hot server paths stop doing work for players who cannot trigger them.** Every monster spawn attempt walked every player in the level and every power they held looking for a spawn-warding power that almost nobody has; that scan is now gated on a cheap per-dimension probe, and the distance check it does reach dropped a square root. Separately, the capability lookup that six server mixins call per tick and per block walked the whole power list and allocated a set on every call; it now consults a cached union of the static capabilities first, used purely as a negative filter: a capability the cache does not contain cannot come from any of those powers, while one it does contain still runs the full live scan, so the shortcut can never answer yes on its own.
- **Six built-in origins granted the same status effect from two powers at once after a tier upgrade.** When a tier adds a power that supersedes a base one, the tier's `remove` list is what tears the old power down, and in six cases it was missing an entry. Abyssal at apex kept both its base night vision and water breathing alongside the apex conduit power that already granted them; Caveborn kept an iron-eating haste bonus underneath permanent apex haste; Verdant kept a forest regeneration power underneath permanent apex regeneration; and Kraken, Merling, and Water Mage each kept a conditional water-breathing power underneath an unconditional one. This was not merely redundant. A conditional power clears its own effect when its condition goes false, so stepping out of the water as an Abyssal at apex would strip the permanent water breathing that the apex power was maintaining. All six now remove the superseded power on upgrade, and a new test walks every built-in origin at every tier to stop it recurring.
- **Blacksmith armour toughness now applies per armour slot.** A full set of quality-crafted armour granted a single toughness bonus instead of one per piece, because all four pieces shared one attribute-modifier id and the game deduplicates modifiers by id. Each slot now carries its own id, so head, chest, legs, and feet stack independently. Mining speed and attack damage were never affected, since only one held item is ever in play.
- **Shift-clicking a quality craft no longer loses the buff.** Taking a crafted item with shift-click distributes it into your inventory before the crafted-item event fires, so the quality bonus was applied to a stack that had already been merged away and vanished. The buff is now applied to the result slot as it is assembled, which covers both the click-take and shift-click paths. Applying it twice is harmless, so nothing double-dips.
- **Legacy attribute rewriting no longer corrupts unrelated text.** The compatibility layer rewrites 1.20-era attribute ids, but the rule matched `generic.` anywhere in a line rather than only in attribute positions, so `playsound minecraft:entity.generic.extinguish_fire` was mangled into nonsense, and the same applied to quoted text in `tellraw` and `say`. Matching is now anchored to the attribute argument of the `attribute` command and to attribute-modifier NBT fields, and skips quoted strings entirely. On Minecraft 1.21.1 the rewrite is gone altogether: 1.21.1 still spells attributes `generic.armor`, and the prefix drop only landed in 1.21.2, so stripping it there turned a valid id into an invalid one.
- **Gravity Mage's Repulse pushes at the strength it was authored with.** The power asks for a knockback strength of 2.5, but it spells that field `knockback_strength` while the alias it routes through reads `strength`, so the field was inert and the ability has been pushing at the 1.0 fallback since it shipped. The name is an easy one to get wrong: Ground Slam and Tidal Wave both genuinely declare a `knockback_strength` field, so it looks right by analogy, and only Repulse goes through the alias. Fixed by making the authored intent the thing that runs, which means this is a live balance change: Repulse now pushes two and a half times as hard as it did.
- **Two Jianxian sword glows were invisible.** `glow_alpha` is a 0-255 integer, and both powers authored it as an 0-1 fraction, which floored to zero. Zero is a legal value rather than "unset", so it was accepted instead of falling back to the default, and the halos never drew at all. Converted to the intended fractions of 255, so Sword Qi and Heaven-Severing Slash gain the glow their author asked for.
- **Commands run by `execute_command` are no longer rewritten when they already work.** The legacy-command rewriter is a set of heuristics meant to run only on commands that fail to parse, and the chat path has guarded it that way since #92. The `execute_command` action skipped that guard and rewrote everything it was given, so a pack issuing a perfectly valid modern command could have it altered underneath it. It now parses the command first and leaves it alone if it already works.
- **`apply_effect` never applied anything in the shape almost every pack writes.** Apoli's documented shape nests the effect in an object: `"effect": {"effect": "minecraft:speed", "duration": 200, "amplifier": 1}`. The compatibility parser resolved the effect id only from a bare `"effect"` string, so every nested use fell straight through to a silent no-op. Of the two hundred and twenty-eight `apply_effect` uses in the pack corpus, two hundred and fourteen are that shape, spread over a hundred and twenty-four files, and not one of them did anything: the power loaded, the origin listed it, and no effect was ever applied. The remaining fourteen use the `effects[]` array, which the parser truncated to the first entry, so a jellyfish sting that should poison and weaken and slow only poisoned. Between the two, no `apply_effect` in the corpus took a path the parser handled correctly. Effect resolution now lives in one place that reads all three shapes and returns every effect asked for rather than the first, and the nested object supplies its own duration, amplifier, and display flags, because that is where authors put them. The target-entity path used by `target_action` and `area_of_effect` shares that resolver, so it no longer carries its own copy of both bugs. When nothing resolves, the parser warns and names the three shapes it accepts instead of returning quietly. That silence is the only reason this survived as long as it did.
- **`origins:choice` rolled a branch and then ran nothing.** Each entry in a weighted `choice` is a wrapper record rather than an action, and Apoli keys the wrapped action `element`. The parser read `action` instead, so every branch resolved to a no-op whichever way the roll went, and a power built entirely out of random outcomes looked like it was simply unlucky every time. `element` is now read, `action` stays accepted as a synonym so anything authored against NeoOrigins' own documentation keeps working, and `element` wins when an entry carries both.
- **Legacy `.mcfunction` files are now translated as they are read (#118).** A function file that fails to compile never runs at all, and never reaches the hook where legacy commands were previously repaired, so packs shipping 1.20 command syntax inside their functions lost those functions silently. Function contents are now rewritten at pack-read time, before the game parses them. Item NBT in `give`, `item replace`, and `item modify` becomes a data-component patch, covering custom names and lore, enchantments, potions, unbreakable, damage, repair cost, custom model data, and hidden tooltip flags, with anything unrecognised preserved under `custom_data`. `clear` is translated as a subset match rather than a component patch, since it takes an item predicate. And 1.20 particle arguments are converted to their 1.21 form for `dust`, `dust_color_transition`, `block`, `item`, and `entity_effect`. On a Fairytale Origins test install this took failed function loads from forty-two down to nine on 1.21.1, and most of what remains there needs mods that were not installed. Minecraft 26.1 and 26.2 carry seven more failures on top of those nine, in command shapes that changed after 1.21.1 and are not rewritten yet: the `generic.` attribute prefix, the split of `minecraft:potion` into thrown and lingering entities, and `gamerule`.
- **Three more legacy power types are implemented: `modify_healing`, `modify_status_effect_duration`, and `action_on_death`.** All three are authored in six packs in the corpus, and all three were rejected by the schema and dropped by the loader. `modify_healing` scales all healing, matching Apoli's contract rather than natural regeneration alone; `modify_status_effect_duration` multiplies the duration of effects as they are applied; and `action_on_death` fires with the killer available, so it can pair with a `bientity_action`. Their modifier maths reads the 1.16-era `multiply_base` and `multiply_total` spellings these packs actually use, rather than only the modern Apoli names. Reading only the modern names would have left every real use silently doing nothing. All four namespace spellings of each type are declared, so the editors get real forms for them too.
- **1.20-style particle strings are accepted in power JSON.** A `particle` field written the old way, as `"minecraft:dust 0.1 0.5 0.1 1"` with its arguments in one string, previously failed the whole power to load. The leading particle id is now used and the power loads.
- **Ten more legacy conditions are understood instead of failing closed, and two actions accept shapes they were rejecting.** When the compatibility layer meets a type it does not know, it refuses to activate the power rather than firing it unconditionally: safe, but the power does nothing. Newly supported: `statistic` tests a vanilla statistic with `comparison` and `compare_to`; `nearby_entities` counts entities by type or tag within `distance` (default `16`) with an optional `bientity_condition` filter; `near_villager` counts real villagers nearby; `nbt` matches a partial NBT tree on the target; `in_tag` matches the target's entity type against a tag; `can_see` tests unobstructed line of sight; `block_state` tests a single blockstate property; `height` tests a block's Y coordinate; `adjacent` counts matching face neighbours; and `always_active` is an unconditional true. On the action side, `and` now accepts a single action as well as a list, and `area_of_effect` accepts both an object-shaped `shape` and Apoli's standard `bientity_action` field. See [CONDITIONS.md](docs/CONDITIONS.md) and [ACTIONS.md](docs/ACTIONS.md) for the field references.
- **`origins:lava_vision` whited out the screen (#121).** Origins' `s` and `v` fields are absolute replacements for vanilla's two lava fog distances, measured in blocks, not multipliers. The translator mapped `s` onto NeoOrigins' multiplicative `strength` and discarded `v`, so the ordinary authoring of `{"s": 0, "v": 15}`, which means "fog starts at zero blocks and ends at fifteen", arrived as a strength of zero: both fog planes scaled to nothing, every pixel fully fogged, a flat sheet of colour. They now map to the power's new `start` and `end`. The screen came out sky blue rather than lava orange because of a second fault in the same path: the fog handler asked whether the player's body was in lava rather than whether the camera was, so standing in a one-block puddle with your eyes in air let it hijack ordinary atmospheric fog. It now runs only when the camera is genuinely in lava. Both faults were reachable on Minecraft 1.21.1 alone, since 26.1 and 26.2 have not drawn lava fog at all since the 26.1 render rework stubbed the handler out. That stub is lifted this release as well, so all three builds run the same fixed path rather than two of them running none of it.
- **`origins:water_vision` is no longer translated into lava vision.** It was routed onto `lava_vision`, which is not remotely what it does, and inherited the whiteout above along the way. Upstream it is not a power type at all: it is an instance of `origins:toggle_night_vision`. It now becomes NeoOrigins' `night_vision` gated on a `submerged_in` water condition, which is what the original power actually gives the player.
- **`apugli:action_on_jump` and `apugli:action_on_target_death` load at all.** Both were registered as aliases onto `action_on_event`, and neither ever reached the alias table: the loader rewrites `apugli:` to `origins:` before the alias pass runs, and then drops any power it cannot route, so by the time the table was asked, it was being asked about an id it has never held. A pack shipping either one lost the whole power without a word. The authored id is now kept in reserve and offered to the alias table on the drop path only, so nothing that already loaded changes route.
- **`prevent_entity_use` no longer blocks every interaction.** The power ignored its `entity_condition` and `bientity_condition`, so once granted it blocked the player from using any entity at all rather than only the ones the pack named. Those conditions are now compiled and tested against the entity you interact with, and if they cannot be compiled the power is refused with a warning instead of over-blocking.
- **`/power has` is registered.** Legacy packs test for a power with `power has <target> <power>` inside their functions, and NeoOrigins registered `grant`, `revoke`, and `remove` but not `has`, so any function containing it failed to compile and was lost entirely. It now returns a result usable with `execute if` and `store result`, and resolves multiple-power ids the same way `grant` does.
- **The Blacksmith class can now craft quality gear at modded workstations.** `quality_equipment` gains an `intercept_menus` list of menu-type ids whose result slot should also grant the quality buff, and the built-in Blacksmith power opts into Overgeared's four smithing anvils. Detection is entirely data-driven, with no compile-time dependency: an id for a mod that is not installed simply never matches, so the list is harmless either way, and pack authors can add workstations from any mod without a code change.
- **The `damage` action's `damage_type` field is documented.** It has been read since 2.0.x and the editors describe it, but [ACTIONS.md](docs/ACTIONS.md) still listed `source.name` as the only way to choose a damage source. `damage_type` resolves against the damage-type registry, so unlike the fixed keyword list it reaches datapack-defined types.
- **[THEMING.md](docs/THEMING.md) now matches the theming code.** The field table had gone stale: `flat` and `panel_color` have been parsed since the classic skin came back, but neither was listed, so there was no documented route to building a flat theme at all. The page also never mentioned `classic_picker_style`, the accessibility option that outranks every theme. A pack ships a theme, a player has that option turned on, and the theme has no visible effect, with nothing on the page to explain the symptom. And the bundled-font section named two files that do not exist: the assets are lowercased on disk, because NeoForge's resource-path validator rejects uppercase path segments, so anyone following the old names was chasing a missing file.
release
NeoOrigins v2.2.22 (MC 26.1.x)
v2.2.22+26.13 авг. 2026 г.55Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A legacy-compatibility and morphing release. The headline: two compatibility actions that packs lean on constantly turn out never to have worked. `apply_effect` resolved its effect id only from a bare string, but two hundred and fourteen of the two hundred and twenty-eight uses in the pack corpus nest it in an object, so those powers loaded, appeared on the origin, and applied nothing at all; `origins:choice` read the wrong key for its wrapped action, so it rolled a branch and then ran nothing. Both are fixed. Legacy 1.20-era packs also have their `.mcfunction` files rewritten as they are read, which took a Fairytale Origins test install from forty-two failed function loads down to nine (#118), and `entity_model` grows from a bare model swap into a full morph system with datapack-defined morphs, matching hitboxes, borrowed entity sounds, skin overrides, and first-person arms. Plus ten more legacy Apoli conditions understood instead of failing closed, real editor forms for twenty-nine alias power types that used to render as raw JSON, and three stability fixes: ocean origins no longer hang the server while picking a spawn point, `origins:lava_vision` no longer paints the whole screen a flat colour (#121), and aquatic origins dry out on land in the fifteen seconds vanilla fish get rather than two and a half minutes (#120), though an existing config file keeps the old value until you edit it.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`entity_model` is now a full morph system, not just a model swap.** The power previously took a single `entity_type` and rendered you as that model. It now describes a whole morph. `nbt` selects a variant (sheep colour, villager profession, slime size); `scale` (default `1.0`) sizes both model and hitbox; `hitbox` (default `true`) swaps your actual collision box and eye height to match, so a slime morph really does fit where a slime fits; `render_held_item` and `render_armor` (both default `true`) control whether your gear draws on the morph; `first_person` (default `"item"`) chooses what you see in your own hands, accepting `"item"`, `"arm"` for the morph's own limb, or `"hidden"`; and `arm` names an explicit bone if the automatic search picks the wrong one. Morph state is broadcast to every client tracking you, so other players see the morph too, not just you.
- **Datapack-defined morphs.** A file at `data/<namespace>/neoorigins/morphs/<name>.json` declares a reusable morph, and a power references it with `"morph": "<id>"` instead of spelling every field out inline. A bare name resolves to `neoorigins:<name>`, and a file whose id matches a built-in overrides it. Ten morphs ship built in (slime, magma cube, sheep, cat, villager, creeper, zombie, skeleton, enderman, and spider), and all are datapack-overridable. An unknown morph id logs a one-time warning and resolves to no morph rather than failing the power. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the full field reference.
- **Morphs can borrow the entity's sounds and reskin the player.** `entity_sounds` (default `true`) makes your hurt, death, fall, swim, and splash sounds come from the morph's entity type. A `sounds` object overrides any of them individually by sound-event id (`hurt`, `death`, `fall_small`, `fall_big`, `swim`, `splash`, `splash_high_speed`). For player-shaped morphs, a `skin` block sets `texture`, `cape`, and `elytra` asset ids and a `model` of `"slim"` or `"wide"`; anything left unset falls through to the player's real skin, so you can restyle only the parts you care about. Step sounds still come from the block underfoot, as in vanilla.
- **Twenty-nine legacy alias power types now have real editor forms.** Legacy types carried by the compatibility layer (the four persistent-effect aliases, seven `condition_passive` aliases, fourteen `action_on_event` aliases, and four stragglers) had no schema branch of their own, so both the web editor and the in-game editor fell back to a raw-JSON box and left the author to spell every field from memory. All twenty-nine are now modelled, and the allowlist that exempted them is empty. Alongside that: the power type picker is grouped by namespace and reads compatibility types straight off the parser rather than the native registry alone, so nothing is missing from the list; scalar-or-array reference fields (roughly twenty of them) render as proper pickers in both editors instead of raw JSON; and the top-level `enabled` kill switch and `action_on_event`'s `hit_dealt` event are declared where they were being read but not described. The thirty-one native types that fall back to codec reflection, among them `multiple`, `status_effect`, `glow`, and `night_vision`, get their display name, description, hidden flag, and `required_mods` rows back. Those keys belong to no power's config record, so the fallback path had never offered them even though a datapack could always write them by hand.
- **The schemas no longer reject JSON the mod itself accepts.** Three separate cases where the editors flagged a perfectly good file as invalid. The layer schema never declared `standalone`, took `name` as a plain string only, and allowed only bare-id or single-object origin entries, while the layer loader accepts all three of the shapes it left out. The item-condition schema demanded a `type` that the parser has never needed, so the typeless `id` / `item` / `tag` shorthand, which NeoOrigins' own Jianxian powers use, failed the mod's own schema. And `prevent_action` declared its two enums in lowercase only, though the power upper-cases before matching, so the sixteen shipped powers written in `SCREAMING_CASE` were all reported invalid while working perfectly in game. All three now describe what the loader actually does.
- **The web editor imports upstream Origins-layout packs.** The importer matched only the editor's own native layout, so every pack laid out the Origins way failed at the origin step. It now tries native then compatibility layouts for origins, layers, and powers, the same pairing the server-side loaders already use, with the compatibility pattern excluding sibling directories, so `origins/powers/foo.json` no longer imports as an origin called `powers/foo`. Three ways it used to lose data are fixed alongside. It read only the nine origin fields the Identity tab covers and discarded the other six, so a round trip through the editor silently stripped evolution tiers, spawn placement, required mods, the special flag, and Figura model keys. Fifty-eight of the seventy-eight shipped origins carry tier powers, so that was the normal case, not an edge one. Unmapped keys now ride along and are written back verbatim, and the import says what it carried. A name written as `{"text": "Asura"}` was flattened to an empty string, which blanked the name and description of six of NeoOrigins' own origins on import. And importing a built-in power threw on a Svelte proxy and appended nothing at all.
- **`lava_vision` can set its fog distances directly.** The power took only a multiplicative `strength`, which scales both of vanilla's lava fog distances at once, so there was no way to say "fog starts at zero blocks and ends at fifteen". Two optional fields, `start` and `end`, now set those two distances in blocks outright, and either may be given on its own, with the plane you leave out still scaled by `strength`. Values that cannot describe a fog volume, a multiplier of zero or less, or an `end` at or before `start`, are discarded rather than applied, so a malformed field can no longer blank the screen. When more than one active power grants lava vision the most generous of each is taken: the largest multiplier, the nearest start, the furthest end. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference.
- **Wiring up a spare orb is documented.** The four inert orbs (gold, pink, purple, and teal) ship with no behaviour on purpose, for datapacks to bind. A new worked recipe walks the whole path end to end: a custom origin layer, an `action_on_event` power that opens the layer picker scoped to it, the global-power grant that makes the orb work whatever your origin is, and a crafting recipe for the orb itself. See [COOKBOOK.md](docs/COOKBOOK.md) § 16.
- **Night vision has its own toggle key, default `K`.** Community feedback asked for night vision to be switchable on any origin that grants it. The switch is a player-level flag rather than a property of one power, so a single keypress covers every tier of a multi-tier origin, and it defaults to on, so nothing changes for players who never press the key. It is deliberately its own keybind rather than an active ability: an earlier attempt spent a skill slot on it and let a stray skill keypress silently disable night vision, which testers reported as "night vision doesn't work". The server stays authoritative: the client asks for a flip and only updates once the server echoes it back, so the admin kill switch cannot be talked around. The key is listed in [CLIENT_CONFIG.md](docs/CLIENT_CONFIG.md).
- **Aquatic origins dry out ten times faster on land (#120).** `[ocean_origins] drain_rate_ticks` shipped at `10`, meaning one air point lost every ten ticks out of a supply of three hundred: two and a half minutes of standing on dry land before drowning damage even begins. Vanilla cod and salmon lose one air point per tick, so fifteen seconds, and the power is written to mirror them. The default is now `1`. The config comment is what produced the wrong number: it correctly described vanilla fish, then recommended `16` as the fish-comparable setting, which is four minutes. It now gives the arithmetic instead. Land time in seconds is roughly `(300 * value) / 20`, so the number stays checkable against the behaviour. If you have run the pack before, note that config files are written once and **never re-defaulted**: an existing `config/neoorigins/gameplay.toml` keeps `drain_rate_ticks = 10` until you edit that line by hand or delete the file and let it regenerate. If fifteen seconds is too harsh for your pack, raise the number (`2` is thirty seconds, `4` is a minute) or set `dries_out = false` to switch the mechanic off entirely.
- **Ocean origins no longer lock up the server while looking for somewhere to spawn.** Five aquatic origins, plus Forest Dragon and Enderian, find their spawn point by asking the world for the nearest matching biome, and that search ran on the server thread at a radius of 12800 blocks with a sixteen-block step: around thirty million climate samples in the worst case, with nothing able to interrupt it. Under ordinary worldgen an ocean sits a few hundred blocks out and the search finishes in milliseconds, which is exactly why this never surfaced in testing. Install a biome or terrain mod that pushes oceans away from world spawn, or one whose own oceans are not in the `minecraft:is_ocean` tag, and the search runs to exhaustion instead: the server thread stops responding and Minecraft's sixty-second watchdog kills the server, with nothing thrown, so it reads as a crash with no cause. The search now runs on a worker thread with a five-second budget, bounded by vanilla `/locate biome`'s own numbers (radius 6400, horizontal step 32, vertical step 64), about twenty-seven times fewer samples. One consequence worth knowing: a matching biome that exists only between 6400 and 12800 blocks out is no longer found, and the player spawns normally with a line in the log. `[spawn_location] teleports_enabled = false` still disables the whole path.
- **Origin spawn teleports no longer freeze the server while terrain generates.** Once a spawn point was found, the step that turns it into a standable position force-loaded chunks a block at a time, and each of those loads blocks the server thread until the chunk exists. Landing in ungenerated terrain on a pack with worldgen mods installed therefore meant twenty to thirty seconds of a completely unresponsive server before the player was placed. The chunks that step needs are now requested up front through the ordinary chunk ticket system and polled once per tick, so the server keeps running while they generate and the placement happens only once they are all present. If they have not arrived within thirty seconds the teleport is abandoned and the player spawns normally. Placement passes over a candidate column whose clearance check would read outside the loaded area, rather than generating more chunks for it. Because the teleport now lands a generation-time later rather than on the next tick, a player who changes dimension while it is still waiting is left where they are instead of being pulled away.
- **Two hot server paths stop doing work for players who cannot trigger them.** Every monster spawn attempt walked every player in the level and every power they held looking for a spawn-warding power that almost nobody has; that scan is now gated on a cheap per-dimension probe, and the distance check it does reach dropped a square root. Separately, the capability lookup that six server mixins call per tick and per block walked the whole power list and allocated a set on every call; it now consults a cached union of the static capabilities first, used purely as a negative filter: a capability the cache does not contain cannot come from any of those powers, while one it does contain still runs the full live scan, so the shortcut can never answer yes on its own.
- **Six built-in origins granted the same status effect from two powers at once after a tier upgrade.** When a tier adds a power that supersedes a base one, the tier's `remove` list is what tears the old power down, and in six cases it was missing an entry. Abyssal at apex kept both its base night vision and water breathing alongside the apex conduit power that already granted them; Caveborn kept an iron-eating haste bonus underneath permanent apex haste; Verdant kept a forest regeneration power underneath permanent apex regeneration; and Kraken, Merling, and Water Mage each kept a conditional water-breathing power underneath an unconditional one. This was not merely redundant. A conditional power clears its own effect when its condition goes false, so stepping out of the water as an Abyssal at apex would strip the permanent water breathing that the apex power was maintaining. All six now remove the superseded power on upgrade, and a new test walks every built-in origin at every tier to stop it recurring.
- **Blacksmith armour toughness now applies per armour slot.** A full set of quality-crafted armour granted a single toughness bonus instead of one per piece, because all four pieces shared one attribute-modifier id and the game deduplicates modifiers by id. Each slot now carries its own id, so head, chest, legs, and feet stack independently. Mining speed and attack damage were never affected, since only one held item is ever in play.
- **Shift-clicking a quality craft no longer loses the buff.** Taking a crafted item with shift-click distributes it into your inventory before the crafted-item event fires, so the quality bonus was applied to a stack that had already been merged away and vanished. The buff is now applied to the result slot as it is assembled, which covers both the click-take and shift-click paths. Applying it twice is harmless, so nothing double-dips.
- **Legacy attribute rewriting no longer corrupts unrelated text.** The compatibility layer rewrites 1.20-era attribute ids, but the rule matched `generic.` anywhere in a line rather than only in attribute positions, so `playsound minecraft:entity.generic.extinguish_fire` was mangled into nonsense, and the same applied to quoted text in `tellraw` and `say`. Matching is now anchored to the attribute argument of the `attribute` command and to attribute-modifier NBT fields, and skips quoted strings entirely. On Minecraft 1.21.1 the rewrite is gone altogether: 1.21.1 still spells attributes `generic.armor`, and the prefix drop only landed in 1.21.2, so stripping it there turned a valid id into an invalid one.
- **Gravity Mage's Repulse pushes at the strength it was authored with.** The power asks for a knockback strength of 2.5, but it spells that field `knockback_strength` while the alias it routes through reads `strength`, so the field was inert and the ability has been pushing at the 1.0 fallback since it shipped. The name is an easy one to get wrong: Ground Slam and Tidal Wave both genuinely declare a `knockback_strength` field, so it looks right by analogy, and only Repulse goes through the alias. Fixed by making the authored intent the thing that runs, which means this is a live balance change: Repulse now pushes two and a half times as hard as it did.
- **Two Jianxian sword glows were invisible.** `glow_alpha` is a 0-255 integer, and both powers authored it as an 0-1 fraction, which floored to zero. Zero is a legal value rather than "unset", so it was accepted instead of falling back to the default, and the halos never drew at all. Converted to the intended fractions of 255, so Sword Qi and Heaven-Severing Slash gain the glow their author asked for.
- **Commands run by `execute_command` are no longer rewritten when they already work.** The legacy-command rewriter is a set of heuristics meant to run only on commands that fail to parse, and the chat path has guarded it that way since #92. The `execute_command` action skipped that guard and rewrote everything it was given, so a pack issuing a perfectly valid modern command could have it altered underneath it. It now parses the command first and leaves it alone if it already works.
- **`apply_effect` never applied anything in the shape almost every pack writes.** Apoli's documented shape nests the effect in an object: `"effect": {"effect": "minecraft:speed", "duration": 200, "amplifier": 1}`. The compatibility parser resolved the effect id only from a bare `"effect"` string, so every nested use fell straight through to a silent no-op. Of the two hundred and twenty-eight `apply_effect` uses in the pack corpus, two hundred and fourteen are that shape, spread over a hundred and twenty-four files, and not one of them did anything: the power loaded, the origin listed it, and no effect was ever applied. The remaining fourteen use the `effects[]` array, which the parser truncated to the first entry, so a jellyfish sting that should poison and weaken and slow only poisoned. Between the two, no `apply_effect` in the corpus took a path the parser handled correctly. Effect resolution now lives in one place that reads all three shapes and returns every effect asked for rather than the first, and the nested object supplies its own duration, amplifier, and display flags, because that is where authors put them. The target-entity path used by `target_action` and `area_of_effect` shares that resolver, so it no longer carries its own copy of both bugs. When nothing resolves, the parser warns and names the three shapes it accepts instead of returning quietly. That silence is the only reason this survived as long as it did.
- **`origins:choice` rolled a branch and then ran nothing.** Each entry in a weighted `choice` is a wrapper record rather than an action, and Apoli keys the wrapped action `element`. The parser read `action` instead, so every branch resolved to a no-op whichever way the roll went, and a power built entirely out of random outcomes looked like it was simply unlucky every time. `element` is now read, `action` stays accepted as a synonym so anything authored against NeoOrigins' own documentation keeps working, and `element` wins when an entry carries both.
- **Legacy `.mcfunction` files are now translated as they are read (#118).** A function file that fails to compile never runs at all, and never reaches the hook where legacy commands were previously repaired, so packs shipping 1.20 command syntax inside their functions lost those functions silently. Function contents are now rewritten at pack-read time, before the game parses them. Item NBT in `give`, `item replace`, and `item modify` becomes a data-component patch, covering custom names and lore, enchantments, potions, unbreakable, damage, repair cost, custom model data, and hidden tooltip flags, with anything unrecognised preserved under `custom_data`. `clear` is translated as a subset match rather than a component patch, since it takes an item predicate. And 1.20 particle arguments are converted to their 1.21 form for `dust`, `dust_color_transition`, `block`, `item`, and `entity_effect`. On a Fairytale Origins test install this took failed function loads from forty-two down to nine on 1.21.1, and most of what remains there needs mods that were not installed. Minecraft 26.1 and 26.2 carry seven more failures on top of those nine, in command shapes that changed after 1.21.1 and are not rewritten yet: the `generic.` attribute prefix, the split of `minecraft:potion` into thrown and lingering entities, and `gamerule`.
- **Three more legacy power types are implemented: `modify_healing`, `modify_status_effect_duration`, and `action_on_death`.** All three are authored in six packs in the corpus, and all three were rejected by the schema and dropped by the loader. `modify_healing` scales all healing, matching Apoli's contract rather than natural regeneration alone; `modify_status_effect_duration` multiplies the duration of effects as they are applied; and `action_on_death` fires with the killer available, so it can pair with a `bientity_action`. Their modifier maths reads the 1.16-era `multiply_base` and `multiply_total` spellings these packs actually use, rather than only the modern Apoli names. Reading only the modern names would have left every real use silently doing nothing. All four namespace spellings of each type are declared, so the editors get real forms for them too.
- **1.20-style particle strings are accepted in power JSON.** A `particle` field written the old way, as `"minecraft:dust 0.1 0.5 0.1 1"` with its arguments in one string, previously failed the whole power to load. The leading particle id is now used and the power loads.
- **Ten more legacy conditions are understood instead of failing closed, and two actions accept shapes they were rejecting.** When the compatibility layer meets a type it does not know, it refuses to activate the power rather than firing it unconditionally: safe, but the power does nothing. Newly supported: `statistic` tests a vanilla statistic with `comparison` and `compare_to`; `nearby_entities` counts entities by type or tag within `distance` (default `16`) with an optional `bientity_condition` filter; `near_villager` counts real villagers nearby; `nbt` matches a partial NBT tree on the target; `in_tag` matches the target's entity type against a tag; `can_see` tests unobstructed line of sight; `block_state` tests a single blockstate property; `height` tests a block's Y coordinate; `adjacent` counts matching face neighbours; and `always_active` is an unconditional true. On the action side, `and` now accepts a single action as well as a list, and `area_of_effect` accepts both an object-shaped `shape` and Apoli's standard `bientity_action` field. See [CONDITIONS.md](docs/CONDITIONS.md) and [ACTIONS.md](docs/ACTIONS.md) for the field references.
- **`origins:lava_vision` whited out the screen (#121).** Origins' `s` and `v` fields are absolute replacements for vanilla's two lava fog distances, measured in blocks, not multipliers. The translator mapped `s` onto NeoOrigins' multiplicative `strength` and discarded `v`, so the ordinary authoring of `{"s": 0, "v": 15}`, which means "fog starts at zero blocks and ends at fifteen", arrived as a strength of zero: both fog planes scaled to nothing, every pixel fully fogged, a flat sheet of colour. They now map to the power's new `start` and `end`. The screen came out sky blue rather than lava orange because of a second fault in the same path: the fog handler asked whether the player's body was in lava rather than whether the camera was, so standing in a one-block puddle with your eyes in air let it hijack ordinary atmospheric fog. It now runs only when the camera is genuinely in lava. Both faults were reachable on Minecraft 1.21.1 alone, since 26.1 and 26.2 have not drawn lava fog at all since the 26.1 render rework stubbed the handler out. That stub is lifted this release as well, so all three builds run the same fixed path rather than two of them running none of it.
- **`origins:water_vision` is no longer translated into lava vision.** It was routed onto `lava_vision`, which is not remotely what it does, and inherited the whiteout above along the way. Upstream it is not a power type at all: it is an instance of `origins:toggle_night_vision`. It now becomes NeoOrigins' `night_vision` gated on a `submerged_in` water condition, which is what the original power actually gives the player.
- **`apugli:action_on_jump` and `apugli:action_on_target_death` load at all.** Both were registered as aliases onto `action_on_event`, and neither ever reached the alias table: the loader rewrites `apugli:` to `origins:` before the alias pass runs, and then drops any power it cannot route, so by the time the table was asked, it was being asked about an id it has never held. A pack shipping either one lost the whole power without a word. The authored id is now kept in reserve and offered to the alias table on the drop path only, so nothing that already loaded changes route.
- **`prevent_entity_use` no longer blocks every interaction.** The power ignored its `entity_condition` and `bientity_condition`, so once granted it blocked the player from using any entity at all rather than only the ones the pack named. Those conditions are now compiled and tested against the entity you interact with, and if they cannot be compiled the power is refused with a warning instead of over-blocking.
- **`/power has` is registered.** Legacy packs test for a power with `power has <target> <power>` inside their functions, and NeoOrigins registered `grant`, `revoke`, and `remove` but not `has`, so any function containing it failed to compile and was lost entirely. It now returns a result usable with `execute if` and `store result`, and resolves multiple-power ids the same way `grant` does.
- **The Blacksmith class can now craft quality gear at modded workstations.** `quality_equipment` gains an `intercept_menus` list of menu-type ids whose result slot should also grant the quality buff, and the built-in Blacksmith power opts into Overgeared's four smithing anvils. Detection is entirely data-driven, with no compile-time dependency: an id for a mod that is not installed simply never matches, so the list is harmless either way, and pack authors can add workstations from any mod without a code change.
- **The `damage` action's `damage_type` field is documented.** It has been read since 2.0.x and the editors describe it, but [ACTIONS.md](docs/ACTIONS.md) still listed `source.name` as the only way to choose a damage source. `damage_type` resolves against the damage-type registry, so unlike the fixed keyword list it reaches datapack-defined types.
- **[THEMING.md](docs/THEMING.md) now matches the theming code.** The field table had gone stale: `flat` and `panel_color` have been parsed since the classic skin came back, but neither was listed, so there was no documented route to building a flat theme at all. The page also never mentioned `classic_picker_style`, the accessibility option that outranks every theme. A pack ships a theme, a player has that option turned on, and the theme has no visible effect, with nothing on the page to explain the symptom. And the bundled-font section named two files that do not exist: the assets are lowercased on disk, because NeoForge's resource-path validator rejects uppercase path segments, so anyone following the old names was chasing a missing file.
release
NeoOrigins v2.2.21 (MC 1.21.1)
v2.2.21+1.21.126 июл. 2026 г.5,1 тыс.Minecraft: 1.21.1neoforge
Что нового
> A pack-author and compatibility release built around a rebuilt entity-group system and the sun. `entity_group` is now fully data-driven: a datapack defines its own mob-affinity groups through declared fields, six groups ship built in (with new illager, piglin, and skeleton groups), and an unknown group id now warns instead of silently doing nothing. On the sun side, a `helmet_protection` toggle lets sun-burning origins burn even while helmeted, a `sun_permeable` tag lets open helmets pass daylight through, and the new skeleton group catches fire in the sun. Plus a Cold Sweat integration that gives eighteen built-in origins heat and cold resistances and weaknesses, an `origins:strong_ankles` compatibility alias for halved fall damage, and a fix for aimed teleports dropping you into a Create: Aeronautics ship's sub-level (#115).
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`entity_group` is now data-driven and datapack-extensible.** The power previously understood only three hardcoded groups (undead, arthropod, water), and any other value — a bare `illager`, say — silently did nothing. Groups are now defined by data: a file at `data/<namespace>/neoorigins/entity_groups/<name>.json` declares what a group does through optional fields (`immune_effects`, `invert_instant_effects`, `vulnerable_enchants`, `ignored_by`, `targeted_by`, `feared_by`, and `burns_in_sunlight`), so `group` is just a label and no value is ever a dead no-op. A bare name resolves to `neoorigins:<name>`, a file whose id matches a built-in overrides it, and an unknown id now logs a one-time warning instead of failing silently. The six built-in groups are themselves data-backed and datapack-overridable. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and a worked example.
- **Three new group behaviours: hunt, flee, and burn.** On top of the existing effect, enchant, and `ignored_by` fields, a group can now set `targeted_by` (listed mobs actively hunt the player within ~16 blocks, the way wolves hunt a skeleton), `feared_by` (listed mobs flee the player within ~8 blocks), and `burns_in_sunlight` (the player catches fire in daylight like a vanilla skeleton, honouring the same `[sun_damage]` helmet and umbrella rules as the `exposed_to_sun` condition). Player-built iron golems are exempt from `targeted_by` even when iron golems are listed, so only village-spawned golems turn on you.
- **Three new built-in entity groups: illager, piglin, and skeleton.** `illager` makes raiders (everything in `#minecraft:raiders`, outpost pillagers included) leave you alone, sets village-spawned iron golems hunting you while your own built golems stay loyal, and sends villagers and wandering traders fleeing. `piglin` treats you as kin so piglins and brutes never aggro — unconditionally, with no gold armour required, unlike vanilla. `skeleton` is the undead kit (Poison and Regeneration immunity, inverted instant effects, Smite vulnerability) plus wolves that hunt you and daylight that burns you. They join the existing undead, arthropod, and water groups.
- **`helmet_protection`: sun-burning origins can burn through helmets.** A new `[sun_damage]` toggle, default `true` so existing behaviour is unchanged. Sun-damage origins — Vampire, Phantom, Abyssal, Caveborn, Warden, and the like — were always fully shielded by any worn helmet with no way to change it, and the old `helmet_dura_damage_chance = 0` even claimed to disable that protection while actually making the helmet a permanent free shield. Set `helmet_protection` to `false` and a worn helmet no longer blocks sun damage or takes durability wear from it, so those origins burn in daylight whatever they wear.
- **`sun_permeable` helmet tag: open helmets let daylight through.** A new item tag, `neoorigins:sun_permeable`, seeded with `minecraft:chainmail_helmet`. Any helmet in the tag counts as no helmet for sun damage: it neither shades the wearer nor takes durability from the sun. Add your own open or mesh helmets to the tag to let them pass daylight through while solid helmets keep shading.
- **Aimed teleports no longer drop you into a Create: Aeronautics ship's sub-level (#115).** Using a "teleport to where you're looking" ability while aiming at a Sable-backed airship teleported you into the contraption's hidden sub-level dimension instead of onto its deck, sending you into an endless fall that could crash the game. The cause: the raycast that finds your aim point returns a hit in the ship's internal staging space, and teleporting straight to it landed you in that empty region. The aimed teleport now lifts the hit back out into real world space, so you land on the deck you were looking at, while aiming at ordinary terrain still works exactly as before. (On 1.21.1, where Sable runs.)
- **Cold Sweat: built-in origins carry heat and cold resistances and weaknesses.** With Cold Sweat installed, the built-in origins now react to its body-temperature system. Heat-adapted origins (Blazeling, Strider, Piglin, Cinderborn, Fire Mage, and Cave Dragon) resist heat and warm faster in the cold; cold-adapted origins (Frostborn, Sea Dragon, Merling, Kraken, Abyssal, and Siren) resist cold and overheat faster, with six more (Enderian, Enderite, Avian, Windwalker, Sculkborn, and Warden) carrying a milder cold resistance — eighteen origins in all, each gated so it only applies when Cold Sweat is present and stays invisible otherwise. Two new datapack primitives drive temperature directly: a `neoorigins:modify_temperature` action shifts a chosen temperature trait, and a `neoorigins:body_temperature` condition tests it. Cold Sweat is a compile-only soft dependency: without it, the resistances never load, the action no-ops, and the condition reads false — none of which crash. See [ACTIONS.md](docs/ACTIONS.md) and [CONDITIONS.md](docs/CONDITIONS.md) for the new action and condition.
- **`origins:strong_ankles` now halves fall damage.** Legacy Feline-based packs list the `origins:strong_ankles` power by id, expecting the host mod to define it. NeoOrigins synthesizes those reference-only Feline ids, but `strong_ankles` was missing from the map, so it silently did nothing while its siblings — fall immunity, nine lives, weak arms, carnivore, and cat vision — all worked. It now maps to native fall-damage scaling that halves fall damage, matching the real Origins "Strong Ankles".
release
NeoOrigins v2.2.21 (MC 26.2)
v2.2.21+26.226 июл. 2026 г.231Minecraft: 26.2neoforge
Что нового
> A pack-author and compatibility release built around a rebuilt entity-group system and the sun. `entity_group` is now fully data-driven: a datapack defines its own mob-affinity groups through declared fields, six groups ship built in (with new illager, piglin, and skeleton groups), and an unknown group id now warns instead of silently doing nothing. On the sun side, a `helmet_protection` toggle lets sun-burning origins burn even while helmeted, a `sun_permeable` tag lets open helmets pass daylight through, and the new skeleton group catches fire in the sun. Plus a Cold Sweat integration that gives eighteen built-in origins heat and cold resistances and weaknesses, an `origins:strong_ankles` compatibility alias for halved fall damage, and a fix for aimed teleports dropping you into a Create: Aeronautics ship's sub-level (#115).
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`entity_group` is now data-driven and datapack-extensible.** The power previously understood only three hardcoded groups (undead, arthropod, water), and any other value — a bare `illager`, say — silently did nothing. Groups are now defined by data: a file at `data/<namespace>/neoorigins/entity_groups/<name>.json` declares what a group does through optional fields (`immune_effects`, `invert_instant_effects`, `vulnerable_enchants`, `ignored_by`, `targeted_by`, `feared_by`, and `burns_in_sunlight`), so `group` is just a label and no value is ever a dead no-op. A bare name resolves to `neoorigins:<name>`, a file whose id matches a built-in overrides it, and an unknown id now logs a one-time warning instead of failing silently. The six built-in groups are themselves data-backed and datapack-overridable. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and a worked example.
- **Three new group behaviours: hunt, flee, and burn.** On top of the existing effect, enchant, and `ignored_by` fields, a group can now set `targeted_by` (listed mobs actively hunt the player within ~16 blocks, the way wolves hunt a skeleton), `feared_by` (listed mobs flee the player within ~8 blocks), and `burns_in_sunlight` (the player catches fire in daylight like a vanilla skeleton, honouring the same `[sun_damage]` helmet and umbrella rules as the `exposed_to_sun` condition). Player-built iron golems are exempt from `targeted_by` even when iron golems are listed, so only village-spawned golems turn on you.
- **Three new built-in entity groups: illager, piglin, and skeleton.** `illager` makes raiders (everything in `#minecraft:raiders`, outpost pillagers included) leave you alone, sets village-spawned iron golems hunting you while your own built golems stay loyal, and sends villagers and wandering traders fleeing. `piglin` treats you as kin so piglins and brutes never aggro — unconditionally, with no gold armour required, unlike vanilla. `skeleton` is the undead kit (Poison and Regeneration immunity, inverted instant effects, Smite vulnerability) plus wolves that hunt you and daylight that burns you. They join the existing undead, arthropod, and water groups.
- **`helmet_protection`: sun-burning origins can burn through helmets.** A new `[sun_damage]` toggle, default `true` so existing behaviour is unchanged. Sun-damage origins — Vampire, Phantom, Abyssal, Caveborn, Warden, and the like — were always fully shielded by any worn helmet with no way to change it, and the old `helmet_dura_damage_chance = 0` even claimed to disable that protection while actually making the helmet a permanent free shield. Set `helmet_protection` to `false` and a worn helmet no longer blocks sun damage or takes durability wear from it, so those origins burn in daylight whatever they wear.
- **`sun_permeable` helmet tag: open helmets let daylight through.** A new item tag, `neoorigins:sun_permeable`, seeded with `minecraft:chainmail_helmet`. Any helmet in the tag counts as no helmet for sun damage: it neither shades the wearer nor takes durability from the sun. Add your own open or mesh helmets to the tag to let them pass daylight through while solid helmets keep shading.
- **Aimed teleports no longer drop you into a Create: Aeronautics ship's sub-level (#115).** Using a "teleport to where you're looking" ability while aiming at a Sable-backed airship teleported you into the contraption's hidden sub-level dimension instead of onto its deck, sending you into an endless fall that could crash the game. The cause: the raycast that finds your aim point returns a hit in the ship's internal staging space, and teleporting straight to it landed you in that empty region. The aimed teleport now lifts the hit back out into real world space, so you land on the deck you were looking at, while aiming at ordinary terrain still works exactly as before. (On 1.21.1, where Sable runs.)
- **Cold Sweat: built-in origins carry heat and cold resistances and weaknesses.** With Cold Sweat installed, the built-in origins now react to its body-temperature system. Heat-adapted origins (Blazeling, Strider, Piglin, Cinderborn, Fire Mage, and Cave Dragon) resist heat and warm faster in the cold; cold-adapted origins (Frostborn, Sea Dragon, Merling, Kraken, Abyssal, and Siren) resist cold and overheat faster, with six more (Enderian, Enderite, Avian, Windwalker, Sculkborn, and Warden) carrying a milder cold resistance — eighteen origins in all, each gated so it only applies when Cold Sweat is present and stays invisible otherwise. Two new datapack primitives drive temperature directly: a `neoorigins:modify_temperature` action shifts a chosen temperature trait, and a `neoorigins:body_temperature` condition tests it. Cold Sweat is a compile-only soft dependency: without it, the resistances never load, the action no-ops, and the condition reads false — none of which crash. See [ACTIONS.md](docs/ACTIONS.md) and [CONDITIONS.md](docs/CONDITIONS.md) for the new action and condition.
- **`origins:strong_ankles` now halves fall damage.** Legacy Feline-based packs list the `origins:strong_ankles` power by id, expecting the host mod to define it. NeoOrigins synthesizes those reference-only Feline ids, but `strong_ankles` was missing from the map, so it silently did nothing while its siblings — fall immunity, nine lives, weak arms, carnivore, and cat vision — all worked. It now maps to native fall-damage scaling that halves fall damage, matching the real Origins "Strong Ankles".
release
NeoOrigins v2.2.21 (MC 26.1.x)
v2.2.21+26.126 июл. 2026 г.145Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A pack-author and compatibility release built around a rebuilt entity-group system and the sun. `entity_group` is now fully data-driven: a datapack defines its own mob-affinity groups through declared fields, six groups ship built in (with new illager, piglin, and skeleton groups), and an unknown group id now warns instead of silently doing nothing. On the sun side, a `helmet_protection` toggle lets sun-burning origins burn even while helmeted, a `sun_permeable` tag lets open helmets pass daylight through, and the new skeleton group catches fire in the sun. Plus a Cold Sweat integration that gives eighteen built-in origins heat and cold resistances and weaknesses, an `origins:strong_ankles` compatibility alias for halved fall damage, and a fix for aimed teleports dropping you into a Create: Aeronautics ship's sub-level (#115).
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`entity_group` is now data-driven and datapack-extensible.** The power previously understood only three hardcoded groups (undead, arthropod, water), and any other value — a bare `illager`, say — silently did nothing. Groups are now defined by data: a file at `data/<namespace>/neoorigins/entity_groups/<name>.json` declares what a group does through optional fields (`immune_effects`, `invert_instant_effects`, `vulnerable_enchants`, `ignored_by`, `targeted_by`, `feared_by`, and `burns_in_sunlight`), so `group` is just a label and no value is ever a dead no-op. A bare name resolves to `neoorigins:<name>`, a file whose id matches a built-in overrides it, and an unknown id now logs a one-time warning instead of failing silently. The six built-in groups are themselves data-backed and datapack-overridable. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and a worked example.
- **Three new group behaviours: hunt, flee, and burn.** On top of the existing effect, enchant, and `ignored_by` fields, a group can now set `targeted_by` (listed mobs actively hunt the player within ~16 blocks, the way wolves hunt a skeleton), `feared_by` (listed mobs flee the player within ~8 blocks), and `burns_in_sunlight` (the player catches fire in daylight like a vanilla skeleton, honouring the same `[sun_damage]` helmet and umbrella rules as the `exposed_to_sun` condition). Player-built iron golems are exempt from `targeted_by` even when iron golems are listed, so only village-spawned golems turn on you.
- **Three new built-in entity groups: illager, piglin, and skeleton.** `illager` makes raiders (everything in `#minecraft:raiders`, outpost pillagers included) leave you alone, sets village-spawned iron golems hunting you while your own built golems stay loyal, and sends villagers and wandering traders fleeing. `piglin` treats you as kin so piglins and brutes never aggro — unconditionally, with no gold armour required, unlike vanilla. `skeleton` is the undead kit (Poison and Regeneration immunity, inverted instant effects, Smite vulnerability) plus wolves that hunt you and daylight that burns you. They join the existing undead, arthropod, and water groups.
- **`helmet_protection`: sun-burning origins can burn through helmets.** A new `[sun_damage]` toggle, default `true` so existing behaviour is unchanged. Sun-damage origins — Vampire, Phantom, Abyssal, Caveborn, Warden, and the like — were always fully shielded by any worn helmet with no way to change it, and the old `helmet_dura_damage_chance = 0` even claimed to disable that protection while actually making the helmet a permanent free shield. Set `helmet_protection` to `false` and a worn helmet no longer blocks sun damage or takes durability wear from it, so those origins burn in daylight whatever they wear.
- **`sun_permeable` helmet tag: open helmets let daylight through.** A new item tag, `neoorigins:sun_permeable`, seeded with `minecraft:chainmail_helmet`. Any helmet in the tag counts as no helmet for sun damage: it neither shades the wearer nor takes durability from the sun. Add your own open or mesh helmets to the tag to let them pass daylight through while solid helmets keep shading.
- **Aimed teleports no longer drop you into a Create: Aeronautics ship's sub-level (#115).** Using a "teleport to where you're looking" ability while aiming at a Sable-backed airship teleported you into the contraption's hidden sub-level dimension instead of onto its deck, sending you into an endless fall that could crash the game. The cause: the raycast that finds your aim point returns a hit in the ship's internal staging space, and teleporting straight to it landed you in that empty region. The aimed teleport now lifts the hit back out into real world space, so you land on the deck you were looking at, while aiming at ordinary terrain still works exactly as before. (On 1.21.1, where Sable runs.)
- **Cold Sweat: built-in origins carry heat and cold resistances and weaknesses.** With Cold Sweat installed, the built-in origins now react to its body-temperature system. Heat-adapted origins (Blazeling, Strider, Piglin, Cinderborn, Fire Mage, and Cave Dragon) resist heat and warm faster in the cold; cold-adapted origins (Frostborn, Sea Dragon, Merling, Kraken, Abyssal, and Siren) resist cold and overheat faster, with six more (Enderian, Enderite, Avian, Windwalker, Sculkborn, and Warden) carrying a milder cold resistance — eighteen origins in all, each gated so it only applies when Cold Sweat is present and stays invisible otherwise. Two new datapack primitives drive temperature directly: a `neoorigins:modify_temperature` action shifts a chosen temperature trait, and a `neoorigins:body_temperature` condition tests it. Cold Sweat is a compile-only soft dependency: without it, the resistances never load, the action no-ops, and the condition reads false — none of which crash. See [ACTIONS.md](docs/ACTIONS.md) and [CONDITIONS.md](docs/CONDITIONS.md) for the new action and condition.
- **`origins:strong_ankles` now halves fall damage.** Legacy Feline-based packs list the `origins:strong_ankles` power by id, expecting the host mod to define it. NeoOrigins synthesizes those reference-only Feline ids, but `strong_ankles` was missing from the map, so it silently did nothing while its siblings — fall immunity, nine lives, weak arms, carnivore, and cat vision — all worked. It now maps to native fall-damage scaling that halves fall damage, matching the real Origins "Strong Ankles".
release
NeoOrigins v2.2.20 (MC 1.21.1)
v2.2.20+1.21.122 июл. 2026 г.1,9 тыс.Minecraft: 1.21.1neoforge
Что нового
> A combined fix-and-integration release. It closes issue #113: the permanent invulnerability when the selection screen is skipped, a new config toggle for spawning players with no origin, and an Orb of Origin that re-rolls only your origin. It also deepens Iron's Spells 'n Spellbooks support with a mana-backed resource bar and first-class handling of Iron's eight custom attributes, which the built-in mage origins now draw on, and adds a Figura integration so custom avatars can react to a player's origin, powers, and evolution tier on every observer's screen. Plus a Bloodfeast diet for vampires, two repaired vampire config overrides, origin-gated recipes that now appear in the recipe book and stop refunding their ingredients, and ability hunger costs that spend saturation first.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`skip_initial_selection`: spawn new players with no origin and no picker.** A new gameplay-config toggle (default off) that skips the initial origin/class selection entirely. When it's on, new players join with no origin and the selection screen never opens: they play as an origin-less player until something grants them one later, for example an Orb of Origin. Unlike auto-human mode it assigns nothing, and unlike the old trick of disabling every class it doesn't leave the player stuck invulnerable. It takes priority over auto-human and the random-assignment modes.
- **The Orb of Origin re-rolls only your origin.** It previously reset both your origin and your class in one go; now it reopens the picker scoped to the origin layer alone and leaves your class exactly as it was, since re-rolling class is the Orb of Class's job. Any class-conditioned sub-power that no longer qualifies under your new origin is still cleared automatically, and the orb keeps committing lazily: the XP levels and the orb itself are spent only when you confirm a new origin, so closing the picker without choosing is a free cancel.
- **Vampires gain a Bloodfeast diet.** The vampire origin can now draw full nourishment from raw and rotten flesh, as if it were freshly cooked: beef, porkchop, chicken, mutton, and rabbit feed you the same raw or cooked, rotten flesh nourishes without inflicting the hunger effect, and spider eye is edible too. It's a themed complement to the origin's existing eating restrictions.
- **No more permanent invulnerability when the selection screen is skipped (#113).** New players are briefly invulnerable while they're still choosing an origin, and that protection is meant to lift the moment they've finished picking. If you ran auto-human with every class disabled, the class screen had nothing left to offer, the client quietly skipped it, and the "still choosing" state never cleared, so the player stayed invulnerable until they used an Orb of Origin or rejoined the world. A layer that has no selectable origin is now treated as already satisfied, so the protection lifts right away instead of hanging forever.
- **Two vampire config overrides that silently did nothing now work.** The `multiplier` for vampire water-weakness, and for the slow-regen powers on Vampire, Revenant, and Necromancer, were ignored in `power_overrides.toml`: the underlying powers hardcoded their values, so editing the toml changed nothing. Both now honour `multiplier`: setting the water-weakness `multiplier` to `0` truly switches off the water damage, and the slow-regen `multiplier` actually scales regeneration (`1.0` = normal).
- **Origin-gated recipes appear in the recipe book and stop refunding their ingredients.** Two fixes to the gated-recipe wrapper. It was marked `isSpecial()`, which suppressed the recipe-book unlock so gated recipes could never surface there; it now inherits the inner recipe's flag and unlocks like any recipe, with the per-player origin gate still enforced at craft time (a player who fails the gate sees an empty result slot). And the crafting player is now planted into recipe context when the result is taken, not just when the grid changes, so completing the craft actually consumes the ingredients instead of refunding them.
- **Ability hunger costs spend saturation first and update nutrition mods.** Powers that charge a hunger cost (active abilities, upkeep auras, and the summon and tame-mob powers) took the cost straight off your food level, skipping the saturation that vanilla always spends first, and never told the client its saturation had changed. Costs now drain saturation before food, the way eating fills it in reverse, and push a hunger update to the client so saturation-display mods track the drain live.
- **Deeper Iron's Spells 'n Spellbooks integration: mana-backed bars and first-class attributes.** Beyond the existing `cast_iron_spell` action, two new surfaces land. A `neoorigins:resource` power can now set `"backing": "irons_spellbooks:mana"` to bind its HUD bar directly to the player's Iron's mana pool: the bar auto-scales to Iron's live max mana (so it fills identically to Iron's own bar), reads and writes stay additive so NeoOrigins never fights Iron's regen and casting bookkeeping, and it re-syncs every 10 ticks so the HUD tracks the pool live. And `attribute_modifier` powers can target Iron's eight custom attributes (max mana, mana regen, spell power, spell resist, cooldown reduction, cast-time reduction, casting move-speed, and summon damage) by id, with the per-attribute scale documented. Iron's stays a compile-only soft dependency: without it installed, each surface degrades to a logged no-op rather than crashing. See the new [Iron's Spells 'n Spellbooks](docs/COMPATIBILITY.md#irons-spells-n-spellbooks) section for the full reference.
- **The built-in mage origins draw on Iron's attributes when it's installed.** Fire, Water, Earth, Air, Darkness, and Gravity Mage, along with the Necromancer, now carry themed Iron's attribute bonuses (a larger mana pool, faster or stronger casting, and school-appropriate perks), each gated behind `"required_mods": ["irons_spellbooks"]`, so they only load and apply when Iron's is present and stay invisible otherwise.
- **Figura avatars can react to a player's origin, powers, and evolution tier.** [Figura](https://modrinth.com/mod/figura) avatars run a Lua script that renders on everyone's screen, and NeoOrigins now exposes a read-only `neoorigins` global to those scripts: an avatar can switch model, toggle parts, or play animations from the wearer's live NeoOrigins state, and it resolves for other players too, not only yourself. Datapack authors drive it from the origin JSON, with a `figura_model` string for the one-model case and a `figura_models` object that maps evolution tiers, active powers, and capability tags to their own model keys (plus a `vocab` map of friendly labels for a generic avatar UI). Avatar scripts read the state through twelve `neoorigins:` calls, for example `getFiguraModelTier()` and `getActiveFiguraModelKeys()`. Figura stays a compile-only soft dependency: with it absent, none of the integration loads and nothing breaks. See the new [Figura integration](docs/FIGURA.md) guide for the datapack fields and the full Lua reference.
- **Projectile-fired `execute_command` runs through the command rewriter and guard.** A command fired from a projectile context, for example an Origins-format addon that runs `/attribute` where its projectile lands, bypassed the legacy-command rewrite and the command-power safety guard that the main `execute_command` path already used. It now routes through both, so legacy attribute ids like `generic.scale` migrate to their modern form (`scale`) and the same command restrictions apply.
release
NeoOrigins v2.2.20 (MC 26.2)
v2.2.20+26.222 июл. 2026 г.77Minecraft: 26.2neoforge
Что нового
> A combined fix-and-integration release. It closes issue #113: the permanent invulnerability when the selection screen is skipped, a new config toggle for spawning players with no origin, and an Orb of Origin that re-rolls only your origin. It also deepens Iron's Spells 'n Spellbooks support with a mana-backed resource bar and first-class handling of Iron's eight custom attributes, which the built-in mage origins now draw on, and adds a Figura integration so custom avatars can react to a player's origin, powers, and evolution tier on every observer's screen. Plus a Bloodfeast diet for vampires, two repaired vampire config overrides, origin-gated recipes that now appear in the recipe book and stop refunding their ingredients, and ability hunger costs that spend saturation first.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`skip_initial_selection`: spawn new players with no origin and no picker.** A new gameplay-config toggle (default off) that skips the initial origin/class selection entirely. When it's on, new players join with no origin and the selection screen never opens: they play as an origin-less player until something grants them one later, for example an Orb of Origin. Unlike auto-human mode it assigns nothing, and unlike the old trick of disabling every class it doesn't leave the player stuck invulnerable. It takes priority over auto-human and the random-assignment modes.
- **The Orb of Origin re-rolls only your origin.** It previously reset both your origin and your class in one go; now it reopens the picker scoped to the origin layer alone and leaves your class exactly as it was, since re-rolling class is the Orb of Class's job. Any class-conditioned sub-power that no longer qualifies under your new origin is still cleared automatically, and the orb keeps committing lazily: the XP levels and the orb itself are spent only when you confirm a new origin, so closing the picker without choosing is a free cancel.
- **Vampires gain a Bloodfeast diet.** The vampire origin can now draw full nourishment from raw and rotten flesh, as if it were freshly cooked: beef, porkchop, chicken, mutton, and rabbit feed you the same raw or cooked, rotten flesh nourishes without inflicting the hunger effect, and spider eye is edible too. It's a themed complement to the origin's existing eating restrictions.
- **No more permanent invulnerability when the selection screen is skipped (#113).** New players are briefly invulnerable while they're still choosing an origin, and that protection is meant to lift the moment they've finished picking. If you ran auto-human with every class disabled, the class screen had nothing left to offer, the client quietly skipped it, and the "still choosing" state never cleared, so the player stayed invulnerable until they used an Orb of Origin or rejoined the world. A layer that has no selectable origin is now treated as already satisfied, so the protection lifts right away instead of hanging forever.
- **Two vampire config overrides that silently did nothing now work.** The `multiplier` for vampire water-weakness, and for the slow-regen powers on Vampire, Revenant, and Necromancer, were ignored in `power_overrides.toml`: the underlying powers hardcoded their values, so editing the toml changed nothing. Both now honour `multiplier`: setting the water-weakness `multiplier` to `0` truly switches off the water damage, and the slow-regen `multiplier` actually scales regeneration (`1.0` = normal).
- **Origin-gated recipes appear in the recipe book and stop refunding their ingredients.** Two fixes to the gated-recipe wrapper. It was marked `isSpecial()`, which suppressed the recipe-book unlock so gated recipes could never surface there; it now inherits the inner recipe's flag and unlocks like any recipe, with the per-player origin gate still enforced at craft time (a player who fails the gate sees an empty result slot). And the crafting player is now planted into recipe context when the result is taken, not just when the grid changes, so completing the craft actually consumes the ingredients instead of refunding them.
- **Ability hunger costs spend saturation first and update nutrition mods.** Powers that charge a hunger cost (active abilities, upkeep auras, and the summon and tame-mob powers) took the cost straight off your food level, skipping the saturation that vanilla always spends first, and never told the client its saturation had changed. Costs now drain saturation before food, the way eating fills it in reverse, and push a hunger update to the client so saturation-display mods track the drain live.
- **Deeper Iron's Spells 'n Spellbooks integration: mana-backed bars and first-class attributes.** Beyond the existing `cast_iron_spell` action, two new surfaces land. A `neoorigins:resource` power can now set `"backing": "irons_spellbooks:mana"` to bind its HUD bar directly to the player's Iron's mana pool: the bar auto-scales to Iron's live max mana (so it fills identically to Iron's own bar), reads and writes stay additive so NeoOrigins never fights Iron's regen and casting bookkeeping, and it re-syncs every 10 ticks so the HUD tracks the pool live. And `attribute_modifier` powers can target Iron's eight custom attributes (max mana, mana regen, spell power, spell resist, cooldown reduction, cast-time reduction, casting move-speed, and summon damage) by id, with the per-attribute scale documented. Iron's stays a compile-only soft dependency: without it installed, each surface degrades to a logged no-op rather than crashing. See the new [Iron's Spells 'n Spellbooks](docs/COMPATIBILITY.md#irons-spells-n-spellbooks) section for the full reference.
- **The built-in mage origins draw on Iron's attributes when it's installed.** Fire, Water, Earth, Air, Darkness, and Gravity Mage, along with the Necromancer, now carry themed Iron's attribute bonuses (a larger mana pool, faster or stronger casting, and school-appropriate perks), each gated behind `"required_mods": ["irons_spellbooks"]`, so they only load and apply when Iron's is present and stay invisible otherwise.
- **Figura avatars can react to a player's origin, powers, and evolution tier.** [Figura](https://modrinth.com/mod/figura) avatars run a Lua script that renders on everyone's screen, and NeoOrigins now exposes a read-only `neoorigins` global to those scripts: an avatar can switch model, toggle parts, or play animations from the wearer's live NeoOrigins state, and it resolves for other players too, not only yourself. Datapack authors drive it from the origin JSON, with a `figura_model` string for the one-model case and a `figura_models` object that maps evolution tiers, active powers, and capability tags to their own model keys (plus a `vocab` map of friendly labels for a generic avatar UI). Avatar scripts read the state through twelve `neoorigins:` calls, for example `getFiguraModelTier()` and `getActiveFiguraModelKeys()`. Figura stays a compile-only soft dependency: with it absent, none of the integration loads and nothing breaks. See the new [Figura integration](docs/FIGURA.md) guide for the datapack fields and the full Lua reference.
- **Projectile-fired `execute_command` runs through the command rewriter and guard.** A command fired from a projectile context, for example an Origins-format addon that runs `/attribute` where its projectile lands, bypassed the legacy-command rewrite and the command-power safety guard that the main `execute_command` path already used. It now routes through both, so legacy attribute ids like `generic.scale` migrate to their modern form (`scale`) and the same command restrictions apply.
release
NeoOrigins v2.2.20 (MC 26.1.x)
v2.2.20+26.122 июл. 2026 г.63Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A combined fix-and-integration release. It closes issue #113: the permanent invulnerability when the selection screen is skipped, a new config toggle for spawning players with no origin, and an Orb of Origin that re-rolls only your origin. It also deepens Iron's Spells 'n Spellbooks support with a mana-backed resource bar and first-class handling of Iron's eight custom attributes, which the built-in mage origins now draw on, and adds a Figura integration so custom avatars can react to a player's origin, powers, and evolution tier on every observer's screen. Plus a Bloodfeast diet for vampires, two repaired vampire config overrides, origin-gated recipes that now appear in the recipe book and stop refunding their ingredients, and ability hunger costs that spend saturation first.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`skip_initial_selection`: spawn new players with no origin and no picker.** A new gameplay-config toggle (default off) that skips the initial origin/class selection entirely. When it's on, new players join with no origin and the selection screen never opens: they play as an origin-less player until something grants them one later, for example an Orb of Origin. Unlike auto-human mode it assigns nothing, and unlike the old trick of disabling every class it doesn't leave the player stuck invulnerable. It takes priority over auto-human and the random-assignment modes.
- **The Orb of Origin re-rolls only your origin.** It previously reset both your origin and your class in one go; now it reopens the picker scoped to the origin layer alone and leaves your class exactly as it was, since re-rolling class is the Orb of Class's job. Any class-conditioned sub-power that no longer qualifies under your new origin is still cleared automatically, and the orb keeps committing lazily: the XP levels and the orb itself are spent only when you confirm a new origin, so closing the picker without choosing is a free cancel.
- **Vampires gain a Bloodfeast diet.** The vampire origin can now draw full nourishment from raw and rotten flesh, as if it were freshly cooked: beef, porkchop, chicken, mutton, and rabbit feed you the same raw or cooked, rotten flesh nourishes without inflicting the hunger effect, and spider eye is edible too. It's a themed complement to the origin's existing eating restrictions.
- **No more permanent invulnerability when the selection screen is skipped (#113).** New players are briefly invulnerable while they're still choosing an origin, and that protection is meant to lift the moment they've finished picking. If you ran auto-human with every class disabled, the class screen had nothing left to offer, the client quietly skipped it, and the "still choosing" state never cleared, so the player stayed invulnerable until they used an Orb of Origin or rejoined the world. A layer that has no selectable origin is now treated as already satisfied, so the protection lifts right away instead of hanging forever.
- **Two vampire config overrides that silently did nothing now work.** The `multiplier` for vampire water-weakness, and for the slow-regen powers on Vampire, Revenant, and Necromancer, were ignored in `power_overrides.toml`: the underlying powers hardcoded their values, so editing the toml changed nothing. Both now honour `multiplier`: setting the water-weakness `multiplier` to `0` truly switches off the water damage, and the slow-regen `multiplier` actually scales regeneration (`1.0` = normal).
- **Origin-gated recipes appear in the recipe book and stop refunding their ingredients.** Two fixes to the gated-recipe wrapper. It was marked `isSpecial()`, which suppressed the recipe-book unlock so gated recipes could never surface there; it now inherits the inner recipe's flag and unlocks like any recipe, with the per-player origin gate still enforced at craft time (a player who fails the gate sees an empty result slot). And the crafting player is now planted into recipe context when the result is taken, not just when the grid changes, so completing the craft actually consumes the ingredients instead of refunding them.
- **Ability hunger costs spend saturation first and update nutrition mods.** Powers that charge a hunger cost (active abilities, upkeep auras, and the summon and tame-mob powers) took the cost straight off your food level, skipping the saturation that vanilla always spends first, and never told the client its saturation had changed. Costs now drain saturation before food, the way eating fills it in reverse, and push a hunger update to the client so saturation-display mods track the drain live.
- **Deeper Iron's Spells 'n Spellbooks integration: mana-backed bars and first-class attributes.** Beyond the existing `cast_iron_spell` action, two new surfaces land. A `neoorigins:resource` power can now set `"backing": "irons_spellbooks:mana"` to bind its HUD bar directly to the player's Iron's mana pool: the bar auto-scales to Iron's live max mana (so it fills identically to Iron's own bar), reads and writes stay additive so NeoOrigins never fights Iron's regen and casting bookkeeping, and it re-syncs every 10 ticks so the HUD tracks the pool live. And `attribute_modifier` powers can target Iron's eight custom attributes (max mana, mana regen, spell power, spell resist, cooldown reduction, cast-time reduction, casting move-speed, and summon damage) by id, with the per-attribute scale documented. Iron's stays a compile-only soft dependency: without it installed, each surface degrades to a logged no-op rather than crashing. See the new [Iron's Spells 'n Spellbooks](docs/COMPATIBILITY.md#irons-spells-n-spellbooks) section for the full reference.
- **The built-in mage origins draw on Iron's attributes when it's installed.** Fire, Water, Earth, Air, Darkness, and Gravity Mage, along with the Necromancer, now carry themed Iron's attribute bonuses (a larger mana pool, faster or stronger casting, and school-appropriate perks), each gated behind `"required_mods": ["irons_spellbooks"]`, so they only load and apply when Iron's is present and stay invisible otherwise.
- **Figura avatars can react to a player's origin, powers, and evolution tier.** [Figura](https://modrinth.com/mod/figura) avatars run a Lua script that renders on everyone's screen, and NeoOrigins now exposes a read-only `neoorigins` global to those scripts: an avatar can switch model, toggle parts, or play animations from the wearer's live NeoOrigins state, and it resolves for other players too, not only yourself. Datapack authors drive it from the origin JSON, with a `figura_model` string for the one-model case and a `figura_models` object that maps evolution tiers, active powers, and capability tags to their own model keys (plus a `vocab` map of friendly labels for a generic avatar UI). Avatar scripts read the state through twelve `neoorigins:` calls, for example `getFiguraModelTier()` and `getActiveFiguraModelKeys()`. Figura stays a compile-only soft dependency: with it absent, none of the integration loads and nothing breaks. See the new [Figura integration](docs/FIGURA.md) guide for the datapack fields and the full Lua reference.
- **Projectile-fired `execute_command` runs through the command rewriter and guard.** A command fired from a projectile context, for example an Origins-format addon that runs `/attribute` where its projectile lands, bypassed the legacy-command rewrite and the command-power safety guard that the main `execute_command` path already used. It now routes through both, so legacy attribute ids like `generic.scale` migrate to their modern form (`scale`) and the same command restrictions apply.
release
NeoOrigins v2.2.19 (MC 1.21.1)
v2.2.19+1.21.117 июл. 2026 г.4,1 тыс.Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.19
> A features-and-compatibility release. Two new powers: `kill_loot_drops` adds bonus drops to the mobs you kill, rolled through each mob's own loot table so they land as genuine world drops instead of being handed straight to your inventory, and `mobs_target_player` is the inverse of `mobs_ignore_player`, letting the mobs you choose actively hunt an origin the way wolves hunt a skeleton. On the compatibility side, the ocean and carnivore origins can now eat fish and meat from other mods out of the box, and a new decaying cobweb block lets legacy Apoli packs (such as the Origins++ broodmother) place their webs.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`kill_loot_drops` power.** Grants its holder bonus drops from the mobs they kill: each entry in the power's `drops` list pairs a mob target with an item, a `chance`, and a `count`, and that item is layered into the mob's vanilla loot when you land the kill, so it falls from the corpse through the normal loot pipeline rather than appearing in your inventory. One power can hook many loot tables at once: list an entry per mob type, or match a whole category from a single entry with `entity_tag` (say `minecraft:undead`) or an explicit `entity_types` list. Drops only roll for a player's own kills, so mob-on-mob and environmental deaths are left alone. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and a worked example.
- **`mobs_target_player` power.** The inverse of `mobs_ignore_player`: rather than making mobs leave you alone, it makes the mob types you list actively hunt whoever holds the power, the way wolves aggro a vanilla skeleton. Use it for, say, a skeleton-type origin that dogs treat as prey. `entity_types` accepts raw ids (`minecraft:wolf`) and tag references (`#mymod:my_tag`), and an empty or omitted list means every mob hunts the holder; `range` (default `16`) sets how close a mob has to be to pick the player up, and `entity_blacklist` carves out types that should never hunt them. Boss-tier mobs (Warden, Ender Dragon, Wither) are always excluded. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference.
- **The undead origins now breathe underwater.** Skeleton, Vampire, Necromancer, Phantom, and Wraith are dead and no longer need air, so they no longer drown: they match Revenant, which already had this. Each origin's underwater breathing is its own toggle in `power_overrides.toml` (set its `enabled` to `false` to remove it for that origin).
- **Native-format origins apply the multiple-power id rewrite.** An origin written in NeoOrigins' own format that pulled in an `apoli:multiple` power (as some datapacks do) skipped the step that gives each bundled sub-power a unique id, so those sub-powers collided or silently dropped. The rewrite now runs for native-format origins as well, matching how converted Origins packs were already handled.
- **Riding a player shows the passenger on the vehicle player's own screen (#111).** When one player mounted another, the rider appeared for every onlooker but not for the player being ridden, and on dismount the vehicle player's screen kept showing a phantom rider until something re-tracked them. The root cause is that a player never tracks itself, so the server's passenger-list broadcast for the vehicle never reached the vehicle player's own client. The server now resends the true passenger list straight to the vehicle player both when a rider mounts and after one dismounts, so their own view stays in sync.
- **`persistent_effect` no longer clobbers stronger or foreign effects (#112).** A persistent effect always overwrote whatever instance of the same effect type was already on the player and, when it turned off, always stripped that effect — so an infinite low-level buff could stamp out a stronger timed buff from another source (for example an Asura Bloodrage/Frenzy strength boost), and an inactive tier could remove a lower tier's effect or a foreign buff that merely shared the effect type. The power now only reapplies when nothing stronger is present, and only removes an effect it actually owns at its own amplifier (an infinite-duration instance matching its tier), leaving stronger and foreign effects untouched.
- **The ocean and carnivore origins eat modded fish and meat.** Fish and meat from other mods (Aquaculture, Hybrid Aquatic, and anything using the common `c:foods/raw_fish`, `cooked_fish`, `raw_meat`, and `cooked_meat` tags) now count toward the ocean origin's pescivore diet and the carnivore meat diet with no setup, so those players can eat modded catches straight away. For mods that don't follow the `c:foods` convention, a new `ocean_origins.extra_fish_foods` config list lets a server add extra edible items by id (`somemod:exotic_fish`) or tag (`#somemod:fish`): the diet allows any food that is either in the `neoorigins:fish_foods` tag or on that list.
- **Legacy Apoli packs can place their cobwebs.** Added the `origins:temporary_cobweb` / `neoorigins:temporary_cobweb` block that packs like the Origins++ broodmother place through their powers and functions. It's a decaying, no-collision web with no item form, placed only by powers and actions, and it registers under the legacy `origins:` id as well so a pack function's `setblock ... origins:temporary_cobweb` resolves.
- **Origins++ 2.4 packs translate far more faithfully (#110).** A batch of compat fixes for the shapes the current Origins++ pack actually uses. `conditioned_attribute` now reads multiple modifiers per power, whether they arrive as a `modifiers` array (dark_boost), a single `modifiers` object (pluck), a singular `modifier` object, or a flat top-level `attribute`/`operation`/`value`: previously only the singular form was understood, so multi-modifier powers lost every entry but the first. Collapsed `apoli:multiple` powers that leave their sub-powers unnamed now show a proper title in the origin screen, resolving the Apoli auto translation key (`power.<namespace>.<path>.name`) that Origins++ relies on instead of falling back to a raw id. And the broodmother lines up: the `temporary_cobweb` block reads the SNBT `tag` that `fire_projectile` merges into its spawn, and the Origins-registered `origins:enderian_pearl` projectile remaps to a vanilla ender pearl while keeping its no-fall-damage behaviour.
- **Block-scanning conditions match Apoli semantics.** `near_block` / `block_in_radius` now counts the matching blocks in range and compares that count via `comparison`/`compare_to` (Apoli's real behaviour) rather than firing on the first hit, and its radius cap is raised from 8 to 16 for the wider tiered scans some packs use; the scan still bails out early once the outcome is settled. Three conditions were added to cover patterns those packs lean on: `in_block_anywhere` counts every block position the player's bounding box overlaps and compares it the same way, `collided_horizontally` reports whether the entity ran into a wall this tick, and an internal `climbing_gate` condition drives conditional climbing powers. Climbing capabilities also join the per-tick position re-sync, so a climbing power that flips on a block or toggle condition no longer leaves the client rubber-banding.
- **New Origins++ 2.4 power types translate.** Three power types the current Origins++ pack introduces now map onto NeoOrigins: `origins:swimming` (as `forced_swimming`, a condition-gated swimming capability), `origins:prevent_block_selection` (as `cobweb_selection_passthrough`, narrowly for the "crosshair passes through cobwebs" pattern that targets the `origins:cobwebs` tag or the cobweb block), and `origins:action_on_being_used`, which fires a bi-entity action when another player right-clicks the holder. Both new movement capabilities join the per-tick re-sync so their client-predicted physics stay in step with the server.
release
NeoOrigins v2.2.19 (MC 26.2)
v2.2.19+26.217 июл. 2026 г.110Minecraft: 26.2neoforge
Что нового
NeoOrigins v2.2.19
> A features-and-compatibility release. Two new powers: `kill_loot_drops` adds bonus drops to the mobs you kill, rolled through each mob's own loot table so they land as genuine world drops instead of being handed straight to your inventory, and `mobs_target_player` is the inverse of `mobs_ignore_player`, letting the mobs you choose actively hunt an origin the way wolves hunt a skeleton. On the compatibility side, the ocean and carnivore origins can now eat fish and meat from other mods out of the box, and a new decaying cobweb block lets legacy Apoli packs (such as the Origins++ broodmother) place their webs.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`kill_loot_drops` power.** Grants its holder bonus drops from the mobs they kill: each entry in the power's `drops` list pairs a mob target with an item, a `chance`, and a `count`, and that item is layered into the mob's vanilla loot when you land the kill, so it falls from the corpse through the normal loot pipeline rather than appearing in your inventory. One power can hook many loot tables at once: list an entry per mob type, or match a whole category from a single entry with `entity_tag` (say `minecraft:undead`) or an explicit `entity_types` list. Drops only roll for a player's own kills, so mob-on-mob and environmental deaths are left alone. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and a worked example.
- **`mobs_target_player` power.** The inverse of `mobs_ignore_player`: rather than making mobs leave you alone, it makes the mob types you list actively hunt whoever holds the power, the way wolves aggro a vanilla skeleton. Use it for, say, a skeleton-type origin that dogs treat as prey. `entity_types` accepts raw ids (`minecraft:wolf`) and tag references (`#mymod:my_tag`), and an empty or omitted list means every mob hunts the holder; `range` (default `16`) sets how close a mob has to be to pick the player up, and `entity_blacklist` carves out types that should never hunt them. Boss-tier mobs (Warden, Ender Dragon, Wither) are always excluded. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference.
- **The undead origins now breathe underwater.** Skeleton, Vampire, Necromancer, Phantom, and Wraith are dead and no longer need air, so they no longer drown: they match Revenant, which already had this. Each origin's underwater breathing is its own toggle in `power_overrides.toml` (set its `enabled` to `false` to remove it for that origin).
- **Native-format origins apply the multiple-power id rewrite.** An origin written in NeoOrigins' own format that pulled in an `apoli:multiple` power (as some datapacks do) skipped the step that gives each bundled sub-power a unique id, so those sub-powers collided or silently dropped. The rewrite now runs for native-format origins as well, matching how converted Origins packs were already handled.
- **Riding a player shows the passenger on the vehicle player's own screen (#111).** When one player mounted another, the rider appeared for every onlooker but not for the player being ridden, and on dismount the vehicle player's screen kept showing a phantom rider until something re-tracked them. The root cause is that a player never tracks itself, so the server's passenger-list broadcast for the vehicle never reached the vehicle player's own client. The server now resends the true passenger list straight to the vehicle player both when a rider mounts and after one dismounts, so their own view stays in sync.
- **`persistent_effect` no longer clobbers stronger or foreign effects (#112).** A persistent effect always overwrote whatever instance of the same effect type was already on the player and, when it turned off, always stripped that effect — so an infinite low-level buff could stamp out a stronger timed buff from another source (for example an Asura Bloodrage/Frenzy strength boost), and an inactive tier could remove a lower tier's effect or a foreign buff that merely shared the effect type. The power now only reapplies when nothing stronger is present, and only removes an effect it actually owns at its own amplifier (an infinite-duration instance matching its tier), leaving stronger and foreign effects untouched.
- **The ocean and carnivore origins eat modded fish and meat.** Fish and meat from other mods (Aquaculture, Hybrid Aquatic, and anything using the common `c:foods/raw_fish`, `cooked_fish`, `raw_meat`, and `cooked_meat` tags) now count toward the ocean origin's pescivore diet and the carnivore meat diet with no setup, so those players can eat modded catches straight away. For mods that don't follow the `c:foods` convention, a new `ocean_origins.extra_fish_foods` config list lets a server add extra edible items by id (`somemod:exotic_fish`) or tag (`#somemod:fish`): the diet allows any food that is either in the `neoorigins:fish_foods` tag or on that list.
- **Legacy Apoli packs can place their cobwebs.** Added the `origins:temporary_cobweb` / `neoorigins:temporary_cobweb` block that packs like the Origins++ broodmother place through their powers and functions. It's a decaying, no-collision web with no item form, placed only by powers and actions, and it registers under the legacy `origins:` id as well so a pack function's `setblock ... origins:temporary_cobweb` resolves.
- **Origins++ 2.4 packs translate far more faithfully (#110).** A batch of compat fixes for the shapes the current Origins++ pack actually uses. `conditioned_attribute` now reads multiple modifiers per power, whether they arrive as a `modifiers` array (dark_boost), a single `modifiers` object (pluck), a singular `modifier` object, or a flat top-level `attribute`/`operation`/`value`: previously only the singular form was understood, so multi-modifier powers lost every entry but the first. Collapsed `apoli:multiple` powers that leave their sub-powers unnamed now show a proper title in the origin screen, resolving the Apoli auto translation key (`power.<namespace>.<path>.name`) that Origins++ relies on instead of falling back to a raw id. And the broodmother lines up: the `temporary_cobweb` block reads the SNBT `tag` that `fire_projectile` merges into its spawn, and the Origins-registered `origins:enderian_pearl` projectile remaps to a vanilla ender pearl while keeping its no-fall-damage behaviour.
- **Block-scanning conditions match Apoli semantics.** `near_block` / `block_in_radius` now counts the matching blocks in range and compares that count via `comparison`/`compare_to` (Apoli's real behaviour) rather than firing on the first hit, and its radius cap is raised from 8 to 16 for the wider tiered scans some packs use; the scan still bails out early once the outcome is settled. Three conditions were added to cover patterns those packs lean on: `in_block_anywhere` counts every block position the player's bounding box overlaps and compares it the same way, `collided_horizontally` reports whether the entity ran into a wall this tick, and an internal `climbing_gate` condition drives conditional climbing powers. Climbing capabilities also join the per-tick position re-sync, so a climbing power that flips on a block or toggle condition no longer leaves the client rubber-banding.
- **New Origins++ 2.4 power types translate.** Three power types the current Origins++ pack introduces now map onto NeoOrigins: `origins:swimming` (as `forced_swimming`, a condition-gated swimming capability), `origins:prevent_block_selection` (as `cobweb_selection_passthrough`, narrowly for the "crosshair passes through cobwebs" pattern that targets the `origins:cobwebs` tag or the cobweb block), and `origins:action_on_being_used`, which fires a bi-entity action when another player right-clicks the holder. Both new movement capabilities join the per-tick re-sync so their client-predicted physics stay in step with the server.
release
NeoOrigins v2.2.19 (MC 26.1.x)
v2.2.19+26.117 июл. 2026 г.120Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.19
> A features-and-compatibility release. Two new powers: `kill_loot_drops` adds bonus drops to the mobs you kill, rolled through each mob's own loot table so they land as genuine world drops instead of being handed straight to your inventory, and `mobs_target_player` is the inverse of `mobs_ignore_player`, letting the mobs you choose actively hunt an origin the way wolves hunt a skeleton. On the compatibility side, the ocean and carnivore origins can now eat fish and meat from other mods out of the box, and a new decaying cobweb block lets legacy Apoli packs (such as the Origins++ broodmother) place their webs.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`kill_loot_drops` power.** Grants its holder bonus drops from the mobs they kill: each entry in the power's `drops` list pairs a mob target with an item, a `chance`, and a `count`, and that item is layered into the mob's vanilla loot when you land the kill, so it falls from the corpse through the normal loot pipeline rather than appearing in your inventory. One power can hook many loot tables at once: list an entry per mob type, or match a whole category from a single entry with `entity_tag` (say `minecraft:undead`) or an explicit `entity_types` list. Drops only roll for a player's own kills, so mob-on-mob and environmental deaths are left alone. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference and a worked example.
- **`mobs_target_player` power.** The inverse of `mobs_ignore_player`: rather than making mobs leave you alone, it makes the mob types you list actively hunt whoever holds the power, the way wolves aggro a vanilla skeleton. Use it for, say, a skeleton-type origin that dogs treat as prey. `entity_types` accepts raw ids (`minecraft:wolf`) and tag references (`#mymod:my_tag`), and an empty or omitted list means every mob hunts the holder; `range` (default `16`) sets how close a mob has to be to pick the player up, and `entity_blacklist` carves out types that should never hunt them. Boss-tier mobs (Warden, Ender Dragon, Wither) are always excluded. See [POWER_TYPES.md](docs/POWER_TYPES.md) for the field reference.
- **The undead origins now breathe underwater.** Skeleton, Vampire, Necromancer, Phantom, and Wraith are dead and no longer need air, so they no longer drown: they match Revenant, which already had this. Each origin's underwater breathing is its own toggle in `power_overrides.toml` (set its `enabled` to `false` to remove it for that origin).
- **Native-format origins apply the multiple-power id rewrite.** An origin written in NeoOrigins' own format that pulled in an `apoli:multiple` power (as some datapacks do) skipped the step that gives each bundled sub-power a unique id, so those sub-powers collided or silently dropped. The rewrite now runs for native-format origins as well, matching how converted Origins packs were already handled.
- **Riding a player shows the passenger on the vehicle player's own screen (#111).** When one player mounted another, the rider appeared for every onlooker but not for the player being ridden, and on dismount the vehicle player's screen kept showing a phantom rider until something re-tracked them. The root cause is that a player never tracks itself, so the server's passenger-list broadcast for the vehicle never reached the vehicle player's own client. The server now resends the true passenger list straight to the vehicle player both when a rider mounts and after one dismounts, so their own view stays in sync.
- **`persistent_effect` no longer clobbers stronger or foreign effects (#112).** A persistent effect always overwrote whatever instance of the same effect type was already on the player and, when it turned off, always stripped that effect — so an infinite low-level buff could stamp out a stronger timed buff from another source (for example an Asura Bloodrage/Frenzy strength boost), and an inactive tier could remove a lower tier's effect or a foreign buff that merely shared the effect type. The power now only reapplies when nothing stronger is present, and only removes an effect it actually owns at its own amplifier (an infinite-duration instance matching its tier), leaving stronger and foreign effects untouched.
- **The ocean and carnivore origins eat modded fish and meat.** Fish and meat from other mods (Aquaculture, Hybrid Aquatic, and anything using the common `c:foods/raw_fish`, `cooked_fish`, `raw_meat`, and `cooked_meat` tags) now count toward the ocean origin's pescivore diet and the carnivore meat diet with no setup, so those players can eat modded catches straight away. For mods that don't follow the `c:foods` convention, a new `ocean_origins.extra_fish_foods` config list lets a server add extra edible items by id (`somemod:exotic_fish`) or tag (`#somemod:fish`): the diet allows any food that is either in the `neoorigins:fish_foods` tag or on that list.
- **Legacy Apoli packs can place their cobwebs.** Added the `origins:temporary_cobweb` / `neoorigins:temporary_cobweb` block that packs like the Origins++ broodmother place through their powers and functions. It's a decaying, no-collision web with no item form, placed only by powers and actions, and it registers under the legacy `origins:` id as well so a pack function's `setblock ... origins:temporary_cobweb` resolves.
- **Origins++ 2.4 packs translate far more faithfully (#110).** A batch of compat fixes for the shapes the current Origins++ pack actually uses. `conditioned_attribute` now reads multiple modifiers per power, whether they arrive as a `modifiers` array (dark_boost), a single `modifiers` object (pluck), a singular `modifier` object, or a flat top-level `attribute`/`operation`/`value`: previously only the singular form was understood, so multi-modifier powers lost every entry but the first. Collapsed `apoli:multiple` powers that leave their sub-powers unnamed now show a proper title in the origin screen, resolving the Apoli auto translation key (`power.<namespace>.<path>.name`) that Origins++ relies on instead of falling back to a raw id. And the broodmother lines up: the `temporary_cobweb` block reads the SNBT `tag` that `fire_projectile` merges into its spawn, and the Origins-registered `origins:enderian_pearl` projectile remaps to a vanilla ender pearl while keeping its no-fall-damage behaviour.
- **Block-scanning conditions match Apoli semantics.** `near_block` / `block_in_radius` now counts the matching blocks in range and compares that count via `comparison`/`compare_to` (Apoli's real behaviour) rather than firing on the first hit, and its radius cap is raised from 8 to 16 for the wider tiered scans some packs use; the scan still bails out early once the outcome is settled. Three conditions were added to cover patterns those packs lean on: `in_block_anywhere` counts every block position the player's bounding box overlaps and compares it the same way, `collided_horizontally` reports whether the entity ran into a wall this tick, and an internal `climbing_gate` condition drives conditional climbing powers. Climbing capabilities also join the per-tick position re-sync, so a climbing power that flips on a block or toggle condition no longer leaves the client rubber-banding.
- **New Origins++ 2.4 power types translate.** Three power types the current Origins++ pack introduces now map onto NeoOrigins: `origins:swimming` (as `forced_swimming`, a condition-gated swimming capability), `origins:prevent_block_selection` (as `cobweb_selection_passthrough`, narrowly for the "crosshair passes through cobwebs" pattern that targets the `origins:cobwebs` tag or the cobweb block), and `origins:action_on_being_used`, which fires a bi-entity action when another player right-clicks the holder. Both new movement capabilities join the per-tick re-sync so their client-predicted physics stay in step with the server.
release
NeoOrigins v2.2.18 (MC 1.21.1)
v2.2.18+1.21.18 июл. 2026 г.5 тыс.Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.18
A Windwalker tune-up and an Iron's Spells compatibility fix: the tornado is much wider and the apex evolution replaces the base one instead of stacking, evolved gliding and the flight toggle work on dedicated servers, a tornado stays in the cave you cast it in, and NeoOrigins loads again alongside current Iron's Spells 'n Spellbooks builds.
Balance & Tuning
- Windwalker's tornado is 2.5x wider (both Typhoon and the apex Eye of Storm); height unchanged.
- The apex evolution's tornado replaces the base one instead of stacking: Typhoon is removed at the final tier and Eye of Storm takes its slot.
Bug Fixes
- Windwalker's Evolved glide works on dedicated servers: tier-granted capabilities now sync to the client.
- Windwalker's tornado stays in the cave you cast it in: it follows the local floor instead of the world surface.
- Windwalker's flight toggle actually starts flight: toggling on lifts off, toggling off lands you.
Compatibility
- NeoOrigins loads alongside current Iron's Spells 'n Spellbooks builds again: the optional dependency range now accounts for Iron's Minecraft-prefixed version string, so 3.x builds no longer trip a false version mismatch.
release
NeoOrigins v2.2.18 (MC 26.2)
v2.2.18+26.28 июл. 2026 г.220Minecraft: 26.2neoforge
Что нового
NeoOrigins v2.2.18
A Windwalker tune-up and an Iron's Spells compatibility fix: the tornado is much wider and the apex evolution replaces the base one instead of stacking, evolved gliding and the flight toggle work on dedicated servers, a tornado stays in the cave you cast it in, and NeoOrigins loads again alongside current Iron's Spells 'n Spellbooks builds.
Balance & Tuning
- Windwalker's tornado is 2.5x wider (both Typhoon and the apex Eye of Storm); height unchanged.
- The apex evolution's tornado replaces the base one instead of stacking: Typhoon is removed at the final tier and Eye of Storm takes its slot.
Bug Fixes
- Windwalker's Evolved glide works on dedicated servers: tier-granted capabilities now sync to the client.
- Windwalker's tornado stays in the cave you cast it in: it follows the local floor instead of the world surface.
- Windwalker's flight toggle actually starts flight: toggling on lifts off, toggling off lands you.
Compatibility
- NeoOrigins loads alongside current Iron's Spells 'n Spellbooks builds again: the optional dependency range now accounts for Iron's Minecraft-prefixed version string, so 3.x builds no longer trip a false version mismatch.
release
NeoOrigins v2.2.18 (MC 26.1.x)
v2.2.18+26.18 июл. 2026 г.112Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.18
A Windwalker tune-up and an Iron's Spells compatibility fix: the tornado is much wider and the apex evolution replaces the base one instead of stacking, evolved gliding and the flight toggle work on dedicated servers, a tornado stays in the cave you cast it in, and NeoOrigins loads again alongside current Iron's Spells 'n Spellbooks builds.
Balance & Tuning
- Windwalker's tornado is 2.5x wider (both Typhoon and the apex Eye of Storm); height unchanged.
- The apex evolution's tornado replaces the base one instead of stacking: Typhoon is removed at the final tier and Eye of Storm takes its slot.
Bug Fixes
- Windwalker's Evolved glide works on dedicated servers: tier-granted capabilities now sync to the client.
- Windwalker's tornado stays in the cave you cast it in: it follows the local floor instead of the world surface.
- Windwalker's flight toggle actually starts flight: toggling on lifts off, toggling off lands you.
Compatibility
- NeoOrigins loads alongside current Iron's Spells 'n Spellbooks builds again: the optional dependency range now accounts for Iron's Minecraft-prefixed version string, so 3.x builds no longer trip a false version mismatch.
release
NeoOrigins v2.2.17 (MC 1.21.1)
v2.2.17+1.21.17 июл. 2026 г.309Minecraft: 1.21.1neoforge
Что нового
> A content release: a family of six hand-modelled Crystal Orbs, a new Orb of Class that re-rolls only your class, a general "reopen the picker for these layers" hook for pack authors, Iron's Spells 'n Spellbooks casting from origin powers, and native elytra flight with visible, re-texturable wings — plus a wraith wall-phase fix and an `action_on_event` correctness pass.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Crystal Orbs: six orb items with new 3D models.** The reset orbs are now hand-modelled glass spheres with an animated swirling core, replacing the old flat sprite. `orb_of_origin` keeps its full-reset behaviour and its id — so existing recipes and pack references carry over unchanged, only the look is new — and four more colours (gold, pink, purple, teal) ship alongside it as inert items for datapack authors.
- **Orb of Class: re-roll only your class.** `neoorigins:orb_of_class` is a cheaper, class-only sibling of the Orb of Origin. Right-clicking it resets just the `neoorigins:class` layer and reopens the picker scoped to that one screen, leaving your main origin untouched. Its XP cost is a flat `class_levels_per_use` (default `2`, versus the origin orb's `5`), and it commits lazily: the levels and the orb itself are spent only when you actually confirm a new class, so closing the picker without picking is a free cancel that refunds the orb and restores your previous class. Crafted like the Orb of Origin, but with ingots instead of blocks.
- **`elytra_flight` power.** Grants elytra-style gliding without an equipped elytra — the same activation as `natural_glide` — and draws a cosmetic elytra on the player's back while you fly. `render_elytra` toggles the wings (flight works either way; set it false to glide with no visible wings), and `texture_location` swaps in a custom wing texture while keeping the vanilla elytra model. Origins/Apoli packs that use `apoli:elytra_flight` now map onto this natively, so their `render_elytra` and `texture_location` are honoured instead of dropped: imported gliders finally show their wings.
- **Reopen the origin picker for any set of layers.** The Orb of Class is one preset of a general mechanism, now exposed to packs two ways. The `neoorigins:open_layer_picker` entity action takes a `layers` list and reopens the picker scoped to exactly those layers, with an author-chosen `commit_mode` (`deferred` for a free-cancel re-pick, `immediate` to charge and clear up front), an XP `cost`, an optional `message` shown when the picker opens, and a `consume_item` flag that spends the triggering item — an inert orb, say — when the pick commits. So a pack can build its own "change my subclass" item or power for whatever layers it defines. The admin command `/origin gui <player> <layers>` does the same against one target player, taking one or more comma- or space-separated layers.
- **Inert orbs and the `#neoorigins:orbs` tag for custom bindings.** The four unused orb colours do nothing on their own and are never consumed by the mod, leaving them free to bind through `action_on_item_use` / `action_on_event`. All six orbs share the `#neoorigins:orbs` item tag, so a condition can match "any orb" in a single check.
- **Cast Iron's Spells 'n Spellbooks spells from origin powers.** The new `neoorigins:cast_iron_spell` action fires a named Iron's Spells spell — from a keybind, on hit, or any trigger — with fields for the spell id, level, cooldown, and instant-versus-channel cast mode. Mana is your choice: by default the cast is free from Iron's mana pool and you charge the cost on the NeoOrigins power itself, or set `consume_mana: true` to draw from and gate on the player's Iron's mana instead (an under-funded cast is refused; creative bypasses). Iron's Spells is an optional soft dependency: NeoOrigins builds and runs whether or not it is installed, and the action simply no-ops with a logged warning when the mod is absent or the spell id is malformed.
- **Wraith wall-phase no longer rubber-bands, sinks into the void, or slips through obsidian.** Phasing through walls could spasm the screen, because the client predicted the phase from the ability's toggle state while the server gated it on the power's condition — so the two disagreed and fought over your position. The client now publishes the phase capability on the same condition the server checks, and re-syncs at once if that condition flips mid-phase. Separately, an idle phasing player's slow downward settle had nothing to arrest it under noclip and would sink through the world — and through obsidian floors; the settle is now zeroed when there is no vertical input and solid ground sits directly underfoot, so you rest on the block below instead.
- **`action_on_event` honours its `item_condition`.** The event action dropped the `item_condition` filter, so a power meant to react to a specific item fired on every matching event regardless of the item involved. The condition is respected again, and the `action_on_item_use` trigger correctly distinguishes the start and finish of a use.
release
NeoOrigins v2.2.17 (MC 26.2)
v2.2.17+26.27 июл. 2026 г.24Minecraft: 26.2neoforge
Что нового
> A content release: a family of six hand-modelled Crystal Orbs, a new Orb of Class that re-rolls only your class, a general "reopen the picker for these layers" hook for pack authors, Iron's Spells 'n Spellbooks casting from origin powers, and native elytra flight with visible, re-texturable wings — plus a wraith wall-phase fix and an `action_on_event` correctness pass.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Crystal Orbs: six orb items with new 3D models.** The reset orbs are now hand-modelled glass spheres with an animated swirling core, replacing the old flat sprite. `orb_of_origin` keeps its full-reset behaviour and its id — so existing recipes and pack references carry over unchanged, only the look is new — and four more colours (gold, pink, purple, teal) ship alongside it as inert items for datapack authors.
- **Orb of Class: re-roll only your class.** `neoorigins:orb_of_class` is a cheaper, class-only sibling of the Orb of Origin. Right-clicking it resets just the `neoorigins:class` layer and reopens the picker scoped to that one screen, leaving your main origin untouched. Its XP cost is a flat `class_levels_per_use` (default `2`, versus the origin orb's `5`), and it commits lazily: the levels and the orb itself are spent only when you actually confirm a new class, so closing the picker without picking is a free cancel that refunds the orb and restores your previous class. Crafted like the Orb of Origin, but with ingots instead of blocks.
- **`elytra_flight` power.** Grants elytra-style gliding without an equipped elytra — the same activation as `natural_glide` — and draws a cosmetic elytra on the player's back while you fly. `render_elytra` toggles the wings (flight works either way; set it false to glide with no visible wings), and `texture_location` swaps in a custom wing texture while keeping the vanilla elytra model. Origins/Apoli packs that use `apoli:elytra_flight` now map onto this natively, so their `render_elytra` and `texture_location` are honoured instead of dropped: imported gliders finally show their wings.
- **Reopen the origin picker for any set of layers.** The Orb of Class is one preset of a general mechanism, now exposed to packs two ways. The `neoorigins:open_layer_picker` entity action takes a `layers` list and reopens the picker scoped to exactly those layers, with an author-chosen `commit_mode` (`deferred` for a free-cancel re-pick, `immediate` to charge and clear up front), an XP `cost`, an optional `message` shown when the picker opens, and a `consume_item` flag that spends the triggering item — an inert orb, say — when the pick commits. So a pack can build its own "change my subclass" item or power for whatever layers it defines. The admin command `/origin gui <player> <layers>` does the same against one target player, taking one or more comma- or space-separated layers.
- **Inert orbs and the `#neoorigins:orbs` tag for custom bindings.** The four unused orb colours do nothing on their own and are never consumed by the mod, leaving them free to bind through `action_on_item_use` / `action_on_event`. All six orbs share the `#neoorigins:orbs` item tag, so a condition can match "any orb" in a single check.
- **Cast Iron's Spells 'n Spellbooks spells from origin powers.** The new `neoorigins:cast_iron_spell` action fires a named Iron's Spells spell — from a keybind, on hit, or any trigger — with fields for the spell id, level, cooldown, and instant-versus-channel cast mode. Mana is your choice: by default the cast is free from Iron's mana pool and you charge the cost on the NeoOrigins power itself, or set `consume_mana: true` to draw from and gate on the player's Iron's mana instead (an under-funded cast is refused; creative bypasses). Iron's Spells is an optional soft dependency: NeoOrigins builds and runs whether or not it is installed, and the action simply no-ops with a logged warning when the mod is absent or the spell id is malformed.
- **Wraith wall-phase no longer rubber-bands, sinks into the void, or slips through obsidian.** Phasing through walls could spasm the screen, because the client predicted the phase from the ability's toggle state while the server gated it on the power's condition — so the two disagreed and fought over your position. The client now publishes the phase capability on the same condition the server checks, and re-syncs at once if that condition flips mid-phase. Separately, an idle phasing player's slow downward settle had nothing to arrest it under noclip and would sink through the world — and through obsidian floors; the settle is now zeroed when there is no vertical input and solid ground sits directly underfoot, so you rest on the block below instead.
- **`action_on_event` honours its `item_condition`.** The event action dropped the `item_condition` filter, so a power meant to react to a specific item fired on every matching event regardless of the item involved. The condition is respected again, and the `action_on_item_use` trigger correctly distinguishes the start and finish of a use.
release
NeoOrigins v2.2.17 (MC 26.1.x)
v2.2.17+26.17 июл. 2026 г.24Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> A content release: a family of six hand-modelled Crystal Orbs, a new Orb of Class that re-rolls only your class, a general "reopen the picker for these layers" hook for pack authors, Iron's Spells 'n Spellbooks casting from origin powers, and native elytra flight with visible, re-texturable wings — plus a wraith wall-phase fix and an `action_on_event` correctness pass.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Crystal Orbs: six orb items with new 3D models.** The reset orbs are now hand-modelled glass spheres with an animated swirling core, replacing the old flat sprite. `orb_of_origin` keeps its full-reset behaviour and its id — so existing recipes and pack references carry over unchanged, only the look is new — and four more colours (gold, pink, purple, teal) ship alongside it as inert items for datapack authors.
- **Orb of Class: re-roll only your class.** `neoorigins:orb_of_class` is a cheaper, class-only sibling of the Orb of Origin. Right-clicking it resets just the `neoorigins:class` layer and reopens the picker scoped to that one screen, leaving your main origin untouched. Its XP cost is a flat `class_levels_per_use` (default `2`, versus the origin orb's `5`), and it commits lazily: the levels and the orb itself are spent only when you actually confirm a new class, so closing the picker without picking is a free cancel that refunds the orb and restores your previous class. Crafted like the Orb of Origin, but with ingots instead of blocks.
- **`elytra_flight` power.** Grants elytra-style gliding without an equipped elytra — the same activation as `natural_glide` — and draws a cosmetic elytra on the player's back while you fly. `render_elytra` toggles the wings (flight works either way; set it false to glide with no visible wings), and `texture_location` swaps in a custom wing texture while keeping the vanilla elytra model. Origins/Apoli packs that use `apoli:elytra_flight` now map onto this natively, so their `render_elytra` and `texture_location` are honoured instead of dropped: imported gliders finally show their wings.
- **Reopen the origin picker for any set of layers.** The Orb of Class is one preset of a general mechanism, now exposed to packs two ways. The `neoorigins:open_layer_picker` entity action takes a `layers` list and reopens the picker scoped to exactly those layers, with an author-chosen `commit_mode` (`deferred` for a free-cancel re-pick, `immediate` to charge and clear up front), an XP `cost`, an optional `message` shown when the picker opens, and a `consume_item` flag that spends the triggering item — an inert orb, say — when the pick commits. So a pack can build its own "change my subclass" item or power for whatever layers it defines. The admin command `/origin gui <player> <layers>` does the same against one target player, taking one or more comma- or space-separated layers.
- **Inert orbs and the `#neoorigins:orbs` tag for custom bindings.** The four unused orb colours do nothing on their own and are never consumed by the mod, leaving them free to bind through `action_on_item_use` / `action_on_event`. All six orbs share the `#neoorigins:orbs` item tag, so a condition can match "any orb" in a single check.
- **Cast Iron's Spells 'n Spellbooks spells from origin powers.** The new `neoorigins:cast_iron_spell` action fires a named Iron's Spells spell — from a keybind, on hit, or any trigger — with fields for the spell id, level, cooldown, and instant-versus-channel cast mode. Mana is your choice: by default the cast is free from Iron's mana pool and you charge the cost on the NeoOrigins power itself, or set `consume_mana: true` to draw from and gate on the player's Iron's mana instead (an under-funded cast is refused; creative bypasses). Iron's Spells is an optional soft dependency: NeoOrigins builds and runs whether or not it is installed, and the action simply no-ops with a logged warning when the mod is absent or the spell id is malformed.
- **Wraith wall-phase no longer rubber-bands, sinks into the void, or slips through obsidian.** Phasing through walls could spasm the screen, because the client predicted the phase from the ability's toggle state while the server gated it on the power's condition — so the two disagreed and fought over your position. The client now publishes the phase capability on the same condition the server checks, and re-syncs at once if that condition flips mid-phase. Separately, an idle phasing player's slow downward settle had nothing to arrest it under noclip and would sink through the world — and through obsidian floors; the settle is now zeroed when there is no vertical input and solid ground sits directly underfoot, so you rest on the block below instead.
- **`action_on_event` honours its `item_condition`.** The event action dropped the `item_condition` filter, so a power meant to react to a specific item fired on every matching event regardless of the item involved. The condition is respected again, and the `action_on_item_use` trigger correctly distinguishes the start and finish of a use.
release
NeoOrigins v2.2.16 (MC 1.21.1)
v2.2.16+1.21.16 июл. 2026 г.1,2 тыс.Minecraft: 1.21.1neoforge
Что нового
2.2.16: fix Dragon Survival growth reset on rejoin + cross-dimension active_recall
Dragon Survival dragons no longer reset to newborn when rejoining a
dedicated server: becomeDragon now only re-seeds species/stage on a
genuine first transformation, leaving DS state untouched when the player
is already that species on login.
active_recall now returns the player to their bed or respawn anchor from
any dimension, using the game's death-respawn resolution (keeps anchor
charge, falls back to world spawn) and teleporting across levels with
arrival effects in the destination.
release
NeoOrigins v2.2.16 (MC 26.2)
v2.2.16+26.26 июл. 2026 г.39Minecraft: 26.2neoforge
Что нового
2.2.16: fix Dragon Survival growth reset on rejoin + cross-dimension active_recall
Dragon Survival dragons no longer reset to newborn when rejoining a
dedicated server: becomeDragon now only re-seeds species/stage on a
genuine first transformation, leaving DS state untouched when the player
is already that species on login.
active_recall now returns the player to their bed or respawn anchor from
any dimension, using the game's death-respawn resolution (keeps anchor
charge, falls back to world spawn) and teleporting across levels with
arrival effects in the destination.
release
NeoOrigins v2.2.16 (MC 26.1.x)
v2.2.16+26.16 июл. 2026 г.32Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
2.2.16: fix Dragon Survival growth reset on rejoin + cross-dimension active_recall
Dragon Survival dragons no longer reset to newborn when rejoining a
dedicated server: becomeDragon now only re-seeds species/stage on a
genuine first transformation, leaving DS state untouched when the player
is already that species on login.
active_recall now returns the player to their bed or respawn anchor from
any dimension, using the game's death-respawn resolution (keeps anchor
charge, falls back to world spawn) and teleporting across levels with
arrival effects in the destination.
release
NeoOrigins v2.2.15 (MC 1.21.1)
v2.2.15+1.21.14 июл. 2026 г.887Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.15
A hotfix: powers no longer vanish when rejoining a multiplayer server, `action_on_hit` runs the entity and bi-entity actions it always documented, and FTB Quests can be installed alongside NeoOrigins.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Powers no longer disappear after rejoining a multiplayer server.** On a dedicated server a player could occasionally reconnect with their origin intact but most of their powers gone until something forced a refresh. The per-player power cache was keyed on the account alone, so a returning session matched the stale entry left by the previous one: if that entry had been built during the login window before the player's data finished loading, it was empty or partial. Each cache entry is now tied to the live player session, so a reconnect always rebuilds powers from freshly loaded data.
- **`action_on_hit` runs its `entity_action` and `bientity_action`.** The power documented an action against the entity you hit and a bi-entity action over the attacker/target pair, but neither was applied — so packs relying on an on-hit effect against the victim, like poison or knockback, saw nothing happen. Both now fire against the victim as documented.
- **FTB Quests can be installed alongside NeoOrigins.** The optional FTB Quests dependency was pinned to an impossible version range, so having FTB Quests present failed the game at load. The range is corrected, and the `loot_pool_grant` power's quest-tag integration is reachable again.
release
NeoOrigins v2.2.15 (MC 26.2)
v2.2.15+26.24 июл. 2026 г.38Minecraft: 26.2neoforge
Что нового
NeoOrigins v2.2.15
A hotfix: powers no longer vanish when rejoining a multiplayer server, `action_on_hit` runs the entity and bi-entity actions it always documented, and FTB Quests can be installed alongside NeoOrigins.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Powers no longer disappear after rejoining a multiplayer server.** On a dedicated server a player could occasionally reconnect with their origin intact but most of their powers gone until something forced a refresh. The per-player power cache was keyed on the account alone, so a returning session matched the stale entry left by the previous one: if that entry had been built during the login window before the player's data finished loading, it was empty or partial. Each cache entry is now tied to the live player session, so a reconnect always rebuilds powers from freshly loaded data.
- **`action_on_hit` runs its `entity_action` and `bientity_action`.** The power documented an action against the entity you hit and a bi-entity action over the attacker/target pair, but neither was applied — so packs relying on an on-hit effect against the victim, like poison or knockback, saw nothing happen. Both now fire against the victim as documented.
- **FTB Quests can be installed alongside NeoOrigins.** The optional FTB Quests dependency was pinned to an impossible version range, so having FTB Quests present failed the game at load. The range is corrected, and the `loot_pool_grant` power's quest-tag integration is reachable again.
release
NeoOrigins v2.2.15 (MC 26.1.x)
v2.2.15+26.14 июл. 2026 г.39Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.15
A hotfix: powers no longer vanish when rejoining a multiplayer server, `action_on_hit` runs the entity and bi-entity actions it always documented, and FTB Quests can be installed alongside NeoOrigins.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Powers no longer disappear after rejoining a multiplayer server.** On a dedicated server a player could occasionally reconnect with their origin intact but most of their powers gone until something forced a refresh. The per-player power cache was keyed on the account alone, so a returning session matched the stale entry left by the previous one: if that entry had been built during the login window before the player's data finished loading, it was empty or partial. Each cache entry is now tied to the live player session, so a reconnect always rebuilds powers from freshly loaded data.
- **`action_on_hit` runs its `entity_action` and `bientity_action`.** The power documented an action against the entity you hit and a bi-entity action over the attacker/target pair, but neither was applied — so packs relying on an on-hit effect against the victim, like poison or knockback, saw nothing happen. Both now fire against the victim as documented.
- **FTB Quests can be installed alongside NeoOrigins.** The optional FTB Quests dependency was pinned to an impossible version range, so having FTB Quests present failed the game at load. The range is corrected, and the `loot_pool_grant` power's quest-tag integration is reachable again.
release
NeoOrigins v2.2.14 (MC 1.21.1)
v2.2.14+1.21.13 июл. 2026 г.788Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.14
A hotfix for tamed-pet lifecycle and origin evolutions: pets now survive their tamer's death and persist across logout like vanilla pets, evolution tiers stop re-granting effects the base origin already has, and two item-condition gaps that broke Origins: Dietary Delights are closed.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Tamed pets survive their tamer's death and recall to them on respawn.** The owner-death cleanup discarded every tracked minion, tamed pets included. Vanilla-pet semantics now apply: summoned minions still die with their summoner, but tamed pets are exempt and teleport to the tamer on respawn — cross-dimension if needed — with their loyalty AI rebound to the respawned player instead of idling against the dead one.
- **Tamed pets persist across logout and server restarts.** Tame state lived only in session memory, so a pet was orphaned the moment its tamer logged out and reverted to hostile vanilla AI when its chunk reloaded. The tame is now stored on the mob itself, vanilla-style: pets rehydrate on load, idle politely while their owner is offline, and rebind automatically on login. Summons remain session-scoped by design.
- **Evolution tiers no longer re-grant effects the origin already has.** Five built-in origins granted a redundant effect on evolution: fire resistance on blazeling, cinderborn, fire mage, and strider over their base fire immunity, and breeze T2 re-granting its own toggleable slow falling — silently defeating the toggle. The redundant grants are dropped, and blazeling T2 gains a new +4 HP step in their place so the tier isn't empty.
- **Item conditions accept `all_of`/`any_of` and vanilla array-form `ingredient`.** Both gaps hit Origins: Dietary Delights' vegetarian power: the unrecognized `all_of` collapsed the condition to match-everything (blocking all item use), and the array-form ingredient never matched (breaking the diet exemption). The power now compiles and runs as the addon ships it, and both forms are documented with regenerated schemas.
release
NeoOrigins v2.2.14 (MC 26.2)
v2.2.14+26.23 июл. 2026 г.51Minecraft: 26.2neoforge
Что нового
NeoOrigins v2.2.14
A hotfix for tamed-pet lifecycle and origin evolutions: pets now survive their tamer's death and persist across logout like vanilla pets, evolution tiers stop re-granting effects the base origin already has, and two item-condition gaps that broke Origins: Dietary Delights are closed.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Tamed pets survive their tamer's death and recall to them on respawn.** The owner-death cleanup discarded every tracked minion, tamed pets included. Vanilla-pet semantics now apply: summoned minions still die with their summoner, but tamed pets are exempt and teleport to the tamer on respawn — cross-dimension if needed — with their loyalty AI rebound to the respawned player instead of idling against the dead one.
- **Tamed pets persist across logout and server restarts.** Tame state lived only in session memory, so a pet was orphaned the moment its tamer logged out and reverted to hostile vanilla AI when its chunk reloaded. The tame is now stored on the mob itself, vanilla-style: pets rehydrate on load, idle politely while their owner is offline, and rebind automatically on login. Summons remain session-scoped by design.
- **Evolution tiers no longer re-grant effects the origin already has.** Five built-in origins granted a redundant effect on evolution: fire resistance on blazeling, cinderborn, fire mage, and strider over their base fire immunity, and breeze T2 re-granting its own toggleable slow falling — silently defeating the toggle. The redundant grants are dropped, and blazeling T2 gains a new +4 HP step in their place so the tier isn't empty.
- **Item conditions accept `all_of`/`any_of` and vanilla array-form `ingredient`.** Both gaps hit Origins: Dietary Delights' vegetarian power: the unrecognized `all_of` collapsed the condition to match-everything (blocking all item use), and the array-form ingredient never matched (breaking the diet exemption). The power now compiles and runs as the addon ships it, and both forms are documented with regenerated schemas.
release
NeoOrigins v2.2.14 (MC 26.1.x)
v2.2.14+26.13 июл. 2026 г.52Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.14
A hotfix for tamed-pet lifecycle and origin evolutions: pets now survive their tamer's death and persist across logout like vanilla pets, evolution tiers stop re-granting effects the base origin already has, and two item-condition gaps that broke Origins: Dietary Delights are closed.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Tamed pets survive their tamer's death and recall to them on respawn.** The owner-death cleanup discarded every tracked minion, tamed pets included. Vanilla-pet semantics now apply: summoned minions still die with their summoner, but tamed pets are exempt and teleport to the tamer on respawn — cross-dimension if needed — with their loyalty AI rebound to the respawned player instead of idling against the dead one.
- **Tamed pets persist across logout and server restarts.** Tame state lived only in session memory, so a pet was orphaned the moment its tamer logged out and reverted to hostile vanilla AI when its chunk reloaded. The tame is now stored on the mob itself, vanilla-style: pets rehydrate on load, idle politely while their owner is offline, and rebind automatically on login. Summons remain session-scoped by design.
- **Evolution tiers no longer re-grant effects the origin already has.** Five built-in origins granted a redundant effect on evolution: fire resistance on blazeling, cinderborn, fire mage, and strider over their base fire immunity, and breeze T2 re-granting its own toggleable slow falling — silently defeating the toggle. The redundant grants are dropped, and blazeling T2 gains a new +4 HP step in their place so the tier isn't empty.
- **Item conditions accept `all_of`/`any_of` and vanilla array-form `ingredient`.** Both gaps hit Origins: Dietary Delights' vegetarian power: the unrecognized `all_of` collapsed the condition to match-everything (blocking all item use), and the array-form ingredient never matched (breaking the diet exemption). The power now compiles and runs as the addon ships it, and both forms are documented with regenerated schemas.
release
NeoOrigins v2.2.13 (MC 1.21.1)
v2.2.13+1.21.13 июл. 2026 г.88Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.13
A legacy-datapack compatibility release: pre-2.2.8 sub-power ids keep their resource caps again, 1.20-era packs with plural folder names load without edits, and a batch of missing Apoli powers, actions, and conditions round out the compat layer.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Legacy slash-form sub-power ids keep their resource caps.** The 2.2.11 shim resolved reads and writes for pre-2.2.8 `parent/sub` ids but not their resource min/max bounds, so `change_resource` could push a resource past its cap and permanently disable the ability (reported as a dead double-jump). Bounds now resolve through the same alias, and affected packs run correctly as downloaded.
- **Pre-1.21 plural folder names load without edits.** Legacy datapacks using `functions/`, `predicates/`, `loot_tables/`, and friends are now served under the modern singular paths automatically — in both originpacks and world datapacks — so downloaded packs run as-is.
- **More legacy power, action, and condition types translate.** Functional `origins:cooldown` powers, `action_on_block_use` and `bonemeal` powers, positional `offset` actions, `area_of_effect` block fan-out, `offset` block conditions, `hands` filters, and inverted `effect_immunity` exception lists.
- **Item conditions got a fidelity pass.** Legacy NBT checks (potions, custom effects) now match against modern components, `amount`/`name`/`food` item checks work, `block_collision` performs a real collision test, and there is a new `origins:inventory` entity condition.
- **All of the above is documented,** with regenerated schemas for the in-game and web editors.
release
NeoOrigins v2.2.13 (MC 26.2)
v2.2.13+26.23 июл. 2026 г.19Minecraft: 26.2neoforge
Что нового
NeoOrigins v2.2.13
A legacy-datapack compatibility release: pre-2.2.8 sub-power ids keep their resource caps again, 1.20-era packs with plural folder names load without edits, and a batch of missing Apoli powers, actions, and conditions round out the compat layer.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Legacy slash-form sub-power ids keep their resource caps.** The 2.2.11 shim resolved reads and writes for pre-2.2.8 `parent/sub` ids but not their resource min/max bounds, so `change_resource` could push a resource past its cap and permanently disable the ability (reported as a dead double-jump). Bounds now resolve through the same alias, and affected packs run correctly as downloaded.
- **Pre-1.21 plural folder names load without edits.** Legacy datapacks using `functions/`, `predicates/`, `loot_tables/`, and friends are now served under the modern singular paths automatically — in both originpacks and world datapacks — so downloaded packs run as-is.
- **More legacy power, action, and condition types translate.** Functional `origins:cooldown` powers, `action_on_block_use` and `bonemeal` powers, positional `offset` actions, `area_of_effect` block fan-out, `offset` block conditions, `hands` filters, and inverted `effect_immunity` exception lists.
- **Item conditions got a fidelity pass.** Legacy NBT checks (potions, custom effects) now match against modern components, `amount`/`name`/`food` item checks work, `block_collision` performs a real collision test, and there is a new `origins:inventory` entity condition.
- **All of the above is documented,** with regenerated schemas for the in-game and web editors.
release
NeoOrigins v2.2.13 (MC 26.1.x)
v2.2.13+26.13 июл. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.13
A legacy-datapack compatibility release: pre-2.2.8 sub-power ids keep their resource caps again, 1.20-era packs with plural folder names load without edits, and a batch of missing Apoli powers, actions, and conditions round out the compat layer.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Legacy slash-form sub-power ids keep their resource caps.** The 2.2.11 shim resolved reads and writes for pre-2.2.8 `parent/sub` ids but not their resource min/max bounds, so `change_resource` could push a resource past its cap and permanently disable the ability (reported as a dead double-jump). Bounds now resolve through the same alias, and affected packs run correctly as downloaded.
- **Pre-1.21 plural folder names load without edits.** Legacy datapacks using `functions/`, `predicates/`, `loot_tables/`, and friends are now served under the modern singular paths automatically — in both originpacks and world datapacks — so downloaded packs run as-is.
- **More legacy power, action, and condition types translate.** Functional `origins:cooldown` powers, `action_on_block_use` and `bonemeal` powers, positional `offset` actions, `area_of_effect` block fan-out, `offset` block conditions, `hands` filters, and inverted `effect_immunity` exception lists.
- **Item conditions got a fidelity pass.** Legacy NBT checks (potions, custom effects) now match against modern components, `amount`/`name`/`food` item checks work, `block_collision` performs a real collision test, and there is a new `origins:inventory` entity condition.
- **All of the above is documented,** with regenerated schemas for the in-game and web editors.
release
NeoOrigins v2.2.12 (MC 1.21.1)
v2.2.12+1.21.12 июл. 2026 г.615Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.2.12
A compatibility release: a new origins:origin condition and four more built-in powers so third-party addon packs load, more forgiving /power and /resource commands, and a Dragon Survival fix that stops us from blocking its appearance editor.
Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
Compatibility (Apoli / Origins)
- origins:origin condition implemented: gate a power on the player's current origin (optionally scoped to a layer), mirroring Apoli's own condition.
- Four more built-in Origins powers translate: origins:strong_arms, natural_armor, and more_exhaustion now resolve to NeoOrigins equivalents, so addon origins auto-hidden for translating too few powers (like the wou pack's rock human) show up in the picker.
- /power accepts an optional source argument, matching Apoli, so addon functions that pass one no longer fail to parse.
- /resource set/change/operation accept a multi-player selector.
Bug Fixes
- origins:weak_arms slows mining again: it was passing its factor under the wrong codec key and silently defaulting to 2x faster.
- The Flower Man addon pack loads clean: command shims + corrected particle lists let its functions register and run.
- Dragon Survival's appearance editor opens again: only species-choice screens are intercepted now, and only behind the opt-in compat.suppress_dragon_species_screens config (default off).
release
NeoOrigins v2.2.12 (MC 26.2)
v2.2.12+26.22 июл. 2026 г.29Minecraft: 26.2neoforge
Что нового
NeoOrigins 2.2.12
A compatibility release: a new origins:origin condition and four more built-in powers so third-party addon packs load, more forgiving /power and /resource commands, and a Dragon Survival fix that stops us from blocking its appearance editor.
Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
Compatibility (Apoli / Origins)
- origins:origin condition implemented: gate a power on the player's current origin (optionally scoped to a layer), mirroring Apoli's own condition.
- Four more built-in Origins powers translate: origins:strong_arms, natural_armor, and more_exhaustion now resolve to NeoOrigins equivalents, so addon origins auto-hidden for translating too few powers (like the wou pack's rock human) show up in the picker.
- /power accepts an optional source argument, matching Apoli, so addon functions that pass one no longer fail to parse.
- /resource set/change/operation accept a multi-player selector.
Bug Fixes
- origins:weak_arms slows mining again: it was passing its factor under the wrong codec key and silently defaulting to 2x faster.
- The Flower Man addon pack loads clean: command shims + corrected particle lists let its functions register and run.
- Dragon Survival's appearance editor opens again: only species-choice screens are intercepted now, and only behind the opt-in compat.suppress_dragon_species_screens config (default off).
release
NeoOrigins v2.2.12 (MC 26.1.x)
v2.2.12+26.12 июл. 2026 г.44Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.2.12
A compatibility release: a new origins:origin condition and four more built-in powers so third-party addon packs load, more forgiving /power and /resource commands, and a Dragon Survival fix that stops us from blocking its appearance editor.
Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
Compatibility (Apoli / Origins)
- origins:origin condition implemented: gate a power on the player's current origin (optionally scoped to a layer), mirroring Apoli's own condition.
- Four more built-in Origins powers translate: origins:strong_arms, natural_armor, and more_exhaustion now resolve to NeoOrigins equivalents, so addon origins auto-hidden for translating too few powers (like the wou pack's rock human) show up in the picker.
- /power accepts an optional source argument, matching Apoli, so addon functions that pass one no longer fail to parse.
- /resource set/change/operation accept a multi-player selector.
Bug Fixes
- origins:weak_arms slows mining again: it was passing its factor under the wrong codec key and silently defaulting to 2x faster.
- The Flower Man addon pack loads clean: command shims + corrected particle lists let its functions register and run.
- Dragon Survival's appearance editor opens again: only species-choice screens are intercepted now, and only behind the opt-in compat.suppress_dragon_species_screens config (default off).
release
NeoOrigins v2.2.11 (MC 1.21.1)
v2.2.11+1.21.11 июл. 2026 г.221Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.2.11
New:
- Numbered keybind slots: add an optional "key": N (1-64) to any active or toggle power to pin it to named-hotkey pool slot N.
- Pre-bound modpack hotkeys: pack authors can seed default slot bindings through the [hotkeys] slot_defaults client config.
- Import built-in powers: every editor (in-game origin creator, mob creator, web form, and Blockly) can now import any built-in power as an editable copy.
- The key:N hotkey field is exposed in the editor UI on active and toggle powers.
Fixed:
- Bars and toggles inside origins:multiple stopped resolving after 2.2.8 when they used slash-form synthetic ids; a legacy-id shim now maps them back to their canonical ids.
- Nested and typed block conditions in action_on_event are now evaluated correctly instead of matching every block.
release
NeoOrigins v2.2.11 (MC 26.2)
v2.2.11+26.21 июл. 2026 г.22Minecraft: 26.2neoforge
Что нового
NeoOrigins 2.2.11
New:
- Numbered keybind slots: add an optional "key": N (1-64) to any active or toggle power to pin it to named-hotkey pool slot N.
- Pre-bound modpack hotkeys: pack authors can seed default slot bindings through the [hotkeys] slot_defaults client config.
- Import built-in powers: every editor (in-game origin creator, mob creator, web form, and Blockly) can now import any built-in power as an editable copy.
- The key:N hotkey field is exposed in the editor UI on active and toggle powers.
Fixed:
- Bars and toggles inside origins:multiple stopped resolving after 2.2.8 when they used slash-form synthetic ids; a legacy-id shim now maps them back to their canonical ids.
- Nested and typed block conditions in action_on_event are now evaluated correctly instead of matching every block.
release
NeoOrigins v2.2.11 (MC 26.1.x)
v2.2.11+26.11 июл. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.2.11
New:
- Numbered keybind slots: add an optional "key": N (1-64) to any active or toggle power to pin it to named-hotkey pool slot N.
- Pre-bound modpack hotkeys: pack authors can seed default slot bindings through the [hotkeys] slot_defaults client config.
- Import built-in powers: every editor (in-game origin creator, mob creator, web form, and Blockly) can now import any built-in power as an editable copy.
- The key:N hotkey field is exposed in the editor UI on active and toggle powers.
Fixed:
- Bars and toggles inside origins:multiple stopped resolving after 2.2.8 when they used slash-form synthetic ids; a legacy-id shim now maps them back to their canonical ids.
- Nested and typed block conditions in action_on_event are now evaluated correctly instead of matching every block.
release
NeoOrigins v2.2.10 (MC 1.21.1)
v2.2.10+1.21.11 июл. 2026 г.277Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.2.10
- Renamed two origin ids for clarity: `jianxian` -> `sword_immortal`, `golden_bell` -> `golden_body`. Existing saves and datapacks keep working — the old ids are mapped automatically.
- Added per-power config overrides for all six eastern origins in `power_overrides.toml`: retune strengths, cooldowns, resource pools, and damage without touching datapacks.
- Server owners can now ground a flying origin: `creative_flight` honors an `enabled = false` switch (see the Sword Immortal / Windwalker flight examples in the docs).
- Config-screen toggle labels for the six eastern origins, translated across all 12 languages.
release
NeoOrigins v2.2.10 (MC 26.2)
v2.2.10+26.21 июл. 2026 г.35Minecraft: 26.2neoforge
Что нового
NeoOrigins 2.2.10
- Renamed two origin ids for clarity: `jianxian` -> `sword_immortal`, `golden_bell` -> `golden_body`. Existing saves and datapacks keep working — the old ids are mapped automatically.
- Added per-power config overrides for all six eastern origins in `power_overrides.toml`: retune strengths, cooldowns, resource pools, and damage without touching datapacks.
- Server owners can now ground a flying origin: `creative_flight` honors an `enabled = false` switch (see the Sword Immortal / Windwalker flight examples in the docs).
- Config-screen toggle labels for the six eastern origins, translated across all 12 languages.
release
NeoOrigins v2.2.10 (MC 26.1.x)
v2.2.10+26.11 июл. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.2.10
- Renamed two origin ids for clarity: `jianxian` -> `sword_immortal`, `golden_bell` -> `golden_body`. Existing saves and datapacks keep working — the old ids are mapped automatically.
- Added per-power config overrides for all six eastern origins in `power_overrides.toml`: retune strengths, cooldowns, resource pools, and damage without touching datapacks.
- Server owners can now ground a flying origin: `creative_flight` honors an `enabled = false` switch (see the Sword Immortal / Windwalker flight examples in the docs).
- Config-screen toggle labels for the six eastern origins, translated across all 12 languages.
release
NeoOrigins v2.2.9 (MC 1.21.1)
v2.2.9+1.21.128 июн. 2026 г.2,2 тыс.Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.9
A hotfix for 2.2.8: condition-gated invisibility now ends the moment its condition lapses, true invisibility hides held items along with armor, and the cooldown-icon HUD honors the "hide idle icons" setting again.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Condition-gated invisibility ends when its condition does.** An `invisibility` power that turns on only while a condition holds no longer keeps you invisible for up to 15 seconds after that condition stops — it now fades within a moment of the condition lapsing, like every other gated passive.
- **True invisibility hides held items.** With `render_armor` off, the item in your hand is now hidden along with your armor and body, so a fully invisible player no longer trails a floating weapon or tool.
- **The cooldown HUD honors "hide idle icons" again.** With **always show ability icons** turned off, idle ability icons now actually disappear: the ability HUD's default mode shows recharging cooldowns and toggles only, and an idle icon stays hidden unless its power opts in with `always_show_icon` or you re-enable the always-show setting.
- *Upgrading from an earlier version? An existing `config/neoorigins/client.toml` keeps its saved value — set `hud_ability_display = COOLDOWNS_AND_TOGGLES` (or delete the file to regenerate it) to pick up the new default.*
release
NeoOrigins v2.2.9 (MC 26.2)
v2.2.9+26.228 июн. 2026 г.76Minecraft: 26.2neoforge
Что нового
NeoOrigins v2.2.9
A hotfix for 2.2.8: condition-gated invisibility now ends the moment its condition lapses, true invisibility hides held items along with armor, and the cooldown-icon HUD honors the "hide idle icons" setting again.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Condition-gated invisibility ends when its condition does.** An `invisibility` power that turns on only while a condition holds no longer keeps you invisible for up to 15 seconds after that condition stops — it now fades within a moment of the condition lapsing, like every other gated passive.
- **True invisibility hides held items.** With `render_armor` off, the item in your hand is now hidden along with your armor and body, so a fully invisible player no longer trails a floating weapon or tool.
- **The cooldown HUD honors "hide idle icons" again.** With **always show ability icons** turned off, idle ability icons now actually disappear: the ability HUD's default mode shows recharging cooldowns and toggles only, and an idle icon stays hidden unless its power opts in with `always_show_icon` or you re-enable the always-show setting.
- *Upgrading from an earlier version? An existing `config/neoorigins/client.toml` keeps its saved value — set `hud_ability_display = COOLDOWNS_AND_TOGGLES` (or delete the file to regenerate it) to pick up the new default.*
release
NeoOrigins v2.2.9 (MC 26.1.x)
v2.2.9+26.128 июн. 2026 г.67Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.9
A hotfix for 2.2.8: condition-gated invisibility now ends the moment its condition lapses, true invisibility hides held items along with armor, and the cooldown-icon HUD honors the "hide idle icons" setting again.
**Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **Condition-gated invisibility ends when its condition does.** An `invisibility` power that turns on only while a condition holds no longer keeps you invisible for up to 15 seconds after that condition stops — it now fades within a moment of the condition lapsing, like every other gated passive.
- **True invisibility hides held items.** With `render_armor` off, the item in your hand is now hidden along with your armor and body, so a fully invisible player no longer trails a floating weapon or tool.
- **The cooldown HUD honors "hide idle icons" again.** With **always show ability icons** turned off, idle ability icons now actually disappear: the ability HUD's default mode shows recharging cooldowns and toggles only, and an idle icon stays hidden unless its power opts in with `always_show_icon` or you re-enable the always-show setting.
- *Upgrading from an earlier version? An existing `config/neoorigins/client.toml` keeps its saved value — set `hud_ability_display = COOLDOWNS_AND_TOGGLES` (or delete the file to regenerate it) to pick up the new default.*
release
NeoOrigins v2.2.8 (MC 1.21.1)
v2.2.8+1.21.127 июн. 2026 г.387Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.8
> A systems and compatibility release: a native **aura** power, entity filtering for area effects, four more native powers (invisibility, item gating, flight-speed scaling, sound muffling), a batch of Apoli/Origins compat fixes, author-controlled origin-picker order, evolution-tier fixes, and phasing/respawn/health polish.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`effect_over_time` aura power.** A native sustained area-of-effect power that runs an action on a fixed `interval` for as long as it is active. Set `activation` to `passive` for an always-on aura or to an active toggle for an upkeep-style aura, and mark it `toggleable` so players can switch it on and off. Pair it with `area_of_effect` to wrap nearby entities in regeneration, particles, or any action you like — the basis for healing auras, damage fields, and persistent buffs.
- **Entity filtering on `area_of_effect`.** Area effects now accept an `entity_condition` that filters *every* entity in the radius — mobs and players alike — so an aura can target only players, only hostiles, only a tagged entity type, and so on. This makes auras like a heal-allies-but-ignore-mobs field possible without touching the action itself.
- **`invisibility` power.** A native invisibility power with an optional `render_armor` flag to hide worn armor along with the body, instead of routing through the status-effect compat layer.
- **`restrict_items` power.** A modular item-gate that can block equipping, using, or totem-popping items, driven by either a deny-list or an allow-list — for origins that can't wield certain gear.
- **`modify_flight_speed` power.** Scales a flying player's speed by a multiplier, a native replacement for the Pehkui-based approach.
- **`muffle_sound` power.** A native power that dampens sound for the holder.
- **`distance_from_coordinates` condition.** Tests the player's distance from a reference point — world origin or world spawn, plus an optional per-axis offset — under a cube (Chebyshev), star (Manhattan), or sphere (Euclidean) metric, with optional per-axis exclusion and an off-dimension fallback. An Apoli-compatible condition for proximity-gated powers.
- **`origins:phasing` is now server-authoritative,** with its `in_block` gate honoring block tags and inverted conditions correctly.
- **`origins:nbt` partial-NBT matching implemented** — the condition now parses SNBT and matches against an entity's `Tags`, instead of being ignored.
- **Fixed Apoli `multiple` sub-power desync** where synthetic sub-power IDs containing a slash drifted out of sync with the client; slashes are now normalized to underscores on both sides.
- **AvP (Aliens vs Predator) soft-dependency compat** — a new `xeno_passive` host gate, plus registration fixes for `xeno_passive` and `creative_flight` so both load reliably.
- **`/scale` shim for Pehkui-dependent packs.** When Pehkui is not installed, a stand-in `/scale` command is registered so Origins/Apoli packs that call it (for example the seer astral origin's init functions) still parse and run the rest of their commands instead of silently failing to load.
- **Author-set picker order is honored.** The origin picker can now sort by the `order` field an author assigns, so packs control exactly where each origin appears in the list.
- **`/origin` is a real command alias.** It is now registered as a proper command literal rather than a loose alias, so it tab-completes and parses like the full command.
- **Boosted max health is restored to full on respawn.** Origins that raise max HP no longer leave the player short after dying.
- **Newly granted hearts fill immediately.** When a +HP origin is granted, the new hearts are filled rather than left empty.
- **In-game power editor shows name and description fields again.** Both fields were missing from the editor and are now back.
- **Phasing no longer ghost-blocks or grants spam-jump flight.** Wraith-phase / astral projection now drives vertical movement with velocity nudges (jump up, sneak down, neither settles slowly) instead of arming creative flight, and keeps the server and client agreeing on position — so block placement raytraces correctly and players can no longer rise freely by spamming jump.
- **Evolution tiers no longer double-stack lower-tier buffs.** Advancing a tier now removes the previous overlay (night vision, slow fall) before granting the upgraded one, so effects like night vision are no longer applied twice at tier 2+.
- **Evolution tier force-set applies powers properly.** Setting an evolution tier from a command now grants/revokes tier powers and reconciles max health the same way the accept-prompt path does, instead of only changing the tier field until the next relog.
- **Evolution panel shows tier-power names and descriptions.** The origin picker's evolution section now resolves each tier power's name and description, collapsing a `multiple` power's synthetic sub-powers into a single authored row instead of showing blank entries.
- **Community resource-bar GUI textures** contributed by huang and spiderkolo are now bundled.
release
NeoOrigins v2.2.8 (MC 26.2)
v2.2.8+26.227 июн. 2026 г.30Minecraft: 26.2neoforge
Что нового
NeoOrigins v2.2.8
> A systems and compatibility release: a native **aura** power, entity filtering for area effects, four more native powers (invisibility, item gating, flight-speed scaling, sound muffling), a batch of Apoli/Origins compat fixes, author-controlled origin-picker order, evolution-tier fixes, and phasing/respawn/health polish.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`effect_over_time` aura power.** A native sustained area-of-effect power that runs an action on a fixed `interval` for as long as it is active. Set `activation` to `passive` for an always-on aura or to an active toggle for an upkeep-style aura, and mark it `toggleable` so players can switch it on and off. Pair it with `area_of_effect` to wrap nearby entities in regeneration, particles, or any action you like — the basis for healing auras, damage fields, and persistent buffs.
- **Entity filtering on `area_of_effect`.** Area effects now accept an `entity_condition` that filters *every* entity in the radius — mobs and players alike — so an aura can target only players, only hostiles, only a tagged entity type, and so on. This makes auras like a heal-allies-but-ignore-mobs field possible without touching the action itself.
- **`invisibility` power.** A native invisibility power with an optional `render_armor` flag to hide worn armor along with the body, instead of routing through the status-effect compat layer.
- **`restrict_items` power.** A modular item-gate that can block equipping, using, or totem-popping items, driven by either a deny-list or an allow-list — for origins that can't wield certain gear.
- **`modify_flight_speed` power.** Scales a flying player's speed by a multiplier, a native replacement for the Pehkui-based approach.
- **`muffle_sound` power.** A native power that dampens sound for the holder.
- **`distance_from_coordinates` condition.** Tests the player's distance from a reference point — world origin or world spawn, plus an optional per-axis offset — under a cube (Chebyshev), star (Manhattan), or sphere (Euclidean) metric, with optional per-axis exclusion and an off-dimension fallback. An Apoli-compatible condition for proximity-gated powers.
- **`origins:phasing` is now server-authoritative,** with its `in_block` gate honoring block tags and inverted conditions correctly.
- **`origins:nbt` partial-NBT matching implemented** — the condition now parses SNBT and matches against an entity's `Tags`, instead of being ignored.
- **Fixed Apoli `multiple` sub-power desync** where synthetic sub-power IDs containing a slash drifted out of sync with the client; slashes are now normalized to underscores on both sides.
- **AvP (Aliens vs Predator) soft-dependency compat** — a new `xeno_passive` host gate, plus registration fixes for `xeno_passive` and `creative_flight` so both load reliably.
- **`/scale` shim for Pehkui-dependent packs.** When Pehkui is not installed, a stand-in `/scale` command is registered so Origins/Apoli packs that call it (for example the seer astral origin's init functions) still parse and run the rest of their commands instead of silently failing to load.
- **Author-set picker order is honored.** The origin picker can now sort by the `order` field an author assigns, so packs control exactly where each origin appears in the list.
- **`/origin` is a real command alias.** It is now registered as a proper command literal rather than a loose alias, so it tab-completes and parses like the full command.
- **Boosted max health is restored to full on respawn.** Origins that raise max HP no longer leave the player short after dying.
- **Newly granted hearts fill immediately.** When a +HP origin is granted, the new hearts are filled rather than left empty.
- **In-game power editor shows name and description fields again.** Both fields were missing from the editor and are now back.
- **Phasing no longer ghost-blocks or grants spam-jump flight.** Wraith-phase / astral projection now drives vertical movement with velocity nudges (jump up, sneak down, neither settles slowly) instead of arming creative flight, and keeps the server and client agreeing on position — so block placement raytraces correctly and players can no longer rise freely by spamming jump.
- **Evolution tiers no longer double-stack lower-tier buffs.** Advancing a tier now removes the previous overlay (night vision, slow fall) before granting the upgraded one, so effects like night vision are no longer applied twice at tier 2+.
- **Evolution tier force-set applies powers properly.** Setting an evolution tier from a command now grants/revokes tier powers and reconciles max health the same way the accept-prompt path does, instead of only changing the tier field until the next relog.
- **Evolution panel shows tier-power names and descriptions.** The origin picker's evolution section now resolves each tier power's name and description, collapsing a `multiple` power's synthetic sub-powers into a single authored row instead of showing blank entries.
- **Community resource-bar GUI textures** contributed by huang and spiderkolo are now bundled.
release
NeoOrigins v2.2.8 (MC 26.1.x)
v2.2.8+26.127 июн. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.8
> A systems and compatibility release: a native **aura** power, entity filtering for area effects, four more native powers (invisibility, item gating, flight-speed scaling, sound muffling), a batch of Apoli/Origins compat fixes, author-controlled origin-picker order, evolution-tier fixes, and phasing/respawn/health polish.
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
- **`effect_over_time` aura power.** A native sustained area-of-effect power that runs an action on a fixed `interval` for as long as it is active. Set `activation` to `passive` for an always-on aura or to an active toggle for an upkeep-style aura, and mark it `toggleable` so players can switch it on and off. Pair it with `area_of_effect` to wrap nearby entities in regeneration, particles, or any action you like — the basis for healing auras, damage fields, and persistent buffs.
- **Entity filtering on `area_of_effect`.** Area effects now accept an `entity_condition` that filters *every* entity in the radius — mobs and players alike — so an aura can target only players, only hostiles, only a tagged entity type, and so on. This makes auras like a heal-allies-but-ignore-mobs field possible without touching the action itself.
- **`invisibility` power.** A native invisibility power with an optional `render_armor` flag to hide worn armor along with the body, instead of routing through the status-effect compat layer.
- **`restrict_items` power.** A modular item-gate that can block equipping, using, or totem-popping items, driven by either a deny-list or an allow-list — for origins that can't wield certain gear.
- **`modify_flight_speed` power.** Scales a flying player's speed by a multiplier, a native replacement for the Pehkui-based approach.
- **`muffle_sound` power.** A native power that dampens sound for the holder.
- **`distance_from_coordinates` condition.** Tests the player's distance from a reference point — world origin or world spawn, plus an optional per-axis offset — under a cube (Chebyshev), star (Manhattan), or sphere (Euclidean) metric, with optional per-axis exclusion and an off-dimension fallback. An Apoli-compatible condition for proximity-gated powers.
- **`origins:phasing` is now server-authoritative,** with its `in_block` gate honoring block tags and inverted conditions correctly.
- **`origins:nbt` partial-NBT matching implemented** — the condition now parses SNBT and matches against an entity's `Tags`, instead of being ignored.
- **Fixed Apoli `multiple` sub-power desync** where synthetic sub-power IDs containing a slash drifted out of sync with the client; slashes are now normalized to underscores on both sides.
- **AvP (Aliens vs Predator) soft-dependency compat** — a new `xeno_passive` host gate, plus registration fixes for `xeno_passive` and `creative_flight` so both load reliably.
- **`/scale` shim for Pehkui-dependent packs.** When Pehkui is not installed, a stand-in `/scale` command is registered so Origins/Apoli packs that call it (for example the seer astral origin's init functions) still parse and run the rest of their commands instead of silently failing to load.
- **Author-set picker order is honored.** The origin picker can now sort by the `order` field an author assigns, so packs control exactly where each origin appears in the list.
- **`/origin` is a real command alias.** It is now registered as a proper command literal rather than a loose alias, so it tab-completes and parses like the full command.
- **Boosted max health is restored to full on respawn.** Origins that raise max HP no longer leave the player short after dying.
- **Newly granted hearts fill immediately.** When a +HP origin is granted, the new hearts are filled rather than left empty.
- **In-game power editor shows name and description fields again.** Both fields were missing from the editor and are now back.
- **Phasing no longer ghost-blocks or grants spam-jump flight.** Wraith-phase / astral projection now drives vertical movement with velocity nudges (jump up, sneak down, neither settles slowly) instead of arming creative flight, and keeps the server and client agreeing on position — so block placement raytraces correctly and players can no longer rise freely by spamming jump.
- **Evolution tiers no longer double-stack lower-tier buffs.** Advancing a tier now removes the previous overlay (night vision, slow fall) before granting the upgraded one, so effects like night vision are no longer applied twice at tier 2+.
- **Evolution tier force-set applies powers properly.** Setting an evolution tier from a command now grants/revokes tier powers and reconciles max health the same way the accept-prompt path does, instead of only changing the tier field until the next relog.
- **Evolution panel shows tier-power names and descriptions.** The origin picker's evolution section now resolves each tier power's name and description, collapsing a `multiple` power's synthetic sub-powers into a single authored row instead of showing blank entries.
- **Community resource-bar GUI textures** contributed by huang and spiderkolo are now bundled.
release
NeoOrigins v2.2.7 (MC 1.21.1)
v2.2.7+1.21.121 июн. 2026 г.3,5 тыс.Minecraft: 1.21.1neoforge
Что нового
A big content update built around six brand-new martial-arts origins — each with a full kit and a three-tier evolution path that unlocks a new signature art as you advance. Underpinning them is a wave of new systems: a `variable` power type, true creative-style flight, the ability to bind powers to vanilla keys, a modular projectile-rain / telegraph / thrown-sword VFX toolkit, an on-hit event hook, and global vision toggles — plus the usual polish and fixes.
Six new origins join the roster, each a self-contained eastern martial-arts fantasy with its own base kit *and* a three-tier evolution path (see below):
- **Asura** *(high impact)* — A frail-bodied berserker who grows faster and stronger the closer death looms: fragile when whole, monstrous when bleeding.
- **Windwalker** *(medium)* — A master of *qinggong*: steps off the air, scales sheer walls, dashes on the wind and never fears a fall, but carries no extra strength into a fight.
- **Qi Cultivator** *(medium)* — Channels Qi into ranged palm-strikes and hardened flesh, meditating to refill reserves — but a cultivator run dry is just a monk.
- **Golden Body** *(medium)* — A hard-qigong Iron Body master: an armored, immovable wall that punishes anyone who strikes it, at the cost of nimbleness.
- **Iron Monk** *(medium)* — A defender monk whose guard, blocks, and strikes all draw on one shared pool of stamina; an exhausted Iron Monk is wide open.
- **Sword Immortal** *(high impact)* — Flies on their blade, hurls sword-qi at range and blinks through battle; every signature art is bound to the sword in hand.
- **Origins can now evolve.** An origin can define an evolution path that grants new powers as the player advances through its tiers, so an origin grows into a distinct late-game shape instead of staying fixed. All six new origins ship with a three-stage path:
- **Asura** — *Undying Rage* (regenerate and shrug off fire while near death) → *Blood Tithe* (drain life from every blow you land) → *Wrath Eruption* (an on-demand shockwave that savages and flings everything around you).
- **Windwalker** — *Sky Dancer* (glide freely on the wind) → *Riding the Wind* (true flight) → *Eye of the Storm* (a cyclone far greater than the Typhoon).
- **Qi Cultivator** — *Dantian Expansion* (Qi circulates even while you move and fight) → *Core Pressure* (strike harder while your core runs deep) → *Flying Sword of Qi* (loose a blade of pure energy).
- **Golden Body** — *Diamond Body* (harder still to wound) → *Reflected Force* (rebound twice the force of every blow) → *Bell Toll* (a resonating shockwave that slows and weakens nearby foes).
- **Iron Monk** — *Counter Stance* (blocked blows rebound on the attacker) → *Sea of Stamina* (stamina trickles back even mid-guard) → *Lohan Palm* (a wide stamina-fueled shockwave).
- **Sword Immortal** — *Sword Heart Unity* (your edge bites deeper with a sword in hand) → *Heavenly Sword Formation* (rain a ring of blades around you) → *Heaven-Severing Slash* (one gathered, cleaving sword-qi crescent).
- **`variable` power type.** A named, hidden counter that persists across sessions, with no HUD bar, regen, or per-tick cost — it only changes when actions touch it. Use it as a hidden state-tracker for charges, stacks, or progress that resources aren't suited to.
- **`creative_flight` power.** Grants true creative-style hover flight while active and cleanly restores normal movement when toggled off (without stripping flight from players already in creative/spectator) — built for "levitating cultivator" fantasies, distinct from elytra and natural glide.
- **Bind powers to vanilla keys.** Active and reactive powers can now key off vanilla inputs — jump, sneak, sprint, use, attack, and the four movement keys (forward / back / left / right) — instead of consuming a named hotkey slot, so lightweight powers like double-jump fire on the keys players already use. Held `key.use` / `key.attack` powers now also fire correctly while the key is held down, where before they only triggered on an actual interaction or attack swing. A worked `double_jump` example ships in the example pack.
- **`hit_dealt` event + `hit_dealt_amount` condition.** Powers can react to the damage *you deal* — mirroring the existing hit-taken hook — so `action_on_event` can fire on a landed hit (used for life-drain) and conditions can test how hard a blow landed.
- **`active_dash` damage scaling.** Dash powers gain `damage`, `damage_radius`, and `weapon_damage_scale` fields, so a dash can cut through the path it travels and scale with the weapon in hand.
- **Modular projectile-rain (`spawn_projectile_rain` / `spawn_sword_rain`).** Rain projectiles or baked-mesh blades down over an area, with configurable radius, count, duration, damage, knockup, a per-landing `impact_action`, and custom projectile entities or spectral-sword models. The rain can be anchored to the caster, their look direction, or an impact point.
- **`spawn_telegraph` action.** A particle-only ground danger reticle (a contracting circle) with a configurable radius and wind-up, optionally firing an action when it expires — a clean wind-up cue for telegraphed attacks.
- **Thrown-sword and componentized tornado VFX.** New baked-mesh model support drives a thrown-sword storm and a rebuilt, component-based tornado (with a proper spectral-sword model and updated tornado mesh/texture).
- **Global vision toggles.** Two new independent `content.toml` switches for packs that want darkness to stay threatening: `disable_night_vision` strips the `minecraft:night_vision` effect from any power that would apply it (other effects on that power still apply), and `disable_enhanced_vision` withholds the `enhanced_vision` low-light brightness boost (cat eyes, salamander, oculus drone, etc.) so it never reaches the client.
- **Fixed a dedicated-server crash on load when walk-on-water / walk-on-lava was present.** The `walk_on_fluid` mixins named a client-only player type directly, so on a dedicated server Mixin tried to load that client class while weaving and aborted with "invalid dist DEDICATED_SERVER" — taking the whole server down at startup whenever a pack used walk-on-water or walk-on-lava. The local-player check is now routed through a client-only helper, so the client type never touches the server's load path.
- **The Windwalker Typhoon (and any moving VFX) now travels smoothly.** The tornado's position only synced to clients every several ticks, so a drifting funnel visibly jumped block to block. Moving storm entities now sync every tick, so the client smoothly interpolates the funnel between updates instead of snapping it, and it follows the ground beneath it as it drifts.
- **Hidden resource bars stay hidden.** A resource power marked `hidden` at the top level (such as the Windwalker's air-step counter) still leaked a "Resource 1/2" bar onto the HUD, because the loader only auto-hid simple on/off resources. The top-level `hidden` flag is now honored, so the bar no longer shows.
- **Every active ability now shows a cooldown icon.** The last few actives without an explicit `cooldown_icon` (Windwalker's Gale Dash, the Sword Immortal's Flickering Slash, and the eastern martial-arts actives) now display a proper item icon on the cooldown HUD instead of the fallback drain bar.
release
NeoOrigins v2.2.7 (MC 26.2)
v2.2.7+26.221 июн. 2026 г.107Minecraft: 26.2neoforge
Что нового
A big content update built around six brand-new martial-arts origins — each with a full kit and a three-tier evolution path that unlocks a new signature art as you advance. Underpinning them is a wave of new systems: a `variable` power type, true creative-style flight, the ability to bind powers to vanilla keys, a modular projectile-rain / telegraph / thrown-sword VFX toolkit, an on-hit event hook, and global vision toggles — plus the usual polish and fixes.
Six new origins join the roster, each a self-contained eastern martial-arts fantasy with its own base kit *and* a three-tier evolution path (see below):
- **Asura** *(high impact)* — A frail-bodied berserker who grows faster and stronger the closer death looms: fragile when whole, monstrous when bleeding.
- **Windwalker** *(medium)* — A master of *qinggong*: steps off the air, scales sheer walls, dashes on the wind and never fears a fall, but carries no extra strength into a fight.
- **Qi Cultivator** *(medium)* — Channels Qi into ranged palm-strikes and hardened flesh, meditating to refill reserves — but a cultivator run dry is just a monk.
- **Golden Body** *(medium)* — A hard-qigong Iron Body master: an armored, immovable wall that punishes anyone who strikes it, at the cost of nimbleness.
- **Iron Monk** *(medium)* — A defender monk whose guard, blocks, and strikes all draw on one shared pool of stamina; an exhausted Iron Monk is wide open.
- **Sword Immortal** *(high impact)* — Flies on their blade, hurls sword-qi at range and blinks through battle; every signature art is bound to the sword in hand.
- **Origins can now evolve.** An origin can define an evolution path that grants new powers as the player advances through its tiers, so an origin grows into a distinct late-game shape instead of staying fixed. All six new origins ship with a three-stage path:
- **Asura** — *Undying Rage* (regenerate and shrug off fire while near death) → *Blood Tithe* (drain life from every blow you land) → *Wrath Eruption* (an on-demand shockwave that savages and flings everything around you).
- **Windwalker** — *Sky Dancer* (glide freely on the wind) → *Riding the Wind* (true flight) → *Eye of the Storm* (a cyclone far greater than the Typhoon).
- **Qi Cultivator** — *Dantian Expansion* (Qi circulates even while you move and fight) → *Core Pressure* (strike harder while your core runs deep) → *Flying Sword of Qi* (loose a blade of pure energy).
- **Golden Body** — *Diamond Body* (harder still to wound) → *Reflected Force* (rebound twice the force of every blow) → *Bell Toll* (a resonating shockwave that slows and weakens nearby foes).
- **Iron Monk** — *Counter Stance* (blocked blows rebound on the attacker) → *Sea of Stamina* (stamina trickles back even mid-guard) → *Lohan Palm* (a wide stamina-fueled shockwave).
- **Sword Immortal** — *Sword Heart Unity* (your edge bites deeper with a sword in hand) → *Heavenly Sword Formation* (rain a ring of blades around you) → *Heaven-Severing Slash* (one gathered, cleaving sword-qi crescent).
- **`variable` power type.** A named, hidden counter that persists across sessions, with no HUD bar, regen, or per-tick cost — it only changes when actions touch it. Use it as a hidden state-tracker for charges, stacks, or progress that resources aren't suited to.
- **`creative_flight` power.** Grants true creative-style hover flight while active and cleanly restores normal movement when toggled off (without stripping flight from players already in creative/spectator) — built for "levitating cultivator" fantasies, distinct from elytra and natural glide.
- **Bind powers to vanilla keys.** Active and reactive powers can now key off vanilla inputs — jump, sneak, sprint, use, attack, and the four movement keys (forward / back / left / right) — instead of consuming a named hotkey slot, so lightweight powers like double-jump fire on the keys players already use. Held `key.use` / `key.attack` powers now also fire correctly while the key is held down, where before they only triggered on an actual interaction or attack swing. A worked `double_jump` example ships in the example pack.
- **`hit_dealt` event + `hit_dealt_amount` condition.** Powers can react to the damage *you deal* — mirroring the existing hit-taken hook — so `action_on_event` can fire on a landed hit (used for life-drain) and conditions can test how hard a blow landed.
- **`active_dash` damage scaling.** Dash powers gain `damage`, `damage_radius`, and `weapon_damage_scale` fields, so a dash can cut through the path it travels and scale with the weapon in hand.
- **Modular projectile-rain (`spawn_projectile_rain` / `spawn_sword_rain`).** Rain projectiles or baked-mesh blades down over an area, with configurable radius, count, duration, damage, knockup, a per-landing `impact_action`, and custom projectile entities or spectral-sword models. The rain can be anchored to the caster, their look direction, or an impact point.
- **`spawn_telegraph` action.** A particle-only ground danger reticle (a contracting circle) with a configurable radius and wind-up, optionally firing an action when it expires — a clean wind-up cue for telegraphed attacks.
- **Thrown-sword and componentized tornado VFX.** New baked-mesh model support drives a thrown-sword storm and a rebuilt, component-based tornado (with a proper spectral-sword model and updated tornado mesh/texture).
- **Global vision toggles.** Two new independent `content.toml` switches for packs that want darkness to stay threatening: `disable_night_vision` strips the `minecraft:night_vision` effect from any power that would apply it (other effects on that power still apply), and `disable_enhanced_vision` withholds the `enhanced_vision` low-light brightness boost (cat eyes, salamander, oculus drone, etc.) so it never reaches the client.
- **Fixed a dedicated-server crash on load when walk-on-water / walk-on-lava was present.** The `walk_on_fluid` mixins named a client-only player type directly, so on a dedicated server Mixin tried to load that client class while weaving and aborted with "invalid dist DEDICATED_SERVER" — taking the whole server down at startup whenever a pack used walk-on-water or walk-on-lava. The local-player check is now routed through a client-only helper, so the client type never touches the server's load path.
- **The Windwalker Typhoon (and any moving VFX) now travels smoothly.** The tornado's position only synced to clients every several ticks, so a drifting funnel visibly jumped block to block. Moving storm entities now sync every tick, so the client smoothly interpolates the funnel between updates instead of snapping it, and it follows the ground beneath it as it drifts.
- **Hidden resource bars stay hidden.** A resource power marked `hidden` at the top level (such as the Windwalker's air-step counter) still leaked a "Resource 1/2" bar onto the HUD, because the loader only auto-hid simple on/off resources. The top-level `hidden` flag is now honored, so the bar no longer shows.
- **Every active ability now shows a cooldown icon.** The last few actives without an explicit `cooldown_icon` (Windwalker's Gale Dash, the Sword Immortal's Flickering Slash, and the eastern martial-arts actives) now display a proper item icon on the cooldown HUD instead of the fallback drain bar.
release
NeoOrigins v2.2.7 (MC 26.1.x)
v2.2.7+26.121 июн. 2026 г.91Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
A big content update built around six brand-new martial-arts origins — each with a full kit and a three-tier evolution path that unlocks a new signature art as you advance. Underpinning them is a wave of new systems: a `variable` power type, true creative-style flight, the ability to bind powers to vanilla keys, a modular projectile-rain / telegraph / thrown-sword VFX toolkit, an on-hit event hook, and global vision toggles — plus the usual polish and fixes.
Six new origins join the roster, each a self-contained eastern martial-arts fantasy with its own base kit *and* a three-tier evolution path (see below):
- **Asura** *(high impact)* — A frail-bodied berserker who grows faster and stronger the closer death looms: fragile when whole, monstrous when bleeding.
- **Windwalker** *(medium)* — A master of *qinggong*: steps off the air, scales sheer walls, dashes on the wind and never fears a fall, but carries no extra strength into a fight.
- **Qi Cultivator** *(medium)* — Channels Qi into ranged palm-strikes and hardened flesh, meditating to refill reserves — but a cultivator run dry is just a monk.
- **Golden Body** *(medium)* — A hard-qigong Iron Body master: an armored, immovable wall that punishes anyone who strikes it, at the cost of nimbleness.
- **Iron Monk** *(medium)* — A defender monk whose guard, blocks, and strikes all draw on one shared pool of stamina; an exhausted Iron Monk is wide open.
- **Sword Immortal** *(high impact)* — Flies on their blade, hurls sword-qi at range and blinks through battle; every signature art is bound to the sword in hand.
- **Origins can now evolve.** An origin can define an evolution path that grants new powers as the player advances through its tiers, so an origin grows into a distinct late-game shape instead of staying fixed. All six new origins ship with a three-stage path:
- **Asura** — *Undying Rage* (regenerate and shrug off fire while near death) → *Blood Tithe* (drain life from every blow you land) → *Wrath Eruption* (an on-demand shockwave that savages and flings everything around you).
- **Windwalker** — *Sky Dancer* (glide freely on the wind) → *Riding the Wind* (true flight) → *Eye of the Storm* (a cyclone far greater than the Typhoon).
- **Qi Cultivator** — *Dantian Expansion* (Qi circulates even while you move and fight) → *Core Pressure* (strike harder while your core runs deep) → *Flying Sword of Qi* (loose a blade of pure energy).
- **Golden Body** — *Diamond Body* (harder still to wound) → *Reflected Force* (rebound twice the force of every blow) → *Bell Toll* (a resonating shockwave that slows and weakens nearby foes).
- **Iron Monk** — *Counter Stance* (blocked blows rebound on the attacker) → *Sea of Stamina* (stamina trickles back even mid-guard) → *Lohan Palm* (a wide stamina-fueled shockwave).
- **Sword Immortal** — *Sword Heart Unity* (your edge bites deeper with a sword in hand) → *Heavenly Sword Formation* (rain a ring of blades around you) → *Heaven-Severing Slash* (one gathered, cleaving sword-qi crescent).
- **`variable` power type.** A named, hidden counter that persists across sessions, with no HUD bar, regen, or per-tick cost — it only changes when actions touch it. Use it as a hidden state-tracker for charges, stacks, or progress that resources aren't suited to.
- **`creative_flight` power.** Grants true creative-style hover flight while active and cleanly restores normal movement when toggled off (without stripping flight from players already in creative/spectator) — built for "levitating cultivator" fantasies, distinct from elytra and natural glide.
- **Bind powers to vanilla keys.** Active and reactive powers can now key off vanilla inputs — jump, sneak, sprint, use, attack, and the four movement keys (forward / back / left / right) — instead of consuming a named hotkey slot, so lightweight powers like double-jump fire on the keys players already use. Held `key.use` / `key.attack` powers now also fire correctly while the key is held down, where before they only triggered on an actual interaction or attack swing. A worked `double_jump` example ships in the example pack.
- **`hit_dealt` event + `hit_dealt_amount` condition.** Powers can react to the damage *you deal* — mirroring the existing hit-taken hook — so `action_on_event` can fire on a landed hit (used for life-drain) and conditions can test how hard a blow landed.
- **`active_dash` damage scaling.** Dash powers gain `damage`, `damage_radius`, and `weapon_damage_scale` fields, so a dash can cut through the path it travels and scale with the weapon in hand.
- **Modular projectile-rain (`spawn_projectile_rain` / `spawn_sword_rain`).** Rain projectiles or baked-mesh blades down over an area, with configurable radius, count, duration, damage, knockup, a per-landing `impact_action`, and custom projectile entities or spectral-sword models. The rain can be anchored to the caster, their look direction, or an impact point.
- **`spawn_telegraph` action.** A particle-only ground danger reticle (a contracting circle) with a configurable radius and wind-up, optionally firing an action when it expires — a clean wind-up cue for telegraphed attacks.
- **Thrown-sword and componentized tornado VFX.** New baked-mesh model support drives a thrown-sword storm and a rebuilt, component-based tornado (with a proper spectral-sword model and updated tornado mesh/texture).
- **Global vision toggles.** Two new independent `content.toml` switches for packs that want darkness to stay threatening: `disable_night_vision` strips the `minecraft:night_vision` effect from any power that would apply it (other effects on that power still apply), and `disable_enhanced_vision` withholds the `enhanced_vision` low-light brightness boost (cat eyes, salamander, oculus drone, etc.) so it never reaches the client.
- **Fixed a dedicated-server crash on load when walk-on-water / walk-on-lava was present.** The `walk_on_fluid` mixins named a client-only player type directly, so on a dedicated server Mixin tried to load that client class while weaving and aborted with "invalid dist DEDICATED_SERVER" — taking the whole server down at startup whenever a pack used walk-on-water or walk-on-lava. The local-player check is now routed through a client-only helper, so the client type never touches the server's load path.
- **The Windwalker Typhoon (and any moving VFX) now travels smoothly.** The tornado's position only synced to clients every several ticks, so a drifting funnel visibly jumped block to block. Moving storm entities now sync every tick, so the client smoothly interpolates the funnel between updates instead of snapping it, and it follows the ground beneath it as it drifts.
- **Hidden resource bars stay hidden.** A resource power marked `hidden` at the top level (such as the Windwalker's air-step counter) still leaked a "Resource 1/2" bar onto the HUD, because the loader only auto-hid simple on/off resources. The top-level `hidden` flag is now honored, so the bar no longer shows.
- **Every active ability now shows a cooldown icon.** The last few actives without an explicit `cooldown_icon` (Windwalker's Gale Dash, the Sword Immortal's Flickering Slash, and the eastern martial-arts actives) now display a proper item icon on the cooldown HUD instead of the fallback drain bar.
release
NeoOrigins v2.2.6 (MC 1.21.1)
v2.2.6+1.21.119 июн. 2026 г.909Minecraft: 1.21.1neoforge
Что нового
A hotfix for 2.2.5: lava/water walking now works on flowing fluid and stands you cleanly on the surface, summoned piglin/hoglin minions properly chase and follow their owner, and `/power grant|revoke` works on grouped (`multiple`) powers.
### Bug Fixes
- **Walk-on-lava / walk-on-water works on flowing fluid and stands you on the surface.** `walk_on_fluid` only solidified *source* blocks, so poured or flowing lava dropped you straight through, and even on a source block you sank knee-deep and bobbed. Any fluid level is now a solid surface and you stand on a full block with your feet clear — jumping works and you no longer sink, while submerging your eyes still lets you dive.
- **Summoned and tamed piglin/hoglin minions chase and follow their owner.** Brain-driven minions ran only on the goal system that 2.2.4 pacified, so they neither chased the owner's target nor leashed back until the owner walked right up to them. They now drive movement through the brain — chasing a live combat target, otherwise following the owner (the same 8-block follow / 24-block teleport distances as goal-based pets) — and no longer turn on a fellow minion the owner clips by accident.
- **`/power grant` and `/power revoke` work on `multiple` powers.** A `multiple` power isn't itself a registered holder, so granting or revoking the parent id silently did nothing. The command now expands a `multiple` to its leaf sub-powers (recursively, for nested multiples) and grants/revokes each.
### Compat Improvements
- **`neoorigins:self_action_on_hit` is recognized** alongside the existing `origins:` / `apace:` `self_action_on_hit` aliases, so a power authored under the native namespace fires when the holder deals damage instead of being dropped at load.
release
NeoOrigins v2.2.6 (MC 26.2)
v2.2.6+26.219 июн. 2026 г.49Minecraft: 26.2neoforge
Что нового
A hotfix for 2.2.5: lava/water walking now works on flowing fluid and stands you cleanly on the surface, summoned piglin/hoglin minions properly chase and follow their owner, and `/power grant|revoke` works on grouped (`multiple`) powers.
### Bug Fixes
- **Walk-on-lava / walk-on-water works on flowing fluid and stands you on the surface.** `walk_on_fluid` only solidified *source* blocks, so poured or flowing lava dropped you straight through, and even on a source block you sank knee-deep and bobbed. Any fluid level is now a solid surface and you stand on a full block with your feet clear — jumping works and you no longer sink, while submerging your eyes still lets you dive.
- **Summoned and tamed piglin/hoglin minions chase and follow their owner.** Brain-driven minions ran only on the goal system that 2.2.4 pacified, so they neither chased the owner's target nor leashed back until the owner walked right up to them. They now drive movement through the brain — chasing a live combat target, otherwise following the owner (the same 8-block follow / 24-block teleport distances as goal-based pets) — and no longer turn on a fellow minion the owner clips by accident.
- **`/power grant` and `/power revoke` work on `multiple` powers.** A `multiple` power isn't itself a registered holder, so granting or revoking the parent id silently did nothing. The command now expands a `multiple` to its leaf sub-powers (recursively, for nested multiples) and grants/revokes each.
### Compat Improvements
- **`neoorigins:self_action_on_hit` is recognized** alongside the existing `origins:` / `apace:` `self_action_on_hit` aliases, so a power authored under the native namespace fires when the holder deals damage instead of being dropped at load.
release
NeoOrigins v2.2.6 (MC 26.1.x)
v2.2.6+26.119 июн. 2026 г.55Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
A hotfix for 2.2.5: lava/water walking now works on flowing fluid and stands you cleanly on the surface, summoned piglin/hoglin minions properly chase and follow their owner, and `/power grant|revoke` works on grouped (`multiple`) powers.
### Bug Fixes
- **Walk-on-lava / walk-on-water works on flowing fluid and stands you on the surface.** `walk_on_fluid` only solidified *source* blocks, so poured or flowing lava dropped you straight through, and even on a source block you sank knee-deep and bobbed. Any fluid level is now a solid surface and you stand on a full block with your feet clear — jumping works and you no longer sink, while submerging your eyes still lets you dive.
- **Summoned and tamed piglin/hoglin minions chase and follow their owner.** Brain-driven minions ran only on the goal system that 2.2.4 pacified, so they neither chased the owner's target nor leashed back until the owner walked right up to them. They now drive movement through the brain — chasing a live combat target, otherwise following the owner (the same 8-block follow / 24-block teleport distances as goal-based pets) — and no longer turn on a fellow minion the owner clips by accident.
- **`/power grant` and `/power revoke` work on `multiple` powers.** A `multiple` power isn't itself a registered holder, so granting or revoking the parent id silently did nothing. The command now expands a `multiple` to its leaf sub-powers (recursively, for nested multiples) and grants/revokes each.
### Compat Improvements
- **`neoorigins:self_action_on_hit` is recognized** alongside the existing `origins:` / `apace:` `self_action_on_hit` aliases, so a power authored under the native namespace fires when the holder deals damage instead of being dropped at load.
release
NeoOrigins v2.2.5 (MC 1.21.1)
v2.2.5+1.21.118 июн. 2026 г.581Minecraft: 1.21.1neoforge
Что нового
## NeoOrigins 2.2.5
Adds a Build A Spell integration, two new powers, an expanded client-config surface for the HUD ability display, an array-form authoring fix, and a new **Minecraft 26.2** build alongside 26.1.x and 1.21.1.
### New Powers & Systems
- **Build A Spell integration — `neoorigins:cast_spell`**: casts an inline, effect-first Build A Spell spell on activation. Mod-gated via `required_mods`; cost is charged on the NeoOrigins power, bypassing BaS mana.
- **`attract_mobs`**: pulls nearby mobs toward the holder (new `AvoidEntityGoalMixin`).
- **`prevent_item_damage`**: stops items losing durability under the power's conditions.
- **`tame_target` action verb**: tames the entity on the other side of an interaction.
### Pack Author Features
- Action/condition fields now accept an **object or an array** (implicit "all-of") — a bare array previously silently no-opped.
- `summon_minion` gains **attribute & enchantment** fields for summoned minions.
- `disable_hotkey` precedence clarified over a power's own bind.
### Client Configuration
- Expanded **HUD ability-display** options (cooldown-countdown opacity, default origin sort), documented in the new `CLIENT_CONFIG.md`.
### Bug Fixes
- **Oceanic conduit/apex powers are usable on land again** — they were water-gated by vanilla `conduit_power`; rebuilt on land-usable effects.
### Minecraft 26.2 Support
- A native **MC 26.2** jar joins the release (NeoForge, Java 25), alongside the 26.1.x and 1.21.1 jars.
- Note: a few soft-dependency integrations (JEI, Jade, FTB) aren't on the 26.2 build yet, pending those mods' 26.2 releases — core + Build A Spell are fully present. 26.1.x and 1.21.1 are unaffected.
### Localization & Docs
- All 12 locale files updated; `ACTIONS`/`API`/`CONDITIONS`/`POWER_TYPES`/`CLIENT_CONFIG` docs and the power/action + web-editor schemas regenerated.
release
NeoOrigins v2.2.5 (MC 26.2)
v2.2.5+26.218 июн. 2026 г.28Minecraft: 26.2neoforge
Что нового
## NeoOrigins 2.2.5
Adds a Build A Spell integration, two new powers, an expanded client-config surface for the HUD ability display, an array-form authoring fix, and a new **Minecraft 26.2** build alongside 26.1.x and 1.21.1.
### New Powers & Systems
- **Build A Spell integration — `neoorigins:cast_spell`**: casts an inline, effect-first Build A Spell spell on activation. Mod-gated via `required_mods`; cost is charged on the NeoOrigins power, bypassing BaS mana.
- **`attract_mobs`**: pulls nearby mobs toward the holder (new `AvoidEntityGoalMixin`).
- **`prevent_item_damage`**: stops items losing durability under the power's conditions.
- **`tame_target` action verb**: tames the entity on the other side of an interaction.
### Pack Author Features
- Action/condition fields now accept an **object or an array** (implicit "all-of") — a bare array previously silently no-opped.
- `summon_minion` gains **attribute & enchantment** fields for summoned minions.
- `disable_hotkey` precedence clarified over a power's own bind.
### Client Configuration
- Expanded **HUD ability-display** options (cooldown-countdown opacity, default origin sort), documented in the new `CLIENT_CONFIG.md`.
### Bug Fixes
- **Oceanic conduit/apex powers are usable on land again** — they were water-gated by vanilla `conduit_power`; rebuilt on land-usable effects.
### Minecraft 26.2 Support
- A native **MC 26.2** jar joins the release (NeoForge, Java 25), alongside the 26.1.x and 1.21.1 jars.
- Note: a few soft-dependency integrations (JEI, Jade, FTB) aren't on the 26.2 build yet, pending those mods' 26.2 releases — core + Build A Spell are fully present. 26.1.x and 1.21.1 are unaffected.
### Localization & Docs
- All 12 locale files updated; `ACTIONS`/`API`/`CONDITIONS`/`POWER_TYPES`/`CLIENT_CONFIG` docs and the power/action + web-editor schemas regenerated.
release
NeoOrigins v2.2.5 (MC 26.1.x)
v2.2.5+26.118 июн. 2026 г.25Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
## NeoOrigins 2.2.5
Adds a Build A Spell integration, two new powers, an expanded client-config surface for the HUD ability display, an array-form authoring fix, and a new **Minecraft 26.2** build alongside 26.1.x and 1.21.1.
### New Powers & Systems
- **Build A Spell integration — `neoorigins:cast_spell`**: casts an inline, effect-first Build A Spell spell on activation. Mod-gated via `required_mods`; cost is charged on the NeoOrigins power, bypassing BaS mana.
- **`attract_mobs`**: pulls nearby mobs toward the holder (new `AvoidEntityGoalMixin`).
- **`prevent_item_damage`**: stops items losing durability under the power's conditions.
- **`tame_target` action verb**: tames the entity on the other side of an interaction.
### Pack Author Features
- Action/condition fields now accept an **object or an array** (implicit "all-of") — a bare array previously silently no-opped.
- `summon_minion` gains **attribute & enchantment** fields for summoned minions.
- `disable_hotkey` precedence clarified over a power's own bind.
### Client Configuration
- Expanded **HUD ability-display** options (cooldown-countdown opacity, default origin sort), documented in the new `CLIENT_CONFIG.md`.
### Bug Fixes
- **Oceanic conduit/apex powers are usable on land again** — they were water-gated by vanilla `conduit_power`; rebuilt on land-usable effects.
### Minecraft 26.2 Support
- A native **MC 26.2** jar joins the release (NeoForge, Java 25), alongside the 26.1.x and 1.21.1 jars.
- Note: a few soft-dependency integrations (JEI, Jade, FTB) aren't on the 26.2 build yet, pending those mods' 26.2 releases — core + Build A Spell are fully present. 26.1.x and 1.21.1 are unaffected.
### Localization & Docs
- All 12 locale files updated; `ACTIONS`/`API`/`CONDITIONS`/`POWER_TYPES`/`CLIENT_CONFIG` docs and the power/action + web-editor schemas regenerated.
release
NeoOrigins v2.2.4 (MC 1.21.1)
v2.2.4+1.21.116 июн. 2026 г.1,3 тыс.Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.2.4
A bug-fix and compat follow-up to 2.2.3, driven by Discord reports: a fix for the 26.1 mod-loading warning, an area-of-effect option for tame_mob, a batch of power fixes, and better Apoli compatibility.
- **Native `neoorigins:multiple` container.** Bundle sub-powers under a first-class in-namespace `neoorigins:multiple` instead of the foreign `origins:multiple` — it flattens through the exact same path (nested multiples and `*:*` self-refs included). `origins:` / `apace:` / `apoli:multiple` still work identically.
- **`summon_minion` can mount its minions.** A new optional `mount` field seats each summoned minion on its own freshly-spawned mount (e.g. piglin cavalry on hoglins): the mount is forced, tracked under the same cap, drops nothing, and despawns with its rider.
- **`tame_mob` gains an area-of-effect mode.** Alongside the default raycast, `targeting: area` tames every eligible mob in range at once, greedily nearest-first until the resource or the minion slots run out. An optional `entity_whitelist` narrows what it will tame, and cost is now charged **per mob** from whatever resource the power is given (`resource_cost` / `resource_cost_amount`), falling back to hunger when resource bars are disabled.
- **The 26.1 "@OnlyIn" loading warning is gone (26.1).** Five client renderers carried a leftover `@OnlyIn` annotation that 26.1 no longer strips, popping a "Warning while loading mods" gate before the main menu. Removed — the client boots straight to the title screen. (Cleaned up on 1.21.1 too for parity.)
- **First-pick invulnerability covers the whole pick, plus a brief grace after.** New players are protected for the entire initial origin selection — every layer, so a multi-layer (origin + class) pick no longer leaves you vulnerable while choosing your class — and stay invulnerable for ~5 seconds after committing (so a `spawn_location` teleport into a hostile area doesn't cost you a hit). Escaping mid-pick still drops the protection, and Orb re-picks don't qualify.
- **`modify_food_nutrition` fills the hunger bar fully.** It recomputed the bar from a post-eat delta, which over-corrected once vanilla clamped the gain at 20. It now snapshots food + saturation before the bite and recomputes from that baseline.
- **`tame_mob` drops the new owner as a target.** A mob tamed mid-swing kept attacking its new owner until it lost sight of them. Taming now clears the mob's current target and last-hurt-by record if they point at the owner.
- **`summon_minion` pacifies brain mobs.** Piglins and hoglins run on the Brain/memory system, not goals, so they bypassed the goal-based interceptor and re-armed against the summoner. They're now pacified at spawn and held friendly each tick.
- **`keep_inventory` covers Curios and Accessories (1.21.1).** It only walked vanilla inventory slots, so trinkets dropped on death. It now matches accessory slots (`*` / `all`, the `curio` / `accessory` / `trinket` umbrellas, or a specific slot id) and re-equips kept trinkets into their original slot on respawn.
- **Long subclass names no longer overflow the picker scroll.** Two-word origin / subclass names (e.g. "Fire Wizard") ran off the right edge of the parchment scroll button. They now scale down to fit; names that already fit render unchanged.
- **`key.jump` double-jumps fire correctly.** The `active_self` proxy mis-detected the gesture — it fired during a normal jump's ascent and was inactive when you re-pressed jump while falling. It now reads the real airborne jump-press edge, firing once per double-jump press.
- **`ADD_MULTIPLIED_TOTAL` attribute ops are no longer demoted to a flat add.** The uppercase NeoForge-enum form fell through to `add_value`, silently turning a multiplier into a flat addition. Operations are now case-normalized, and known-unrepresentable `set_*` / `min_*` / `max_*` ops fall back cleanly without the misleading "unknown operation" warning.
- **`modify_fall_damage` / fall-damage `conditioned_attribute` load again.** With no `modify_fall_damage` handler in the compat layer, a `conditioned_attribute` targeting fall damage returned null and the loader silently dropped the whole power. A full handler is added, and `conditioned_attribute` forwards a `fall_damage` leaf to it instead of dropping the power.
- **`neoorigins:multiple`, `summon_minion` `mount`, the `tame_mob` `targeting` / `entity_whitelist` / `resource_cost` fields, the compat `modify_fall_damage` verb, and the `keep_inventory` `slots` field documented** in `POWER_TYPES.md`, with the power schema + web-editor mirror regenerated.
release
NeoOrigins v2.2.4 (MC 26.1.x)
v2.2.4+26.116 июн. 2026 г.128Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.2.4
A bug-fix and compat follow-up to 2.2.3, driven by Discord reports: a fix for the 26.1 mod-loading warning, an area-of-effect option for tame_mob, a batch of power fixes, and better Apoli compatibility.
- **Native `neoorigins:multiple` container.** Bundle sub-powers under a first-class in-namespace `neoorigins:multiple` instead of the foreign `origins:multiple` — it flattens through the exact same path (nested multiples and `*:*` self-refs included). `origins:` / `apace:` / `apoli:multiple` still work identically.
- **`summon_minion` can mount its minions.** A new optional `mount` field seats each summoned minion on its own freshly-spawned mount (e.g. piglin cavalry on hoglins): the mount is forced, tracked under the same cap, drops nothing, and despawns with its rider.
- **`tame_mob` gains an area-of-effect mode.** Alongside the default raycast, `targeting: area` tames every eligible mob in range at once, greedily nearest-first until the resource or the minion slots run out. An optional `entity_whitelist` narrows what it will tame, and cost is now charged **per mob** from whatever resource the power is given (`resource_cost` / `resource_cost_amount`), falling back to hunger when resource bars are disabled.
- **The 26.1 "@OnlyIn" loading warning is gone (26.1).** Five client renderers carried a leftover `@OnlyIn` annotation that 26.1 no longer strips, popping a "Warning while loading mods" gate before the main menu. Removed — the client boots straight to the title screen. (Cleaned up on 1.21.1 too for parity.)
- **First-pick invulnerability covers the whole pick, plus a brief grace after.** New players are protected for the entire initial origin selection — every layer, so a multi-layer (origin + class) pick no longer leaves you vulnerable while choosing your class — and stay invulnerable for ~5 seconds after committing (so a `spawn_location` teleport into a hostile area doesn't cost you a hit). Escaping mid-pick still drops the protection, and Orb re-picks don't qualify.
- **`modify_food_nutrition` fills the hunger bar fully.** It recomputed the bar from a post-eat delta, which over-corrected once vanilla clamped the gain at 20. It now snapshots food + saturation before the bite and recomputes from that baseline.
- **`tame_mob` drops the new owner as a target.** A mob tamed mid-swing kept attacking its new owner until it lost sight of them. Taming now clears the mob's current target and last-hurt-by record if they point at the owner.
- **`summon_minion` pacifies brain mobs.** Piglins and hoglins run on the Brain/memory system, not goals, so they bypassed the goal-based interceptor and re-armed against the summoner. They're now pacified at spawn and held friendly each tick.
- **`keep_inventory` covers Curios and Accessories (1.21.1).** It only walked vanilla inventory slots, so trinkets dropped on death. It now matches accessory slots (`*` / `all`, the `curio` / `accessory` / `trinket` umbrellas, or a specific slot id) and re-equips kept trinkets into their original slot on respawn.
- **Long subclass names no longer overflow the picker scroll.** Two-word origin / subclass names (e.g. "Fire Wizard") ran off the right edge of the parchment scroll button. They now scale down to fit; names that already fit render unchanged.
- **`key.jump` double-jumps fire correctly.** The `active_self` proxy mis-detected the gesture — it fired during a normal jump's ascent and was inactive when you re-pressed jump while falling. It now reads the real airborne jump-press edge, firing once per double-jump press.
- **`ADD_MULTIPLIED_TOTAL` attribute ops are no longer demoted to a flat add.** The uppercase NeoForge-enum form fell through to `add_value`, silently turning a multiplier into a flat addition. Operations are now case-normalized, and known-unrepresentable `set_*` / `min_*` / `max_*` ops fall back cleanly without the misleading "unknown operation" warning.
- **`modify_fall_damage` / fall-damage `conditioned_attribute` load again.** With no `modify_fall_damage` handler in the compat layer, a `conditioned_attribute` targeting fall damage returned null and the loader silently dropped the whole power. A full handler is added, and `conditioned_attribute` forwards a `fall_damage` leaf to it instead of dropping the power.
- **`neoorigins:multiple`, `summon_minion` `mount`, the `tame_mob` `targeting` / `entity_whitelist` / `resource_cost` fields, the compat `modify_fall_damage` verb, and the `keep_inventory` `slots` field documented** in `POWER_TYPES.md`, with the power schema + web-editor mirror regenerated.
release
NeoOrigins v2.2.3 (MC 1.21.1)
v2.2.3+1.21.114 июн. 2026 г.1,2 тыс.Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.3
release
NeoOrigins v2.2.3 (MC 26.1.x)
v2.2.3+26.114 июн. 2026 г.64Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.3
release
NeoOrigins v2.2.2 (MC 1.21.1)
v2.2.2+1.21.112 июн. 2026 г.995Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.2
release
NeoOrigins v2.2.2 (MC 26.1.x)
v2.2.2+26.112 июн. 2026 г.59Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.2
release
NeoOrigins v2.2.1 (MC 1.21.1)
v2.2.1+1.21.16 июн. 2026 г.3,6 тыс.Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v2.2.1
release
NeoOrigins v2.2.1 (MC 26.1.x)
v2.2.1+26.16 июн. 2026 г.178Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v2.2.1
release
NeoOrigins v2.2.0 (MC 1.21.1)
v2.2.0+1.21.15 июн. 2026 г.548Minecraft: 1.21.1neoforge
Что нового
> This release is a large compatibility + UI pass — a major Origins / Apoli / Apugli compatibility overhaul, first-class integrations with EMI / Jade / The One Probe / FTB Quests / FTB Teams / FTB Ultimine / Accessories, a parchment-scroll UI, a browser-based pack editor, config hardening, and a long list of new powers, actions, and fixes. If you hit a rough edge, please report it on the [GitHub issue tracker](https://github.com/CyberDay1/NeoOrigins/issues).
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 1.21.1 (Java 21)
The headline of this release is a big jump in **Origins / Apoli / Apugli pack compatibility** — real spell packs (deanos, CrystalWeaver) that previously hit "Unknown power type" or silently no-op'd now load and behave correctly — alongside a parchment-scroll skin for the origin picker and a browser-based pack editor to complement the existing in-game creator.
- **`apoli:` / `apugli:` namespaces are now recognized.** Power types, actions, and conditions declared under the `apoli:` / `apugli:` namespaces are canonicalized to their `origins:` equivalents before dispatch (e.g. `apoli:resource`, `apoli:multiple`, `apoli:and`, `apoli:raycast`, `apoli:change_resource`, `apoli:sneaking`). Previously these fell through to "Unknown power type" even when an identical handler already existed, so modern packs that author in the Apoli namespace lost large chunks of behavior on load.
- **Apoli resource bars render with the real sprite sheet.** Compat resource bars now draw using Apoli's actual `resource_bar.png` art — bar fill selected by `bar_index`, icon by `icon_index` — including a per-power `sprite_location` override so packs that ship a restyled bar sheet render with *their* texture. Native NeoOrigins resources keep the existing color-tinted fill, so nothing regresses. (Apoli's `resource_bar.png` is bundled under its MIT license — see Documentation.)
- **`apoli:modify_velocity` is now supported.** Per-axis modifier on the player's movement each tick, **condition-gated and fail-closed**: if a gating condition can't be parsed the power refuses to compile rather than risk freezing the player (e.g. a resource-gated "stop" effect that would otherwise apply unconditionally).
- **`origins:modify_attribute` now translates** to `neoorigins:attribute_modifier`. (This is the top-level-attribute schema, distinct from `origins:attribute`, which nests the attribute inside each modifier.) Resource-driven dynamic values apply their static base value.
- **Raycast spells gain `before_action` + `command_at_hit`.** `before_action` runs once up front (e.g. consume the offhand reagent) and `command_at_hit` runs a command at the exact impact point. Together with the existing `command_along_ray`, this covers deanos-style projectile and teleport spells.
- **Right-click (`key.use`) active powers now fire.** Apoli `active_self` powers bound to `key.use` — cast by right-clicking with a plain or empty hand, the way most spell packs work — previously never triggered, because the server only saw item-use *animations* (food/bow/shield) and not a plain tap. The server now tracks the right-click tick so these powers cast.
- **Nested bientity actions resolve instead of no-op'ing.** Entity-actions tucked inside a bientity `and` (`add_velocity`, `mount`, `if_else`, `spawn_particles`, …) now run on the actor with the hit entity as context. Genuinely-unknown verbs still warn (and don't double-warn).
- **Plural modifier arrays accepted.** Conditioned `modify_damage_taken` / `modify_damage_dealt` and `modify_xp_gain` now accept Apoli's plural `modifiers` / `amount` forms in addition to the legacy singular fields.
- **Apoli attribute-operation mapping is safer.** The operation mapper now **drops** clamp-style operations that have no vanilla `AttributeModifier` equivalent (`set_base`, `min_total`, `max_total`, …) instead of silently mismapping them onto an unrelated vanilla operation. `modify_attribute` and conditioned-attribute powers skip any non-representable op rather than apply a wrong one.
- **`add_velocity` honors the Apoli `space` transform** (`world` / `local` / `velocity`), so directional knockback/launch verbs push along the intended frame instead of always in world space.
- **Inline Apoli recipes now decode on NeoForge.** `origins:recipe` powers that ship pre-1.20.5 recipe JSON (e.g. Toxophilite's makeshift arrows) are normalized to the 1.21.1 codec shape. Ingredient objects are left in NeoForge's `either(list, object)` form (rewriting them to bare strings made the codec reject every inline recipe); only the `result`'s Apoli `item` key is rewritten to the 1.21.1 `id` key.
- **Iron's Spells damage types match by full id.** Namespaced damage-type ids (e.g. `irons_spellbooks:fire_magic`) now compare on the full registry key in `modify_damage` / `action_on_hit`, so spell-school damage conditions resolve instead of dropping the namespace.
- **The `/resource` command matches Apoli.** Brought to parity with apace100/apoli's `ResourceCommand` — `has` / `get` / `set` / `change` / `operation` subcommands, single-target, "power not granted" errors, vanilla scoreboard feedback messages, correct return values, and resource-name suggestions scoped to the target. A load-time warning is also logged when a `resource` reference (in the condition or `change_resource` / `set_resource`) uses the `*:` self-reference wildcard, which is only resolved for `power_active` and `origins:multiple` — never for resources (see Documentation).
A batch of new out-of-the-box integrations with popular mods. Each is a **soft dependency** — gated behind a mod-list check or reflection, so none of these mods are required and the integration silently no-ops when its mod is absent. The full catalogue lives in the new [`COMPATIBILITY.md`](docs/COMPATIBILITY.md).
- **EMI** *(1.21.1)* — adds an information panel for the Orb of Origin item.
- **Jade / The One Probe** — looking at a player shows their origin in the block/entity tooltip (Jade on both builds; The One Probe on 1.21.1).
- **FTB Quests** — a first-class **"NeoOrigins: Grant Loot Pool"** reward type (set a loot-table id + roll count directly on the quest) *(1.21.1)*, plus a quest-tag route: quests tagged `neoorigins_loot_pool_grant:<table_id>` grant a loot pool on completion (both builds). The tag route now hooks FTBQ's real completion event and grants to every online team member.
- **FTB Teams** — players on an **allied** team (not just the same team) are now trusted for mount consent, so an ally can ride your mountable origin without sending a request.
- **FTB Ultimine** — new zero-config marker power **`neoorigins:ultimine`**. FTB Ultimine's restriction API is deny-only, so the power works by denying vein-mining to non-holders; it stays fully **dormant until at least one `ultimine` power is present in loaded data**, so simply installing both mods never disables vein-mining for everyone.
- **Accessories** *(1.21.1)* — the `equipped_item` condition gains an `accessory` slot value plus an optional `slot_type` to narrow to a named curio/accessory slot; it aggregates equipped stacks from both Curios (reflection) and Accessories (typed).
- **Vampires Need Umbrellas** — holding an umbrella now shields the holder from **both** weather-damage gates: `exposed_to_sun` (sun-burn origins) *and* `in_rain` (rain/water-damage origins like Wet Fur and True Hydrophobia). The umbrella is detected in either hand or any Curios/Accessories slot.
- **`neoorigins:simple`** — new display-only marker power. Does nothing mechanically; it exists to show a `name` + `description` line in the origin info panel (lore, or to describe an effect implemented by another power). Direct equivalent of `origins:simple`; `origins:tooltip` / `apace:tooltip` translate to it as well.
- **`drop_inventory` action** — drops the holder's full inventory as item entities (`throw_randomly` / `retain_ownership` honored).
- **`riding_action` action** — runs an entity-action on the entity the holder is *riding* (the mirror of `passenger_action`).
- **`spawn_particles` action** — server-broadcasts particles from the player's position (count / speed / offset / spread; simple particle types).
- **`hardness` condition** — compares the destroy-hardness of the targeted block, enabling "only affect blocks with hardness ≤ N" style spells.
- **`summon` quantity** — the summon entity-action now takes a `quantity` field.
- **`starting_equipment` multi-item** — accepts a list of item stacks (`stacks`) instead of just one; the legacy singular `item` form still works. Each entry carries full per-item data — `components` (`item[...]`-style data components: custom name, enchantments, custom model data, lore) and a structured `enchantments` list — and a new **`legacy_tag`** field bridges pre-1.21 flat SNBT onto the component system.
- **`tame_mob` owner-aware goals** — tamed-mob aggro/defend goals are split into owner-aware targeting, so a tamed mob defends its owner and won't target them.
- **`spawn_projectile` gains `no_gravity`.** When `true`, the projectile flies dead-straight along its launch vector instead of arcing (drag still applies). Works for *any* projectile entity, not just the magic orb.
- **`selector_action` action** — resolves a vanilla entity selector relative to the holder and runs a bientity-action per selected entity, publishing each as a source-entity context. A nested `fire_projectile` can then fire *from* each selected entity using its position and rotation — the basis of fan-out volleys like Toxophilite's `hyper_multishot`.
- **`fire_projectile` honors Apoli `count` + `tag`.** Non-orb projectiles spawn `count` copies (default 1), and an Apoli `tag` SNBT compound (e.g. `{pickup:1b}`) is applied to each spawned projectile. For the magic orb, `count` keeps its trail-particle meaning.
- **`break_speed_modifier` now respects `block_tag`.** The power advertised a `block_tag` filter but ignored it, scaling mining speed on every block. It is reimplemented through `PlayerEvent.BreakSpeed` (fired client + server so mining prediction matches) and now actually filters by the target block's tag/id — a leading `#` forces tag-only.
A new family of "caster + target" spell building blocks. Previously a projectile's `on_hit_action` always ran on the *shooter*, and `target_action` was a transparent pass-through — so you couldn't write "swap me with the mob I hit" or "shear whatever this orb lands on." These verbs let a spell act on **the entity (or block) on the other side of the interaction**, and the magic-orb projectile is now styled entirely from JSON.
- **`target_action` actually retargets now.** It resolves the entity on the other side of the interaction (hit / hit-by / killed / interacted-with / projectile-struck) and runs the inner entity-action against it, instead of passing through to the holder. A **player** target gets the full entity-action surface; a **non-player mob** gets the entity-general subset (`apply_effect`, `clear_effect`, `damage`, `heal`, `set_on_fire`, `extinguish`, `add_velocity`, `play_sound`, `set_fall_distance`, `dismount`, `swing_hand`). It also works directly as a `neoorigins:`-namespaced action (e.g. inside a projectile `on_hit_action`). `actor_action` is unchanged.
- **Movement verbs.** `swap_positions` atomically swaps the actor and the context target's full transform (position + yaw + pitch) — both transforms are snapshotted before either moves, so they never collapse to one point. `teleport_to_target` moves the actor to the target; `teleport_target_to_self` moves the target to the actor.
- **Entity-target verbs.** `shear` (sheep / mooshroom / snow golem / bogged / any modded `IShearable`), `dye` (`color` — dyeable mobs like sheep), `force_drop` (`slot`, default `mainhand` — makes the target drop a named equipment slot), and `steal_item` (`slot` — transfers the target's item to the actor's inventory). Each works as a projectile `on_hit_action` or wrapped in `target_action`.
- **Block-target verbs.** Spells can now act on the *block* a projectile or raycast impacts: `strip` (logs/wood → stripped, axis-preserving), `till` (grass/dirt → farmland, vanilla hoe rule), `path` (→ dirt path, vanilla shovel rule), `grow` (one bonemeal-style growth tick), and the generic `transform_block` (`to` required, optional `from` guard). `block_target_action` is the block-side analogue of `target_action` for running these explicitly.
- **Area-of-effect fan-out.** `area_of_effect` on impact now applies its inner verb to **every** matching entity in the blast — including the new dual-actor verbs — so "swap / shear / disarm everything in the radius" is a one-liner. Kill credit is now attributed to the casting player for AoE damage.
- **Data-driven projectile visuals.** `spawn_projectile` (magic orb) gains author-controlled visuals: `orb_color` and `glow_color` (RGB `[r,g,b]` 0–255 **or** hex `"#RRGGBB"`), `size`, `glow_size`, `glow_alpha`, `shape` (`cross` / `cube` / `ring` / `sphere` — all four ship), and `trail_particle` (any vanilla particle id, with `count` / `spread` / `trail_speed` tuning). `effect_type` stays as a shorthand that sets sensible defaults; any explicit field overrides it. The original seed request — *a green orb emitting purple particles that swaps the two entities when it hits* — is now fully expressible in JSON.
- **`apoli:global` global power sets are now supported.** A datapack file at `data/<ns>/global_powers/<id>.json` grants a bundle of `powers` to entities **without any origin assignment** — NeoOrigins' port of Apoli's Global Power Set, using the same JSON shape. An optional `entity_types` list may **mix** literal entity ids (`"minecraft:creeper"`) and tag refs (`"#minecraft:skeletons"`) in one array; when absent or empty the set applies to **all** entities. An optional `order` (default `0`, lower applies first) controls apply ordering, and powers referenced by multiple sets are granted once. **Players** receive matching powers on login and on datapack sync (`/reload`), granted through the same dynamic-grant mechanism as `grant_power` so they persist across respawn and reload; removing a set revokes its grant on the next login/`/reload` unless an origin still supplies the power. **Mobs** receive matching, mob-applicable powers at spawn (`FinalizeSpawnEvent`) — already-spawned mobs pick up changes on respawn/reload rather than live-updating.
- **Parchment scroll buttons.** The origin picker's list rows, the top-right sort button, and the Random / Back / Confirm row now render as parchment scrolls — rolled up at rest, unrolled with a warm glow on hover/selection — drawn with a horizontal 3-slice so the rolled ends never distort at any width. A compact "short" scroll variant is used for the list rows and the sort button so they don't look oversized. Replaces the old flat-fill + outline buttons.
- **Live Essence Evolution progress** now shows on the Origin Info screen — your current kill-count toward the next evolution tier.
- **Themed fonts across the picker.** The bundled Newsreader font (shipped under the OFL) is now applied consistently across screen titles, body text, power names/descriptions, headers, and button labels, instead of only the layer title.
- **In-game creator polish.** The existing in-game `/neoorigins editor` and mob editor pick up the parchment widget/font theming, and raw-JSON fields gained shape-hint placeholders. The editor also gained a per-session tooltip toggle and now tolerates blank item/enchantment rows in `starting_equipment` (skipping the row instead of failing the whole power).
- **Classic-picker accessibility fallback.** A `classic_picker_style` client option swaps the parchment skin for a flat, high-contrast picker for players who find the textured UI hard to read.
- **Named keybind / hotkey support** for pack-defined keybinds.
A browser-based datapack editor, complementing the existing in-game `/neoorigins editor`. New this release:
- **Origin editor** — Identity / Powers / JSON Preview tabs, a schema-driven form engine with live AJV validation, datapack `.zip` **export and import**, class creation (layer + upgrades), localStorage autosave, and an MC-version / `pack_format` toggle.
- **Block (Scratch-style) editing** — an optional Blockly view for building powers visually, with a data-safety guard when switching views.
- **Mob Origin editor** — a full second editor track (Identity / Spawn Rules / Drops / JSON Preview) with its own serializer, `.zip` export/import, and a published `mob_origin.schema.json`.
- **Accessibility — light/dark theme + colorblind palettes** — a theme toggle plus five selectable palettes (default, protanopia, deuteranopia, tritanopia, monochrome) that repaint both the block category colors and the UI accent tokens, with aria labels and screen-reader descriptions throughout.
- **Vanilla item typeahead** — the origin icon field (and other item fields) offer a searchable vanilla-item suggestion list.
- **Load vanilla template** — start from a prebuilt vanilla origin/power as a starting point, picked from a searchable template list, rather than building every draft from scratch.
- **Nested action/condition editing** — recursive ref rows let you build nested action/condition trees, and raw-JSON fields round-trip imported objects correctly (no more `[object Object]`).
- **The origin picker auto-skipped third-party compat layers.** Packs that nest their origins at `data/<ns>/origins/origins/<name>.json` (the Origins-mod nested-id convention) were registered under the prefix-stripped id `<ns>:<name>`, which didn't match the layer's `<ns>:origins/<name>` reference — so the layer resolved to null, reported "nothing here," and the picker skipped straight past it onto the next page. They're now registered under the id the layer actually references, so the layer shows.
- **Picking a class wiped the origin layer's attribute bonuses.** Selecting or changing a class layer used to purge *all* attribute modifiers, dropping things like an origin's bonus max-health. Modifier cleanup is now layer-aware — it only removes a modifier whose source power is no longer active in *any* layer — so origin and class bonuses coexist.
- **Two powers granting the same attribute didn't stack.** Identical attribute grants (e.g. two powers each adding max-health) collided on a shared modifier id and de-duplicated to a single bonus. Each grant now builds a per-power modifier id, so they add up. (See Breaking / Migration Notes — this can change outcomes for packs that relied on the old behavior.)
- **Mage-style block/item prevention fired unconditionally.** `prevent_item_use` / `prevent_block_use` dropped the power-level holder `condition` and only kept the item/block target condition, so prevention applied the moment the power was granted rather than only when its condition was met (the deanos Mage's "can't place blocks unless holding a spell item" gate). The holder condition is now honored.
- **Elytra / natural-glide start delay.** Gliding engaged only after a multi-second delay (and often a second jump press) because the start was gated behind a fall-distance check that stays zero on the way up. The gate is removed; glide now engages on the first jump press.
- **Water-damage config value of `0` now truly disables** water/rain damage (the override was being applied after the value had already been baked in).
- **Water breathing no longer lets the bubble bar drain while submerged.** The power gated on `isUnderWater()`, which also requires the *body* to be in water; on ticks where the body briefly read as out-of-water while the eye stayed under (surface-swimming, currents, edges), vanilla drained a bubble the power didn't refill — visible bar drift with no actual drowning. It now gates on the **eye** being in water, the exact condition under which air depletes, so the bar holds steady.
- **`pack.mcmeta` pack_format corrected to 48** for MC 1.21.1 packs and editor exports.
- **JSON-preview layer-id namespace leak** and **Evolution Path glyph rendering / transparent parchment background** fixed.
- **Projectile `projectile_action` ran on the shooter, not the projectile.** `spawn_projectile` / `fire_projectile` now apply `projectile_action` to the spawned projectile itself (actor = projectile), with `on_hit_action` routed separately to the hit registry — so "set the arrow on fire" affects the arrow, not the caster.
- **Resource HUD bar didn't update on `change_resource` / `set_resource`.** Those actions mutated server-side state only; they now sync to the client so the bar value visibly updates.
- **`active_self` with `continuous: true` fired every tick.** Holding the key now fires every `<cooldown>` ticks as intended, gated behind the declared cooldown instead of once per tick.
- **`give` ignored the Apoli `amount` alias** and always granted a single item; the requested stack size is now honored.
- **Curios-slot umbrellas weren't detected.** A wrong `ICurioStacksHandler` class path (the class moved package in Curios 9.5.1) failed the reflection block and poisoned the whole Curios scan, so umbrellas worn in Curios slots never shielded against sun or rain (only the hand worked). Corrected — Curios-slot umbrellas shield again.
- **The origin picker could strand the player on a nitwit-only layer.** The auto-skip logic no longer skips (or gets stuck on) a layer whose only visible option is Nitwit.
- **Origin-gated recipe conditions** — recipes can be gated on a player's origin.
- **Sort dropdown on the origin selection screen** (re-skinned this release as the parchment scroll button).
- **Config split into CLIENT / SERVER / COMMON specs.** Origin/class enable toggles and the global resource-bar disable moved to a **server** spec, so NeoForge auto-syncs them to connecting clients — server-side origin toggles now correctly apply on remote clients instead of desyncing. Client-only display prefs (hotkey pool size, classic-picker style, show-editor button, hidden HUD bars) moved to a client config.
- **Command-power blacklist (security).** Datapack powers can execute server commands at permission level 2 — an escalation vector (e.g. a power running `/op @s`). A configurable `COMMAND_POWER_BLACKLIST` now guards `execute_command`, `command_along_ray`, `command_at_hit`, and the `command` condition; blocked roots are refused and warned (the guard unwraps `execute … run <cmd>` to the real command token).
- **Per-layer unique origins (server claims).** An optional uniqueness lock: in layers listed under the new `unique_origin_layers` config, an origin can be held by only one player at a time. Includes saved-data + client sync, `/neoorigins claims` / `unlock` admin commands, and pick-time enforcement (the Orb of Origin is **not** consumed on a rejected pick). Creative-mode ops and `/set` bypass the lock and take over the claim.
- **`show_origin_editor` config** — expose the in-game editor button outside Creative mode.
- **`/resource` parity with Apoli** — see Compat Improvements (`has` / `get` / `set` / `change` / `operation`).
- **Powers, actions, and conditions are now self-describing.** Nearly the entire power / action / condition layer was migrated onto registry-backed descriptor tables (`BuiltinPowers` field specs, `BuiltinConditions`, and the action descriptor registry): each type declares its own fields in one place — field name, type (string / enum / number / id / string-list / nested object), whether each is optional, and its default — instead of a hand-maintained dispatch switch. This was the single largest body of work in the release. The author-visible payoffs: `power.schema.json` is now **generated from the same registry the game runs on**, so editor/IDE validation can't silently drift from real behavior; closed-set fields surface as **dropdowns** and string-list fields as proper **list widgets** in both the in-game creator and the web editor; and adding or correcting a type is a single registration rather than parallel edits across the loader, the schema, and the editors.
- `neoorigins:simple` documented in `POWER_TYPES.md` and added to `power.schema.json`.
- `mob_origin.schema.json` published for the mob-origin editor and wired into the IDE-validator mapping.
- Hotkey system, theming, the water-damage gate, and evolution authoring documented.
- **Dual-actor spells, projectile visuals, and the new movement / entity-target / block-target verbs documented** — the new `target_action` retargeting and the `swap_positions` / `teleport_*` / `shear` / `dye` / `force_drop` / `steal_item` / `strip` / `till` / `path` / `grow` / `transform_block` / `block_target_action` verbs are in `ACTIONS.md`, and the data-driven projectile visual fields in `CUSTOM_PROJECTILES.md`.
- **Global Power Sets** documented in the new [`GLOBAL_POWERS.md`](docs/GLOBAL_POWERS.md) pack-author reference (linked from the README).
- **`mob_behavior` and `mount` power types fully documented** in `POWER_TYPES.md` — including the target-goal lifecycle (a `NearestAttackableTargetGoal`, plus a `HurtByTargetGoal` when `retaliate` is set, added on grant and stripped on revoke) and mount consent / dismount-on-revoke behavior.
- **Four new cookbook recipes** in `COOKBOOK.md`: "Arcane bolt" (straight-flying `no_gravity` projectile), "Elemental cast" (one-line fireball / wind bolt), "Hunting predator" (conditional mob aggression for mob origins), and "Beast rider" (mount entities on demand).
- **New [`COMPATIBILITY.md`](docs/COMPATIBILITY.md)** cataloguing every out-of-the-box mod integration (EMI, Jade, The One Probe, FTB Quests/Teams/Ultimine, Accessories, Curios, Vampires Need Umbrellas, Ars Nouveau, Pehkui, Epic Fight, JEI/REI, and the Origins/Apoli/Apugli importer), with honest notes on each integration's caveats and which build it targets. Linked from the docs index.
- **Resource-wildcard limitation documented** in `CONDITIONS.md` and `ACTIONS.md`: the `*:` / `*:*` self-reference wildcard is resolved only for `power_active` toggles and `origins:multiple` sub-powers, never for the `resource` condition or `change_resource` / `set_resource` actions — a `*` there reads as `0` and now warns at load.
- **Theme-template download guide** added to the theme-template README (how to grab just that folder from the repo).
- **Attribution:** `LICENSE` now credits the Apoli / apace100 project for the bundled `resource_bar.png` (MIT).
No hard data-format breaks — existing packs load without edits — but a few of the fixes above correct previously-wrong behavior and can change outcomes:
- **Attribute stacking.** Packs that (knowingly or not) relied on the old de-duplicating behavior will now see two identical attribute grants **stack**. Review any power that double-grants the same attribute.
- **Conditioned prevention.** `prevent_item_use` / `prevent_block_use` now honor the holder `condition`. A pack that leaned on the old unconditional behavior will see prevention fire only when the condition is met.
- **pack_format.** Datapacks/exports generated by older editor builds may need their `pack.mcmeta` corrected to `48` for MC 1.21.1.
- **Config moved between files.** Origin/class enable toggles and the resource-bar disable are now in the **server** config (so they sync to clients); client display prefs (hotkey pool size, classic-picker style, show-editor button, hidden HUD bars) are in the **client** config. Defaults are unchanged, but admins who previously hand-edited these in the common config should set them in their new homes.
- **Command-powers can be blacklisted.** Datapack powers that run server commands now pass through `COMMAND_POWER_BLACKLIST`. The default list blocks obvious escalation roots; a pack that legitimately relies on a blocked command will need it removed from the blacklist.
Huge thanks to our testers on the [Discord](https://discord.gg/Ukph2budfy) for burning through the 2.2 betas — catching the compat edge cases, broken hitboxes, and silently-misbehaving powers that this release fixes.
release
NeoOrigins v2.2.0 (MC 26.1.x)
v2.2.0+26.15 июн. 2026 г.68Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
> This release is a large compatibility + UI pass — a major Origins / Apoli / Apugli compatibility overhaul, first-class integrations with EMI / Jade / The One Probe / FTB Quests / FTB Teams / FTB Ultimine / Accessories, a parchment-scroll UI, a browser-based pack editor, config hardening, and a long list of new powers, actions, and fixes. If you hit a rough edge, please report it on the [GitHub issue tracker](https://github.com/CyberDay1/NeoOrigins/issues).
>
> **Supports:** Minecraft 26.1.x (Java 25) · Minecraft 1.21.1 (Java 21)
The headline of this release is a big jump in **Origins / Apoli / Apugli pack compatibility** — real spell packs (deanos, CrystalWeaver) that previously hit "Unknown power type" or silently no-op'd now load and behave correctly — alongside a parchment-scroll skin for the origin picker and a browser-based pack editor to complement the existing in-game creator.
- **`apoli:` / `apugli:` namespaces are now recognized.** Power types, actions, and conditions declared under the `apoli:` / `apugli:` namespaces are canonicalized to their `origins:` equivalents before dispatch (e.g. `apoli:resource`, `apoli:multiple`, `apoli:and`, `apoli:raycast`, `apoli:change_resource`, `apoli:sneaking`). Previously these fell through to "Unknown power type" even when an identical handler already existed, so modern packs that author in the Apoli namespace lost large chunks of behavior on load.
- **Apoli resource bars render with the real sprite sheet.** Compat resource bars now draw using Apoli's actual `resource_bar.png` art — bar fill selected by `bar_index`, icon by `icon_index` — including a per-power `sprite_location` override so packs that ship a restyled bar sheet render with *their* texture. Native NeoOrigins resources keep the existing color-tinted fill, so nothing regresses. (Apoli's `resource_bar.png` is bundled under its MIT license — see Documentation.)
- **`apoli:modify_velocity` is now supported.** Per-axis modifier on the player's movement each tick, **condition-gated and fail-closed**: if a gating condition can't be parsed the power refuses to compile rather than risk freezing the player (e.g. a resource-gated "stop" effect that would otherwise apply unconditionally).
- **`origins:modify_attribute` now translates** to `neoorigins:attribute_modifier`. (This is the top-level-attribute schema, distinct from `origins:attribute`, which nests the attribute inside each modifier.) Resource-driven dynamic values apply their static base value.
- **Raycast spells gain `before_action` + `command_at_hit`.** `before_action` runs once up front (e.g. consume the offhand reagent) and `command_at_hit` runs a command at the exact impact point. Together with the existing `command_along_ray`, this covers deanos-style projectile and teleport spells.
- **Right-click (`key.use`) active powers now fire.** Apoli `active_self` powers bound to `key.use` — cast by right-clicking with a plain or empty hand, the way most spell packs work — previously never triggered, because the server only saw item-use *animations* (food/bow/shield) and not a plain tap. The server now tracks the right-click tick so these powers cast.
- **Nested bientity actions resolve instead of no-op'ing.** Entity-actions tucked inside a bientity `and` (`add_velocity`, `mount`, `if_else`, `spawn_particles`, …) now run on the actor with the hit entity as context. Genuinely-unknown verbs still warn (and don't double-warn).
- **Plural modifier arrays accepted.** Conditioned `modify_damage_taken` / `modify_damage_dealt` and `modify_xp_gain` now accept Apoli's plural `modifiers` / `amount` forms in addition to the legacy singular fields.
- **Apoli attribute-operation mapping is safer.** The operation mapper now **drops** clamp-style operations that have no vanilla `AttributeModifier` equivalent (`set_base`, `min_total`, `max_total`, …) instead of silently mismapping them onto an unrelated vanilla operation. `modify_attribute` and conditioned-attribute powers skip any non-representable op rather than apply a wrong one.
- **`add_velocity` honors the Apoli `space` transform** (`world` / `local` / `velocity`), so directional knockback/launch verbs push along the intended frame instead of always in world space.
- **Inline Apoli recipes now decode on NeoForge.** `origins:recipe` powers that ship pre-1.20.5 recipe JSON (e.g. Toxophilite's makeshift arrows) are normalized to the 1.21.1 codec shape. Ingredient objects are left in NeoForge's `either(list, object)` form (rewriting them to bare strings made the codec reject every inline recipe); only the `result`'s Apoli `item` key is rewritten to the 1.21.1 `id` key.
- **Iron's Spells damage types match by full id.** Namespaced damage-type ids (e.g. `irons_spellbooks:fire_magic`) now compare on the full registry key in `modify_damage` / `action_on_hit`, so spell-school damage conditions resolve instead of dropping the namespace.
- **The `/resource` command matches Apoli.** Brought to parity with apace100/apoli's `ResourceCommand` — `has` / `get` / `set` / `change` / `operation` subcommands, single-target, "power not granted" errors, vanilla scoreboard feedback messages, correct return values, and resource-name suggestions scoped to the target. A load-time warning is also logged when a `resource` reference (in the condition or `change_resource` / `set_resource`) uses the `*:` self-reference wildcard, which is only resolved for `power_active` and `origins:multiple` — never for resources (see Documentation).
A batch of new out-of-the-box integrations with popular mods. Each is a **soft dependency** — gated behind a mod-list check or reflection, so none of these mods are required and the integration silently no-ops when its mod is absent. The full catalogue lives in the new [`COMPATIBILITY.md`](docs/COMPATIBILITY.md).
- **EMI** *(1.21.1)* — adds an information panel for the Orb of Origin item.
- **Jade / The One Probe** — looking at a player shows their origin in the block/entity tooltip (Jade on both builds; The One Probe on 1.21.1).
- **FTB Quests** — a first-class **"NeoOrigins: Grant Loot Pool"** reward type (set a loot-table id + roll count directly on the quest) *(1.21.1)*, plus a quest-tag route: quests tagged `neoorigins_loot_pool_grant:<table_id>` grant a loot pool on completion (both builds). The tag route now hooks FTBQ's real completion event and grants to every online team member.
- **FTB Teams** — players on an **allied** team (not just the same team) are now trusted for mount consent, so an ally can ride your mountable origin without sending a request.
- **FTB Ultimine** — new zero-config marker power **`neoorigins:ultimine`**. FTB Ultimine's restriction API is deny-only, so the power works by denying vein-mining to non-holders; it stays fully **dormant until at least one `ultimine` power is present in loaded data**, so simply installing both mods never disables vein-mining for everyone.
- **Accessories** *(1.21.1)* — the `equipped_item` condition gains an `accessory` slot value plus an optional `slot_type` to narrow to a named curio/accessory slot; it aggregates equipped stacks from both Curios (reflection) and Accessories (typed).
- **Vampires Need Umbrellas** — holding an umbrella now shields the holder from **both** weather-damage gates: `exposed_to_sun` (sun-burn origins) *and* `in_rain` (rain/water-damage origins like Wet Fur and True Hydrophobia). The umbrella is detected in either hand or any Curios/Accessories slot.
- **`neoorigins:simple`** — new display-only marker power. Does nothing mechanically; it exists to show a `name` + `description` line in the origin info panel (lore, or to describe an effect implemented by another power). Direct equivalent of `origins:simple`; `origins:tooltip` / `apace:tooltip` translate to it as well.
- **`drop_inventory` action** — drops the holder's full inventory as item entities (`throw_randomly` / `retain_ownership` honored).
- **`riding_action` action** — runs an entity-action on the entity the holder is *riding* (the mirror of `passenger_action`).
- **`spawn_particles` action** — server-broadcasts particles from the player's position (count / speed / offset / spread; simple particle types).
- **`hardness` condition** — compares the destroy-hardness of the targeted block, enabling "only affect blocks with hardness ≤ N" style spells.
- **`summon` quantity** — the summon entity-action now takes a `quantity` field.
- **`starting_equipment` multi-item** — accepts a list of item stacks (`stacks`) instead of just one; the legacy singular `item` form still works. Each entry carries full per-item data — `components` (`item[...]`-style data components: custom name, enchantments, custom model data, lore) and a structured `enchantments` list — and a new **`legacy_tag`** field bridges pre-1.21 flat SNBT onto the component system.
- **`tame_mob` owner-aware goals** — tamed-mob aggro/defend goals are split into owner-aware targeting, so a tamed mob defends its owner and won't target them.
- **`spawn_projectile` gains `no_gravity`.** When `true`, the projectile flies dead-straight along its launch vector instead of arcing (drag still applies). Works for *any* projectile entity, not just the magic orb.
- **`selector_action` action** — resolves a vanilla entity selector relative to the holder and runs a bientity-action per selected entity, publishing each as a source-entity context. A nested `fire_projectile` can then fire *from* each selected entity using its position and rotation — the basis of fan-out volleys like Toxophilite's `hyper_multishot`.
- **`fire_projectile` honors Apoli `count` + `tag`.** Non-orb projectiles spawn `count` copies (default 1), and an Apoli `tag` SNBT compound (e.g. `{pickup:1b}`) is applied to each spawned projectile. For the magic orb, `count` keeps its trail-particle meaning.
- **`break_speed_modifier` now respects `block_tag`.** The power advertised a `block_tag` filter but ignored it, scaling mining speed on every block. It is reimplemented through `PlayerEvent.BreakSpeed` (fired client + server so mining prediction matches) and now actually filters by the target block's tag/id — a leading `#` forces tag-only.
A new family of "caster + target" spell building blocks. Previously a projectile's `on_hit_action` always ran on the *shooter*, and `target_action` was a transparent pass-through — so you couldn't write "swap me with the mob I hit" or "shear whatever this orb lands on." These verbs let a spell act on **the entity (or block) on the other side of the interaction**, and the magic-orb projectile is now styled entirely from JSON.
- **`target_action` actually retargets now.** It resolves the entity on the other side of the interaction (hit / hit-by / killed / interacted-with / projectile-struck) and runs the inner entity-action against it, instead of passing through to the holder. A **player** target gets the full entity-action surface; a **non-player mob** gets the entity-general subset (`apply_effect`, `clear_effect`, `damage`, `heal`, `set_on_fire`, `extinguish`, `add_velocity`, `play_sound`, `set_fall_distance`, `dismount`, `swing_hand`). It also works directly as a `neoorigins:`-namespaced action (e.g. inside a projectile `on_hit_action`). `actor_action` is unchanged.
- **Movement verbs.** `swap_positions` atomically swaps the actor and the context target's full transform (position + yaw + pitch) — both transforms are snapshotted before either moves, so they never collapse to one point. `teleport_to_target` moves the actor to the target; `teleport_target_to_self` moves the target to the actor.
- **Entity-target verbs.** `shear` (sheep / mooshroom / snow golem / bogged / any modded `IShearable`), `dye` (`color` — dyeable mobs like sheep), `force_drop` (`slot`, default `mainhand` — makes the target drop a named equipment slot), and `steal_item` (`slot` — transfers the target's item to the actor's inventory). Each works as a projectile `on_hit_action` or wrapped in `target_action`.
- **Block-target verbs.** Spells can now act on the *block* a projectile or raycast impacts: `strip` (logs/wood → stripped, axis-preserving), `till` (grass/dirt → farmland, vanilla hoe rule), `path` (→ dirt path, vanilla shovel rule), `grow` (one bonemeal-style growth tick), and the generic `transform_block` (`to` required, optional `from` guard). `block_target_action` is the block-side analogue of `target_action` for running these explicitly.
- **Area-of-effect fan-out.** `area_of_effect` on impact now applies its inner verb to **every** matching entity in the blast — including the new dual-actor verbs — so "swap / shear / disarm everything in the radius" is a one-liner. Kill credit is now attributed to the casting player for AoE damage.
- **Data-driven projectile visuals.** `spawn_projectile` (magic orb) gains author-controlled visuals: `orb_color` and `glow_color` (RGB `[r,g,b]` 0–255 **or** hex `"#RRGGBB"`), `size`, `glow_size`, `glow_alpha`, `shape` (`cross` / `cube` / `ring` / `sphere` — all four ship), and `trail_particle` (any vanilla particle id, with `count` / `spread` / `trail_speed` tuning). `effect_type` stays as a shorthand that sets sensible defaults; any explicit field overrides it. The original seed request — *a green orb emitting purple particles that swaps the two entities when it hits* — is now fully expressible in JSON.
- **`apoli:global` global power sets are now supported.** A datapack file at `data/<ns>/global_powers/<id>.json` grants a bundle of `powers` to entities **without any origin assignment** — NeoOrigins' port of Apoli's Global Power Set, using the same JSON shape. An optional `entity_types` list may **mix** literal entity ids (`"minecraft:creeper"`) and tag refs (`"#minecraft:skeletons"`) in one array; when absent or empty the set applies to **all** entities. An optional `order` (default `0`, lower applies first) controls apply ordering, and powers referenced by multiple sets are granted once. **Players** receive matching powers on login and on datapack sync (`/reload`), granted through the same dynamic-grant mechanism as `grant_power` so they persist across respawn and reload; removing a set revokes its grant on the next login/`/reload` unless an origin still supplies the power. **Mobs** receive matching, mob-applicable powers at spawn (`FinalizeSpawnEvent`) — already-spawned mobs pick up changes on respawn/reload rather than live-updating.
- **Parchment scroll buttons.** The origin picker's list rows, the top-right sort button, and the Random / Back / Confirm row now render as parchment scrolls — rolled up at rest, unrolled with a warm glow on hover/selection — drawn with a horizontal 3-slice so the rolled ends never distort at any width. A compact "short" scroll variant is used for the list rows and the sort button so they don't look oversized. Replaces the old flat-fill + outline buttons.
- **Live Essence Evolution progress** now shows on the Origin Info screen — your current kill-count toward the next evolution tier.
- **Themed fonts across the picker.** The bundled Newsreader font (shipped under the OFL) is now applied consistently across screen titles, body text, power names/descriptions, headers, and button labels, instead of only the layer title.
- **In-game creator polish.** The existing in-game `/neoorigins editor` and mob editor pick up the parchment widget/font theming, and raw-JSON fields gained shape-hint placeholders. The editor also gained a per-session tooltip toggle and now tolerates blank item/enchantment rows in `starting_equipment` (skipping the row instead of failing the whole power).
- **Classic-picker accessibility fallback.** A `classic_picker_style` client option swaps the parchment skin for a flat, high-contrast picker for players who find the textured UI hard to read.
- **Named keybind / hotkey support** for pack-defined keybinds.
A browser-based datapack editor, complementing the existing in-game `/neoorigins editor`. New this release:
- **Origin editor** — Identity / Powers / JSON Preview tabs, a schema-driven form engine with live AJV validation, datapack `.zip` **export and import**, class creation (layer + upgrades), localStorage autosave, and an MC-version / `pack_format` toggle.
- **Block (Scratch-style) editing** — an optional Blockly view for building powers visually, with a data-safety guard when switching views.
- **Mob Origin editor** — a full second editor track (Identity / Spawn Rules / Drops / JSON Preview) with its own serializer, `.zip` export/import, and a published `mob_origin.schema.json`.
- **Accessibility — light/dark theme + colorblind palettes** — a theme toggle plus five selectable palettes (default, protanopia, deuteranopia, tritanopia, monochrome) that repaint both the block category colors and the UI accent tokens, with aria labels and screen-reader descriptions throughout.
- **Vanilla item typeahead** — the origin icon field (and other item fields) offer a searchable vanilla-item suggestion list.
- **Load vanilla template** — start from a prebuilt vanilla origin/power as a starting point, picked from a searchable template list, rather than building every draft from scratch.
- **Nested action/condition editing** — recursive ref rows let you build nested action/condition trees, and raw-JSON fields round-trip imported objects correctly (no more `[object Object]`).
- **The origin picker auto-skipped third-party compat layers.** Packs that nest their origins at `data/<ns>/origins/origins/<name>.json` (the Origins-mod nested-id convention) were registered under the prefix-stripped id `<ns>:<name>`, which didn't match the layer's `<ns>:origins/<name>` reference — so the layer resolved to null, reported "nothing here," and the picker skipped straight past it onto the next page. They're now registered under the id the layer actually references, so the layer shows.
- **Picking a class wiped the origin layer's attribute bonuses.** Selecting or changing a class layer used to purge *all* attribute modifiers, dropping things like an origin's bonus max-health. Modifier cleanup is now layer-aware — it only removes a modifier whose source power is no longer active in *any* layer — so origin and class bonuses coexist.
- **Two powers granting the same attribute didn't stack.** Identical attribute grants (e.g. two powers each adding max-health) collided on a shared modifier id and de-duplicated to a single bonus. Each grant now builds a per-power modifier id, so they add up. (See Breaking / Migration Notes — this can change outcomes for packs that relied on the old behavior.)
- **Mage-style block/item prevention fired unconditionally.** `prevent_item_use` / `prevent_block_use` dropped the power-level holder `condition` and only kept the item/block target condition, so prevention applied the moment the power was granted rather than only when its condition was met (the deanos Mage's "can't place blocks unless holding a spell item" gate). The holder condition is now honored.
- **Elytra / natural-glide start delay.** Gliding engaged only after a multi-second delay (and often a second jump press) because the start was gated behind a fall-distance check that stays zero on the way up. The gate is removed; glide now engages on the first jump press.
- **Water-damage config value of `0` now truly disables** water/rain damage (the override was being applied after the value had already been baked in).
- **Water breathing no longer lets the bubble bar drain while submerged.** The power gated on `isUnderWater()`, which also requires the *body* to be in water; on ticks where the body briefly read as out-of-water while the eye stayed under (surface-swimming, currents, edges), vanilla drained a bubble the power didn't refill — visible bar drift with no actual drowning. It now gates on the **eye** being in water, the exact condition under which air depletes, so the bar holds steady.
- **`pack.mcmeta` pack_format corrected to 48** for MC 1.21.1 packs and editor exports.
- **JSON-preview layer-id namespace leak** and **Evolution Path glyph rendering / transparent parchment background** fixed.
- **Projectile `projectile_action` ran on the shooter, not the projectile.** `spawn_projectile` / `fire_projectile` now apply `projectile_action` to the spawned projectile itself (actor = projectile), with `on_hit_action` routed separately to the hit registry — so "set the arrow on fire" affects the arrow, not the caster.
- **Resource HUD bar didn't update on `change_resource` / `set_resource`.** Those actions mutated server-side state only; they now sync to the client so the bar value visibly updates.
- **`active_self` with `continuous: true` fired every tick.** Holding the key now fires every `<cooldown>` ticks as intended, gated behind the declared cooldown instead of once per tick.
- **`give` ignored the Apoli `amount` alias** and always granted a single item; the requested stack size is now honored.
- **Curios-slot umbrellas weren't detected.** A wrong `ICurioStacksHandler` class path (the class moved package in Curios 9.5.1) failed the reflection block and poisoned the whole Curios scan, so umbrellas worn in Curios slots never shielded against sun or rain (only the hand worked). Corrected — Curios-slot umbrellas shield again.
- **The origin picker could strand the player on a nitwit-only layer.** The auto-skip logic no longer skips (or gets stuck on) a layer whose only visible option is Nitwit.
- **Origin-gated recipe conditions** — recipes can be gated on a player's origin.
- **Sort dropdown on the origin selection screen** (re-skinned this release as the parchment scroll button).
- **Config split into CLIENT / SERVER / COMMON specs.** Origin/class enable toggles and the global resource-bar disable moved to a **server** spec, so NeoForge auto-syncs them to connecting clients — server-side origin toggles now correctly apply on remote clients instead of desyncing. Client-only display prefs (hotkey pool size, classic-picker style, show-editor button, hidden HUD bars) moved to a client config.
- **Command-power blacklist (security).** Datapack powers can execute server commands at permission level 2 — an escalation vector (e.g. a power running `/op @s`). A configurable `COMMAND_POWER_BLACKLIST` now guards `execute_command`, `command_along_ray`, `command_at_hit`, and the `command` condition; blocked roots are refused and warned (the guard unwraps `execute … run <cmd>` to the real command token).
- **Per-layer unique origins (server claims).** An optional uniqueness lock: in layers listed under the new `unique_origin_layers` config, an origin can be held by only one player at a time. Includes saved-data + client sync, `/neoorigins claims` / `unlock` admin commands, and pick-time enforcement (the Orb of Origin is **not** consumed on a rejected pick). Creative-mode ops and `/set` bypass the lock and take over the claim.
- **`show_origin_editor` config** — expose the in-game editor button outside Creative mode.
- **`/resource` parity with Apoli** — see Compat Improvements (`has` / `get` / `set` / `change` / `operation`).
- **Powers, actions, and conditions are now self-describing.** Nearly the entire power / action / condition layer was migrated onto registry-backed descriptor tables (`BuiltinPowers` field specs, `BuiltinConditions`, and the action descriptor registry): each type declares its own fields in one place — field name, type (string / enum / number / id / string-list / nested object), whether each is optional, and its default — instead of a hand-maintained dispatch switch. This was the single largest body of work in the release. The author-visible payoffs: `power.schema.json` is now **generated from the same registry the game runs on**, so editor/IDE validation can't silently drift from real behavior; closed-set fields surface as **dropdowns** and string-list fields as proper **list widgets** in both the in-game creator and the web editor; and adding or correcting a type is a single registration rather than parallel edits across the loader, the schema, and the editors.
- `neoorigins:simple` documented in `POWER_TYPES.md` and added to `power.schema.json`.
- `mob_origin.schema.json` published for the mob-origin editor and wired into the IDE-validator mapping.
- Hotkey system, theming, the water-damage gate, and evolution authoring documented.
- **Dual-actor spells, projectile visuals, and the new movement / entity-target / block-target verbs documented** — the new `target_action` retargeting and the `swap_positions` / `teleport_*` / `shear` / `dye` / `force_drop` / `steal_item` / `strip` / `till` / `path` / `grow` / `transform_block` / `block_target_action` verbs are in `ACTIONS.md`, and the data-driven projectile visual fields in `CUSTOM_PROJECTILES.md`.
- **Global Power Sets** documented in the new [`GLOBAL_POWERS.md`](docs/GLOBAL_POWERS.md) pack-author reference (linked from the README).
- **`mob_behavior` and `mount` power types fully documented** in `POWER_TYPES.md` — including the target-goal lifecycle (a `NearestAttackableTargetGoal`, plus a `HurtByTargetGoal` when `retaliate` is set, added on grant and stripped on revoke) and mount consent / dismount-on-revoke behavior.
- **Four new cookbook recipes** in `COOKBOOK.md`: "Arcane bolt" (straight-flying `no_gravity` projectile), "Elemental cast" (one-line fireball / wind bolt), "Hunting predator" (conditional mob aggression for mob origins), and "Beast rider" (mount entities on demand).
- **New [`COMPATIBILITY.md`](docs/COMPATIBILITY.md)** cataloguing every out-of-the-box mod integration (EMI, Jade, The One Probe, FTB Quests/Teams/Ultimine, Accessories, Curios, Vampires Need Umbrellas, Ars Nouveau, Pehkui, Epic Fight, JEI/REI, and the Origins/Apoli/Apugli importer), with honest notes on each integration's caveats and which build it targets. Linked from the docs index.
- **Resource-wildcard limitation documented** in `CONDITIONS.md` and `ACTIONS.md`: the `*:` / `*:*` self-reference wildcard is resolved only for `power_active` toggles and `origins:multiple` sub-powers, never for the `resource` condition or `change_resource` / `set_resource` actions — a `*` there reads as `0` and now warns at load.
- **Theme-template download guide** added to the theme-template README (how to grab just that folder from the repo).
- **Attribution:** `LICENSE` now credits the Apoli / apace100 project for the bundled `resource_bar.png` (MIT).
No hard data-format breaks — existing packs load without edits — but a few of the fixes above correct previously-wrong behavior and can change outcomes:
- **Attribute stacking.** Packs that (knowingly or not) relied on the old de-duplicating behavior will now see two identical attribute grants **stack**. Review any power that double-grants the same attribute.
- **Conditioned prevention.** `prevent_item_use` / `prevent_block_use` now honor the holder `condition`. A pack that leaned on the old unconditional behavior will see prevention fire only when the condition is met.
- **pack_format.** Datapacks/exports generated by older editor builds may need their `pack.mcmeta` corrected to `48` for MC 1.21.1.
- **Config moved between files.** Origin/class enable toggles and the resource-bar disable are now in the **server** config (so they sync to clients); client display prefs (hotkey pool size, classic-picker style, show-editor button, hidden HUD bars) are in the **client** config. Defaults are unchanged, but admins who previously hand-edited these in the common config should set them in their new homes.
- **Command-powers can be blacklisted.** Datapack powers that run server commands now pass through `COMMAND_POWER_BLACKLIST`. The default list blocks obvious escalation roots; a pack that legitimately relies on a blocked command will need it removed from the blacklist.
Huge thanks to our testers on the [Discord](https://discord.gg/Ukph2budfy) for burning through the 2.2 betas — catching the compat edge cases, broken hitboxes, and silently-misbehaving powers that this release fixes.
release
NeoOrigins v2.1.5 (MC 1.21.1)
v2.1.5+1.21.127 мая 2026 г.5,6 тыс.Minecraft: 1.21.1neoforge
Что нового
### Bug Fixes
- **Cook crafted/smelted food spiraled to absurd saturation values.**
`rebuildFood` was calling `FoodProperties.Builder#saturationModifier(float)`
with what it thought was an absolute saturation value, but that
setter stores a *multiplier* — `build()` then ran it through
`FoodConstants.saturationByModifier(nutrition, modifier)` which
returns `nutrition * modifier * 2.0`. Each Cook (and Smoking Expert)
pass fed the previous already-blown-up saturation back through the
multiplier; Mollan reported cooked steak coming out with 2639
saturation. The helper now constructs the `FoodProperties` record
directly so the `saturation` parameter remains a literal absolute
value, matching Apoli/Origins semantics. On 26.1 the rebuild also
drops `eatSeconds`/`usingConvertsTo`/`effects` overrides — those
moved out of `FoodProperties` to the `Consumable` data component
in 26.1, and leaving the original `Consumable` untouched on the
stack is the correct preservation path. Resolves GitHub #95.
- **Voidwalker (and other Route B resource bars) vanished on relog,
blocking abilities that gate on `cur > 0`.** `f1c492fe` already
fixed `onLogin` so it no longer reset the stored value back to
`start_value` — but two residual problems remained:
(1) On 1.21.1 the `RESOURCE_STATE` attachment was missing
`.copyOnDeath()`, so any respawn wiped the saved value entirely
(master had it; 2.1 didn't).
(2) `onLogin` re-registered the resource *meta* but didn't seed the
*state* entry when none existed, so `syncResourcesToClient`
iterates `state.getAll()` and skipped the bar entirely — symptom
was "energy bar disappeared, abilities won't fire because cur=0".
Added `.copyOnDeath()` to the 1.21.1 attachment and a state-seed
step in `ResourcePower#onLogin` that writes `start_value` only when
no entry is present (existing values are preserved). Resolves
GitHub #90.
- **`tamed_animal_boost` granted a permanent attribute modifier that
outlived the source mob.** The boost modifier was applied once on
tame and never cleaned up, so once a player tamed enough mobs they
effectively kept the stacked bonus forever — even after every
tamed mob died or despawned. The modifier is now recomputed each
tick against the current owned-mob count and removed when that
count drops to zero.
- **`persistent_effect` `show_icon` / `show_particles` / `ambient`
were ignored when set at the power root.** Pack authors writing
the convenience top-level form `{ "type":
"neoorigins:persistent_effect", "effect": "...", "show_icon":
false }` got the HUD icon anyway, because those fields were only
read off each `EffectSpec` and the root-level values were dropped.
Top-level `show_icon`, `show_particles`, and `ambient` now cascade
as defaults onto every nested `EffectSpec` that doesn't declare
its own value.
- **`tame_mob` couldn't tame non-hostile mobs.** The target check
required `Enemy`, so packs that wanted a generalized "tame any
creature" power (animals, golems, villagers) had no JSON knob.
Added `hostile_only` (default `true`, preserving the existing
Monster Tamer feel); set `hostile_only: false` to allow taming
any non-player `Mob`. Boss rejection via `canUsePortal` is
unchanged.
- **`breath_in_fluid`'s only drain knob (`drain_rate`) read as
"speed" but was actually "ticks between decrements", confusing
pack authors.** Added two more intuitive aliases:
`air_loss_per_second` (higher = faster drain, internally converted
to `20 / value` ticks) and `drain_interval_ticks` (the literal
meaning of the original field). Resolution priority is
`air_loss_per_second` > `drain_interval_ticks` > `drain_rate` >
default `20`. Existing packs using `drain_rate` keep working
unchanged.
release
NeoOrigins v2.1.5 (MC 26.1.x)
v2.1.5+26.127 мая 2026 г.155Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
### Bug Fixes
- **Cook crafted/smelted food spiraled to absurd saturation values.**
`rebuildFood` was calling `FoodProperties.Builder#saturationModifier(float)`
with what it thought was an absolute saturation value, but that
setter stores a *multiplier* — `build()` then ran it through
`FoodConstants.saturationByModifier(nutrition, modifier)` which
returns `nutrition * modifier * 2.0`. Each Cook (and Smoking Expert)
pass fed the previous already-blown-up saturation back through the
multiplier; Mollan reported cooked steak coming out with 2639
saturation. The helper now constructs the `FoodProperties` record
directly so the `saturation` parameter remains a literal absolute
value, matching Apoli/Origins semantics. On 26.1 the rebuild also
drops `eatSeconds`/`usingConvertsTo`/`effects` overrides — those
moved out of `FoodProperties` to the `Consumable` data component
in 26.1, and leaving the original `Consumable` untouched on the
stack is the correct preservation path. Resolves GitHub #95.
- **Voidwalker (and other Route B resource bars) vanished on relog,
blocking abilities that gate on `cur > 0`.** `f1c492fe` already
fixed `onLogin` so it no longer reset the stored value back to
`start_value` — but two residual problems remained:
(1) On 1.21.1 the `RESOURCE_STATE` attachment was missing
`.copyOnDeath()`, so any respawn wiped the saved value entirely
(master had it; 2.1 didn't).
(2) `onLogin` re-registered the resource *meta* but didn't seed the
*state* entry when none existed, so `syncResourcesToClient`
iterates `state.getAll()` and skipped the bar entirely — symptom
was "energy bar disappeared, abilities won't fire because cur=0".
Added `.copyOnDeath()` to the 1.21.1 attachment and a state-seed
step in `ResourcePower#onLogin` that writes `start_value` only when
no entry is present (existing values are preserved). Resolves
GitHub #90.
- **`tamed_animal_boost` granted a permanent attribute modifier that
outlived the source mob.** The boost modifier was applied once on
tame and never cleaned up, so once a player tamed enough mobs they
effectively kept the stacked bonus forever — even after every
tamed mob died or despawned. The modifier is now recomputed each
tick against the current owned-mob count and removed when that
count drops to zero.
- **`persistent_effect` `show_icon` / `show_particles` / `ambient`
were ignored when set at the power root.** Pack authors writing
the convenience top-level form `{ "type":
"neoorigins:persistent_effect", "effect": "...", "show_icon":
false }` got the HUD icon anyway, because those fields were only
read off each `EffectSpec` and the root-level values were dropped.
Top-level `show_icon`, `show_particles`, and `ambient` now cascade
as defaults onto every nested `EffectSpec` that doesn't declare
its own value.
- **`tame_mob` couldn't tame non-hostile mobs.** The target check
required `Enemy`, so packs that wanted a generalized "tame any
creature" power (animals, golems, villagers) had no JSON knob.
Added `hostile_only` (default `true`, preserving the existing
Monster Tamer feel); set `hostile_only: false` to allow taming
any non-player `Mob`. Boss rejection via `canUsePortal` is
unchanged.
- **`breath_in_fluid`'s only drain knob (`drain_rate`) read as
"speed" but was actually "ticks between decrements", confusing
pack authors.** Added two more intuitive aliases:
`air_loss_per_second` (higher = faster drain, internally converted
to `20 / value` ticks) and `drain_interval_ticks` (the literal
meaning of the original field). Resolution priority is
`air_loss_per_second` > `drain_interval_ticks` > `drain_rate` >
default `20`. Existing packs using `drain_rate` keep working
unchanged.
release
NeoOrigins v2.1.4 (MC 1.21.1)
v2.1.4+1.21.126 мая 2026 г.726Minecraft: 1.21.1neoforge
Что нового
### Bug Fixes
- **`origins:exhaust` drained hunger ~268× the intended amount.** The
legacy compat translator routed `origins:exhaust` to a Route A food
modifier with `op: "set"`, and `ModifyFoodRegistry` re-applies that
modifier on every food refill — so each bite of food re-stamped the
exhaustion value instead of ticking it once per interval. Moved to
Route B (`parseExhaust`): ticks `player.causeFoodExhaustion(amount)`
on a hashed offset of the configured `interval` so the cost lands
exactly once per period regardless of food intake. `condition` block
honored. Accepts both `exhaustion` and `amount` for the field name.
- **`effect_immunity` ids without a namespace silently mismatched the
effect registry.** Pack authors writing `"wither"` (Apoli-style
unqualified id) didn't equal `MobEffect`'s registered
`"minecraft:wither"`, so the immunity check looked up the wrong key
and the player still took the effect. `translateEffectImmunity` now
routes every id through a `canonicalizeEffectId` helper that prepends
`minecraft:` when the namespace is missing.
- **`origins:self_action_when_hit` ignored `bientity_action`, `cooldown`,
and `condition`.** The Route B parser only parsed `entity_action`,
so packs porting Apoli's `bientity_action` shape (where the action
needs the attacker reference) silently lost their behavior, and the
cooldown/condition gates were dropped. New
`BiEntityAction` + `BiEntityActionParser` covers `damage`,
`add_velocity`, `apply_mob_effect`, `set_on_fire`, and `invert`.
`parseSelfActionWhenHit` now wires cooldown + condition;
`CombatPowerEvents` publishes the active `HitTakenContext` to
`ActionContextHolder` around the `onHit` dispatch so the bi-entity
lambda can resolve `target = source.getEntity()` without re-traversing
the event.
- **`origins:modify_jump`'s `entity_action` was parsed but never fired.**
The field was read into a local variable and immediately thrown
away — so Apoli-style jump-velocity boosts, "explode on jump", or
any other configured action silently no-op'd, leaving the power as
a plain attribute modifier. New `JumpActionRegistry` stores the
parsed action on grant; `JumpEventHandler` fires it from
`LivingJumpEvent` (server players only). Cleaned up on logout and
on power revoke.
- **`origins:recipe` couldn't carry an inline recipe body** (1.21.1 only).
Pack authors had to ship a separate `data/<ns>/recipe/...json` file
even when the recipe was Origins-specific and only used by one
power. `parseRecipe` now also accepts an inline JSON object in
the `recipe` field; `InlineRecipeRegistry` collects pending bodies
during the datapack reload and injects them via
`RecipeManager#replaceRecipes` on `OnDatapackSyncEvent`. Caveat:
the resulting recipe is globally craftable — the inline form only
controls recipe-book visibility, not the craft gate. The 26.1 jar
doesn't ship this: `RecipeManager` on 26.1 stores recipes in an
immutable `RecipeMap` with no `replaceRecipes` hook, so inline
bodies log a one-shot warning and are skipped there. String-id
pointers in the `recipe` field continue to work on both branches.
- **`PreventActionPower`'s SWIM and ELYTRA enforcement was a no-op.**
Holder dispatch fires from `PlayerLifecycleEvents.onPlayerTick` on
the `.Pre` phase, but vanilla's `LivingEntity#travel()` and
swim-flag update run *after* the .Pre tick the same frame and
overwrite anything we reset — so Earth Mage's "can't swim" ability
was setting `swimming = false` only to have vanilla immediately set
it back to true. Moved SWIM/ELYTRA enforcement out of `onTick` into
a new `PreventActionPostTickHandler` subscribed to
`PlayerTickEvent.Post`, which runs after vanilla physics. FIRE
fire-tick clearing stays on `onTick` since it's not state vanilla
touches the same tick.
- **Compat raycast lacked `shape_type` and along-ray actions** (1.21.1
only). `parseRaycast` only supported a point-hit `command`/
`entity_action`/`block_action` triple — packs that wanted to scan
voxel space (e.g. fire-along-ray, glow-trace) had no way to express
it. Added `shape_type` (`collider` / `visual` / `outline`) to
control the clip mode, plus `command_along_ray` + `command_step`
that walks the ray in `command_step`-block increments executing the
command at each step, breaking on the first command exception.
Master/26.1 doesn't have `parseRaycast` at all and isn't a hotfix
scope — the along-ray feature will land there as part of the next
raycast backport.
release
NeoOrigins v2.1.4 (MC 26.1.x)
v2.1.4+26.126 мая 2026 г.29Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
### Bug Fixes
- **`origins:exhaust` drained hunger ~268× the intended amount.** The
legacy compat translator routed `origins:exhaust` to a Route A food
modifier with `op: "set"`, and `ModifyFoodRegistry` re-applies that
modifier on every food refill — so each bite of food re-stamped the
exhaustion value instead of ticking it once per interval. Moved to
Route B (`parseExhaust`): ticks `player.causeFoodExhaustion(amount)`
on a hashed offset of the configured `interval` so the cost lands
exactly once per period regardless of food intake. `condition` block
honored. Accepts both `exhaustion` and `amount` for the field name.
- **`effect_immunity` ids without a namespace silently mismatched the
effect registry.** Pack authors writing `"wither"` (Apoli-style
unqualified id) didn't equal `MobEffect`'s registered
`"minecraft:wither"`, so the immunity check looked up the wrong key
and the player still took the effect. `translateEffectImmunity` now
routes every id through a `canonicalizeEffectId` helper that prepends
`minecraft:` when the namespace is missing.
- **`origins:self_action_when_hit` ignored `bientity_action`, `cooldown`,
and `condition`.** The Route B parser only parsed `entity_action`,
so packs porting Apoli's `bientity_action` shape (where the action
needs the attacker reference) silently lost their behavior, and the
cooldown/condition gates were dropped. New
`BiEntityAction` + `BiEntityActionParser` covers `damage`,
`add_velocity`, `apply_mob_effect`, `set_on_fire`, and `invert`.
`parseSelfActionWhenHit` now wires cooldown + condition;
`CombatPowerEvents` publishes the active `HitTakenContext` to
`ActionContextHolder` around the `onHit` dispatch so the bi-entity
lambda can resolve `target = source.getEntity()` without re-traversing
the event.
- **`origins:modify_jump`'s `entity_action` was parsed but never fired.**
The field was read into a local variable and immediately thrown
away — so Apoli-style jump-velocity boosts, "explode on jump", or
any other configured action silently no-op'd, leaving the power as
a plain attribute modifier. New `JumpActionRegistry` stores the
parsed action on grant; `JumpEventHandler` fires it from
`LivingJumpEvent` (server players only). Cleaned up on logout and
on power revoke.
- **`origins:recipe` couldn't carry an inline recipe body** (1.21.1 only).
Pack authors had to ship a separate `data/<ns>/recipe/...json` file
even when the recipe was Origins-specific and only used by one
power. `parseRecipe` now also accepts an inline JSON object in
the `recipe` field; `InlineRecipeRegistry` collects pending bodies
during the datapack reload and injects them via
`RecipeManager#replaceRecipes` on `OnDatapackSyncEvent`. Caveat:
the resulting recipe is globally craftable — the inline form only
controls recipe-book visibility, not the craft gate. The 26.1 jar
doesn't ship this: `RecipeManager` on 26.1 stores recipes in an
immutable `RecipeMap` with no `replaceRecipes` hook, so inline
bodies log a one-shot warning and are skipped there. String-id
pointers in the `recipe` field continue to work on both branches.
- **`PreventActionPower`'s SWIM and ELYTRA enforcement was a no-op.**
Holder dispatch fires from `PlayerLifecycleEvents.onPlayerTick` on
the `.Pre` phase, but vanilla's `LivingEntity#travel()` and
swim-flag update run *after* the .Pre tick the same frame and
overwrite anything we reset — so Earth Mage's "can't swim" ability
was setting `swimming = false` only to have vanilla immediately set
it back to true. Moved SWIM/ELYTRA enforcement out of `onTick` into
a new `PreventActionPostTickHandler` subscribed to
`PlayerTickEvent.Post`, which runs after vanilla physics. FIRE
fire-tick clearing stays on `onTick` since it's not state vanilla
touches the same tick.
- **Compat raycast lacked `shape_type` and along-ray actions** (1.21.1
only). `parseRaycast` only supported a point-hit `command`/
`entity_action`/`block_action` triple — packs that wanted to scan
voxel space (e.g. fire-along-ray, glow-trace) had no way to express
it. Added `shape_type` (`collider` / `visual` / `outline`) to
control the clip mode, plus `command_along_ray` + `command_step`
that walks the ray in `command_step`-block increments executing the
command at each step, breaking on the first command exception.
Master/26.1 doesn't have `parseRaycast` at all and isn't a hotfix
scope — the along-ray feature will land there as part of the next
raycast backport.
release
NeoOrigins v2.1.3 (MC 1.21.1)
v2.1.3+1.21.125 мая 2026 г.263Minecraft: 1.21.1neoforge
Что нового
## NeoOrigins v2.1.3
Built for **Minecraft 26.1 / 26.1.1 / 26.1.2** and **1.21.1** with **NeoForge**.
## v2.1.3
### Bug Fixes
- **`origins:set_resource` action was a silent no-op.** The legacy
compat layer rewrote `origins:set_resource` to
`neoorigins:set_resource` but the action dispatcher had no arm
for it, so packs porting from Origins++ saw the action listed
as "unknown" with no effect. Wired the dispatch arm to read
`resource` + `value` (or fallback `change`) and write through
`CompatAttachments.resourceState()`. Same commit aliases
`xp_levels` to the existing `xp_level` condition (Apoli's
plural form) and adds a new `saturation_level` entity condition
reading `FoodData.getSaturationLevel()`.
- **`origins:flame_particles` failed codec validation.** Route B's
WELL_KNOWN synth emitted a fieldless `neoorigins:particle` stub
and `ParticlePower.CODEC` rejected the entry with
`particle: missing or unknown 'particle' field`, dropping the
whole power. Synth now passes `minecraft:flame` as the default
particle id so legacy `flame_particles` references load.
- **Legacy `forge:` attribute ids resolved to nothing on
NeoForge.** Packs authored against Forge-era Origins++ pinned
attributes like `forge:generic.entity_reach`, which NeoForge
re-registered under `neoforge:entity_reach`.
`AttributeModifierPower.resolveAttribute` now retries any
unresolved `forge:*` id under the `neoforge:` namespace with
`generic.` / `player.` prefix permutations, so existing packs
don't need to be rewritten.
- **Origin layer screens displayed the raw layer id** instead of
the layer JSON's `name` field. `OriginInfoScreen.getLayerDisplayName`
and `OriginEditorScreen.drawLayerLabels` both fell back to the
translation key / capitalized path even when the layer had a
populated `name`. Both screens now read `layer.name()` first,
only falling back to the translation key / prettified path if
blank.
- **Warding Presence ignored its toggle.** The spawn-cancel
handler used `forEachOfType`, which doesn't consult
`AbstractTogglePower.isToggledOff` — turning the power off in
the HUD still suppressed mob spawns. New
`forEachOfTypeActive` helper on `ActiveOriginService` gates
toggleable powers; event handlers reading toggle-style powers
must use it. (Only `onTick` honors the toggle automatically.)
- **Warding Presence was a no-op for monsters at the default
radius.** The power's radius default was 24, at or below
vanilla's `MobCategory.MONSTER` 24-block player-distance
spawn rule — so monsters were already blocked by vanilla
and the power did nothing for the case authors actually
wanted. Stoneguard's JSON now sets radius 36 explicitly; the
code default stays at 24 to force pack authors to opt in to
a meaningful radius.
- **`longer_potions` didn't extend the first dose.**
`MobEffectEvent.Added` fires *before* vanilla
`LivingEntity#addEffect` inserts the instance into
`activeEffects`. The old handler re-called `sp.addEffect(extended)`
from inside the event; the nested put ran first, then the
outer vanilla put overwrote with the original un-extended
instance. Net result: first dose looked normal, subsequent
doses extended correctly via the merge path. Now mutates the
incoming `MobEffectInstance` via `update()` so vanilla's
subsequent put sees the already-extended values.
- **Cook food bonus stripped `eatSeconds`, consume effects, and
`usingConvertsTo`** (1.21.1 only). The bonus rebuilt
`FoodProperties` through `FoodProperties.Builder`, which only
exposes nutrition / saturation / `canAlwaysEat` — so suspicious
stew lost its random potion effect when boosted, golden apple
lost regen, bowls/bottles no longer returned an empty container.
New `rebuildFood()` helper goes through the builder for the
bonus fields then constructs the record directly to copy the
remaining fields through unchanged. **Wayfarer's smoker bonus
(`MoreSmokerXpPower`) gets the same treatment**, and re-reads
the FOOD component before rebuilding so it stacks cleanly on
top of Cook's earlier rebuild when a player has both. The bug
is 1.21.1-specific: 26.1's `FoodProperties` record no longer
carries `eatSeconds` / `usingConvertsTo` / `effects` (Mojang
moved them to `DataComponents.CONSUMABLE` and
`DataComponents.USE_REMAINDER`), so the boost path never
touches them and the original symptom can't reproduce.
- **`MobsIgnorePlayer` had no way to disable retaliation.** By
default the power lets vanilla's `getLastHurtByMob()` window
apply — once the player hits an "ignoring" mob, the mob is
allowed to target back briefly so combat feedback loops still
work. Pack authors who wanted true peace (Bonewalker, druidic
neutrality, etc.) had no knob to turn that off. New
`passive: true` config flag bypasses the retaliation window
so the mob never targets the player even if attacked first.
Default `false` keeps existing pack behavior intact.
- **`[CompatB]` parser warnings deduped per reload.** Pack-port
sessions were dumping hundreds of `WARN` lines during datapack
load — one per occurrence of every unsupported
action/condition/modifier op. One porting log had 268 such
lines (22% of bootup output) that collapsed into 6 unique
action types + 4 unique condition types. New
`CompatWarningCollector` batches parser-side warnings
(unsupported actions / conditions / item-actions /
item-conditions, modifier defaults, parse errors, malformed
SNBT, per-power compile failures) during a session held open
by `OriginsCompatPowerLoader.apply()`, then emits one sorted
summary block at the end. Outside a session each `record*`
call falls back to immediate `LOGGER.warn`. Wrapped in
try/finally so a mid-reload throw can't leak the session.
- **Dropped orphaned lang keys** (`skeleton_apex_hp`,
`skeleton_rattling`, `merling_no_drowning`) with no power JSON
or origin reference, and broadened the stamina power
description across all 10 pools from "Physical energy for
powerful attacks." to "Physical reserves spent on active
abilities." (The old line lied for Stoneguard (utility-only)
and Shulk (CC + mobility) and was misleadingly narrow for the
rest.)
- **Caveborn / Skeleton edible-power JSONs ate without hunger
gating.** The six `EdibleItemPower` configs for stone, iron,
gold, diamond, netherite, and bone meal shipped with
`always_edible: true`, so the hunger check at
`InteractionPowerEvents.java:115` short-circuited and the
right-click animation fired even at a full food bar — players
could spam-eat the mineral indefinitely. Flipped to `false` on
all six. The codec default in `EdibleItemPower.java` stays
`true` so external packs that omit the field keep their
current behavior.
- **Caveborn mineral effects (haste / speed / luck / strength +
resistance) never applied after eating off-tier minerals.**
The 4 `caveborn_*_bonus` powers listened on
`event: item_use_finish`, but `food_item_in_tag` reads the
dispatch context as a `FoodContext`. Per
`InteractionPowerEvents.java:172–177`, `ITEM_USE_FINISH`
dispatches the raw `ItemStack`; only `FOOD_FINISHED` wraps it
in `FoodContext`. The cast failed silently so the `if_else`
action took the noop branch and no status indicator appeared.
Switched all 4 to `food_finished`, matching the working
`aquatic_fish_diet_bonus` template.
### Documentation
- New `docs/ORIGINS.md` — per-origin reference covering every
default origin and its evolution tree. Each entry has impact
rating, icon, spawn behavior (where applicable), base-power
list with one-line glosses, and a tier-delta table for the
evolution path. Catalogues all 49 non-class origins.
- `docs/POWER_TYPES.md` and `field_docs.json` aligned with the
new `no_mob_spawns_nearby` 24-block code default. The old
docs advertised 48 and used a 48-block example; now reflect
the 24 default, call out the vanilla 24-block cutoff, and use
a 36-block example matching Stoneguard's own JSON.
- `MobsIgnorePlayer` field docs updated to add the `passive` row
+ an example combining `#tag` syntax with `passive`, and to
clarify that `entity_types` already accepts `#tag` references
and that an empty list matches every mob (both were true
before but undocumented).
### Installation
Download the JAR matching your Minecraft version and drop it into your `mods/` folder.
- `neoorigins-2.1.3+26.1.jar` — for MC 26.1, 26.1.1, and 26.1.2
- `neoorigins-2.1.1+1.21.1.jar` — for MC 1.21.1
### Origins Compatibility
Drop Origins mod content packs (`.jar`, `.zip`, or folder) into the `originpacks/` folder in your game directory.
release
NeoOrigins v2.1.3 (MC 1.21.1)
v2.1.3+1.21.125 мая 2026 г.604Minecraft: 1.21.1neoforge
Что нового
## v2.1.3
### Bug Fixes
- **`origins:set_resource` action was a silent no-op.** The legacy
compat layer rewrote `origins:set_resource` to
`neoorigins:set_resource` but the action dispatcher had no arm
for it, so packs porting from Origins++ saw the action listed
as "unknown" with no effect. Wired the dispatch arm to read
`resource` + `value` (or fallback `change`) and write through
`CompatAttachments.resourceState()`. Same commit aliases
`xp_levels` to the existing `xp_level` condition (Apoli's
plural form) and adds a new `saturation_level` entity condition
reading `FoodData.getSaturationLevel()`.
- **`origins:flame_particles` failed codec validation.** Route B's
WELL_KNOWN synth emitted a fieldless `neoorigins:particle` stub
and `ParticlePower.CODEC` rejected the entry with
`particle: missing or unknown 'particle' field`, dropping the
whole power. Synth now passes `minecraft:flame` as the default
particle id so legacy `flame_particles` references load.
- **Legacy `forge:` attribute ids resolved to nothing on
NeoForge.** Packs authored against Forge-era Origins++ pinned
attributes like `forge:generic.entity_reach`, which NeoForge
re-registered under `neoforge:entity_reach`.
`AttributeModifierPower.resolveAttribute` now retries any
unresolved `forge:*` id under the `neoforge:` namespace with
`generic.` / `player.` prefix permutations, so existing packs
don't need to be rewritten.
- **Origin layer screens displayed the raw layer id** instead of
the layer JSON's `name` field. `OriginInfoScreen.getLayerDisplayName`
and `OriginEditorScreen.drawLayerLabels` both fell back to the
translation key / capitalized path even when the layer had a
populated `name`. Both screens now read `layer.name()` first,
only falling back to the translation key / prettified path if
blank.
- **Warding Presence ignored its toggle.** The spawn-cancel
handler used `forEachOfType`, which doesn't consult
`AbstractTogglePower.isToggledOff` — turning the power off in
the HUD still suppressed mob spawns. New
`forEachOfTypeActive` helper on `ActiveOriginService` gates
toggleable powers; event handlers reading toggle-style powers
must use it. (Only `onTick` honors the toggle automatically.)
- **Warding Presence was a no-op for monsters at the default
radius.** The power's radius default was 24, at or below
vanilla's `MobCategory.MONSTER` 24-block player-distance
spawn rule — so monsters were already blocked by vanilla
and the power did nothing for the case authors actually
wanted. Stoneguard's JSON now sets radius 36 explicitly; the
code default stays at 24 to force pack authors to opt in to
a meaningful radius.
- **`longer_potions` didn't extend the first dose.**
`MobEffectEvent.Added` fires *before* vanilla
`LivingEntity#addEffect` inserts the instance into
`activeEffects`. The old handler re-called `sp.addEffect(extended)`
from inside the event; the nested put ran first, then the
outer vanilla put overwrote with the original un-extended
instance. Net result: first dose looked normal, subsequent
doses extended correctly via the merge path. Now mutates the
incoming `MobEffectInstance` via `update()` so vanilla's
subsequent put sees the already-extended values.
- **Cook food bonus stripped `eatSeconds`, consume effects, and
`usingConvertsTo`** (1.21.1 only). The bonus rebuilt
`FoodProperties` through `FoodProperties.Builder`, which only
exposes nutrition / saturation / `canAlwaysEat` — so suspicious
stew lost its random potion effect when boosted, golden apple
lost regen, bowls/bottles no longer returned an empty container.
New `rebuildFood()` helper goes through the builder for the
bonus fields then constructs the record directly to copy the
remaining fields through unchanged. **Wayfarer's smoker bonus
(`MoreSmokerXpPower`) gets the same treatment**, and re-reads
the FOOD component before rebuilding so it stacks cleanly on
top of Cook's earlier rebuild when a player has both. The bug
is 1.21.1-specific: 26.1's `FoodProperties` record no longer
carries `eatSeconds` / `usingConvertsTo` / `effects` (Mojang
moved them to `DataComponents.CONSUMABLE` and
`DataComponents.USE_REMAINDER`), so the boost path never
touches them and the original symptom can't reproduce.
- **`MobsIgnorePlayer` had no way to disable retaliation.** By
default the power lets vanilla's `getLastHurtByMob()` window
apply — once the player hits an "ignoring" mob, the mob is
allowed to target back briefly so combat feedback loops still
work. Pack authors who wanted true peace (Bonewalker, druidic
neutrality, etc.) had no knob to turn that off. New
`passive: true` config flag bypasses the retaliation window
so the mob never targets the player even if attacked first.
Default `false` keeps existing pack behavior intact.
- **`[CompatB]` parser warnings deduped per reload.** Pack-port
sessions were dumping hundreds of `WARN` lines during datapack
load — one per occurrence of every unsupported
action/condition/modifier op. One porting log had 268 such
lines (22% of bootup output) that collapsed into 6 unique
action types + 4 unique condition types. New
`CompatWarningCollector` batches parser-side warnings
(unsupported actions / conditions / item-actions /
item-conditions, modifier defaults, parse errors, malformed
SNBT, per-power compile failures) during a session held open
by `OriginsCompatPowerLoader.apply()`, then emits one sorted
summary block at the end. Outside a session each `record*`
call falls back to immediate `LOGGER.warn`. Wrapped in
try/finally so a mid-reload throw can't leak the session.
- **Dropped orphaned lang keys** (`skeleton_apex_hp`,
`skeleton_rattling`, `merling_no_drowning`) with no power JSON
or origin reference, and broadened the stamina power
description across all 10 pools from "Physical energy for
powerful attacks." to "Physical reserves spent on active
abilities." (The old line lied for Stoneguard (utility-only)
and Shulk (CC + mobility) and was misleadingly narrow for the
rest.)
- **Caveborn / Skeleton edible-power JSONs ate without hunger
gating.** The six `EdibleItemPower` configs for stone, iron,
gold, diamond, netherite, and bone meal shipped with
`always_edible: true`, so the hunger check at
`InteractionPowerEvents.java:115` short-circuited and the
right-click animation fired even at a full food bar — players
could spam-eat the mineral indefinitely. Flipped to `false` on
all six. The codec default in `EdibleItemPower.java` stays
`true` so external packs that omit the field keep their
current behavior.
- **Caveborn mineral effects (haste / speed / luck / strength +
resistance) never applied after eating off-tier minerals.**
The 4 `caveborn_*_bonus` powers listened on
`event: item_use_finish`, but `food_item_in_tag` reads the
dispatch context as a `FoodContext`. Per
`InteractionPowerEvents.java:172–177`, `ITEM_USE_FINISH`
dispatches the raw `ItemStack`; only `FOOD_FINISHED` wraps it
in `FoodContext`. The cast failed silently so the `if_else`
action took the noop branch and no status indicator appeared.
Switched all 4 to `food_finished`, matching the working
`aquatic_fish_diet_bonus` template.
### Documentation
- New `docs/ORIGINS.md` — per-origin reference covering every
default origin and its evolution tree. Each entry has impact
rating, icon, spawn behavior (where applicable), base-power
list with one-line glosses, and a tier-delta table for the
evolution path. Catalogues all 49 non-class origins.
- `docs/POWER_TYPES.md` and `field_docs.json` aligned with the
new `no_mob_spawns_nearby` 24-block code default. The old
docs advertised 48 and used a 48-block example; now reflect
the 24 default, call out the vanilla 24-block cutoff, and use
a 36-block example matching Stoneguard's own JSON.
- `MobsIgnorePlayer` field docs updated to add the `passive` row
+ an example combining `#tag` syntax with `passive`, and to
clarify that `entity_types` already accepts `#tag` references
and that an empty list matches every mob (both were true
before but undocumented).
release
NeoOrigins v2.1.3 (MC 26.1.x)
v2.1.3+26.125 мая 2026 г.26Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
## v2.1.3
### Bug Fixes
- **`origins:set_resource` action was a silent no-op.** The legacy
compat layer rewrote `origins:set_resource` to
`neoorigins:set_resource` but the action dispatcher had no arm
for it, so packs porting from Origins++ saw the action listed
as "unknown" with no effect. Wired the dispatch arm to read
`resource` + `value` (or fallback `change`) and write through
`CompatAttachments.resourceState()`. Same commit aliases
`xp_levels` to the existing `xp_level` condition (Apoli's
plural form) and adds a new `saturation_level` entity condition
reading `FoodData.getSaturationLevel()`.
- **`origins:flame_particles` failed codec validation.** Route B's
WELL_KNOWN synth emitted a fieldless `neoorigins:particle` stub
and `ParticlePower.CODEC` rejected the entry with
`particle: missing or unknown 'particle' field`, dropping the
whole power. Synth now passes `minecraft:flame` as the default
particle id so legacy `flame_particles` references load.
- **Legacy `forge:` attribute ids resolved to nothing on
NeoForge.** Packs authored against Forge-era Origins++ pinned
attributes like `forge:generic.entity_reach`, which NeoForge
re-registered under `neoforge:entity_reach`.
`AttributeModifierPower.resolveAttribute` now retries any
unresolved `forge:*` id under the `neoforge:` namespace with
`generic.` / `player.` prefix permutations, so existing packs
don't need to be rewritten.
- **Origin layer screens displayed the raw layer id** instead of
the layer JSON's `name` field. `OriginInfoScreen.getLayerDisplayName`
and `OriginEditorScreen.drawLayerLabels` both fell back to the
translation key / capitalized path even when the layer had a
populated `name`. Both screens now read `layer.name()` first,
only falling back to the translation key / prettified path if
blank.
- **Warding Presence ignored its toggle.** The spawn-cancel
handler used `forEachOfType`, which doesn't consult
`AbstractTogglePower.isToggledOff` — turning the power off in
the HUD still suppressed mob spawns. New
`forEachOfTypeActive` helper on `ActiveOriginService` gates
toggleable powers; event handlers reading toggle-style powers
must use it. (Only `onTick` honors the toggle automatically.)
- **Warding Presence was a no-op for monsters at the default
radius.** The power's radius default was 24, at or below
vanilla's `MobCategory.MONSTER` 24-block player-distance
spawn rule — so monsters were already blocked by vanilla
and the power did nothing for the case authors actually
wanted. Stoneguard's JSON now sets radius 36 explicitly; the
code default stays at 24 to force pack authors to opt in to
a meaningful radius.
- **`longer_potions` didn't extend the first dose.**
`MobEffectEvent.Added` fires *before* vanilla
`LivingEntity#addEffect` inserts the instance into
`activeEffects`. The old handler re-called `sp.addEffect(extended)`
from inside the event; the nested put ran first, then the
outer vanilla put overwrote with the original un-extended
instance. Net result: first dose looked normal, subsequent
doses extended correctly via the merge path. Now mutates the
incoming `MobEffectInstance` via `update()` so vanilla's
subsequent put sees the already-extended values.
- **Cook food bonus stripped `eatSeconds`, consume effects, and
`usingConvertsTo`** (1.21.1 only). The bonus rebuilt
`FoodProperties` through `FoodProperties.Builder`, which only
exposes nutrition / saturation / `canAlwaysEat` — so suspicious
stew lost its random potion effect when boosted, golden apple
lost regen, bowls/bottles no longer returned an empty container.
New `rebuildFood()` helper goes through the builder for the
bonus fields then constructs the record directly to copy the
remaining fields through unchanged. **Wayfarer's smoker bonus
(`MoreSmokerXpPower`) gets the same treatment**, and re-reads
the FOOD component before rebuilding so it stacks cleanly on
top of Cook's earlier rebuild when a player has both. The bug
is 1.21.1-specific: 26.1's `FoodProperties` record no longer
carries `eatSeconds` / `usingConvertsTo` / `effects` (Mojang
moved them to `DataComponents.CONSUMABLE` and
`DataComponents.USE_REMAINDER`), so the boost path never
touches them and the original symptom can't reproduce.
- **`MobsIgnorePlayer` had no way to disable retaliation.** By
default the power lets vanilla's `getLastHurtByMob()` window
apply — once the player hits an "ignoring" mob, the mob is
allowed to target back briefly so combat feedback loops still
work. Pack authors who wanted true peace (Bonewalker, druidic
neutrality, etc.) had no knob to turn that off. New
`passive: true` config flag bypasses the retaliation window
so the mob never targets the player even if attacked first.
Default `false` keeps existing pack behavior intact.
- **`[CompatB]` parser warnings deduped per reload.** Pack-port
sessions were dumping hundreds of `WARN` lines during datapack
load — one per occurrence of every unsupported
action/condition/modifier op. One porting log had 268 such
lines (22% of bootup output) that collapsed into 6 unique
action types + 4 unique condition types. New
`CompatWarningCollector` batches parser-side warnings
(unsupported actions / conditions / item-actions /
item-conditions, modifier defaults, parse errors, malformed
SNBT, per-power compile failures) during a session held open
by `OriginsCompatPowerLoader.apply()`, then emits one sorted
summary block at the end. Outside a session each `record*`
call falls back to immediate `LOGGER.warn`. Wrapped in
try/finally so a mid-reload throw can't leak the session.
- **Dropped orphaned lang keys** (`skeleton_apex_hp`,
`skeleton_rattling`, `merling_no_drowning`) with no power JSON
or origin reference, and broadened the stamina power
description across all 10 pools from "Physical energy for
powerful attacks." to "Physical reserves spent on active
abilities." (The old line lied for Stoneguard (utility-only)
and Shulk (CC + mobility) and was misleadingly narrow for the
rest.)
- **Caveborn / Skeleton edible-power JSONs ate without hunger
gating.** The six `EdibleItemPower` configs for stone, iron,
gold, diamond, netherite, and bone meal shipped with
`always_edible: true`, so the hunger check at
`InteractionPowerEvents.java:115` short-circuited and the
right-click animation fired even at a full food bar — players
could spam-eat the mineral indefinitely. Flipped to `false` on
all six. The codec default in `EdibleItemPower.java` stays
`true` so external packs that omit the field keep their
current behavior.
- **Caveborn mineral effects (haste / speed / luck / strength +
resistance) never applied after eating off-tier minerals.**
The 4 `caveborn_*_bonus` powers listened on
`event: item_use_finish`, but `food_item_in_tag` reads the
dispatch context as a `FoodContext`. Per
`InteractionPowerEvents.java:172–177`, `ITEM_USE_FINISH`
dispatches the raw `ItemStack`; only `FOOD_FINISHED` wraps it
in `FoodContext`. The cast failed silently so the `if_else`
action took the noop branch and no status indicator appeared.
Switched all 4 to `food_finished`, matching the working
`aquatic_fish_diet_bonus` template.
### Documentation
- New `docs/ORIGINS.md` — per-origin reference covering every
default origin and its evolution tree. Each entry has impact
rating, icon, spawn behavior (where applicable), base-power
list with one-line glosses, and a tier-delta table for the
evolution path. Catalogues all 49 non-class origins.
- `docs/POWER_TYPES.md` and `field_docs.json` aligned with the
new `no_mob_spawns_nearby` 24-block code default. The old
docs advertised 48 and used a 48-block example; now reflect
the 24 default, call out the vanilla 24-block cutoff, and use
a 36-block example matching Stoneguard's own JSON.
- `MobsIgnorePlayer` field docs updated to add the `passive` row
+ an example combining `#tag` syntax with `passive`, and to
clarify that `entity_types` already accepts `#tag` references
and that an empty list matches every mob (both were true
before but undocumented).
release
NeoOrigins v2.1.2 (MC 1.21.1)
v2.1.2+1.21.122 мая 2026 г.1,3 тыс.Minecraft: 1.21.1neoforge
Что нового
### KubeJS Integration
Soft dependency on KubeJS 2101.7.x — when KubeJS is installed, pack
authors can hook into origin and power lifecycle from JavaScript and
register their own power behaviors without writing Java. When KubeJS
is absent the mod runs unchanged (every fire site short-circuits on a
single cached load check; no reflection, no class-not-found risk).
> ℹ️ **1.21.1 build only for this release.** KubeJS hasn't published a
> Minecraft 26.1 build yet, so the 26.1 jar ships without the
> integration. It'll land on 26.1 the release after KubeJS cuts a
> 2601.x build.
- **15 events** covering origin lifecycle (chosen / changed),
power lifecycle (granted / revoked / activated / tick), evolution
(tier_changed / declined), mob origin (assigned / cleared), and
mount (requested / accepted / declined / started / ended). Fired from
central choke points so admin commands and cascade invalidations are
covered, not just user-driven paths. `power_tick` is gated by
`hasListeners()` so zero overhead when no script subscribes.
- **`neoorigins:kubejs_callback` entity action** — JS-registered
`Consumer<ServerPlayer>` invokable by id from any action slot the DSL
already supports (`active_ability.on_use`, `action_on_event`,
`condition_passive`, `chance`, `choice`, …). Register via
`NeoOrigins.registerCallback('mypack:foo', player => { ... })`.
- **JS-defined power types** — `neoorigins:js_custom` (passive,
`onGranted` / `onRevoked` / `onTick`) and `neoorigins:js_active`
(extends the AbstractActivePower contract, `onUse` returning a
boolean to consume cooldown/hunger). Register a handler object
literal — Rhino auto-adapts to the Java interface, missing hooks
default to no-ops.
- **`mount_ended` covers all dismount paths** — vanilla sneak-dismount,
vehicle death, server stop, and force-mount swap all fire via an
`Entity#removePassenger` mixin, scoped to mounts created by our power
(non-empty `mountPosition` attachment) so vanilla horses don't trip
the event.
- **Hot-reload safe** — `/kubejs reload` wipes registered callbacks
and JS power handlers via the plugin's `clearCaches` hook.
### Mount Power
New `neoorigins:mount` active power — ride any living entity, with a
consent system for player-to-player mounts.
- Raycast pickup with configurable range; press the keybind a second
time while riding to dismount.
- **Player consent** with three modes: `ALWAYS` (immediate),
`TEAM` (immediate if same FTB Teams team or Open Parties & Claims
party — falls through to prompt otherwise), and `PROMPT` (chat
request with clickable `[ACCEPT]` / `[DECLINE]`, configurable
timeout). Configured under `[mount]` in `neoorigins-common.toml`.
- **Mob mounts** — `allow_mobs` toggle, `block_bosses` flag to refuse
Wither / Ender Dragon, and a check that the target isn't already
carrying a passenger.
- **`mount_position`** field — `centered` (default) or `shoulder`,
offsetting the passenger ~0.4 blocks to one side.
- `/neoorigins mount accept` and `/neoorigins mount decline` resolve
pending prompts. Soft compat: FTB Teams and Open Parties & Claims
detection is gated behind the same load-check pattern as our other
compats, so neither mod is required.
### Internal
- **Origin layer canonicalized on `neoorigins:origin`.** The layer id
emitted for built-in origins is now namespaced under our mod
consistently instead of straddling `origins:origin` and
`neoorigins:origin`. Existing user packs that pin the old layer
continue to load through the compat translator.
release
NeoOrigins v2.1.2 (MC 26.1.x)
v2.1.2+26.122 мая 2026 г.52Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
### KubeJS Integration
Soft dependency on KubeJS 2101.7.x — when KubeJS is installed, pack
authors can hook into origin and power lifecycle from JavaScript and
register their own power behaviors without writing Java. When KubeJS
is absent the mod runs unchanged (every fire site short-circuits on a
single cached load check; no reflection, no class-not-found risk).
> ℹ️ **1.21.1 build only for this release.** KubeJS hasn't published a
> Minecraft 26.1 build yet, so the 26.1 jar ships without the
> integration. It'll land on 26.1 the release after KubeJS cuts a
> 2601.x build.
- **15 events** covering origin lifecycle (chosen / changed),
power lifecycle (granted / revoked / activated / tick), evolution
(tier_changed / declined), mob origin (assigned / cleared), and
mount (requested / accepted / declined / started / ended). Fired from
central choke points so admin commands and cascade invalidations are
covered, not just user-driven paths. `power_tick` is gated by
`hasListeners()` so zero overhead when no script subscribes.
- **`neoorigins:kubejs_callback` entity action** — JS-registered
`Consumer<ServerPlayer>` invokable by id from any action slot the DSL
already supports (`active_ability.on_use`, `action_on_event`,
`condition_passive`, `chance`, `choice`, …). Register via
`NeoOrigins.registerCallback('mypack:foo', player => { ... })`.
- **JS-defined power types** — `neoorigins:js_custom` (passive,
`onGranted` / `onRevoked` / `onTick`) and `neoorigins:js_active`
(extends the AbstractActivePower contract, `onUse` returning a
boolean to consume cooldown/hunger). Register a handler object
literal — Rhino auto-adapts to the Java interface, missing hooks
default to no-ops.
- **`mount_ended` covers all dismount paths** — vanilla sneak-dismount,
vehicle death, server stop, and force-mount swap all fire via an
`Entity#removePassenger` mixin, scoped to mounts created by our power
(non-empty `mountPosition` attachment) so vanilla horses don't trip
the event.
- **Hot-reload safe** — `/kubejs reload` wipes registered callbacks
and JS power handlers via the plugin's `clearCaches` hook.
### Mount Power
New `neoorigins:mount` active power — ride any living entity, with a
consent system for player-to-player mounts.
- Raycast pickup with configurable range; press the keybind a second
time while riding to dismount.
- **Player consent** with three modes: `ALWAYS` (immediate),
`TEAM` (immediate if same FTB Teams team or Open Parties & Claims
party — falls through to prompt otherwise), and `PROMPT` (chat
request with clickable `[ACCEPT]` / `[DECLINE]`, configurable
timeout). Configured under `[mount]` in `neoorigins-common.toml`.
- **Mob mounts** — `allow_mobs` toggle, `block_bosses` flag to refuse
Wither / Ender Dragon, and a check that the target isn't already
carrying a passenger.
- **`mount_position`** field — `centered` (default) or `shoulder`,
offsetting the passenger ~0.4 blocks to one side.
- `/neoorigins mount accept` and `/neoorigins mount decline` resolve
pending prompts. Soft compat: FTB Teams and Open Parties & Claims
detection is gated behind the same load-check pattern as our other
compats, so neither mod is required.
### Internal
- **Origin layer canonicalized on `neoorigins:origin`.** The layer id
emitted for built-in origins is now namespaced under our mod
consistently instead of straddling `origins:origin` and
`neoorigins:origin`. Existing user packs that pin the old layer
continue to load through the compat translator.
release
NeoOrigins v2.1.1 (MC 1.21.1)
v2.1.1+1.21.121 мая 2026 г.455Minecraft: 1.21.1neoforge
Что нового
### Bug Fixes
- **Origin Creator name/description rejected on save as "Not a string"** —
the creator writes `name` / `description` as `{"text": "..."}` component
JSON so author-entered text renders literally rather than as a
translation key, but the field codec accepted only raw strings and
validation failed on every save with
`Not a string: {"text": "..."}`. The codec now accepts either form:
raw strings continue to wrap as translatable components (so every
shipped origin still resolves through the language file), and any
vanilla component-JSON object decodes through
`ComponentSerialization.CODEC`. Same helper is shared by the player
Origin Creator, the Mob Origin Creator, and any custom
`origin_layer` JSON.
release
NeoOrigins v2.1.1 (MC 26.1.x)
v2.1.1+26.121 мая 2026 г.24Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
### Bug Fixes
- **Origin Creator name/description rejected on save as "Not a string"** —
the creator writes `name` / `description` as `{"text": "..."}` component
JSON so author-entered text renders literally rather than as a
translation key, but the field codec accepted only raw strings and
validation failed on every save with
`Not a string: {"text": "..."}`. The codec now accepts either form:
raw strings continue to wrap as translatable components (so every
shipped origin still resolves through the language file), and any
vanilla component-JSON object decodes through
`ComponentSerialization.CODEC`. Same helper is shared by the player
Origin Creator, the Mob Origin Creator, and any custom
`origin_layer` JSON.
release
NeoOrigins v2.1.0 (MC 1.21.1)
v2.1.0+1.21.121 мая 2026 г.233Minecraft: 1.21.1neoforge
Что нового
# NeoOrigins v2.1.0 - Patch Notes
Built for **Minecraft 26.1 / 26.1.1 / 26.1.2** and **1.21.1** with **NeoForge**.
---
### In-Game Origin Creator
A fresh tabbed GUI for authoring player origins without hand-writing JSON. Identity / Powers / Appearance / JSON tabs. The form renderer covers every native power type - a structured schema branch where one exists, falling back to codec reflection for the rest, so there are no gaps. Output writes a real datapack at `<world>/datapacks/neoorigins_custom/`; saved origins flow through the normal datapack reload, and the GUI has an explicit Apply button so authors control the reload hitch.
- **Item picker** for the icon field - registry-backed and searchable, so modded items appear free. Optional SNBT components.
- **Per-field hover tooltips** sourced from the schema and `docs/schema/field_docs.json` so every form field has at least a short hint.
- **Raw-JSON escape hatch** - per-power "raw" toggle for authors who want to drop straight to JSON for a single power.
- **Live JSON preview** mirrors the draft as it would land on disk; a built-in problems panel runs the same validation the server applies on save.
- **Server-authoritative writes** - open / save / apply gate on permission level 2 or creative (integrated server only), so non-OP clients can't drive the creator on a dedicated server.
Opened via `/neoorigins editor` or the "Open Origin Creator" keybind (unbound by default).
---
### Mob Origin System
Origins for mobs. Pack authors and ops can attach a bundle of powers plus custom drops to any non-player `LivingEntity`. Origins live at `data/<namespace>/origins/mob_origins/<id>.json`.
- **Weighted spawn rules** - per-origin filters for entity type / entity tag, biome, biome tag, structure, structure tag, dimension, Y range, light range, time-of-day, and the spawn-reason set; mutex groups so two origins can't both attach to the same spawn; optional `replace` flag for overriding another origin mid-spawn.
- **`neoorigins:mob_behavior` power** - configurable per-origin aggression. Modes: neutral / hostile / conditional (triggered by an entity-condition list with throttled re-evaluation). Wires the vanilla `NearestAttackableGoal` / `HurtByTargetGoal` automatically.
- **Per-origin drops** - additive or replace; either independent-chance per entry or weighted-pool sampling. Layered onto vanilla loot via a global loot modifier. Carrier files live in the world datapack for portability - copy `neoorigins_custom/` to another NeoOrigins instance and drops keep working.
- **Spawn-egg minting** - `/neoorigins mob egg <origin> [entity_type] [count]` mints a vanilla spawn egg pre-attached to the origin. Right-clicking the egg on a vanilla spawner reconfigures the spawner's next-spawn so every subsequent spawn inherits the origin too.
---
### In-Game Mob Origin Creator
Same Creator framework as the player side, one package over. Identity / Powers / Spawn Rules / Drops / JSON Preview tabs. Open with `/neoorigins mob editor` or the "Open Mob Origin Creator" keybind (unbound by default).
---
### Cross-Mod Status-Effect Reactions
`neoorigins:action_on_event` gains a new `effect_applied` event so pack authors can react to (and probabilistically cancel) any mob effect landing on the player - including effects from other mods. Pre-dispatch filters by exact id (`effect`) or tag (`effect_tag`); the usual `condition` block runs after the filter for things like a `random_chance` resistance roll. Cancel the effect with the existing `neoorigins:cancel_event` action.
- **Post-cleanse grace window** - optional `immunity_ticks` field grants N ticks of full immunity to the same effect id after a successful cancel, so probabilistic resistance feels like a real cleanse: a 90% roll holds for ~2 seconds rather than re-rolling on every individual bite.
- **Use case** - drop-in compat with infection-style mods (e.g. Fungal Infection: SPORE's `spore:mycelium_ef`) without a bespoke power type per mod. Same hook covers debuff-pruning antidotes, "resist this potion" talents, particle reactions to incoming buffs, and so on.
---
### Bug Fixes
- **Mob-origin spawn egg crashed the server on world save** when held in inventory. The egg's NBT was missing a required `id` field that vanilla's `ENTITY_DATA` codec validates at encode time.
- **Mob-origin spawn eggs didn't attach the origin in survival.** Vanilla's spawn-egg NBT-injection is gated to creative plus permission 2; the minted egg now spawns the mob through a custom path that bypasses the gate and applies the origin directly on the returned entity.
- **Mob-origin spawn eggs didn't propagate the origin to vanilla spawners.** The spawner's next-spawn block didn't copy the egg's `ENTITY_DATA`; the egg now reconfigures the spawner with the origin marker so every subsequent spawn inherits it.
- **All origins silently failed to load on world startup (26.1 only)** - the icon codec read item components that weren't bound yet during the early datapack reload, NPE'd, and aborted parsing for the entire origin. All origins fell out silently with a `0 origins loaded` log line. Origins now load with empty icons during the early reload and re-resolve their icons on `ServerStarting` once components are bound.
- **Elytrian-style flight powers triggered the vanilla elytra wind sound** even when the player wasn't wearing an elytra. The fall-fly sound is now suppressed unless the chest slot actually contains `minecraft:elytra`.
- **Piglin "Fire Ward" was redundant** - base Piglin already had blanket fire/lava immunity, so the tier-3 evolution overlay added nothing. Base immunity removed; the apex overlay actually grants new resistance now.
- **Hiveling "Liftoff" and Elytrian "Fragile Frame" had no display names.** Lang keys added.
- **Origin re-selection bypass** - non-OP players could reset their chosen origin for free via `/origin gui` or a crafted `ChooseOrigin` packet, skipping the Orb of Origin XP cost and orb consumption. Re-selection now requires an Orb commit, an OP-granted re-selection, or sender-OP.
- **Creator validation false-rejected modded ids** - origins referencing modded items / attributes / entities or dynamic registry contents (biomes, dimensions) were incorrectly flagged as invalid on save. Validation now consults the live `RegistryAccess`.
- **Blacksmith / Cook crafted equipment lost its base stats.** Quality Equipment Power was seeding from the raw `ATTRIBUTE_MODIFIERS` data component, which is usually empty on freshly-crafted vanilla items (their base stats come from the item's default modifiers, not a component patch). The subsequent component-set wiped the base armor toughness, mining speed, or attack damage and left only the Blacksmith bonus on top - so a crafted iron chestplate would show toughness 1 with no armor value. Now seeds from `ItemStack#getAttributeModifiers()` (the resolved effective modifiers), so base stats are preserved and the quality bonus stacks on top.
- **`/attribute` commands targeting vanilla attribute ids returned "Can't find element"** when this mod was loaded. The legacy-command rewriter (which fixes 1.20-era Origins++ mcfunction syntax to 1.21+) was running on every command, including modern ones, and silently corrupting attribute references in the process. Now gates on whether the original command already parses cleanly - if vanilla can resolve it, the rewriter leaves it alone and only intervenes on commands vanilla rejects.
- **Size-scaling powers left the player permanently rescaled after an origin change.** The clear-on-revoke step was using a per-power id derived at dispatch time, which doesn't always resolve to the same value during a revoke triggered by an origin swap or orb reroll - the modifier we added and the one we tried to remove didn't match, so the scale stuck. Now clears any `neoorigins:size_*` modifier by prefix sweep across the scale and interaction-range attributes, regardless of which power originally set it.
- **`neoorigins:crop_harvest_bonus` duplicated logs from world-gen trees, stripped logs, and player-placed log walls.** The bonus is intended for chopping naturally-grown wood. It now skips stripped logs entirely (registry-id prefix check on `stripped_`) and tracks logs placed by hand in a per-chunk attachment so breaking your own log walls back down doesn't dupe the materials. Naturally-generated trees and player-grown trees from saplings still earn the bonus - tree generation places logs via the feature system, not the player place path.
---
### Commands & Config
- **Canonical NeoOrigins command surface is now `/neoorigins`.** The `/origin` command-tree alias is no longer registered (it claimed the Origins mod's namespace, which isn't ours). Tab-complete and `/help` will only suggest `/neoorigins ...`. Existing mcfunctions or chat habits that still use `/origin set @p ...`, `/origin mob apply ...`, etc. continue to work via the compat layer - `LegacyCommandRewriter` transparently rewrites the leading verb so dispatch succeeds. The real Origins-mod-compat commands (`/resource`, `/power`) are untouched.
- **New `/neoorigins mob` subtree** - `apply`, `clear`, `get`, `editor`, `egg`. Permission level 2 required.
- **In-game origin creator gated** - open / save / apply requires permission level 2 or creative (integrated server only); rate-limited per player to prevent payload spam against the reload pipeline.
- **Custom-pack file paths hardened** - the writer enforces a strict id grammar and verifies all output stays inside the `neoorigins_custom/` folder before writing anything.
---
### Documentation
- New `docs/MOB_ORIGINS.md` - pack-author reference for the mob origin format (every field of `MobOrigin`, `EntityTargetSpec`, `SpawnRules`, `DropRules` documented with type, default, example).
- New `effect_applied` event entry in `docs/EVENTS.md`, with its filters and grace-window semantics.
- `docs/POWER_TYPES.md` - extended the `neoorigins:action_on_event` field table with `block_condition`, `effect`, `effect_tag`, `immunity_ticks`; added `EFFECT_APPLIED` to the event categories; new example showing 90% mycelium resistance with a 2-second grace window.
- Schema (`docs/schema/power.schema.json`, `field_docs.json`) extended for the new fields.
release
NeoOrigins v2.1.0 (MC 26.1.x)
v2.1.0+26.121 мая 2026 г.19Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# NeoOrigins v2.1.0 - Patch Notes
Built for **Minecraft 26.1 / 26.1.1 / 26.1.2** and **1.21.1** with **NeoForge**.
---
### In-Game Origin Creator
A fresh tabbed GUI for authoring player origins without hand-writing JSON. Identity / Powers / Appearance / JSON tabs. The form renderer covers every native power type - a structured schema branch where one exists, falling back to codec reflection for the rest, so there are no gaps. Output writes a real datapack at `<world>/datapacks/neoorigins_custom/`; saved origins flow through the normal datapack reload, and the GUI has an explicit Apply button so authors control the reload hitch.
- **Item picker** for the icon field - registry-backed and searchable, so modded items appear free. Optional SNBT components.
- **Per-field hover tooltips** sourced from the schema and `docs/schema/field_docs.json` so every form field has at least a short hint.
- **Raw-JSON escape hatch** - per-power "raw" toggle for authors who want to drop straight to JSON for a single power.
- **Live JSON preview** mirrors the draft as it would land on disk; a built-in problems panel runs the same validation the server applies on save.
- **Server-authoritative writes** - open / save / apply gate on permission level 2 or creative (integrated server only), so non-OP clients can't drive the creator on a dedicated server.
Opened via `/neoorigins editor` or the "Open Origin Creator" keybind (unbound by default).
---
### Mob Origin System
Origins for mobs. Pack authors and ops can attach a bundle of powers plus custom drops to any non-player `LivingEntity`. Origins live at `data/<namespace>/origins/mob_origins/<id>.json`.
- **Weighted spawn rules** - per-origin filters for entity type / entity tag, biome, biome tag, structure, structure tag, dimension, Y range, light range, time-of-day, and the spawn-reason set; mutex groups so two origins can't both attach to the same spawn; optional `replace` flag for overriding another origin mid-spawn.
- **`neoorigins:mob_behavior` power** - configurable per-origin aggression. Modes: neutral / hostile / conditional (triggered by an entity-condition list with throttled re-evaluation). Wires the vanilla `NearestAttackableGoal` / `HurtByTargetGoal` automatically.
- **Per-origin drops** - additive or replace; either independent-chance per entry or weighted-pool sampling. Layered onto vanilla loot via a global loot modifier. Carrier files live in the world datapack for portability - copy `neoorigins_custom/` to another NeoOrigins instance and drops keep working.
- **Spawn-egg minting** - `/neoorigins mob egg <origin> [entity_type] [count]` mints a vanilla spawn egg pre-attached to the origin. Right-clicking the egg on a vanilla spawner reconfigures the spawner's next-spawn so every subsequent spawn inherits the origin too.
---
### In-Game Mob Origin Creator
Same Creator framework as the player side, one package over. Identity / Powers / Spawn Rules / Drops / JSON Preview tabs. Open with `/neoorigins mob editor` or the "Open Mob Origin Creator" keybind (unbound by default).
---
### Cross-Mod Status-Effect Reactions
`neoorigins:action_on_event` gains a new `effect_applied` event so pack authors can react to (and probabilistically cancel) any mob effect landing on the player - including effects from other mods. Pre-dispatch filters by exact id (`effect`) or tag (`effect_tag`); the usual `condition` block runs after the filter for things like a `random_chance` resistance roll. Cancel the effect with the existing `neoorigins:cancel_event` action.
- **Post-cleanse grace window** - optional `immunity_ticks` field grants N ticks of full immunity to the same effect id after a successful cancel, so probabilistic resistance feels like a real cleanse: a 90% roll holds for ~2 seconds rather than re-rolling on every individual bite.
- **Use case** - drop-in compat with infection-style mods (e.g. Fungal Infection: SPORE's `spore:mycelium_ef`) without a bespoke power type per mod. Same hook covers debuff-pruning antidotes, "resist this potion" talents, particle reactions to incoming buffs, and so on.
---
### Bug Fixes
- **Mob-origin spawn egg crashed the server on world save** when held in inventory. The egg's NBT was missing a required `id` field that vanilla's `ENTITY_DATA` codec validates at encode time.
- **Mob-origin spawn eggs didn't attach the origin in survival.** Vanilla's spawn-egg NBT-injection is gated to creative plus permission 2; the minted egg now spawns the mob through a custom path that bypasses the gate and applies the origin directly on the returned entity.
- **Mob-origin spawn eggs didn't propagate the origin to vanilla spawners.** The spawner's next-spawn block didn't copy the egg's `ENTITY_DATA`; the egg now reconfigures the spawner with the origin marker so every subsequent spawn inherits it.
- **All origins silently failed to load on world startup (26.1 only)** - the icon codec read item components that weren't bound yet during the early datapack reload, NPE'd, and aborted parsing for the entire origin. All origins fell out silently with a `0 origins loaded` log line. Origins now load with empty icons during the early reload and re-resolve their icons on `ServerStarting` once components are bound.
- **Elytrian-style flight powers triggered the vanilla elytra wind sound** even when the player wasn't wearing an elytra. The fall-fly sound is now suppressed unless the chest slot actually contains `minecraft:elytra`.
- **Piglin "Fire Ward" was redundant** - base Piglin already had blanket fire/lava immunity, so the tier-3 evolution overlay added nothing. Base immunity removed; the apex overlay actually grants new resistance now.
- **Hiveling "Liftoff" and Elytrian "Fragile Frame" had no display names.** Lang keys added.
- **Origin re-selection bypass** - non-OP players could reset their chosen origin for free via `/origin gui` or a crafted `ChooseOrigin` packet, skipping the Orb of Origin XP cost and orb consumption. Re-selection now requires an Orb commit, an OP-granted re-selection, or sender-OP.
- **Creator validation false-rejected modded ids** - origins referencing modded items / attributes / entities or dynamic registry contents (biomes, dimensions) were incorrectly flagged as invalid on save. Validation now consults the live `RegistryAccess`.
- **Blacksmith / Cook crafted equipment lost its base stats.** Quality Equipment Power was seeding from the raw `ATTRIBUTE_MODIFIERS` data component, which is usually empty on freshly-crafted vanilla items (their base stats come from the item's default modifiers, not a component patch). The subsequent component-set wiped the base armor toughness, mining speed, or attack damage and left only the Blacksmith bonus on top - so a crafted iron chestplate would show toughness 1 with no armor value. Now seeds from `ItemStack#getAttributeModifiers()` (the resolved effective modifiers), so base stats are preserved and the quality bonus stacks on top.
- **`/attribute` commands targeting vanilla attribute ids returned "Can't find element"** when this mod was loaded. The legacy-command rewriter (which fixes 1.20-era Origins++ mcfunction syntax to 1.21+) was running on every command, including modern ones, and silently corrupting attribute references in the process. Now gates on whether the original command already parses cleanly - if vanilla can resolve it, the rewriter leaves it alone and only intervenes on commands vanilla rejects.
- **Size-scaling powers left the player permanently rescaled after an origin change.** The clear-on-revoke step was using a per-power id derived at dispatch time, which doesn't always resolve to the same value during a revoke triggered by an origin swap or orb reroll - the modifier we added and the one we tried to remove didn't match, so the scale stuck. Now clears any `neoorigins:size_*` modifier by prefix sweep across the scale and interaction-range attributes, regardless of which power originally set it.
- **`neoorigins:crop_harvest_bonus` duplicated logs from world-gen trees, stripped logs, and player-placed log walls.** The bonus is intended for chopping naturally-grown wood. It now skips stripped logs entirely (registry-id prefix check on `stripped_`) and tracks logs placed by hand in a per-chunk attachment so breaking your own log walls back down doesn't dupe the materials. Naturally-generated trees and player-grown trees from saplings still earn the bonus - tree generation places logs via the feature system, not the player place path.
---
### Commands & Config
- **Canonical NeoOrigins command surface is now `/neoorigins`.** The `/origin` command-tree alias is no longer registered (it claimed the Origins mod's namespace, which isn't ours). Tab-complete and `/help` will only suggest `/neoorigins ...`. Existing mcfunctions or chat habits that still use `/origin set @p ...`, `/origin mob apply ...`, etc. continue to work via the compat layer - `LegacyCommandRewriter` transparently rewrites the leading verb so dispatch succeeds. The real Origins-mod-compat commands (`/resource`, `/power`) are untouched.
- **New `/neoorigins mob` subtree** - `apply`, `clear`, `get`, `editor`, `egg`. Permission level 2 required.
- **In-game origin creator gated** - open / save / apply requires permission level 2 or creative (integrated server only); rate-limited per player to prevent payload spam against the reload pipeline.
- **Custom-pack file paths hardened** - the writer enforces a strict id grammar and verifies all output stays inside the `neoorigins_custom/` folder before writing anything.
---
### Documentation
- New `docs/MOB_ORIGINS.md` - pack-author reference for the mob origin format (every field of `MobOrigin`, `EntityTargetSpec`, `SpawnRules`, `DropRules` documented with type, default, example).
- New `effect_applied` event entry in `docs/EVENTS.md`, with its filters and grace-window semantics.
- `docs/POWER_TYPES.md` - extended the `neoorigins:action_on_event` field table with `block_condition`, `effect`, `effect_tag`, `immunity_ticks`; added `EFFECT_APPLIED` to the event categories; new example showing 90% mycelium resistance with a 2-second grace window.
- Schema (`docs/schema/power.schema.json`, `field_docs.json`) extended for the new fields.
release
NeoOrigins v2.0.37 (MC 1.21.1)
v2.0.37+1.21.116 мая 2026 г.2,4 тыс.Minecraft: 1.21.1neoforge
Что нового
v2.0.37: no_slowdown fix, armor_equip, public /neoorigins get, custom-class docs
- no_slowdown: implement the previously no-op power — cancels cobweb / sweet berry / powder snow slowdown and the soul sand / honey walk-speed factor. Unrestricted variant is client-predicted; optional block_tag filter.
- prevent_action: new armor_equip action with per-slot head/chest/legs/feet toggles; chestplate_equip kept as a legacy alias.
- active_dash / dash: optional set_velocity bool so backward momentum can't cancel a dash; all four built-in dashes ship with set_velocity: true (#73).
- hiveling_jump_boost: +40% jump strength so Hiveling's 60% size still clears a one-block jump (#70).
- /neoorigins get usable by non-operators via new [commands] public_origin_get config (default true; operators always allowed).
- Fix minion death / despawn-tick server crash.
- Fix (26.1): /origin and /neoorigins were root-gated to OP; permissions now per-subcommand so editor, evolve accept/decline and self-gui work without OP (matches 1.21.1).
- New docs/CLASSES.md custom-class guide + examples/custom_class/ datapack; no_slowdown and prevent_action docs/schema updated.
release
NeoOrigins v2.0.37 (MC 26.1.x)
v2.0.37+26.116 мая 2026 г.84Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.37: no_slowdown fix, armor_equip, public /neoorigins get, custom-class docs
- no_slowdown: implement the previously no-op power — cancels cobweb / sweet berry / powder snow slowdown and the soul sand / honey walk-speed factor. Unrestricted variant is client-predicted; optional block_tag filter.
- prevent_action: new armor_equip action with per-slot head/chest/legs/feet toggles; chestplate_equip kept as a legacy alias.
- active_dash / dash: optional set_velocity bool so backward momentum can't cancel a dash; all four built-in dashes ship with set_velocity: true (#73).
- hiveling_jump_boost: +40% jump strength so Hiveling's 60% size still clears a one-block jump (#70).
- /neoorigins get usable by non-operators via new [commands] public_origin_get config (default true; operators always allowed).
- Fix minion death / despawn-tick server crash.
- Fix (26.1): /origin and /neoorigins were root-gated to OP; permissions now per-subcommand so editor, evolve accept/decline and self-gui work without OP (matches 1.21.1).
- New docs/CLASSES.md custom-class guide + examples/custom_class/ datapack; no_slowdown and prevent_action docs/schema updated.
release
NeoOrigins v2.0.36 (MC 1.21.1)
v2.0.36+1.21.113 мая 2026 г.2,8 тыс.Minecraft: 1.21.1neoforge
Что нового
v2.0.36
- Disabled origins no longer block /neoorigins set — they are hidden from the selection screen but stay registered
for admin commands.
- New [auto_human] config: auto-assigns neoorigins:human on the origin layer and sends new players straight to the
class selection screen.
- QualityEquipmentPower: seed from item defaults instead of EMPTY (fixes #87, #67)
- Fix cooldown key mismatch in syncCooldownIfStarted (fixes #82)
- New modify_lava_speed power type, added draconic_lava_swimming (fixes #78)
- Update 41 power descriptions from "hunger" to correct resource name (fixes #81)
- Add tab-complete suggestions to /power and /resource compat commands
- StartingEquipmentPower: add components SNBT field for DataComponent support
- New debug_compat_actions config for diagnosing compat action no-ops
release
NeoOrigins v2.0.36 (MC 26.1.x)
v2.0.36+26.113 мая 2026 г.56Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.36
- Disabled origins no longer block /neoorigins set — they are hidden from the selection screen but stay registered
for admin commands.
- New [auto_human] config: auto-assigns neoorigins:human on the origin layer and sends new players straight to the
class selection screen.
- QualityEquipmentPower: seed from item defaults instead of EMPTY (fixes #87, #67)
- Fix cooldown key mismatch in syncCooldownIfStarted (fixes #82)
- New modify_lava_speed power type, added draconic_lava_swimming (fixes #78)
- Update 41 power descriptions from "hunger" to correct resource name (fixes #81)
- Add tab-complete suggestions to /power and /resource compat commands
- StartingEquipmentPower: add components SNBT field for DataComponent support
- New debug_compat_actions config for diagnosing compat action no-ops
release
NeoOrigins v2.0.35 (MC 1.21.1)
v2.0.35+1.21.111 мая 2026 г.845Minecraft: 1.21.1neoforge
Что нового
v2.0.35: sub-origins, compat test harness, 31 bug fixes, compat improvements
Sub-Origins (Conditioned Layers):
- New feature for datapack authors: conditioned origin layers (race/subrace trees)
- OriginCondition system: origins:origin, origins:and, origins:or + inverted
- Conditioned-batch format auto-expansion
- Cascade invalidation on parent choice change
- Condition-aware picker with auto-skip
- docs/SUB_ORIGINS.md
Headless Compat Test:
- ./gradlew compatTest — validates packs without launching MC
- Origins++ 1323 powers: 0 FAIL
31 Bug Fixes (7 HIGH, 16 MEDIUM, 8 LOW):
- InvulnerabilityPower crash on malformed IDs
- HordeRegenPower div/zero
- Thread safety: CompatTickScheduler, PlayerLifecycleEvents, MinionTracker
- NeoOriginsConfig restriction version collision
- conditioned_restrict_armor predicates
- 5 memory leaks on logout
- Dynamic powers synced to client
- ExtraInventoryPower drop_on_death functional
- ActiveTeleportPower wall suffocation fix
- QualityEquipmentPower duplicate modifiers
- CompatAttachments resource bars reset on death
- PlayerOriginData cross-dimension gcSet
- More (see PATCH_NOTES_2_0.md)
Compat Improvements:
- origins:ingredient nested unwrap (9 packs)
- origins:type damage_condition (Kitsune invincibility fix)
- Wildcard *:*_toggle power_active (155 uses)
- origins:phasing with block_condition (19 powers)
- origins:biome sub-conditions (22 powers)
- Conditioned modify_damage_dealt Route B (15 powers)
release
NeoOrigins v2.0.35 (MC 26.1.x)
v2.0.35+26.111 мая 2026 г.63Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.35: sub-origins, compat test harness, 31 bug fixes, compat improvements
Sub-Origins (Conditioned Layers):
- New feature for datapack authors: conditioned origin layers (race/subrace trees)
- OriginCondition system: origins:origin, origins:and, origins:or + inverted
- Conditioned-batch format auto-expansion
- Cascade invalidation on parent choice change
- Condition-aware picker with auto-skip
- docs/SUB_ORIGINS.md
Headless Compat Test:
- ./gradlew compatTest — validates packs without launching MC
- Origins++ 1323 powers: 0 FAIL
31 Bug Fixes (7 HIGH, 16 MEDIUM, 8 LOW):
- InvulnerabilityPower crash on malformed IDs
- HordeRegenPower div/zero
- Thread safety: CompatTickScheduler, PlayerLifecycleEvents, MinionTracker
- NeoOriginsConfig restriction version collision
- conditioned_restrict_armor predicates
- 5 memory leaks on logout
- Dynamic powers synced to client
- ExtraInventoryPower drop_on_death functional
- ActiveTeleportPower wall suffocation fix
- QualityEquipmentPower duplicate modifiers
- CompatAttachments resource bars reset on death
- PlayerOriginData cross-dimension gcSet
- More (see PATCH_NOTES_2_0.md)
Compat Improvements:
- origins:ingredient nested unwrap (9 packs)
- origins:type damage_condition (Kitsune invincibility fix)
- Wildcard *:*_toggle power_active (155 uses)
- origins:phasing with block_condition (19 powers)
- origins:biome sub-conditions (22 powers)
- Conditioned modify_damage_dealt Route B (15 powers)
release
NeoOrigins v2.0.34 (MC 1.21.1)
v2.0.34+1.21.110 мая 2026 г.257Minecraft: 1.21.1neoforge
Что нового
v2.0.34: object-format key parsing, toolbar key slots, phantom cleanup
- Fix active_self key field parsing: handle JSON object format ({"key": "...", "continuous": true}) — fixes Esper Origin (156 power failures) and any pack using object keys
- Continuous key support: fires action every tick while held (vs once on press)
- Map loadToolbarActivator/saveToolbarActivator/pickItem to skill slots — fixes warper teleport and similar powers that were silently no-op
- Log warning for unsupported key types
- Remove phantom_form from Phantom origin
release
NeoOrigins v2.0.34 (MC 26.1.x)
v2.0.34+26.110 мая 2026 г.19Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.34: object-format key parsing, toolbar key slots, phantom cleanup
- Fix active_self key field parsing: handle JSON object format ({"key": "...", "continuous": true}) — fixes Esper Origin (156 power failures) and any pack using object keys
- Continuous key support: fires action every tick while held (vs once on press)
- Map loadToolbarActivator/saveToolbarActivator/pickItem to skill slots — fixes warper teleport and similar powers that were silently no-op
- Log warning for unsupported key types
- Remove phantom_form from Phantom origin
release
NeoOrigins v2.0.33 (MC 1.21.1)
v2.0.33+1.21.110 мая 2026 г.411Minecraft: 1.21.1neoforge
Что нового
fix: Kitsune/Origins pack compat — icon parsing, modifier amount field, damage cancellation, jump conditions, food filters, breath_in_fluid surface detection
- IconCodec: accept both "id" and "item" keys for origin icons — Kitsune and other packs use "id" which caused origins to fail to parse entirely
- Modifier parser: read "amount" field (Origins standard) in addition to "value" — was silently defaulting to 1.0x for all damage/food modifiers across all packs
- ModifyDamagePower: cancel event when scaled damage <= 0 — prevents hurt sound/tilt on nullified damage (e.g. fall damage immunity)
- Route A translate: add damage_condition -> damage_type translation for origins:name and origins:type conditions
- parseModifyJump: respect condition field — was always applying jump boost permanently, ignoring condition gates like sneaking
- CompatEventPowers.onFoodEaten: fix post-eat FoodData correction (same Finish-event timing bug as native ModifyFoodNutritionPower)
- ModifyFoodNutritionPower: add food_item and food_tag filter fields for per-item nutrition overrides
- prevent_game_event: new compat power type via VanillaGameEvent cancellation
- breath_in_fluid: use isUnderWater() instead of isInWater() — drain only when eyes submerged, surface breathing works normally
release
NeoOrigins v2.0.33 (MC 26.1.x)
v2.0.33+26.110 мая 2026 г.20Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
fix: Kitsune/Origins pack compat — icon parsing, modifier amount field, damage cancellation, jump conditions, food filters, breath_in_fluid surface detection
- IconCodec: accept both "id" and "item" keys for origin icons — Kitsune and other packs use "id" which caused origins to fail to parse entirely
- Modifier parser: read "amount" field (Origins standard) in addition to "value" — was silently defaulting to 1.0x for all damage/food modifiers across all packs
- ModifyDamagePower: cancel event when scaled damage <= 0 — prevents hurt sound/tilt on nullified damage (e.g. fall damage immunity)
- Route A translate: add damage_condition -> damage_type translation for origins:name and origins:type conditions
- parseModifyJump: respect condition field — was always applying jump boost permanently, ignoring condition gates like sneaking
- CompatEventPowers.onFoodEaten: fix post-eat FoodData correction (same Finish-event timing bug as native ModifyFoodNutritionPower)
- ModifyFoodNutritionPower: add food_item and food_tag filter fields for per-item nutrition overrides
- prevent_game_event: new compat power type via VanillaGameEvent cancellation
- breath_in_fluid: use isUnderWater() instead of isInWater() — drain only when eyes submerged, surface breathing works normally
release
NeoOrigins v2.0.33 (MC 1.21.1)
v2.0.33+1.21.110 мая 2026 г.25Minecraft: 1.21.1neoforge
Что нового
v2.0.33: Origins pack compat fixes, food filtering, breath_in_fluid surface fix, teleport VFX
Compat Fixes (affects ALL Origins datapacks):
- Icon "id" field: origins using {"id": "minecraft:item"} instead of {"item": "..."} for icons failed to parse entirely — the origin never loaded. Now accepts both fields.
- Modifier "amount" field: damage/food/jump modifiers using the standard Origins "amount" field (vs "value") were silently ignored, defaulting to no effect. Affected modify_damage_taken, modify_food, and all Route B modifier math.
- Damage cancellation: 0-multiplier damage (e.g. fall damage immunity) no longer plays the hurt sound/screen tilt — event is now fully cancelled.
- damage_condition translation: origins:name and origins:type damage conditions now properly translate to the native damage_type filter.
- modify_jump conditions: jump modifiers with condition gates (e.g. "only while sneaking") were permanently applied — condition was ignored. Now toggles per-tick.
- modify_food timing: Route B food modifiers had the same post-eat timing bug fixed in v2.0.31 for the native power — stack modification after consumption did nothing.
- prevent_game_event: new compat power type — suppresses sculk sensor detection via VanillaGameEvent cancellation.
Features:
- modify_food_nutrition: new food_item and food_tag filter fields for per-item nutrition overrides
- Enderman teleport VFX (sound + portal particles) on all built-in teleport powers: active_teleport, active_phase, active_recall, active_swap, slime death save
Bug Fix:
- breath_in_fluid: was using isInWater() (any body part) instead of isUnderWater() (eyes submerged) — drain fired even at the surface, and surfacing briefly reset the air tracker. Now matches vanilla drowning behavior: drain only when eyes are submerged, surface breathing refills air normally.
release
NeoOrigins v2.0.33 (MC 26.1.x)
v2.0.33+26.110 мая 2026 г.12Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.33: Origins pack compat fixes, food filtering, breath_in_fluid surface fix, teleport VFX
Compat Fixes (affects ALL Origins datapacks):
- Icon "id" field: origins using {"id": "minecraft:item"} instead of {"item": "..."} for icons failed to parse entirely — the origin never loaded. Now accepts both fields.
- Modifier "amount" field: damage/food/jump modifiers using the standard Origins "amount" field (vs "value") were silently ignored, defaulting to no effect. Affected modify_damage_taken, modify_food, and all Route B modifier math.
- Damage cancellation: 0-multiplier damage (e.g. fall damage immunity) no longer plays the hurt sound/screen tilt — event is now fully cancelled.
- damage_condition translation: origins:name and origins:type damage conditions now properly translate to the native damage_type filter.
- modify_jump conditions: jump modifiers with condition gates (e.g. "only while sneaking") were permanently applied — condition was ignored. Now toggles per-tick.
- modify_food timing: Route B food modifiers had the same post-eat timing bug fixed in v2.0.31 for the native power — stack modification after consumption did nothing.
- prevent_game_event: new compat power type — suppresses sculk sensor detection via VanillaGameEvent cancellation.
Features:
- modify_food_nutrition: new food_item and food_tag filter fields for per-item nutrition overrides
- Enderman teleport VFX (sound + portal particles) on all built-in teleport powers: active_teleport, active_phase, active_recall, active_swap, slime death save
Bug Fix:
- breath_in_fluid: was using isInWater() (any body part) instead of isUnderWater() (eyes submerged) — drain fired even at the surface, and surfacing briefly reset the air tracker. Now matches vanilla drowning behavior: drain only when eyes are submerged, surface breathing refills air normally.
release
NeoOrigins v2.0.32 (MC 1.21.1)
v2.0.32+1.21.19 мая 2026 г.104Minecraft: 1.21.1neoforge
Что нового
v2.0.32: Origins++ warper compat, keybind expansion, command condition fix
Origins++ Warper Compat:
- Ship 1.21.1-compatible override mcfunctions for warper portal system (1.20 NBT->component syntax, singular function/ path — Origins++ 2.4 functions were never loading on 1.21.1)
- Portals now summon, detect nearby entities, and teleport correctly
Command Condition Fix:
- origins:command condition was missing .withPermission(2) — entity selectors (@e) silently failed for survival players, breaking any power that uses command-based detection
Keybind Slot System:
- Only primary_active and secondary_active keys occupy skill slots now
- 69 Origins++ powers using vanilla keys (key.use, key.sneak, key.jump, movement) were incorrectly consuming skill slots — now fire via server-side input polling instead
- Added Skill 5 + Skill 6 keybinds (unbound by default), raised slot limit from 4 to 6
Resource Bar Visibility:
- Boolean toggle resources (min=0, max=1) hidden from HUD — these are internal state flags
- Condition-gated hud_render resources hidden from flat bar display
- Route B resource min/max actions now edge-triggered (same fix as native ResourcePower in v2.0.31)
release
NeoOrigins v2.0.32 (MC 26.1.x)
v2.0.32+26.19 мая 2026 г.24Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.32: Origins++ warper compat, keybind expansion, command condition fix
Origins++ Warper Compat:
- Ship 1.21.1-compatible override mcfunctions for warper portal system (1.20 NBT->component syntax, singular function/ path — Origins++ 2.4 functions were never loading on 1.21.1)
- Portals now summon, detect nearby entities, and teleport correctly
Command Condition Fix:
- origins:command condition was missing .withPermission(2) — entity selectors (@e) silently failed for survival players, breaking any power that uses command-based detection
Keybind Slot System:
- Only primary_active and secondary_active keys occupy skill slots now
- 69 Origins++ powers using vanilla keys (key.use, key.sneak, key.jump, movement) were incorrectly consuming skill slots — now fire via server-side input polling instead
- Added Skill 5 + Skill 6 keybinds (unbound by default), raised slot limit from 4 to 6
Resource Bar Visibility:
- Boolean toggle resources (min=0, max=1) hidden from HUD — these are internal state flags
- Condition-gated hud_render resources hidden from flat bar display
- Route B resource min/max actions now edge-triggered (same fix as native ResourcePower in v2.0.31)
release
NeoOrigins v2.0.31 (MC 1.21.1)
v2.0.31+1.21.19 мая 2026 г.286Minecraft: 1.21.1neoforge
Что нового
v2.0.31: full power type API audit — 33 bug fixes across 24 files
Full audit of all 93 power types against both game versions (1.21.1 + 26.1).
33 bugs identified and fixed, covering vanilla race conditions, event timing,
memory leaks, codec issues, and master-branch regressions.
Bug Fixes (HIGH):
- breath_in_fluid completely broken — vanilla baseTick overwrites air drain; rebuilt with Post-tick handler + LivingBreatheEvent suppression
- modify_food_nutrition does nothing — Finish event fires after vanilla already ate the food; switched to post-eat FoodData correction with proper saturation scaling
- SlimeDeathSavePower stores tickCount as float — precision degrades after ~9.6 days; also broke across relogs. Switched to remaining-ticks countdown
- CraftAmountBonusPower triggers on any inventory increase (pickup, hopper, trade) — replaced tick polling with PlayerEvent.ItemCraftedEvent
- ActivePhasePower charges hunger twice (execute + base class both deduct)
- ExtraInventoryPower hardcodes 3-row chest menu regardless of config size
- ShadowOrbPower orbs tick in wrong dimension after dimension change
- WaterBreathingPower bubble bar flickers (onTick air set overwritten by baseTick)
Bug Fixes (MEDIUM):
- SizeScalingPower hardcoded modifier IDs — collision when player has multiple size_scaling powers
- ResourcePower min/max actions fire every tick at boundary instead of edge-triggered
- SlimeMoisturePower resets moisture to 1.0 on every login/respawn
- SlimeLevelHPPower uses permanent modifier — stale bonus HP after death
- ModelColorPower CONDITION_STATE map never cleaned on logout/revoke (memory leak)
- TamedAnimalBoostPower permanent modifiers never removed on power revoke
- ModifyFoodNutritionPower saturation math passes raw value where Builder expects ratio
Bug Fixes (LOW):
- ActiveTidalWavePower consumes cooldown on whiff (zero hits)
- ElytraBoostPower scales entire velocity vector, not just boost delta — exponential acceleration
- BurnPower doc says "seconds" but field is ticks
- EffectImmunityPower effects field required instead of optional — confusing codec error
- PreventActionPower SWIM sets hurtMarked every tick — 20 velocity sync packets/sec
- StealthPower SNEAK_TICKS map uses non-concurrent HashMap
- WraithPhasePower allocates new HashSet and re-parses blocked_blocks every tick
- LowHPThresholdPower NaN if getMaxHealth() returns 0
- IgnoreWaterPower fragile string-based attribute lookup instead of Attributes constant
- HordeRegenPower combat detection conflates damage source types
Master-only regressions also fixed (6 commits on master branch):
- AbstractActivePower cooldown key uses identityHashCode — resets on every rejoin
- AbstractTogglePower isToggledOff signature changed — compile failure + WraithPhase dead override
- AttributeModifierPower modIdFor dropped powerKey — identical modifier IDs de-duplicate
- ModifyDamagePower removed targetGroup — 3 shipped powers lose entity-group filter
- BreathOutOfFluidPower backtank drains 20x too fast (lost tick guard)
- ExtraInventoryPower onPlayerSave overwrites entire mod NBT compound
- ScareEntitiesPower only clears target for specific player — breaks Phantoms
- SummonMinionPower lost offensive targeting — minions only defend
- PhantomFormPower ability sync gated behind wasFlying
Documentation:
- POWER_TYPES.md: updated breath_in_fluid, craft_amount_bonus, extra_inventory, tamed_animal_boost
- 2_0_CHANGES.md: marked craft_amount_bonus as resolved (no longer tick-polled)
release
NeoOrigins v2.0.31 (MC 26.1.x)
v2.0.31+26.19 мая 2026 г.23Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.31: full power type API audit — 33 bug fixes across 24 files
Full audit of all 93 power types against both game versions (1.21.1 + 26.1).
33 bugs identified and fixed, covering vanilla race conditions, event timing,
memory leaks, codec issues, and master-branch regressions.
Bug Fixes (HIGH):
- breath_in_fluid completely broken — vanilla baseTick overwrites air drain; rebuilt with Post-tick handler + LivingBreatheEvent suppression
- modify_food_nutrition does nothing — Finish event fires after vanilla already ate the food; switched to post-eat FoodData correction with proper saturation scaling
- SlimeDeathSavePower stores tickCount as float — precision degrades after ~9.6 days; also broke across relogs. Switched to remaining-ticks countdown
- CraftAmountBonusPower triggers on any inventory increase (pickup, hopper, trade) — replaced tick polling with PlayerEvent.ItemCraftedEvent
- ActivePhasePower charges hunger twice (execute + base class both deduct)
- ExtraInventoryPower hardcodes 3-row chest menu regardless of config size
- ShadowOrbPower orbs tick in wrong dimension after dimension change
- WaterBreathingPower bubble bar flickers (onTick air set overwritten by baseTick)
Bug Fixes (MEDIUM):
- SizeScalingPower hardcoded modifier IDs — collision when player has multiple size_scaling powers
- ResourcePower min/max actions fire every tick at boundary instead of edge-triggered
- SlimeMoisturePower resets moisture to 1.0 on every login/respawn
- SlimeLevelHPPower uses permanent modifier — stale bonus HP after death
- ModelColorPower CONDITION_STATE map never cleaned on logout/revoke (memory leak)
- TamedAnimalBoostPower permanent modifiers never removed on power revoke
- ModifyFoodNutritionPower saturation math passes raw value where Builder expects ratio
Bug Fixes (LOW):
- ActiveTidalWavePower consumes cooldown on whiff (zero hits)
- ElytraBoostPower scales entire velocity vector, not just boost delta — exponential acceleration
- BurnPower doc says "seconds" but field is ticks
- EffectImmunityPower effects field required instead of optional — confusing codec error
- PreventActionPower SWIM sets hurtMarked every tick — 20 velocity sync packets/sec
- StealthPower SNEAK_TICKS map uses non-concurrent HashMap
- WraithPhasePower allocates new HashSet and re-parses blocked_blocks every tick
- LowHPThresholdPower NaN if getMaxHealth() returns 0
- IgnoreWaterPower fragile string-based attribute lookup instead of Attributes constant
- HordeRegenPower combat detection conflates damage source types
Master-only regressions also fixed (6 commits on master branch):
- AbstractActivePower cooldown key uses identityHashCode — resets on every rejoin
- AbstractTogglePower isToggledOff signature changed — compile failure + WraithPhase dead override
- AttributeModifierPower modIdFor dropped powerKey — identical modifier IDs de-duplicate
- ModifyDamagePower removed targetGroup — 3 shipped powers lose entity-group filter
- BreathOutOfFluidPower backtank drains 20x too fast (lost tick guard)
- ExtraInventoryPower onPlayerSave overwrites entire mod NBT compound
- ScareEntitiesPower only clears target for specific player — breaks Phantoms
- SummonMinionPower lost offensive targeting — minions only defend
- PhantomFormPower ability sync gated behind wasFlying
Documentation:
- POWER_TYPES.md: updated breath_in_fluid, craft_amount_bonus, extra_inventory, tamed_animal_boost
- 2_0_CHANGES.md: marked craft_amount_bonus as resolved (no longer tick-polled)
release
NeoOrigins v2.0.30 (MC 1.21.1)
v2.0.30+1.21.18 мая 2026 г.343Minecraft: 1.21.1neoforge
Что нового
v2.0.30: Origins++ 100% compat, walk_on_fluid, extra_inventory, command translation
- **`neoorigins:walk_on_fluid`** — Walk on water/lava surfaces (Strider mechanic). Configurable: `water`, `lava`, or `both`.
- **`neoorigins:extra_inventory`** — Extra inventory via skill keybind. Vanilla chest UI, up to 54 slots, persistent, drop_on_death option.
Origins++ 2.4 power compat raised from ~96% to **100%** (all ~1326 powers handled). 17 new power type handlers covering action_on_block_break, action_on_entity_use, action_on_item_use, action_on_wake_up, status_bar_texture, prevent_elytra_flight, modify_projectile_damage, modify_air_speed, exhaust, starting_equipment, walk_on_fluid, inventory, conditioned_restrict_armor, freeze, modify_harvest, recipe.
- `/resource change|set|get` and `/power grant|revoke` commands mirror Origins-mod API
- `LegacyCommandRewriter` rewrites 1.20→1.21 attribute names, item data paths, and modifier IDs at runtime
- `elytra` value added to `prevent_action`
- `LivingEntityWalkOnFluidMixin` for walk capabilities
- 8 new power type sections, 5 stale entry fixes, food_finished event, v2.0.29 notes merged
release
NeoOrigins v2.0.30 (MC 26.1.x)
v2.0.30+26.18 мая 2026 г.26Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.30: Origins++ 100% compat, walk_on_fluid, extra_inventory, command translation
- **`neoorigins:walk_on_fluid`** — Walk on water/lava surfaces (Strider mechanic). Configurable: `water`, `lava`, or `both`.
- **`neoorigins:extra_inventory`** — Extra inventory via skill keybind. Vanilla chest UI, up to 54 slots, persistent, drop_on_death option.
Origins++ 2.4 power compat raised from ~96% to **100%** (all ~1326 powers handled). 17 new power type handlers covering action_on_block_break, action_on_entity_use, action_on_item_use, action_on_wake_up, status_bar_texture, prevent_elytra_flight, modify_projectile_damage, modify_air_speed, exhaust, starting_equipment, walk_on_fluid, inventory, conditioned_restrict_armor, freeze, modify_harvest, recipe.
- `/resource change|set|get` and `/power grant|revoke` commands mirror Origins-mod API
- `LegacyCommandRewriter` rewrites 1.20→1.21 attribute names, item data paths, and modifier IDs at runtime
- `elytra` value added to `prevent_action`
- `LivingEntityWalkOnFluidMixin` for walk capabilities
- 8 new power type sections, 5 stale entry fixes, food_finished event, v2.0.29 notes merged
release
NeoOrigins v2.0.29 (MC 1.21.1)
v2.0.29+1.21.18 мая 2026 г.289Minecraft: 1.21.1neoforge
Что нового
v2.0.29: custom icons, Ars compat, blacksmith/cook rework, modify_food compat fix
Features:
- Custom origin icons with CustomModelData support (IconCodec)
- Ars Nouveau compat — harm spell inversion for undead origins
- New power type: neoorigins:modify_food_nutrition
- New condition type: neoorigins:cooldown
- Stoneguard Warding Presence now toggleable
Reworks:
- Blacksmith Quality Craftsmanship — attribute-based (+mining speed, +attack damage, +armor toughness, +durability)
- Cook Good Meals — now adds +1 nutrition alongside saturation
- Cook Smoking Expert — was inert, now +2 nutrition +0.5 saturation
- Stoneguard Warding Presence — radius 24→48
Bug Fixes:
- origins:modify_food compat power was inert (no-op stub)
- 26.1.2 crash (RareWanderingLootPower static init) + mixin renames
- Mod armor helmets not blocking sunburn
- Model color transparency broken with nametag off
- Unknown icon items no longer crash origin loading
- Compat translator stripping icon data
Closes #85 #64 #51 #39 #33 #83 #80 #62 #61 #76 #75 #69 #68 #81
release
NeoOrigins v2.0.29 (MC 26.1.x)
v2.0.29+26.18 мая 2026 г.22Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.29: custom icons, Ars compat, blacksmith/cook rework, modify_food compat fix
Features:
- Custom origin icons with CustomModelData support (IconCodec)
- Ars Nouveau compat — harm spell inversion for undead origins
- New power type: neoorigins:modify_food_nutrition
- New condition type: neoorigins:cooldown
- Stoneguard Warding Presence now toggleable
Reworks:
- Blacksmith Quality Craftsmanship — attribute-based (+mining speed, +attack damage, +armor toughness, +durability)
- Cook Good Meals — now adds +1 nutrition alongside saturation
- Cook Smoking Expert — was inert, now +2 nutrition +0.5 saturation
- Stoneguard Warding Presence — radius 24→48
Bug Fixes:
- origins:modify_food compat power was inert (no-op stub)
- 26.1.2 crash (RareWanderingLootPower static init) + mixin renames
- Mod armor helmets not blocking sunburn
- Model color transparency broken with nametag off
- Unknown icon items no longer crash origin loading
- Compat translator stripping icon data
Closes #85 #64 #51 #39 #33 #83 #80 #62 #61 #76 #75 #69 #68 #81
release
NeoOrigins v2.0.28 (MC 1.21.1)
v2.0.28+1.21.17 мая 2026 г.604Minecraft: 1.21.1neoforge
Что нового
v2.0.28
Bug Fixes:
- fix: flight powers no longer activate after entering the Nether — client
air-jump cooldown used player.tickCount which resets on dimension change,
silently blocking all flight activation. Switched to monotonic clock.
- fix: flight rubber-banding on dedicated servers — added client-side
updateFallFlying bypass for flight/natural_glide capabilities.
- fix: Necromancer/undead not healing from Instant Damage (#84) — added
LivingEntityUndeadPotionMixin for isInvertedHealAndHarm override.
- fix: Blacksmith enchanting all items on pickup — QualityEquipmentPower
rewritten from tick-scan to craft-event-only.
- fix: fox berry bush phasing mapped as full wall noclip — translator now
skips when block_condition is present.
Improvements:
- Create Copper Backtank compat for aquatic dries-out origins.
- origins:fresh_air now height-gated (blocked below Y 86, not unconditional).
release
NeoOrigins v2.0.28 (MC 26.1.x)
v2.0.28+26.17 мая 2026 г.21Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.28
Bug Fixes:
- fix: flight powers no longer activate after entering the Nether — client
air-jump cooldown used player.tickCount which resets on dimension change,
silently blocking all flight activation. Switched to monotonic clock.
- fix: flight rubber-banding on dedicated servers — added client-side
updateFallFlying bypass for flight/natural_glide capabilities.
- fix: Necromancer/undead not healing from Instant Damage (#84) — added
LivingEntityUndeadPotionMixin for isInvertedHealAndHarm override.
- fix: Blacksmith enchanting all items on pickup — QualityEquipmentPower
rewritten from tick-scan to craft-event-only.
- fix: fox berry bush phasing mapped as full wall noclip — translator now
skips when block_condition is present.
Improvements:
- Create Copper Backtank compat for aquatic dries-out origins.
- origins:fresh_air now height-gated (blocked below Y 86, not unconditional).
release
NeoOrigins v2.0.27 (MC 1.21.1)
v2.0.27+1.21.15 мая 2026 г.664Minecraft: 1.21.1neoforge
Что нового
v2.0.27: Warper Portal Fix, Sleep Compat, Spawn Translation
Features:
- *:* self-reference resolution in origins:multiple powers — sibling sub-power references (*:*_subkey) now correctly resolve to their synthetic IDs in both Route A and Route B expansion
- origins:modify_player_spawn Route A translation — maps dimension/biome/structure fields to native LocationCondition (18 Origins++ powers: Warper End spawn, Nether spawns, fortress/mineshaft/village structure spawns, biome spawns)
- origins:command condition now returns the command's integer result and evaluates comparison/compare_to fields (was always returning true)
- origins:prevent_sleep now supports block_condition field — height-gated sleep restrictions work correctly (Spirit Ram high_sleep: sleep only above Y 70)
- Coffin compat: sleep prevention only blocks vanilla beds — modded sleep blocks (Vampirism coffins, etc.) pass through so vampires can skip the day
Fixes:
- Warper portality power fully functional: portal placement, entity detection, cross-portal teleportation, particle effects, and cleanup all working
- Spirit Ram / origins with conditioned sleep now correctly allow sleeping when block_condition is not met
- Vampirism coffin interaction no longer crashes the server (Failed to encode packet clientbound/minecraft:system_chat) or corrupts singleplayer worlds
- Connection null guard on sleep prevention event for modded block edge cases
release
NeoOrigins v2.0.27 (MC 26.1.x)
v2.0.27+26.15 мая 2026 г.22Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.27: Warper Portal Fix, Sleep Compat, Spawn Translation
Features:
- *:* self-reference resolution in origins:multiple powers — sibling sub-power references (*:*_subkey) now correctly resolve to their synthetic IDs in both Route A and Route B expansion
- origins:modify_player_spawn Route A translation — maps dimension/biome/structure fields to native LocationCondition (18 Origins++ powers: Warper End spawn, Nether spawns, fortress/mineshaft/village structure spawns, biome spawns)
- origins:command condition now returns the command's integer result and evaluates comparison/compare_to fields (was always returning true)
- origins:prevent_sleep now supports block_condition field — height-gated sleep restrictions work correctly (Spirit Ram high_sleep: sleep only above Y 70)
- Coffin compat: sleep prevention only blocks vanilla beds — modded sleep blocks (Vampirism coffins, etc.) pass through so vampires can skip the day
Fixes:
- Warper portality power fully functional: portal placement, entity detection, cross-portal teleportation, particle effects, and cleanup all working
- Spirit Ram / origins with conditioned sleep now correctly allow sleeping when block_condition is not met
- Vampirism coffin interaction no longer crashes the server (Failed to encode packet clientbound/minecraft:system_chat) or corrupts singleplayer worlds
- Connection null guard on sleep prevention event for modded block edge cases
release
NeoOrigins v2.0.26 (MC 1.21.1)
v2.0.26+1.21.15 мая 2026 г.139Minecraft: 1.21.1neoforge
Что нового
v2.0.26: Compat Expansion — Power Aliases, Effect Amplifier, Attribute Normalization
Features:
- 22 well-known Origins built-in power aliases (carnivore, cat_vision, fall_immunity, launch_into_air, light_armor, nine_lives, no_shield, vegetarian, weak_arms, etc.)
- New item tag: neoorigins:meat_foods for carnivore diet restriction
- modify_status_effect_amplifier Route B handler — boosts effect amplifiers (fixes 25 Chimaera powers)
- modify_falling Route B handler — gravity reduction + safe fall distance
- 12 new condition/action types: status_effect, air, power, replaceable, actor_condition, choice, mount, passenger_action, spawn_effect_cloud, offset, add_xp, crafting_table
- origins:shaking Route B handler (freeze-tick visual)
- apoli:overlay Route B no-op handler (counts toward power ratio)
- Hidden flag for resource bars (hud_render.should_render support)
Fixes:
- conditioned_attribute: attribute field nested inside "modifier" object now parsed correctly (fixes 57 Origins++ powers)
- Attribute name normalization: try raw name, then with/without "generic." prefix (fixes 70 powers on 1.21.1)
- origins:advancement condition support
- spawn_effect_cloud: effect field as JSON object with nested fields
- Suppress "Unknown power type" warnings for Route B types in Route A log
- Substitute origins:temporary_cobweb with minecraft:cobweb in set_block action
- on_block: handle in_tag and and/or nested block_condition combinators
- block_in_radius: fix missing neoorigins: prefix in switch case
release
NeoOrigins v2.0.26 (MC 26.1.x)
v2.0.26+26.15 мая 2026 г.20Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.26: Compat Expansion — Power Aliases, Effect Amplifier, Attribute Normalization
Features:
- 22 well-known Origins built-in power aliases (carnivore, cat_vision, fall_immunity, launch_into_air, light_armor, nine_lives, no_shield, vegetarian, weak_arms, etc.)
- New item tag: neoorigins:meat_foods for carnivore diet restriction
- modify_status_effect_amplifier Route B handler — boosts effect amplifiers (fixes 25 Chimaera powers)
- modify_falling Route B handler — gravity reduction + safe fall distance
- 12 new condition/action types: status_effect, air, power, replaceable, actor_condition, choice, mount, passenger_action, spawn_effect_cloud, offset, add_xp, crafting_table
- origins:shaking Route B handler (freeze-tick visual)
- apoli:overlay Route B no-op handler (counts toward power ratio)
- Hidden flag for resource bars (hud_render.should_render support)
Fixes:
- conditioned_attribute: attribute field nested inside "modifier" object now parsed correctly (fixes 57 Origins++ powers)
- Attribute name normalization: try raw name, then with/without "generic." prefix (fixes 70 powers on 1.21.1)
- origins:advancement condition support
- spawn_effect_cloud: effect field as JSON object with nested fields
- Suppress "Unknown power type" warnings for Route B types in Route A log
- Substitute origins:temporary_cobweb with minecraft:cobweb in set_block action
- on_block: handle in_tag and and/or nested block_condition combinators
- block_in_radius: fix missing neoorigins: prefix in switch case
release
NeoOrigins v2.0.25 (MC 1.21.1)
v2.0.25+1.21.14 мая 2026 г.378Minecraft: 1.21.1neoforge
Что нового
v2.0.25: fix escape immortality, config for new origins & orb XP cost
- Fix: escaping the starter origin screen no longer grants permanent
immortality. pickerAbandoned is now persisted in the player data
codec so the flag survives relog/restart.
- Config: skeleton, slime, and wraith origins can now be disabled via
the [origins] config section like all other built-in origins.
- Config: new [orb_of_origins] section with levels_per_use setting.
Set to 0 to disable the escalating XP cost entirely.
- Config: added power_overrides for all skeleton powers (speed, jump,
brittle_frame, marksmanship, eat_bone_meal, evolved/ascended/apex).
- Config: added power_overrides for all slime powers (moisture drain
rates, death_save thresholds, level_hp scaling, evolved/apex HP).
- Config: added exhaustion_per_tick overrides to all wraith phase
tiers, plus wraith_apex_hunger_drain.
release
NeoOrigins v2.0.25 (MC 26.1.x)
v2.0.25+26.14 мая 2026 г.21Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.25: fix escape immortality, config for new origins & orb XP cost
- Fix: escaping the starter origin screen no longer grants permanent
immortality. pickerAbandoned is now persisted in the player data
codec so the flag survives relog/restart.
- Config: skeleton, slime, and wraith origins can now be disabled via
the [origins] config section like all other built-in origins.
- Config: new [orb_of_origins] section with levels_per_use setting.
Set to 0 to disable the escalating XP cost entirely.
- Config: added power_overrides for all skeleton powers (speed, jump,
brittle_frame, marksmanship, eat_bone_meal, evolved/ascended/apex).
- Config: added power_overrides for all slime powers (moisture drain
rates, death_save thresholds, level_hp scaling, evolved/apex HP).
- Config: added exhaustion_per_tick overrides to all wraith phase
tiers, plus wraith_apex_hunger_drain.
release
NeoOrigins v2.0.23 (MC 1.21.1)
v2.0.23+1.21.13 мая 2026 г.382Minecraft: 1.21.1neoforge
Что нового
v2.0.23
Bug fixes:
- fix: wall climb sneak now holds position instead of dropping player
- fix: resource bars fully cleaned up on origin change and relog
- fix: safer compat layer — action_over_time, conditioned_status_effect,
and damage_over_time refuse to compile when condition types are
unsupported, preventing unconditional execution disasters
- fix: conditioned status effects now remove when condition becomes false
- docs: fixed COOKBOOK.md dash example (add_velocity → dash)
release
NeoOrigins v2.0.23 (MC 26.1.x)
v2.0.23+26.13 мая 2026 г.25Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.23
Bug fixes:
- fix: wall climb sneak now holds position instead of dropping player
- fix: resource bars fully cleaned up on origin change and relog
- fix: safer compat layer — action_over_time, conditioned_status_effect,
and damage_over_time refuse to compile when condition types are
unsupported, preventing unconditional execution disasters
- fix: conditioned status effects now remove when condition becomes false
- docs: fixed COOKBOOK.md dash example (add_velocity → dash)
release
NeoOrigins v2.0.22 (MC 1.21.1)
v2.0.22+1.21.12 мая 2026 г.652Minecraft: 1.21.1neoforge
Что нового
v2.0.22
Features:
- Universal power condition gate — all power types support optional
top-level `power_condition` + `power_condition_mode` fields using
the full condition DSL
Bug fixes:
- fix: origins with `unchoosable: true` now properly hidden from the
selection screen (was parsed but never filtered)
- fix: Impact codec accepts integer values (0-3) for Origins pack compat
- fix: origin upgrade `condition` field accepts bare-string advancement
IDs (e.g. "condition": "minecraft:story/mine_diamond")
- fix: renamed universal gate field from "condition" to "power_condition"
to avoid collision with power types using "condition" internally
release
NeoOrigins v2.0.22 (MC 26.1.x)
v2.0.22+26.12 мая 2026 г.21Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.22
Features:
- Universal power condition gate — all power types support optional
top-level `power_condition` + `power_condition_mode` fields using
the full condition DSL
Bug fixes:
- fix: origins with `unchoosable: true` now properly hidden from the
selection screen (was parsed but never filtered)
- fix: Impact codec accepts integer values (0-3) for Origins pack compat
- fix: origin upgrade `condition` field accepts bare-string advancement
IDs (e.g. "condition": "minecraft:story/mine_diamond")
- fix: renamed universal gate field from "condition" to "power_condition"
to avoid collision with power types using "condition" internally
release
NeoOrigins v2.0.21 (MC 1.21.1)
v2.0.21+1.21.12 мая 2026 г.172Minecraft: 1.21.1neoforge
Что нового
v2.0.21
Features (from v2.0.20):
- Universal power condition gate — all power types now support optional
top-level `power_condition` + `power_condition_mode` fields
- Full condition DSL (and/or/not, biome, water, sun, health, etc.) can
gate any power without needing per-type condition support
- power_condition_mode "deny" (default): power disabled when condition is true
- power_condition_mode "allow": power only operates when condition is true
- Gates onTick, onActivated, onHit, onKill, and capability checks
- Lifecycle methods (onGranted/onRevoked/onLogin/onRespawn) remain ungated
Bug fixes:
- fix: renamed universal gate field from "condition" to "power_condition"
to avoid collision with power types that use "condition" in their own
config (condition_passive, action_on_event, attribute_modifier, model_color).
v2.0.20 caused all conditioned powers to fire unconditionally.
release
NeoOrigins v2.0.21 (MC 26.1.x)
v2.0.21+26.12 мая 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.21
Features (from v2.0.20):
- Universal power condition gate — all power types now support optional
top-level `power_condition` + `power_condition_mode` fields
- Full condition DSL (and/or/not, biome, water, sun, health, etc.) can
gate any power without needing per-type condition support
- power_condition_mode "deny" (default): power disabled when condition is true
- power_condition_mode "allow": power only operates when condition is true
- Gates onTick, onActivated, onHit, onKill, and capability checks
- Lifecycle methods (onGranted/onRevoked/onLogin/onRespawn) remain ungated
Bug fixes:
- fix: renamed universal gate field from "condition" to "power_condition"
to avoid collision with power types that use "condition" in their own
config (condition_passive, action_on_event, attribute_modifier, model_color).
v2.0.20 caused all conditioned powers to fire unconditionally.
release
NeoOrigins v2.0.20 (MC 1.21.1)
v2.0.20+1.21.12 мая 2026 г.11Minecraft: 1.21.1neoforge
Что нового
v2.0.20: universal condition gate for all power types
Features:
- All power types now support optional top-level `power_condition` + `power_condition_mode` fields
- Full condition DSL (and/or/not, biome, water, sun, health, etc.) can gate any power
- power_condition_mode "deny" (default): power disabled when condition is true
- power_condition_mode "allow": power only operates when condition is true
- Gates onTick, onActivated, onHit, onKill, and capability checks
- Lifecycle methods (onGranted/onRevoked/onLogin/onRespawn) remain ungated
release
NeoOrigins v2.0.20 (MC 26.1.x)
v2.0.20+26.12 мая 2026 г.12Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.20: universal condition gate for all power types
Features:
- All power types now support optional top-level `power_condition` + `power_condition_mode` fields
- Full condition DSL (and/or/not, biome, water, sun, health, etc.) can gate any power
- power_condition_mode "deny" (default): power disabled when condition is true
- power_condition_mode "allow": power only operates when condition is true
- Gates onTick, onActivated, onHit, onKill, and capability checks
- Lifecycle methods (onGranted/onRevoked/onLogin/onRespawn) remain ungated
release
NeoOrigins v2.0.20 (MC 1.21.1)
v2.0.20+1.21.12 мая 2026 г.269Minecraft: 1.21.1neoforge
Что нового
v2.0.20: universal condition gate for all power types
Features:
- All power types now support optional top-level `condition` + `condition_mode` fields
- Full condition DSL (and/or/not, biome, water, sun, health, etc.) can gate any power
- condition_mode "deny" (default): power disabled when condition is true
- condition_mode "allow": power only operates when condition is true
- Gates onTick, onActivated, onHit, onKill, and capability checks
- Lifecycle methods (onGranted/onRevoked/onLogin/onRespawn) remain ungated
release
NeoOrigins v2.0.20 (MC 26.1.x)
v2.0.20+26.12 мая 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.20: universal condition gate for all power types
Features:
- All power types now support optional top-level `condition` + `condition_mode` fields
- Full condition DSL (and/or/not, biome, water, sun, health, etc.) can gate any power
- condition_mode "deny" (default): power disabled when condition is true
- condition_mode "allow": power only operates when condition is true
- Gates onTick, onActivated, onHit, onKill, and capability checks
- Lifecycle methods (onGranted/onRevoked/onLogin/onRespawn) remain ungated
release
NeoOrigins v2.0.19 (MC 1.21.1)
v2.0.19+1.21.11 мая 2026 г.313Minecraft: 1.21.1neoforge
Что нового
v2.0.19
Compat Layer Expansion:
- 16 well-known Origins built-in power IDs registered as synthetic
powers (origins:elytra, origins:fire_immunity, origins:fresh_air,
etc.) — addon packs like Chidori Origins no longer silently lose
bare-ID powers
- origins:invulnerability damage conditions (origins:fire, projectile,
fall, explosive) now translate to correct damage type tags
- origins:block_in_radius aliases to neoorigins:near_block with
nested block_condition format support
Bug Fixes:
- model_color condition re-evaluates every second and resyncs to
client on change (was only updating on login/toggle)
- Bedrock phasing blocked in all directions (was only blocking
vertical, allowing horizontal pass-through)
- 10-tick cooldown on air jump packets prevents infinite flight
re-activation
- power_active condition now reads native toggle powers (wraith_phase,
flight, phantom_form) not just compat toggles
Docs:
- power_active: expanded with toggle power examples
- near_block: documented block_in_radius alias + block_condition field
release
NeoOrigins v2.0.19 (MC 26.1.x)
v2.0.19+26.11 мая 2026 г.21Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.19
Compat Layer Expansion:
- 16 well-known Origins built-in power IDs registered as synthetic
powers (origins:elytra, origins:fire_immunity, origins:fresh_air,
etc.) — addon packs like Chidori Origins no longer silently lose
bare-ID powers
- origins:invulnerability damage conditions (origins:fire, projectile,
fall, explosive) now translate to correct damage type tags
- origins:block_in_radius aliases to neoorigins:near_block with
nested block_condition format support
Bug Fixes:
- model_color condition re-evaluates every second and resyncs to
client on change (was only updating on login/toggle)
- Bedrock phasing blocked in all directions (was only blocking
vertical, allowing horizontal pass-through)
- 10-tick cooldown on air jump packets prevents infinite flight
re-activation
- power_active condition now reads native toggle powers (wraith_phase,
flight, phantom_form) not just compat toggles
Docs:
- power_active: expanded with toggle power examples
- near_block: documented block_in_radius alias + block_condition field
release
NeoOrigins v2.0.18 (MC 1.21.1)
v2.0.18+1.21.11 мая 2026 г.197Minecraft: 1.21.1neoforge
Что нового
v2.0.18
Bug Fixes:
- #61: model_color transparency works when nametag is hidden (1.21.1)
- #62: rain/sun damage no longer applies while riding vehicles
- #60: active_self powers log a warning when missing action field
- Evolution HP applies immediately on evolve (no death required)
- Origin swaps (orb, command, GUI, reset) properly purge orphaned
attribute modifiers and clamp health to new maximum
- Stale modifiers from changed JSON values auto-purged on login
- Login health clamp when HP exceeds max
Evolution HP Standardized (full hearts):
- Evolved: +2 HP (+1 heart)
- Ascended: +4 HP (+2 hearts)
- Apex: +6 HP (+3 hearts)
- Fixed: Avian, Feline, Phantom (1/2/4 → 2/4/6),
Blazeling/Slime apex (4 → 6)
New Config:
- disable_resource_bars: hides resource HUD, falls back costs to hunger
QoL:
- Command autocomplete for layer/origin/power arguments
- Config overrides for Fisher, Mason, Paladin, Wraith powers
Docs:
- Evolution page on GitHub Pages with exact attribute values
- Cookbook recipe 3c: food nutrition/saturation bonuses
release
NeoOrigins v2.0.18 (MC 26.1.x)
v2.0.18+26.11 мая 2026 г.17Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.18
Bug Fixes:
- #61: model_color transparency works when nametag is hidden (1.21.1)
- #62: rain/sun damage no longer applies while riding vehicles
- #60: active_self powers log a warning when missing action field
- Evolution HP applies immediately on evolve (no death required)
- Origin swaps (orb, command, GUI, reset) properly purge orphaned
attribute modifiers and clamp health to new maximum
- Stale modifiers from changed JSON values auto-purged on login
- Login health clamp when HP exceeds max
Evolution HP Standardized (full hearts):
- Evolved: +2 HP (+1 heart)
- Ascended: +4 HP (+2 hearts)
- Apex: +6 HP (+3 hearts)
- Fixed: Avian, Feline, Phantom (1/2/4 → 2/4/6),
Blazeling/Slime apex (4 → 6)
New Config:
- disable_resource_bars: hides resource HUD, falls back costs to hunger
QoL:
- Command autocomplete for layer/origin/power arguments
- Config overrides for Fisher, Mason, Paladin, Wraith powers
Docs:
- Evolution page on GitHub Pages with exact attribute values
- Cookbook recipe 3c: food nutrition/saturation bonuses
release
NeoOrigins v2.0.15 (MC 1.21.1)
v2.0.15+1.21.130 апр. 2026 г.497Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.15
- New `neoorigins:resource` power type — custom resource bars (Mana, Stamina, Energy, Essence, Vitality) with configurable min/max, regen rate, regen conditions, threshold actions, and HUD rendering
- 31 origins migrated from hunger_cost to themed resource bars with HUD display:
- Mana (blue): Air, Fire, Water, Earth, Darkness, Gravity Mages
- Essence (purple): Necromancer, Kraken, Abyssal, Monster Tamer
- Stamina (orange): Draconic, Golem, Shulk, Gorgon, Warden, Strider, Cinderborn, Frostborn, Sculkborn, Stoneguard
- Energy (yellow-green): Umbral, Revenant, Arachnid, Feline, Hiveling, Blazeling, Enderian, Enderite, Voidwalker
- Vitality (green): Sylvan, Sporeling
- `resource_cost` / `resource_cost_amount` fields on `neoorigins:active_ability`
- `neoorigins:modify_resource` action + `neoorigins:resource_level` condition
- #42 — Flight audio no longer loops for other players after landing
- #54 — play_sound action now broadcasts to all nearby players
- #55 — Caveborn ore eating now correctly grants bonus effects on last item
- #56 — Cooldown HUD now displays for compat-layer powers
- #57 — Archer Arthropod Bane changed from Poison to Slowness
- #58 — Removed duplicate Sporeling apex poison immunity
- Added target_action, actor_action, block_action_at, fire_projectile, custom_data
- Added multiply_base_additive/multiplicative operation mapping
- Fixed stacking_status_effect id field parsing
- Conduit Power effect now bypasses aquatic land penalties
release
NeoOrigins v2.0.15 (MC 26.1.x)
v2.0.15+26.130 апр. 2026 г.33Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.15
- New `neoorigins:resource` power type — custom resource bars (Mana, Stamina, Energy, Essence, Vitality) with configurable min/max, regen rate, regen conditions, threshold actions, and HUD rendering
- 31 origins migrated from hunger_cost to themed resource bars with HUD display:
- Mana (blue): Air, Fire, Water, Earth, Darkness, Gravity Mages
- Essence (purple): Necromancer, Kraken, Abyssal, Monster Tamer
- Stamina (orange): Draconic, Golem, Shulk, Gorgon, Warden, Strider, Cinderborn, Frostborn, Sculkborn, Stoneguard
- Energy (yellow-green): Umbral, Revenant, Arachnid, Feline, Hiveling, Blazeling, Enderian, Enderite, Voidwalker
- Vitality (green): Sylvan, Sporeling
- `resource_cost` / `resource_cost_amount` fields on `neoorigins:active_ability`
- `neoorigins:modify_resource` action + `neoorigins:resource_level` condition
- #42 — Flight audio no longer loops for other players after landing
- #54 — play_sound action now broadcasts to all nearby players
- #55 — Caveborn ore eating now correctly grants bonus effects on last item
- #56 — Cooldown HUD now displays for compat-layer powers
- #57 — Archer Arthropod Bane changed from Poison to Slowness
- #58 — Removed duplicate Sporeling apex poison immunity
- Added target_action, actor_action, block_action_at, fire_projectile, custom_data
- Added multiply_base_additive/multiplicative operation mapping
- Fixed stacking_status_effect id field parsing
- Conduit Power effect now bypasses aquatic land penalties
release
NeoOrigins v2.0.14 (MC 1.21.1)
v2.0.14+1.21.130 апр. 2026 г.379Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.14 (MC 26.1)
Aquatic QoL:
- Water Breathing potion now pauses land dry-out drain and refills bubbles
- Respiration enchantment extends land time (~2x/3x/4x per level),
using vanilla's same probability curve
- Drinking a water bottle restores half the breath bar for aquatic origins
Bug Fixes:
- SizeScalingPower uses Attributes holders directly instead of string
lookups — fixes size not applying on 1.21.1 (generic.scale vs scale)
release
NeoOrigins v2.0.14 (MC 26.1.x)
v2.0.14+26.130 апр. 2026 г.20Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.14 (MC 26.1)
Aquatic QoL:
- Water Breathing potion now pauses land dry-out drain and refills bubbles
- Respiration enchantment extends land time (~2x/3x/4x per level),
using vanilla's same probability curve
- Drinking a water bottle restores half the breath bar for aquatic origins
Bug Fixes:
- SizeScalingPower uses Attributes holders directly instead of string
lookups — fixes size not applying on 1.21.1 (generic.scale vs scale)
release
NeoOrigins v2.0.13 (MC 1.21.1)
v2.0.13+1.21.129 апр. 2026 г.78Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.13 (MC 26.1)
Bug Fixes:
- spawn_location column search widened from 5x5 to 33x33 — fixes Nether
and underground spawns failing to find air pockets
- Biome search radius doubled (6400→12800 blocks) with finer sampling
steps — fixes mountain/cave biome spawns not finding biomes in range
- Spawn failure log now includes the spec summary for easier debugging
release
NeoOrigins v2.0.13 (MC 26.1.x)
v2.0.13+26.129 апр. 2026 г.17Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.13 (MC 26.1)
Bug Fixes:
- spawn_location column search widened from 5x5 to 33x33 — fixes Nether
and underground spawns failing to find air pockets
- Biome search radius doubled (6400→12800 blocks) with finer sampling
steps — fixes mountain/cave biome spawns not finding biomes in range
- Spawn failure log now includes the spec summary for easier debugging
release
NeoOrigins v2.0.12 (MC 1.21.1)
v2.0.12+1.21.129 апр. 2026 г.308Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.12 (MC 26.1)
Bug Fixes:
- #52: Active abilities shared a single cooldown — each power now tracks independently
- #46: Arachnid Spider's Fang (action_on_hit) only worked in PvP — now fires against mobs
- #49: Caveborn mineral eating broken — no eat animation, no bonus effects
- #50: Aquatic fish diet — edible item FoodContext not provided to condition checks
- #47: Draconic water damage used magic type with knockback — now uses drown
- #44: Undead origins (Revenant/Necromancer) couldn't heal from food. Added potion reversal: Instant Health deals damage, Instant Damage heals
- #45: Elytrian collision damage — damage type matcher now checks both msgId and registry key path
- Draconic size not applying — scale attribute was minecraft:generic.scale, should be minecraft:scale
- 3 evolution poison immunity powers used wrong codec field (effect → effects)
- 2 condition_passive powers used nonexistent always_true condition
- Iron/gold armor missing from heavy_armor tag
Water Origin Buffs:
- All ocean origins gain Aqua Affinity (full mining speed underwater)
- All ocean origins gain Natural Swimmer (+0.15 water movement efficiency)
Docs:
- Essence Evolution system documented in COOKBOOK.md
- config_flag and food_item_id conditions added to CONDITIONS.md
- Armor class system documented in POWER_TYPES.md
release
NeoOrigins v2.0.12 (MC 26.1.x)
v2.0.12+26.129 апр. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.12 (MC 26.1)
Bug Fixes:
- #52: Active abilities shared a single cooldown — each power now tracks independently
- #46: Arachnid Spider's Fang (action_on_hit) only worked in PvP — now fires against mobs
- #49: Caveborn mineral eating broken — no eat animation, no bonus effects
- #50: Aquatic fish diet — edible item FoodContext not provided to condition checks
- #47: Draconic water damage used magic type with knockback — now uses drown
- #44: Undead origins (Revenant/Necromancer) couldn't heal from food. Added potion reversal: Instant Health deals damage, Instant Damage heals
- #45: Elytrian collision damage — damage type matcher now checks both msgId and registry key path
- Draconic size not applying — scale attribute was minecraft:generic.scale, should be minecraft:scale
- 3 evolution poison immunity powers used wrong codec field (effect → effects)
- 2 condition_passive powers used nonexistent always_true condition
- Iron/gold armor missing from heavy_armor tag
Water Origin Buffs:
- All ocean origins gain Aqua Affinity (full mining speed underwater)
- All ocean origins gain Natural Swimmer (+0.15 water movement efficiency)
Docs:
- Essence Evolution system documented in COOKBOOK.md
- config_flag and food_item_id conditions added to CONDITIONS.md
- Armor class system documented in POWER_TYPES.md
release
NeoOrigins v2.0.11 (MC 1.21.1)
v2.0.11+1.21.129 апр. 2026 г.630Minecraft: 1.21.1neoforge
Что нового
v2.0.11 (MC 26.1)
Headline: Essence Evolution System
Kill mobs to evolve through Evolved → Ascended → Apex tiers. All 49 origins have unique evolution tracks. Largely untested — report issues on Discord or GitHub.
New Power Types: burn, ignore_water, overlay, model_color, lava_vision, shader, dodge_chance, thorns_on_hit, light_level_effect, low_hp_threshold
New Condition: near_entity (entity type/tag + distance)
Note: overlay, model_color, lava_vision, and shader have server-side capability sync but client-side visuals are stubbed on 26.1 due to rendering pipeline changes.
Bug Fixes:
- Aquatic origins can't eat anything (missing # prefix on tag)
- Aquatic diet config toggle does nothing
- No moisture from rain/cauldrons
- Draconic size ~40% with Pehkui (double-scaling)
- Draconic water weakness description stale
- Caveborn mineral bonuses never trigger
- food_restriction carnivore diet broken
Compat: origins:keep_inventory, swim_speed, phasing, burn, ignore_water, overlay, model_color, lava_vision, shader all now translate. Skipped list down to just origins:shaking.
release
NeoOrigins v2.0.11 (MC 1.21.1)
v2.0.11+1.21.129 апр. 2026 г.18Minecraft: 1.21.1neoforge
Что нового
v2.0.11 (MC 26.1)
Headline: Essence Evolution System
Kill mobs to evolve through Evolved → Ascended → Apex tiers. All 49 origins have unique evolution tracks. Largely untested — report issues on Discord or GitHub.
New Power Types: burn, ignore_water, overlay, model_color, lava_vision, shader, dodge_chance, thorns_on_hit, light_level_effect, low_hp_threshold
New Condition: near_entity (entity type/tag + distance)
Note: overlay, model_color, lava_vision, and shader have server-side capability sync but client-side visuals are stubbed on 26.1 due to rendering pipeline changes.
Bug Fixes:
- Aquatic origins can't eat anything (missing # prefix on tag)
- Aquatic diet config toggle does nothing
- No moisture from rain/cauldrons
- Draconic size ~40% with Pehkui (double-scaling)
- Draconic water weakness description stale
- Caveborn mineral bonuses never trigger
- food_restriction carnivore diet broken
Compat: origins:keep_inventory, swim_speed, phasing, burn, ignore_water, overlay, model_color, lava_vision, shader all now translate. Skipped list down to just origins:shaking.
release
NeoOrigins v2.0.11 (MC 26.1.x)
v2.0.11+26.129 апр. 2026 г.11Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.11 (MC 26.1)
Headline: Essence Evolution System
Kill mobs to evolve through Evolved → Ascended → Apex tiers. All 49 origins have unique evolution tracks. Largely untested — report issues on Discord or GitHub.
New Power Types: burn, ignore_water, overlay, model_color, lava_vision, shader, dodge_chance, thorns_on_hit, light_level_effect, low_hp_threshold
New Condition: near_entity (entity type/tag + distance)
Note: overlay, model_color, lava_vision, and shader have server-side capability sync but client-side visuals are stubbed on 26.1 due to rendering pipeline changes.
Bug Fixes:
- Aquatic origins can't eat anything (missing # prefix on tag)
- Aquatic diet config toggle does nothing
- No moisture from rain/cauldrons
- Draconic size ~40% with Pehkui (double-scaling)
- Draconic water weakness description stale
- Caveborn mineral bonuses never trigger
- food_restriction carnivore diet broken
Compat: origins:keep_inventory, swim_speed, phasing, burn, ignore_water, overlay, model_color, lava_vision, shader all now translate. Skipped list down to just origins:shaking.
release
NeoOrigins v2.0.11 (MC 26.1.x)
v2.0.11+26.129 апр. 2026 г.16Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v2.0.11 (MC 26.1)
Headline: Essence Evolution System
Kill mobs to evolve through Evolved → Ascended → Apex tiers. All 49 origins have unique evolution tracks. Largely untested — report issues on Discord or GitHub.
New Power Types: burn, ignore_water, overlay, model_color, lava_vision, shader, dodge_chance, thorns_on_hit, light_level_effect, low_hp_threshold
New Condition: near_entity (entity type/tag + distance)
Note: overlay, model_color, lava_vision, and shader have server-side capability sync but client-side visuals are stubbed on 26.1 due to rendering pipeline changes.
Bug Fixes:
- Aquatic origins can't eat anything (missing # prefix on tag)
- Aquatic diet config toggle does nothing
- No moisture from rain/cauldrons
- Draconic size ~40% with Pehkui (double-scaling)
- Draconic water weakness description stale
- Caveborn mineral bonuses never trigger
- food_restriction carnivore diet broken
Compat: origins:keep_inventory, swim_speed, phasing, burn, ignore_water, overlay, model_color, lava_vision, shader all now translate. Skipped list down to just origins:shaking.
release
NeoOrigins v2.0.9 (MC 1.21.1)
v2.0.9+1.21.128 апр. 2026 г.276Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.9
- **Wraith** — phases through solid blocks passively (obsidian/bedrock blocked), hunger drains while phasing, burns in sunlight
- **Skeleton** — undead type (Harming heals, Healing hurts, Smite extra damage), +50% arrow damage, 20% faster movement, 30% higher jump, 7 hearts max HP, burns in sun (helmet absorbs), restricted diet (bone meal, rotten flesh, spider eyes)
- **Slime** — moisture bar with HUD display (drains over time, faster in deserts/on fire, refills in water/rain), Regen 1 above 75%, -4 armor below 10%, DoT at 0%, death save "split" at >75% moisture (teleport 50 blocks, 2 hearts, regen over 2 min), +1 max HP per 10 XP levels (resets on death), no fall damage
- **Merchant Charisma** (issue #43) — wandering traders now offer 3 random master-tier villager trades + 25% chance treasure slot (Heart of the Sea, Nether Star, Totem, Trident, Elytra, Dragon Head — costs 32-64 emeralds + 1-6 netherite ingots). Treasure slot glows golden.
- **spawn_location** — three new optional fields: `min_y`, `max_y`, `can_see_sky` for underground/Y-constrained origin spawning
- `wraith_phase` — configurable block-phasing with hunger drain
- `slime_moisture` — moisture resource bar with HUD overlay, biome/fire drain modifiers
- `slime_death_save` — totem-like split mechanic
- `slime_level_hp` — XP level scaling max HP
release
NeoOrigins v2.0.9 (MC 26.1.x)
v2.0.9+26.128 апр. 2026 г.18Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.9
- **Wraith** — phases through solid blocks passively (obsidian/bedrock blocked), hunger drains while phasing, burns in sunlight
- **Skeleton** — undead type (Harming heals, Healing hurts, Smite extra damage), +50% arrow damage, 20% faster movement, 30% higher jump, 7 hearts max HP, burns in sun (helmet absorbs), restricted diet (bone meal, rotten flesh, spider eyes)
- **Slime** — moisture bar with HUD display (drains over time, faster in deserts/on fire, refills in water/rain), Regen 1 above 75%, -4 armor below 10%, DoT at 0%, death save "split" at >75% moisture (teleport 50 blocks, 2 hearts, regen over 2 min), +1 max HP per 10 XP levels (resets on death), no fall damage
- **Merchant Charisma** (issue #43) — wandering traders now offer 3 random master-tier villager trades + 25% chance treasure slot (Heart of the Sea, Nether Star, Totem, Trident, Elytra, Dragon Head — costs 32-64 emeralds + 1-6 netherite ingots). Treasure slot glows golden.
- **spawn_location** — three new optional fields: `min_y`, `max_y`, `can_see_sky` for underground/Y-constrained origin spawning
- `wraith_phase` — configurable block-phasing with hunger drain
- `slime_moisture` — moisture resource bar with HUD overlay, biome/fire drain modifiers
- `slime_death_save` — totem-like split mechanic
- `slime_level_hp` — XP level scaling max HP
release
NeoOrigins v2.0.9-1.21.1 (MC 1.21.1)
v2.0.9-1.21.128 апр. 2026 г.19Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.9
- **Wraith** — phases through solid blocks passively (obsidian/bedrock blocked), hunger drains while phasing, burns in sunlight
- **Skeleton** — undead type (Harming heals, Healing hurts, Smite extra damage), +50% arrow damage, 20% faster movement, 30% higher jump, 7 hearts max HP, burns in sun (helmet absorbs), restricted diet (bone meal, rotten flesh, spider eyes)
- **Slime** — moisture bar system (drains over time, faster in deserts/on fire, refills in water/rain), Regen 1 above 75%, -4 armor below 10%, DoT at 0%, death save "split" at >75% moisture (teleport + 2 hearts, regen over 2 min), +1 max HP per 10 XP levels (resets on death), no fall damage
- **Merchant Charisma** (issue #43) — wandering traders now offer 3 random master-tier villager trades + 25% chance treasure slot (Heart of the Sea, Nether Star, Totem, Trident, Elytra, Dragon Head — costs 32-64 emeralds + 1-6 netherite ingots). Treasure slot glows golden.
- **spawn_location** — three new optional fields: `min_y`, `max_y`, `can_see_sky` for underground/Y-constrained origin spawning
- `wraith_phase` — configurable block-phasing with hunger drain
- `slime_moisture` — moisture resource bar with biome/fire drain modifiers
- `slime_death_save` — totem-like split mechanic
- `slime_level_hp` — XP level scaling max HP
release
NeoOrigins v2.0.9 (MC 26.1.x)
v2.0.9+26.128 апр. 2026 г.18Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.9
- **Wraith** — phases through solid blocks passively (obsidian/bedrock blocked), hunger drains while phasing, burns in sunlight
- **Skeleton** — undead type (Harming heals, Healing hurts, Smite extra damage), +50% arrow damage, 20% faster movement, 30% higher jump, 7 hearts max HP, burns in sun (helmet absorbs), restricted diet (bone meal, rotten flesh, spider eyes)
- **Slime** — moisture bar system (drains over time, faster in deserts/on fire, refills in water/rain), Regen 1 above 75%, -4 armor below 10%, DoT at 0%, death save "split" at >75% moisture (teleport + 2 hearts, regen over 2 min), +1 max HP per 10 XP levels (resets on death), no fall damage
- **Merchant Charisma** (issue #43) — wandering traders now offer 3 random master-tier villager trades + 25% chance treasure slot (Heart of the Sea, Nether Star, Totem, Trident, Elytra, Dragon Head — costs 32-64 emeralds + 1-6 netherite ingots). Treasure slot glows golden.
- **spawn_location** — three new optional fields: `min_y`, `max_y`, `can_see_sky` for underground/Y-constrained origin spawning
- `wraith_phase` — configurable block-phasing with hunger drain
- `slime_moisture` — moisture resource bar with biome/fire drain modifiers
- `slime_death_save` — totem-like split mechanic
- `slime_level_hp` — XP level scaling max HP
release
NeoOrigins v2.0.8 (MC 1.21.1)
v2.0.8+1.21.128 апр. 2026 г.307Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.8
- **Item actions & conditions** — new `ItemActionParser` (merge_nbt, consume, damage, set_count) and `ItemConditionParser` (and, or, not, empty, nbt, enchantment, ingredient) for per-stack operations. `equipped_item_action` and `modify_inventory` now delegate to these parsers.
- **`origins:starting_equipment`** — multi-stack Apoli starting_equipment powers now expand to N synthetic `neoorigins:starting_equipment` entries. Legacy pre-1.21 SNBT tags (Potion, Enchantments, Damage, Unbreakable, CustomModelData, display.Name/Lore) are auto-translated to data components via `LegacyTagToComponents`.
- **`modify_crafting`** — full Route B implementation. Per-player recipe output replacement with optional legacy tag support.
- **`modify_lava_speed`** — new `LivingEntityLavaSpeedMixin` with shared `NumericModifierRegistry` and `OriginsModifierMath` (Apoli addition + multiply_base/multiply_total collapse).
- **`modify_xp_gain`** — wired to `PlayerXpEvent.XpChange` through the same numeric modifier registry.
- **`prevent_sprinting`** — per-tick `setSprinting(false)` gated by optional condition.
- **`origins:modify_swim_speed`** — now translates to `attribute_modifier` on `water_movement_efficiency` instead of being silently skipped.
- **`raycast`** — block and entity raycasting with nested action dispatch; `RaycastBlockContext` publishes hit position so `~ ~ ~` resolves correctly in sub-actions.
- **`inverted: true`** — Apoli universal condition inversion is now honoured (was silently dropped).
- **`action_on_event` field aliasing** — `parseActionOverTime` accepts both `condition` and `entity_condition`.
- **#41** — 22 night_vision JSONs reverted from `enhanced_vision` back to `night_vision`.
- **#42** — `fallFlyTicks` reset to 0 after `stopFallFlying()` on landing (defensive flight audio fix).
- **#33** — NeoForge version range floor bumped to `21.1.224` to prevent loading on stale builds.
- **`block_condition`** on `action_on_event` — was silently dropped at codec time; now parsed and applied.
- **`execute_command`** — command source positioned at the dispatch BlockPos in block-event context, so `~ ~ ~` resolves to the broken/placed/used block.
- **`conditioned_attribute`** — bad attribute IDs now surface in the compat log instead of failing silently.
- **Air refill** — aquatic origins now require head submerged (`isUnderWater`) to refill air, not just feet touching water (`isInWater`).
- **Tidal wave spam** — cooldown and hunger cost now always consumed when the wave fires, regardless of whether it hit anything.
- **`drop_items` action** — inline loot table with `each` (per-entry chance) and `one_of` (weighted single pick) modes; supports count ranges per entry.
- **`food_restriction` array support** — `item_tag` now accepts a JSON array of tags and/or item IDs (prefix tags with `#`). Multiple entries are OR'd together for blacklist, NOT(OR) for whitelist.
Only `inventory.container_type: hopper` remains unsupported.
release
NeoOrigins v2.0.8 (MC 26.1.x)
v2.0.8+26.128 апр. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.8
- **Item actions & conditions** — new `ItemActionParser` (merge_nbt, consume, damage, set_count) and `ItemConditionParser` (and, or, not, empty, nbt, enchantment, ingredient) for per-stack operations. `equipped_item_action` and `modify_inventory` now delegate to these parsers.
- **`origins:starting_equipment`** — multi-stack Apoli starting_equipment powers now expand to N synthetic `neoorigins:starting_equipment` entries. Legacy pre-1.21 SNBT tags (Potion, Enchantments, Damage, Unbreakable, CustomModelData, display.Name/Lore) are auto-translated to data components via `LegacyTagToComponents`.
- **`modify_crafting`** — full Route B implementation. Per-player recipe output replacement with optional legacy tag support.
- **`modify_lava_speed`** — new `LivingEntityLavaSpeedMixin` with shared `NumericModifierRegistry` and `OriginsModifierMath` (Apoli addition + multiply_base/multiply_total collapse).
- **`modify_xp_gain`** — wired to `PlayerXpEvent.XpChange` through the same numeric modifier registry.
- **`prevent_sprinting`** — per-tick `setSprinting(false)` gated by optional condition.
- **`origins:modify_swim_speed`** — now translates to `attribute_modifier` on `water_movement_efficiency` instead of being silently skipped.
- **`raycast`** — block and entity raycasting with nested action dispatch; `RaycastBlockContext` publishes hit position so `~ ~ ~` resolves correctly in sub-actions.
- **`inverted: true`** — Apoli universal condition inversion is now honoured (was silently dropped).
- **`action_on_event` field aliasing** — `parseActionOverTime` accepts both `condition` and `entity_condition`.
- **#41** — 22 night_vision JSONs reverted from `enhanced_vision` back to `night_vision`.
- **#42** — `fallFlyTicks` reset to 0 after `stopFallFlying()` on landing (defensive flight audio fix).
- **#33** — NeoForge version range floor bumped to `21.1.224` to prevent loading on stale builds.
- **`block_condition`** on `action_on_event` — was silently dropped at codec time; now parsed and applied.
- **`execute_command`** — command source positioned at the dispatch BlockPos in block-event context, so `~ ~ ~` resolves to the broken/placed/used block.
- **`conditioned_attribute`** — bad attribute IDs now surface in the compat log instead of failing silently.
- **Air refill** — aquatic origins now require head submerged (`isUnderWater`) to refill air, not just feet touching water (`isInWater`).
- **Tidal wave spam** — cooldown and hunger cost now always consumed when the wave fires, regardless of whether it hit anything.
- **`drop_items` action** — inline loot table with `each` (per-entry chance) and `one_of` (weighted single pick) modes; supports count ranges per entry.
- **`food_restriction` array support** — `item_tag` now accepts a JSON array of tags and/or item IDs (prefix tags with `#`). Multiple entries are OR'd together for blacklist, NOT(OR) for whitelist.
Only `inventory.container_type: hopper` remains unsupported.
release
NeoOrigins v2.0.7 (MC 1.21.1)
v2.0.7+1.21.127 апр. 2026 г.658Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.7
Spawns a vanilla particle on the player at a fixed cadence. Server-side
`ServerLevel.sendParticles` packetizes to nearby clients, so this works
on dedicated servers without a client-side mixin.
```json
{
"type": "neoorigins:particle",
"particle": "minecraft:end_rod",
"frequency": 6,
"spread": [0.4, 0.6, 0.4]
}
```
Accepts a simple particle id string or the object form for parameterized
particles (`dust` with `color` + `scale`). Configurable `frequency`,
`count`, `spread`, `offset`, `speed`, and an optional `condition` gate.
**Compat:** `origins:particle`, `apace:particle`, `apoli:particle`, and
`apugli:particle` now auto-translate to this — previously they were
silently dropped as "no server-side equivalent."
Two leak paths from the per-power `onRevoked` sequence in
`ActiveOriginService.revokeAllPowers`:
1. **Stale legacy-format modifier IDs in NBT** from older buggy formats.
`purgeStaleModifiers` ran only on the grant path, so
`instance.removeModifier(currentModId)` couldn't match them.
2. **Modifiers from origins whose JSON is gone** — `revokeAllPowers`
skipped them because `OriginDataManager.getOrigin(...)` returned null.
Fix: after the per-power loop, sweep every `neoorigins:power_*`
AttributeModifier off every attribute attached to the player. New
`AttributeModifierPower.purgeAllOriginModifiers(LivingEntity)`. Common
case is no-op; only does work when one of the leak paths is in play.
Pack authors can now suppress a power's row in the origin info panel
without `origins:multiple` wrapping or hardcoded type exclusions:
```json
{
"type": "neoorigins:toggle",
"default": false,
"hidden": true
}
```
Mechanical effect of the power is unchanged — only the display row is
suppressed. Default is `false`, so no existing pack regresses.
`PowerHolder` and `ClientPowerCache.Entry` carry the new flag;
`SyncOriginRegistryPayload` syncs it to dedicated-server clients;
`OriginDetailViewModel.isHiddenPowerType` checks it before the legacy
`HideHudBarPower` path.
- POWER_TYPES.md: new shared metadata table now lists `hidden`. New
`neoorigins:particle` reference entry with sparkle-aesthetic picks.
- COOKBOOK.md: recipe #15 (Toggleable abilities) updated to recommend
`hidden: true` on internal flag/glue powers.
- power.schema.json: both new fields documented.
release
NeoOrigins v2.0.7 (MC 26.1.x)
v2.0.7+26.127 апр. 2026 г.32Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.7
Spawns a vanilla particle on the player at a fixed cadence. Server-side
`ServerLevel.sendParticles` packetizes to nearby clients, so this works
on dedicated servers without a client-side mixin.
```json
{
"type": "neoorigins:particle",
"particle": "minecraft:end_rod",
"frequency": 6,
"spread": [0.4, 0.6, 0.4]
}
```
Accepts a simple particle id string or the object form for parameterized
particles (`dust` with `color` + `scale`). Configurable `frequency`,
`count`, `spread`, `offset`, `speed`, and an optional `condition` gate.
**Compat:** `origins:particle`, `apace:particle`, `apoli:particle`, and
`apugli:particle` now auto-translate to this — previously they were
silently dropped as "no server-side equivalent."
Two leak paths from the per-power `onRevoked` sequence in
`ActiveOriginService.revokeAllPowers`:
1. **Stale legacy-format modifier IDs in NBT** from older buggy formats.
`purgeStaleModifiers` ran only on the grant path, so
`instance.removeModifier(currentModId)` couldn't match them.
2. **Modifiers from origins whose JSON is gone** — `revokeAllPowers`
skipped them because `OriginDataManager.getOrigin(...)` returned null.
Fix: after the per-power loop, sweep every `neoorigins:power_*`
AttributeModifier off every attribute attached to the player. New
`AttributeModifierPower.purgeAllOriginModifiers(LivingEntity)`. Common
case is no-op; only does work when one of the leak paths is in play.
Pack authors can now suppress a power's row in the origin info panel
without `origins:multiple` wrapping or hardcoded type exclusions:
```json
{
"type": "neoorigins:toggle",
"default": false,
"hidden": true
}
```
Mechanical effect of the power is unchanged — only the display row is
suppressed. Default is `false`, so no existing pack regresses.
`PowerHolder` and `ClientPowerCache.Entry` carry the new flag;
`SyncOriginRegistryPayload` syncs it to dedicated-server clients;
`OriginDetailViewModel.isHiddenPowerType` checks it before the legacy
`HideHudBarPower` path.
- POWER_TYPES.md: new shared metadata table now lists `hidden`. New
`neoorigins:particle` reference entry with sparkle-aesthetic picks.
- COOKBOOK.md: recipe #15 (Toggleable abilities) updated to recommend
`hidden: true` on internal flag/glue powers.
- power.schema.json: both new fields documented.
release
NeoOrigins v2.0.6 (MC 1.21.1)
v2.0.6+1.21.126 апр. 2026 г.146Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.6
- **Issue #40 — addon power types not registering**: PowerTypes lookup
now goes through the live PowerType registry captured from
NewRegistryEvent instead of the built-in DeferredRegister entries.
Addon mods registering power types via their own DeferredRegister or
RegisterEvent are now visible to the JSON loader.
- **`neoorigins:toggle` `default` field now actually applies**: previously
parsed-but-unused — both reads (`origins:power_active`) and writes
(`neoorigins:toggle`) hardcoded `false` as the starting value.
Centralized through new `Toggles` facade that resolves the registered
power's `default` lazily, so `"default": true` reads as
on-until-flipped-off without an `action_on_event GAINED` workaround.
- POWER_TYPES.md / ACTIONS.md / CONDITIONS.md updated with corrected
toggle semantics and cross-links.
- New COOKBOOK recipe #15 "Toggleable abilities (no keybind slot)" with
two worked examples (toggle-gated wall climb, Hunter's Mark stance
switch).
release
NeoOrigins v2.0.6 (MC 26.1.x)
v2.0.6+26.126 апр. 2026 г.26Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.6
- **Issue #40 — addon power types not registering**: PowerTypes lookup
now goes through the live PowerType registry captured from
NewRegistryEvent instead of the built-in DeferredRegister entries.
Addon mods registering power types via their own DeferredRegister or
RegisterEvent are now visible to the JSON loader.
- **`neoorigins:toggle` `default` field now actually applies**: previously
parsed-but-unused — both reads (`origins:power_active`) and writes
(`neoorigins:toggle`) hardcoded `false` as the starting value.
Centralized through new `Toggles` facade that resolves the registered
power's `default` lazily, so `"default": true` reads as
on-until-flipped-off without an `action_on_event GAINED` workaround.
- POWER_TYPES.md / ACTIONS.md / CONDITIONS.md updated with corrected
toggle semantics and cross-links.
- New COOKBOOK recipe #15 "Toggleable abilities (no keybind slot)" with
two worked examples (toggle-gated wall climb, Hunter's Mark stance
switch).
release
NeoOrigins v2.0.5 (MC 1.21.1)
v2.0.5+1.21.126 апр. 2026 г.245Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.5 — armor rework + in-game config screen + tester-driven polish
Headlining the release: a rework of every "natural armor" power on
tanky origins so they actually matter at end-game gear levels, plus
NeoForge's auto-generated config screen wired in with full label
translations so server admins can edit settings without leaving the
game.
Vanilla armor caps at 80% damage reduction at 20 effective armor, and
the attribute itself caps at 30. Origin powers stacking +armor on top
of full Netherite + Prot IV mostly hit that wall and contributed ~1
saved damage per hit. 16 origin powers reworked:
13 tanky origins now have permanent Resistance (own budget,
multiplicative on top of armor + protection):
Automaton, Sculkborn, Shulk, Gorgon, Kraken, Strider, Cinderborn,
Golem, Dwarf, Frostborn, Sporeling — all Resistance I.
Phantom — Resistance I, night-only (kept the moon-armor flavour).
Warden — Resistance II (the only origin >+8 armor before).
3 lighter origins gain max HP instead (pure pool, no cap competition):
Abyssal +2 hearts, Blazeling +3 hearts, Stoneguard +3 hearts.
Class +armor powers (Warrior, Paladin, Sentinel, Mason, Berserker)
intentionally untouched — they're early-game bumps that don't hit
the ceiling.
NeoForge's auto-generated ConfigurationScreen is now wired into the
mod menu's Config button via a client-only trampoline (so dedicated
servers don't break). 271 translation keys added across two passes
covering every section, every per-origin enable toggle, every
per-class enable toggle, and 176 power_overrides subsection labels
(generated by title-casing each registered power id). Section
buttons, top-level toggles, and inside-section values all read as
human names instead of raw 'neoorigins.configuration.<key>' paths.
PersistentEffectPower's codec now reads a top-level 'amplifier' field
as a config-override hook, since power_overrides writes fields at the
JSON root and the Resistance amplifier lives nested under
effects[0].amplifier. The 13 reworked powers now register
fi('amplifier', N, 0, 4) instead of f('amount', ...) so admins can
re-tune Resistance level (I → V) via TOML or the in-game screen
without touching the JSON.
- Elytrian: removed the −2-hearts Frail Frame penalty; can't-wear-
heavy-armor restriction is enough drawback on its own.
- Sentinel Anchored: knockback resist 20% → 40%.
- Sentinel Guard Stance: +20% sneaking → +35% sneaking
(40% + 35% = 75% total when crouching).
- Earth Mage / SWIM prevent_action: previously only zeroed upward
velocity, which fought vanilla water buoyancy and produced an
"occasional freeze in place" stutter. Now forces a constant
downward sink (-0.16) and clears the swim flag every tick — player
walks the ocean floor cleanly regardless of input.
release
NeoOrigins v2.0.5 (MC 26.1.x)
v2.0.5+26.126 апр. 2026 г.17Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.5 — armor rework + in-game config screen + tester-driven polish
Headlining the release: a rework of every "natural armor" power on
tanky origins so they actually matter at end-game gear levels, plus
NeoForge's auto-generated config screen wired in with full label
translations so server admins can edit settings without leaving the
game.
Vanilla armor caps at 80% damage reduction at 20 effective armor, and
the attribute itself caps at 30. Origin powers stacking +armor on top
of full Netherite + Prot IV mostly hit that wall and contributed ~1
saved damage per hit. 16 origin powers reworked:
13 tanky origins now have permanent Resistance (own budget,
multiplicative on top of armor + protection):
Automaton, Sculkborn, Shulk, Gorgon, Kraken, Strider, Cinderborn,
Golem, Dwarf, Frostborn, Sporeling — all Resistance I.
Phantom — Resistance I, night-only (kept the moon-armor flavour).
Warden — Resistance II (the only origin >+8 armor before).
3 lighter origins gain max HP instead (pure pool, no cap competition):
Abyssal +2 hearts, Blazeling +3 hearts, Stoneguard +3 hearts.
Class +armor powers (Warrior, Paladin, Sentinel, Mason, Berserker)
intentionally untouched — they're early-game bumps that don't hit
the ceiling.
NeoForge's auto-generated ConfigurationScreen is now wired into the
mod menu's Config button via a client-only trampoline (so dedicated
servers don't break). 271 translation keys added across two passes
covering every section, every per-origin enable toggle, every
per-class enable toggle, and 176 power_overrides subsection labels
(generated by title-casing each registered power id). Section
buttons, top-level toggles, and inside-section values all read as
human names instead of raw 'neoorigins.configuration.<key>' paths.
PersistentEffectPower's codec now reads a top-level 'amplifier' field
as a config-override hook, since power_overrides writes fields at the
JSON root and the Resistance amplifier lives nested under
effects[0].amplifier. The 13 reworked powers now register
fi('amplifier', N, 0, 4) instead of f('amount', ...) so admins can
re-tune Resistance level (I → V) via TOML or the in-game screen
without touching the JSON.
- Elytrian: removed the −2-hearts Frail Frame penalty; can't-wear-
heavy-armor restriction is enough drawback on its own.
- Sentinel Anchored: knockback resist 20% → 40%.
- Sentinel Guard Stance: +20% sneaking → +35% sneaking
(40% + 35% = 75% total when crouching).
- Earth Mage / SWIM prevent_action: previously only zeroed upward
velocity, which fought vanilla water buoyancy and produced an
"occasional freeze in place" stutter. Now forces a constant
downward sink (-0.16) and clears the swim flag every tick — player
walks the ocean floor cleanly regardless of input.
release
NeoOrigins v2.0.4 (MC 1.21.1)
v2.0.4+1.21.126 апр. 2026 г.34Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.4 — issue rollup
GitHub-issue cleanup release. Five reports addressed in code, two more
addressed via documentation / known-issue clarifications.
The neoorigins:biome condition parser only recognised the 'tag' field;
several built-in JSONs use the more descriptive 'biome_tag' (frostborn,
piglin, strider). Without the alias those powers fell through to
alwaysTrue() and fired in every biome. Parser now accepts both fields,
fixing seven powers in one pass:
frostborn_cold_buff, frostborn_nether_damage,
piglin_nether_buff, piglin_overworld_weakness,
piglin_soul_fire_damage, strider_nether_buff,
strider_overworld_slowness.
neoorigins:in_rain used isRainingAt(pos) which only consults world
weather + biome — it does not check whether overhead blocks shield the
player. Now also requires canSeeSky(pos), so any overhead block (solid
or transparent) blocks the rain check, matching player intuition.
fire_mage_fire_immunity used modify_damage with damage_type='onFire',
covering only the entity-on-fire damage type. LAVA and HOT_FLOOR fell
through. Switched to prevent_action 'fire' (matching blazeling and
cinderborn), which the existing CombatPowerEvents handler covers for
IN_FIRE, ON_FIRE, LAVA, and HOT_FLOOR in a single check.
[ocean_origins].fish_diet_required (default true) gates the
aquatic_fish_diet power on Abyssal / Kraken / Merling / Siren.
Set to false to let them eat anything.
Pack authors can gate any power on a registered config key. Supported
keys: ocean_origins.fish_diet_required, ocean_origins.dries_out.
Adding more is a one-line change to the lookup map.
Foreign <ns>:origin / <ns>:class layers now fold into the canonical
NeoOrigins picker tab instead of creating a separate screen. Authors
who want a separate tab opt in via "standalone": true on the layer
JSON. Carried forward from 2.0.3.
- HP-modifying lang strings now lead with hearts (player-facing unit)
with HP in parens: "−3 hearts (−6 max HP). Fragile wings, fragile
frame." instead of the ambiguous "Has 6 fewer HP than a normal
player." Covers all 14 max_health-modifying powers.
- Feline 'Hates Water' description fix — was claiming "Takes 50% more
damage from all sources", now correctly says "Takes 0.5 damage per
second while in water or rain".
Patch notes for 2.0 buried the originpacks/ → config/originpacks/
move in the QoL list. We've added a prominent migration section near
the top, calling out:
- the new location
- the existing legacy fallback (will warn, still loads)
- that no JSON changes are needed
- the new layer auto-merge from 2.0.3
release
NeoOrigins v2.0.4 (MC 26.1.x)
v2.0.4+26.126 апр. 2026 г.13Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.4 — issue rollup
GitHub-issue cleanup release. Five reports addressed in code, two more
addressed via documentation / known-issue clarifications.
The neoorigins:biome condition parser only recognised the 'tag' field;
several built-in JSONs use the more descriptive 'biome_tag' (frostborn,
piglin, strider). Without the alias those powers fell through to
alwaysTrue() and fired in every biome. Parser now accepts both fields,
fixing seven powers in one pass:
frostborn_cold_buff, frostborn_nether_damage,
piglin_nether_buff, piglin_overworld_weakness,
piglin_soul_fire_damage, strider_nether_buff,
strider_overworld_slowness.
neoorigins:in_rain used isRainingAt(pos) which only consults world
weather + biome — it does not check whether overhead blocks shield the
player. Now also requires canSeeSky(pos), so any overhead block (solid
or transparent) blocks the rain check, matching player intuition.
fire_mage_fire_immunity used modify_damage with damage_type='onFire',
covering only the entity-on-fire damage type. LAVA and HOT_FLOOR fell
through. Switched to prevent_action 'fire' (matching blazeling and
cinderborn), which the existing CombatPowerEvents handler covers for
IN_FIRE, ON_FIRE, LAVA, and HOT_FLOOR in a single check.
[ocean_origins].fish_diet_required (default true) gates the
aquatic_fish_diet power on Abyssal / Kraken / Merling / Siren.
Set to false to let them eat anything.
Pack authors can gate any power on a registered config key. Supported
keys: ocean_origins.fish_diet_required, ocean_origins.dries_out.
Adding more is a one-line change to the lookup map.
Foreign <ns>:origin / <ns>:class layers now fold into the canonical
NeoOrigins picker tab instead of creating a separate screen. Authors
who want a separate tab opt in via "standalone": true on the layer
JSON. Carried forward from 2.0.3.
- HP-modifying lang strings now lead with hearts (player-facing unit)
with HP in parens: "−3 hearts (−6 max HP). Fragile wings, fragile
frame." instead of the ambiguous "Has 6 fewer HP than a normal
player." Covers all 14 max_health-modifying powers.
- Feline 'Hates Water' description fix — was claiming "Takes 50% more
damage from all sources", now correctly says "Takes 0.5 damage per
second while in water or rain".
Patch notes for 2.0 buried the originpacks/ → config/originpacks/
move in the QoL list. We've added a prominent migration section near
the top, calling out:
- the new location
- the existing legacy fallback (will warn, still loads)
- that no JSON changes are needed
- the new layer auto-merge from 2.0.3
release
NeoOrigins v2.0.3 (MC 1.21.1)
v2.0.3+1.21.125 апр. 2026 г.53Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.3 — server boot fix + datapack auto-merge
Critical patch for anyone running NeoOrigins on a dedicated server:
2.0.0, 2.0.1, and 2.0.2 all crash at boot before the world loads.
2.0.3 fixes that. Also includes a quality-of-life change for datapack
authors so origin packs no longer create a separate picker screen.
EntityMakeStuckInBlockMixin (a common mixin for cobweb-affinity)
contained an `instanceof LocalPlayer` check. Mixin resolves type
references at transform time, and LocalPlayer.class isn't on the
dedicated-server distribution — every server bricks at boot with
`ClassMetadataNotFoundException`. Singleplayer was unaffected because
the integrated server runs on the client distribution where
LocalPlayer exists.
Fix: trampoline the LocalPlayer reference through a new
ClientStuckInBlockHelper class. The mixin calls a static method on
the helper only inside `level().isClientSide()`; the helper class is
loaded lazily and only ever on the physical client. Server JVM never
resolves LocalPlayer.
Datapacks that ship their own e.g. `erin:origin` layer (the most
common Apoli/Origins-style structure) were creating a separate picker
screen alongside the main NeoOrigins origin tab. New
`mergeForeignSamePathLayers` pass folds any layer whose path is
`origin` or `class` into the canonical destination
(`origins:origin` or `neoorigins:class` respectively).
Pack authors who genuinely want a separate picker tab opt out via
`"standalone": true` on their layer JSON. INFO-level log line
announces each fold so debugging is straightforward:
Folded foreign layer erin:origin (7 origins) into origins:origin
Carried over from 2.0.2: the `[sun_damage]` block in
`neoorigins-common.toml` exposes `helmet_dura_damage_chance`
(default 0.07, range 0–1). Live-read each evaluation, so server
admins can tune helmet wear without restarting.
If you maintain a dedicated server running NeoOrigins, update
immediately. There is no workaround for the 2.0.0–2.0.2 boot crash
short of removing the mod or running on the integrated server.
release
NeoOrigins v2.0.3 (MC 26.1.x)
v2.0.3+26.125 апр. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.3 — server boot fix + datapack auto-merge
Critical patch for anyone running NeoOrigins on a dedicated server:
2.0.0, 2.0.1, and 2.0.2 all crash at boot before the world loads.
2.0.3 fixes that. Also includes a quality-of-life change for datapack
authors so origin packs no longer create a separate picker screen.
EntityMakeStuckInBlockMixin (a common mixin for cobweb-affinity)
contained an `instanceof LocalPlayer` check. Mixin resolves type
references at transform time, and LocalPlayer.class isn't on the
dedicated-server distribution — every server bricks at boot with
`ClassMetadataNotFoundException`. Singleplayer was unaffected because
the integrated server runs on the client distribution where
LocalPlayer exists.
Fix: trampoline the LocalPlayer reference through a new
ClientStuckInBlockHelper class. The mixin calls a static method on
the helper only inside `level().isClientSide()`; the helper class is
loaded lazily and only ever on the physical client. Server JVM never
resolves LocalPlayer.
Datapacks that ship their own e.g. `erin:origin` layer (the most
common Apoli/Origins-style structure) were creating a separate picker
screen alongside the main NeoOrigins origin tab. New
`mergeForeignSamePathLayers` pass folds any layer whose path is
`origin` or `class` into the canonical destination
(`origins:origin` or `neoorigins:class` respectively).
Pack authors who genuinely want a separate picker tab opt out via
`"standalone": true` on their layer JSON. INFO-level log line
announces each fold so debugging is straightforward:
Folded foreign layer erin:origin (7 origins) into origins:origin
Carried over from 2.0.2: the `[sun_damage]` block in
`neoorigins-common.toml` exposes `helmet_dura_damage_chance`
(default 0.07, range 0–1). Live-read each evaluation, so server
admins can tune helmet wear without restarting.
If you maintain a dedicated server running NeoOrigins, update
immediately. There is no workaround for the 2.0.0–2.0.2 boot crash
short of removing the mod or running on the integrated server.
release
NeoOrigins v2.0.2 (MC 1.21.1)
v2.0.2+1.21.125 апр. 2026 г.16Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.2 — sun helmet tuning
Single-change tuning release: helmet durability damage from sun
exposure now happens at 7% per evaluation (down from 10% in 2.0.1),
≈30% slower wear. Tester feedback was that helmets ate too quickly
under continuous sun.
Rough new lifespans under continuous direct sunlight:
Iron helm ~40 min (was ~27 min)
Diamond helm ~85 min (was ~60 min)
Netherite helm ~95 min (was ~67 min)
Unbreaking still stacks on top via vanilla hurtAndBreak.
release
NeoOrigins v2.0.2 (MC 26.1.x)
v2.0.2+26.125 апр. 2026 г.12Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.2 — sun helmet tuning
Single-change tuning release: helmet durability damage from sun
exposure now happens at 7% per evaluation (down from 10% in 2.0.1),
≈30% slower wear. Tester feedback was that helmets ate too quickly
under continuous sun.
Rough new lifespans under continuous direct sunlight:
Iron helm ~40 min (was ~27 min)
Diamond helm ~85 min (was ~60 min)
Netherite helm ~95 min (was ~67 min)
Unbreaking still stacks on top via vanilla hurtAndBreak.
release
NeoOrigins v2.0.1 (MC 1.21.1)
v2.0.1+1.21.125 апр. 2026 г.13Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.1 — post-launch fix rollup
Supports: Minecraft 26.1.x (Java 25) · Minecraft 1.21.1 (Java 21)
A 10-iteration polish pass on top of 2.0.0, driven by post-launch
testing. Mostly bugfixes plus a few targeted features (Nether food,
helmet sun protection, eating animation for custom edibles).
- Phantom / Elytrian / Hiveling / Draconic actually glide now without
an elytra equipped. Two-mixin fix: client-side LocalPlayer redirect
to bypass canElytraFly + send the START_FALL_FLYING packet, and the
server-side updateFallFlying mixin extended to keep the natural_glide
flag set instead of clearing it on the next tick.
- LocationCondition.isLandColumn now requires solid floor + 2-block
air clearance with no lava in column triple, plus a 3x3 air-only
ring + 3x3 floor-ring lava reject. Avoids 1-block lava islands and
1-wide crevice spawns.
- Ceiling dimensions (Nether) start the Y scan 16 blocks below
logicalHeight so we land on natural netherrack instead of inside a
bedrock-roof air pocket.
- Skip canSeeSky check in ceiling dimensions so the original Nether-
spawn check stops silently rejecting every column.
- spawn_location teleport now first-pick-only — re-picks via /origin
gui no longer relocate the player.
- Gravity Mage Levitation: was permanent slow_falling (wrong content).
Now toggleable Levitation I, default-off. Description matches
behavior again.
- Hiveling Sting: 4 magic damage + Poison II for 10s in 3-block AOE,
plus a per-tick particle trail keyed to effect_type (poison → green
wisp on 1.21.1, HAPPY_VILLAGER on 26.1).
- Blazeling: Nether-Born swapped from passive regen to invisible
Speed I in is_nether biomes (no HUD pollution). New Brimstone Fists
power = stone-pickaxe handmining tier so a fresh-spawn Blazeling can
break netherrack and stone-tier ores barehanded.
- Nether-native origins (Blazeling, Piglin, Strider, Cinderborn) gain
Fungal Diet: warped/crimson fungi edible for 5 hunger / 0.6
saturation, hunger-gated.
- exposed_to_sun condition now mirrors vanilla zombie/skeleton helmet
rule. A damageable helmet absorbs the burn at the cost of its own
durability. 10% per-evaluation chance of 1 dura damage; Unbreaking
stacks via vanilla hurtAndBreak. Iron helm lasts ~25 min of straight
sun, more with enchants. Covers all 13 daylight-burn powers (Abyssal,
Caveborn, Vampire, Phantom, Warden, etc.) without per-power JSON
changes.
- ItemStackEdibleDurationMixin: stacks promoted by edible_item powers
now have a 32-tick getUseDuration so vanilla startUsingItem actually
plays the eating animation.
- ItemStackEdibleAnimationMixin: returns UseAnim.EAT (1.21.1) /
ItemUseAnimation.EAT (26.1) for promoted items so the chew animation
renders.
- Right-click no longer instant-consumes — it starts the use animation,
and nutrition is applied on LivingEntityUseItemEvent.Finish, matching
vanilla food UX (releasable mid-bite, hunger-gated when
always_edible: false).
- area_of_effect now configurable via [friendly_fire] in
neoorigins-common.toml: protect_owned_pets, protect_minions,
protect_animals, protect_villagers, protect_iron_golems. Defaults
flip the previous over-protective behavior (animals NOT protected
by default) so combat AOEs like Hiveling Sting, Inferno Burst, and
Kraken Ink can actually hit livestock test targets.
- @Redirect handler arg type was Player on a LocalPlayer-owner
redirect — Mixin rejected at class load. Fixed.
- Several 26.1 API rename adjustments: TamableAnimal.getOwnerUUID →
getOwnerReference().getUUID(); AbstractVillager moved to .npc.villager
package; IronGolem moved to .animal.golem package; UseAnim →
ItemUseAnimation; canElytraFly call site removed from LocalPlayer.aiStep.
release
NeoOrigins v2.0.1 (MC 26.1.x)
v2.0.1+26.125 апр. 2026 г.13Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.1 — post-launch fix rollup
Supports: Minecraft 26.1.x (Java 25) · Minecraft 1.21.1 (Java 21)
A 10-iteration polish pass on top of 2.0.0, driven by post-launch
testing. Mostly bugfixes plus a few targeted features (Nether food,
helmet sun protection, eating animation for custom edibles).
- Phantom / Elytrian / Hiveling / Draconic actually glide now without
an elytra equipped. Two-mixin fix: client-side LocalPlayer redirect
to bypass canElytraFly + send the START_FALL_FLYING packet, and the
server-side updateFallFlying mixin extended to keep the natural_glide
flag set instead of clearing it on the next tick.
- LocationCondition.isLandColumn now requires solid floor + 2-block
air clearance with no lava in column triple, plus a 3x3 air-only
ring + 3x3 floor-ring lava reject. Avoids 1-block lava islands and
1-wide crevice spawns.
- Ceiling dimensions (Nether) start the Y scan 16 blocks below
logicalHeight so we land on natural netherrack instead of inside a
bedrock-roof air pocket.
- Skip canSeeSky check in ceiling dimensions so the original Nether-
spawn check stops silently rejecting every column.
- spawn_location teleport now first-pick-only — re-picks via /origin
gui no longer relocate the player.
- Gravity Mage Levitation: was permanent slow_falling (wrong content).
Now toggleable Levitation I, default-off. Description matches
behavior again.
- Hiveling Sting: 4 magic damage + Poison II for 10s in 3-block AOE,
plus a per-tick particle trail keyed to effect_type (poison → green
wisp on 1.21.1, HAPPY_VILLAGER on 26.1).
- Blazeling: Nether-Born swapped from passive regen to invisible
Speed I in is_nether biomes (no HUD pollution). New Brimstone Fists
power = stone-pickaxe handmining tier so a fresh-spawn Blazeling can
break netherrack and stone-tier ores barehanded.
- Nether-native origins (Blazeling, Piglin, Strider, Cinderborn) gain
Fungal Diet: warped/crimson fungi edible for 5 hunger / 0.6
saturation, hunger-gated.
- exposed_to_sun condition now mirrors vanilla zombie/skeleton helmet
rule. A damageable helmet absorbs the burn at the cost of its own
durability. 10% per-evaluation chance of 1 dura damage; Unbreaking
stacks via vanilla hurtAndBreak. Iron helm lasts ~25 min of straight
sun, more with enchants. Covers all 13 daylight-burn powers (Abyssal,
Caveborn, Vampire, Phantom, Warden, etc.) without per-power JSON
changes.
- ItemStackEdibleDurationMixin: stacks promoted by edible_item powers
now have a 32-tick getUseDuration so vanilla startUsingItem actually
plays the eating animation.
- ItemStackEdibleAnimationMixin: returns UseAnim.EAT (1.21.1) /
ItemUseAnimation.EAT (26.1) for promoted items so the chew animation
renders.
- Right-click no longer instant-consumes — it starts the use animation,
and nutrition is applied on LivingEntityUseItemEvent.Finish, matching
vanilla food UX (releasable mid-bite, hunger-gated when
always_edible: false).
- area_of_effect now configurable via [friendly_fire] in
neoorigins-common.toml: protect_owned_pets, protect_minions,
protect_animals, protect_villagers, protect_iron_golems. Defaults
flip the previous over-protective behavior (animals NOT protected
by default) so combat AOEs like Hiveling Sting, Inferno Burst, and
Kraken Ink can actually hit livestock test targets.
- @Redirect handler arg type was Player on a LocalPlayer-owner
redirect — Mixin rejected at class load. Fixed.
- Several 26.1 API rename adjustments: TamableAnimal.getOwnerUUID →
getOwnerReference().getUUID(); AbstractVillager moved to .npc.villager
package; IronGolem moved to .animal.golem package; UseAnim →
ItemUseAnimation; canElytraFly call site removed from LocalPlayer.aiStep.
release
NeoOrigins v2.0.0 (MC 1.21.1)
v2.0.0+1.21.125 апр. 2026 г.415Minecraft: 1.21.1neoforge
Что нового
NeoOrigins 2.0.0
A ground-up V2 rewrite focused on data-driven authoring, cleaner internals, and a big content pass across every built-in origin and class.
Pack-author docs: https://cyberday1.github.io/NeoOrigins/
Highlights:
- Two-layer selection: 46 origins x 20 classes
- All 17 classes rebalanced to 4-5 passive powers each (zero keybind slots)
- 3 new classes: Fisher, Mason, Paladin
- 88 legacy PowerType classes consolidated to ~60 composable types
- New canonical V2 forms: persistent_effect, condition_passive, action_on_event, active_ability
- 10+ new DSL conditions (night, thundering, has_effect, climbing, near_block, out_of_combat, moon_phase, exposed_to_sun)
- New 'dash' DSL action with variable strength
- Orb of Origin: XP-gated re-pick consumable
- Origin spawn anchors with ocean-floor + water-surface fallbacks
- Advancement-based origin upgrades
Aquatic overhaul:
- 'Dries Out of Water' system with global config-driven drain rate
- 'Pescivore' fish-only diet with cooked-equivalent stats for raw fish
- 'Deep Current' aquatic speed across all aquatic origins
- Bubble HUD hidden + water-fog removed for aquatic kits
Fixes:
- Hunger cost on active abilities actually deducts (was silently dropped pre-2.0)
- ModifyDamagePower direction:out fires vs mob victims
- exposed_to_sun covers the full day
- Action handlers no longer leak on respawn / login / origin-swap
- Mob-summon ownership stable cross-dimension and relog
- Stable attribute modifier IDs (no stacking on relog)
And near-uncountable small and large bugs that came up during playtesting both V1 and V2.
Huge thanks to NyxBorne, Soul, and Jams.
Targets: MC 26.1 / Java 25 / NeoForge 27.x and MC 1.21.1 / Java 21 / NeoForge 21.1.x.
Report bugs: https://github.com/CyberDay1/NeoOrigins/issues
release
NeoOrigins v2.0.0 (MC 26.1.x)
v2.0.0+26.125 апр. 2026 г.18Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins 2.0.0
A ground-up V2 rewrite focused on data-driven authoring, cleaner internals, and a big content pass across every built-in origin and class.
Pack-author docs: https://cyberday1.github.io/NeoOrigins/
Highlights:
- Two-layer selection: 46 origins x 20 classes
- All 17 classes rebalanced to 4-5 passive powers each (zero keybind slots)
- 3 new classes: Fisher, Mason, Paladin
- 88 legacy PowerType classes consolidated to ~60 composable types
- New canonical V2 forms: persistent_effect, condition_passive, action_on_event, active_ability
- 10+ new DSL conditions (night, thundering, has_effect, climbing, near_block, out_of_combat, moon_phase, exposed_to_sun)
- New 'dash' DSL action with variable strength
- Orb of Origin: XP-gated re-pick consumable
- Origin spawn anchors with ocean-floor + water-surface fallbacks
- Advancement-based origin upgrades
Aquatic overhaul:
- 'Dries Out of Water' system with global config-driven drain rate
- 'Pescivore' fish-only diet with cooked-equivalent stats for raw fish
- 'Deep Current' aquatic speed across all aquatic origins
- Bubble HUD hidden + water-fog removed for aquatic kits
Fixes:
- Hunger cost on active abilities actually deducts (was silently dropped pre-2.0)
- ModifyDamagePower direction:out fires vs mob victims
- exposed_to_sun covers the full day
- Action handlers no longer leak on respawn / login / origin-swap
- Mob-summon ownership stable cross-dimension and relog
- Stable attribute modifier IDs (no stacking on relog)
And near-uncountable small and large bugs that came up during playtesting both V1 and V2.
Huge thanks to NyxBorne, Soul, and Jams.
Targets: MC 26.1 / Java 25 / NeoForge 27.x and MC 1.21.1 / Java 21 / NeoForge 21.1.x.
Report bugs: https://github.com/CyberDay1/NeoOrigins/issues
release
NeoOrigins v1.14.2 (MC 1.21.1)
v1.14.2+1.21.123 апр. 2026 г.772Minecraft: 1.21.1neoforge
Что нового
v1.14.2 — Turkish-locale hotfix
Patch release fixing a client-side crash for players running the JVM in
Turkish locale (tr_TR).
All five enum codecs in NeoOrigins (Impact, Condition, Action, ActiveWhen,
ActionType) called `String.toUpperCase()` / `toLowerCase()` without
specifying a locale. In Turkish locale, `"medium".toUpperCase()` returns
`"MEDİUM"` (with a dotted capital I) instead of `"MEDIUM"`, which fails
`Impact.valueOf()` and crashes the client on the `sync_origin_registry`
payload every time they try to join a server.
Symptom reported in the wild: `Failed to decode packet
'clientbound/minecraft:custom_payload'` on login, only for one specific
player in a party (the one whose JVM defaults to tr_TR). The misleading
Sable crash banner — "Please make sure this issue is not caused by Sable"
— hides the real root cause, which is NeoOrigins.
Every affected codec now passes `Locale.ROOT` explicitly:
```java
s -> Impact.valueOf(s.toUpperCase(Locale.ROOT))
```
Four power classes + the Impact enum updated. No schema changes; packs
that worked on v1.14.1 continue to work without edits.
Any player whose JVM defaults to a locale where letter-case conversion
produces non-ASCII characters — Turkish (tr_TR), Azerbaijani (az_AZ), and
a handful of others. Latin-locale users were never affected.
Thanks to RadexKonera for the detailed crash report.
release
NeoOrigins v1.14.2 (MC 26.1.x)
v1.14.2+26.123 апр. 2026 г.34Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v1.14.2 — Turkish-locale hotfix
Patch release fixing a client-side crash for players running the JVM in
Turkish locale (tr_TR).
All five enum codecs in NeoOrigins (Impact, Condition, Action, ActiveWhen,
ActionType) called `String.toUpperCase()` / `toLowerCase()` without
specifying a locale. In Turkish locale, `"medium".toUpperCase()` returns
`"MEDİUM"` (with a dotted capital I) instead of `"MEDIUM"`, which fails
`Impact.valueOf()` and crashes the client on the `sync_origin_registry`
payload every time they try to join a server.
Symptom reported in the wild: `Failed to decode packet
'clientbound/minecraft:custom_payload'` on login, only for one specific
player in a party (the one whose JVM defaults to tr_TR). The misleading
Sable crash banner — "Please make sure this issue is not caused by Sable"
— hides the real root cause, which is NeoOrigins.
Every affected codec now passes `Locale.ROOT` explicitly:
```java
s -> Impact.valueOf(s.toUpperCase(Locale.ROOT))
```
Four power classes + the Impact enum updated. No schema changes; packs
that worked on v1.14.1 continue to work without edits.
Any player whose JVM defaults to a locale where letter-case conversion
produces non-ASCII characters — Turkish (tr_TR), Azerbaijani (az_AZ), and
a handful of others. Latin-locale users were never affected.
Thanks to RadexKonera for the detailed crash report.
release
NeoOrigins v1.14.1 (MC 1.21.1)
v1.14.1+1.21.123 апр. 2026 г.217Minecraft: 1.21.1neoforge
Что нового
v1.14.1 — minion friendly-fire fix + pet-leash tuning
Patch release addressing three tester-reported regressions affecting summoned
and tamed mobs. Drop-in replacement for v1.14.0 — no schema changes, no new
power types, no pack migrations needed.
- **Minions no longer attack their summoner.** Summons via `neoorigins:summon_minion`
(Abyssal guardians, Necromancer skeletons, etc.) were spawning with their
default vanilla AI — which still targets the nearest player, including the
one who summoned them. They now receive the same owner-aware AI rewrite as
tamed mobs, and event-level chokepoints catch anything that still slips
through.
- **Tamed mobs forgive accidental owner hits.** `HurtByTargetGoal` was naive —
any damage source flipped the pet hostile against the owner, including
collision nudges, AoE splashback, and thorns reflection. A new
`OwnerAwareHurtByTargetGoal` subclass clears `lastHurtByMob` when the owner
is the source and declines to target.
- **Pet leash loosened.** `FollowOwnerGoal` teleport distance raised from 10 →
24 blocks, follow-start from 3 → 8. Pets now have real room to engage
enemies without snapping back to the owner every few steps.
- **Primed creepers defuse before leash-teleport.** A tamed creeper that began
its swell at a distant target would detonate on top of the owner the
instant the leash teleported it back. Creeper `swellDir` is now reset to
-1 before the teleport call.
release
NeoOrigins v1.14.1 (MC 26.1.x)
v1.14.1+26.123 апр. 2026 г.18Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v1.14.1 — minion friendly-fire fix + pet-leash tuning
Patch release addressing three tester-reported regressions affecting summoned
and tamed mobs. Drop-in replacement for v1.14.0 — no schema changes, no new
power types, no pack migrations needed.
- **Minions no longer attack their summoner.** Summons via `neoorigins:summon_minion`
(Abyssal guardians, Necromancer skeletons, etc.) were spawning with their
default vanilla AI — which still targets the nearest player, including the
one who summoned them. They now receive the same owner-aware AI rewrite as
tamed mobs, and event-level chokepoints catch anything that still slips
through.
- **Tamed mobs forgive accidental owner hits.** `HurtByTargetGoal` was naive —
any damage source flipped the pet hostile against the owner, including
collision nudges, AoE splashback, and thorns reflection. A new
`OwnerAwareHurtByTargetGoal` subclass clears `lastHurtByMob` when the owner
is the source and declines to target.
- **Pet leash loosened.** `FollowOwnerGoal` teleport distance raised from 10 →
24 blocks, follow-start from 3 → 8. Pets now have real room to engage
enemies without snapping back to the owner every few steps.
- **Primed creepers defuse before leash-teleport.** A tamed creeper that began
its swell at a distant target would detonate on top of the owner the
instant the leash teleported it back. Creeper `swellDir` is now reset to
-1 before the teleport call.
release
NeoOrigins v1.14.0 (MC 1.21.1)
v1.14.0+1.21.122 апр. 2026 г.473Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.14.0
Built for **Minecraft 26.1 / 26.1.1 / 26.1.2** and **1.21.1** with **NeoForge**.
Issue-driven release focused on user-reported bugs (#22, #25, #27, #28, #29, #30) and one feature request (#26). Nothing in this release changes existing JSON schemas — all additions are backwards-compatible.
`mobs_ignore_player` used to cancel `LivingChangeTargetEvent` unconditionally, so pacified mobs stayed passive even when the player hit them. Now defers to vanilla's `getLastHurtByMob` — if the player recently attacked the mob, targeting is allowed through. Warden-class exceptions are unchanged.
The power cancelled fire damage but didn't clear the fire-tick counter, so the burning model still rendered on lava / fire contact. Fixed by zeroing remaining fire ticks each tick while the power is active.
Rare reports of the power being inert were hard to isolate. Added a warning log when the underlying attribute fails to resolve, plus a 40-tick self-heal that re-applies the modifier if it ever gets lost. Default behaviour unchanged for working cases.
Selecting Abyssal in the origin picker granted the trident immediately; clicking "back" and picking a different origin left the trident in the inventory. Grants are now deferred until the player commits to their full origin set (`hadAllOrigins` flips true). Re-picking via Orb of Origin clears the grant ledger, so paying the orb XP cost re-earns your items — consistent with the orb's re-pick semantics.
- "4 fewer hearts" → "8 HP (4 hearts) less" — matches the unit used by other reduced-health tooltips.
- Light Frame's 0.9 scale no longer shrinks block / entity interaction range. Compact Build (Caveborn) also cleaned up. Pack authors who want size-coupled reach can set `modify_reach: true` on their own `size_scaling` powers.
- Aquatic Recovery: now says "roughly 1 HP every 3 seconds" (matches actual healing rate).
- Mechanical Body: dropped the inaccurate "potions have no effect on metal" line; now correctly lists the three immune effects and notes other potion effects still apply.
- Dark Adapted: "in the dark with no light source" rather than "underground" (the power is always on).
Cancels vanilla food-tick natural regeneration only. `LivingHealEvent` is not touched — Regeneration potion, beacon, totem, and direct `origins:heal` actions still work. Closes the design gap where `natural_regen_modifier: 0.0` previously disabled *all* healing including potions. Pair with an alternative healing mechanic for "metabolism-less" origins.
```json
{ "type": "neoorigins:no_natural_regen" }
```
`prevent_action` powers now accept an optional `active_when` enum field that gates the prevention on a player state:
- `always` (default) — previous behaviour
- `not_sneaking` — power inactive while crouching
- `sneaking` — power only active while crouching
- `on_ground`, `not_on_ground` — position-based gates
Avian's Featherweight uses `not_sneaking` by default so crouch-landing re-enables critical hits. Any other `prevent_action` power keeps legacy behaviour unless overridden.
- `docs/POWER_TYPES.md` now documents `no_natural_regen`, clarifies that `natural_regen_modifier` scales all heal sources, and adds a "Pack-author patterns" section with `origins:action_over_time + origins:feed / origins:heal` recipes for passive hunger / health restoration (closes the "I couldn't find a way to add hunger every few ticks" gap reported in #25).
Almost every power rate, multiplier, cooldown, damage value, and duration in the built-in origins is adjustable via `config/neoorigins-common.toml` under `[power_overrides]`. Find the power id, change the value, then `/reload` or restart. Build a pack or play how you want — the defaults are a starting point, not a statement.
release
NeoOrigins v1.14.0 (MC 26.1.x)
v1.14.0+26.122 апр. 2026 г.31Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.14.0
Built for **Minecraft 26.1 / 26.1.1 / 26.1.2** and **1.21.1** with **NeoForge**.
Issue-driven release focused on user-reported bugs (#22, #25, #27, #28, #29, #30) and one feature request (#26). Nothing in this release changes existing JSON schemas — all additions are backwards-compatible.
`mobs_ignore_player` used to cancel `LivingChangeTargetEvent` unconditionally, so pacified mobs stayed passive even when the player hit them. Now defers to vanilla's `getLastHurtByMob` — if the player recently attacked the mob, targeting is allowed through. Warden-class exceptions are unchanged.
The power cancelled fire damage but didn't clear the fire-tick counter, so the burning model still rendered on lava / fire contact. Fixed by zeroing remaining fire ticks each tick while the power is active.
Rare reports of the power being inert were hard to isolate. Added a warning log when the underlying attribute fails to resolve, plus a 40-tick self-heal that re-applies the modifier if it ever gets lost. Default behaviour unchanged for working cases.
Selecting Abyssal in the origin picker granted the trident immediately; clicking "back" and picking a different origin left the trident in the inventory. Grants are now deferred until the player commits to their full origin set (`hadAllOrigins` flips true). Re-picking via Orb of Origin clears the grant ledger, so paying the orb XP cost re-earns your items — consistent with the orb's re-pick semantics.
- "4 fewer hearts" → "8 HP (4 hearts) less" — matches the unit used by other reduced-health tooltips.
- Light Frame's 0.9 scale no longer shrinks block / entity interaction range. Compact Build (Caveborn) also cleaned up. Pack authors who want size-coupled reach can set `modify_reach: true` on their own `size_scaling` powers.
- Aquatic Recovery: now says "roughly 1 HP every 3 seconds" (matches actual healing rate).
- Mechanical Body: dropped the inaccurate "potions have no effect on metal" line; now correctly lists the three immune effects and notes other potion effects still apply.
- Dark Adapted: "in the dark with no light source" rather than "underground" (the power is always on).
Cancels vanilla food-tick natural regeneration only. `LivingHealEvent` is not touched — Regeneration potion, beacon, totem, and direct `origins:heal` actions still work. Closes the design gap where `natural_regen_modifier: 0.0` previously disabled *all* healing including potions. Pair with an alternative healing mechanic for "metabolism-less" origins.
```json
{ "type": "neoorigins:no_natural_regen" }
```
`prevent_action` powers now accept an optional `active_when` enum field that gates the prevention on a player state:
- `always` (default) — previous behaviour
- `not_sneaking` — power inactive while crouching
- `sneaking` — power only active while crouching
- `on_ground`, `not_on_ground` — position-based gates
Avian's Featherweight uses `not_sneaking` by default so crouch-landing re-enables critical hits. Any other `prevent_action` power keeps legacy behaviour unless overridden.
- `docs/POWER_TYPES.md` now documents `no_natural_regen`, clarifies that `natural_regen_modifier` scales all heal sources, and adds a "Pack-author patterns" section with `origins:action_over_time + origins:feed / origins:heal` recipes for passive hunger / health restoration (closes the "I couldn't find a way to add hunger every few ticks" gap reported in #25).
Almost every power rate, multiplier, cooldown, damage value, and duration in the built-in origins is adjustable via `config/neoorigins-common.toml` under `[power_overrides]`. Find the power id, change the value, then `/reload` or restart. Build a pack or play how you want — the defaults are a starting point, not a statement.
release
NeoOrigins v1.13.0 (MC 1.21.1)
v1.13.0+1.21.121 апр. 2026 г.657Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.13.0
Outgoing-damage trigger. When the wearer deals damage that passes the filters, runs an action on the attacker and/or the victim.
Filters: target_group, target_type, damage_type, min_damage, chance.
Actions: restore_health, restore_hunger, grant_effect (self), target_effect (victim).
neoorigins:attribute_modifier now takes two more optional gates, AND-combined with the existing condition:
- equipment_condition — {slot, item, tag}. Modifier only applies while the named slot holds a matching item (or any item if neither field is given).
- location_condition — {dimension, biome, biome_tag, structure, structure_tag}. Modifier only applies while the player is in the matching place.
Any origin can now declare a spawn_location that the mod will teleport the player to — both on pick and on bed-less respawn. Uses the same five location fields as the gate.
- Teleport fires only once every layer has a selection, so it no longer yanks the player mid-picker.
- Spawn column resolution is robust now: force-loads the target chunk, scans a 5x5 XZ area top-down for a (solid, air, air) land column, and respects logicalHeight so Nether spawns stay under the bedrock roof (no more roof-of-the-Nether teleports, no more End void drops).
- Two new optional flags for aquatic origins:
- allow_ocean_floor — if no land column is found, fall back to (solid, water, water) on the seabed. Survives if the origin has water breathing.
- allow_water_surface — if no land (and no allowed floor) is found, fall back to the topmost water column — player spawns feet-in-water with head in open air.
- When nothing matches, the pick proceeds without teleport (with a warning in the log).
- Orb of Origin no longer consumed when you can't afford it. Client-side was shrinking the stack before the server's XP check ran; the server's refusal arrived too late to restore the optimistic consumption in some cases. Fixed by deferring both the decision and the shrink to the server.
- 26.1 only — FoodData.tick arity fix so Avian Athlete's Diet regen-exhaustion hook loads again.
- 26.1 only — attribute ID resolver now probes both directions (generic.armor <-> armor, player.block_interaction_range <-> block_interaction_range), so bare-id JSON from 26.1 and prefixed JSON from older packs both work.
- Paladin — demoes equipment_condition (extra armor in a full set) and two action_on_hit configs (lifesteal vs. undead, smite bonus).
- Void Knight — demoes spawn_location (End City) + location_condition attribute buffs inside the End.
- README.md — Origin Spawn Locations section, new columns for the water flags, scan-order explanation.
- docs/POWER_TYPES.md — all three attribute gates, action_on_hit section, modify_damage.target_group addition, field-name corrections.
release
NeoOrigins v1.13.0 (MC 26.1.x)
v1.13.0+26.121 апр. 2026 г.19Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.13.0
Outgoing-damage trigger. When the wearer deals damage that passes the filters, runs an action on the attacker and/or the victim.
Filters: target_group, target_type, damage_type, min_damage, chance.
Actions: restore_health, restore_hunger, grant_effect (self), target_effect (victim).
neoorigins:attribute_modifier now takes two more optional gates, AND-combined with the existing condition:
- equipment_condition — {slot, item, tag}. Modifier only applies while the named slot holds a matching item (or any item if neither field is given).
- location_condition — {dimension, biome, biome_tag, structure, structure_tag}. Modifier only applies while the player is in the matching place.
Any origin can now declare a spawn_location that the mod will teleport the player to — both on pick and on bed-less respawn. Uses the same five location fields as the gate.
- Teleport fires only once every layer has a selection, so it no longer yanks the player mid-picker.
- Spawn column resolution is robust now: force-loads the target chunk, scans a 5x5 XZ area top-down for a (solid, air, air) land column, and respects logicalHeight so Nether spawns stay under the bedrock roof (no more roof-of-the-Nether teleports, no more End void drops).
- Two new optional flags for aquatic origins:
- allow_ocean_floor — if no land column is found, fall back to (solid, water, water) on the seabed. Survives if the origin has water breathing.
- allow_water_surface — if no land (and no allowed floor) is found, fall back to the topmost water column — player spawns feet-in-water with head in open air.
- When nothing matches, the pick proceeds without teleport (with a warning in the log).
- Orb of Origin no longer consumed when you can't afford it. Client-side was shrinking the stack before the server's XP check ran; the server's refusal arrived too late to restore the optimistic consumption in some cases. Fixed by deferring both the decision and the shrink to the server.
- 26.1 only — FoodData.tick arity fix so Avian Athlete's Diet regen-exhaustion hook loads again.
- 26.1 only — attribute ID resolver now probes both directions (generic.armor <-> armor, player.block_interaction_range <-> block_interaction_range), so bare-id JSON from 26.1 and prefixed JSON from older packs both work.
- Paladin — demoes equipment_condition (extra armor in a full set) and two action_on_hit configs (lifesteal vs. undead, smite bonus).
- Void Knight — demoes spawn_location (End City) + location_condition attribute buffs inside the End.
- README.md — Origin Spawn Locations section, new columns for the water flags, scan-order explanation.
- docs/POWER_TYPES.md — all three attribute gates, action_on_hit section, modify_damage.target_group addition, field-name corrections.
release
NeoOrigins v1.12.0 (MC 1.21.1)
v1.12.0+1.21.119 апр. 2026 г.1,3 тыс.Minecraft: 1.21.1neoforge
Что нового
## v1.12.0
### Fixes
- **Wall climbing now actually works.** The power has been converted from an
active toggle to a passive ability (matching upstream origins:climbing):
no more skill-slot binding or toggle-on required. Holding jump against a
wall propels you upward; releasing jump slow-falls/grips. Previously the
power only clamped downward velocity — you could never climb up.
- **Mage origins and monster_tamer can now be disabled via config.** The
config keys for air_mage, darkness_mage, earth_mage, fire_mage,
gravity_mage, water_mage and monster_tamer were missing from the
ModConfigSpec declaration, so NightConfig silently stripped any false
value on save. (#21)
### Datapack compatibility (Origins/Apoli)
- Support canonical Apoli field names: entity_action_lost /
entity_action_removed / removed_action for onRevoked hooks, and
respawn_entity_action / respawn_action for onRespawn hooks.
- entity_action_chosen now works in action_on_callback powers.
- Accept bare-namespace power type aliases where upstream Origins uses them.
- Clearer registry-mismatch / unknown-type warnings when a datapack
references something this build does not recognise.
### Performance
- Per-player resolved power cache in ActiveOriginService. The active
power set is now rebuilt only on real state changes (origin change,
datapack reload, dimension change, config reload) rather than every
tick. Cuts steady-state per-player iteration cost substantially on
servers with many powers or frequently-iterated queries.
### Builds
Shipped for:
- Minecraft 1.21.1 (NeoForge)
- Minecraft 26.1.x (NeoForge)
release
NeoOrigins v1.12.0 (MC 26.1.x)
v1.12.0+26.119 апр. 2026 г.44Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
## v1.12.0
### Fixes
- **Wall climbing now actually works.** The power has been converted from an
active toggle to a passive ability (matching upstream origins:climbing):
no more skill-slot binding or toggle-on required. Holding jump against a
wall propels you upward; releasing jump slow-falls/grips. Previously the
power only clamped downward velocity — you could never climb up.
- **Mage origins and monster_tamer can now be disabled via config.** The
config keys for air_mage, darkness_mage, earth_mage, fire_mage,
gravity_mage, water_mage and monster_tamer were missing from the
ModConfigSpec declaration, so NightConfig silently stripped any false
value on save. (#21)
### Datapack compatibility (Origins/Apoli)
- Support canonical Apoli field names: entity_action_lost /
entity_action_removed / removed_action for onRevoked hooks, and
respawn_entity_action / respawn_action for onRespawn hooks.
- entity_action_chosen now works in action_on_callback powers.
- Accept bare-namespace power type aliases where upstream Origins uses them.
- Clearer registry-mismatch / unknown-type warnings when a datapack
references something this build does not recognise.
### Performance
- Per-player resolved power cache in ActiveOriginService. The active
power set is now rebuilt only on real state changes (origin change,
datapack reload, dimension change, config reload) rather than every
tick. Cuts steady-state per-player iteration cost substantially on
servers with many powers or frequently-iterated queries.
### Builds
Shipped for:
- Minecraft 1.21.1 (NeoForge)
- Minecraft 26.1.x (NeoForge)
release
NeoOrigins v1.11.2 (MC 1.21.1)
v1.11.2+1.21.117 апр. 2026 г.446Minecraft: 1.21.1neoforge
Что нового
**Epic Fight Compatibility (MC 1.21.1 only)**
- Sized origins (Tiny, Dwarf, Golem, Inchling, etc.) now maintain their correct scale when Epic Fight takes over rendering in combat mode. Previously, players would snap to full size when entering Epic Fight combat.
- Implemented via an optional mixin that is silently skipped when Epic Fight is not installed — zero impact on non-Epic-Fight setups.
- Note: Epic Fight is not yet available for MC 26.1, so this fix only ships in the 1.21.1 jar.
release
NeoOrigins v1.11.2 (MC 26.1.x)
v1.11.2+26.117 апр. 2026 г.41Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
**Epic Fight Compatibility (MC 1.21.1 only)**
- Sized origins (Tiny, Dwarf, Golem, Inchling, etc.) now maintain their correct scale when Epic Fight takes over rendering in combat mode. Previously, players would snap to full size when entering Epic Fight combat.
- Implemented via an optional mixin that is silently skipped when Epic Fight is not installed — zero impact on non-Epic-Fight setups.
- Note: Epic Fight is not yet available for MC 26.1, so this fix only ships in the 1.21.1 jar.
release
NeoOrigins v1.11.1 (MC 1.21.1)
v1.11.1+1.21.117 апр. 2026 г.122Minecraft: 1.21.1neoforge
Что нового
**Bug Fixes**
- Fixed Cook class causing exponential saturation on food items, making them unstackable. The broken tick-based scanner has been replaced with one-shot craft/smelt event handlers that boost food exactly once.
- Fixed execute_command compat actions running at player permission level instead of server level. Addon packs using /function calls (e.g. spawning Icarus wings into curio slots) now work for non-op players.
- Fixed entity_action_chosen trigger being silently ignored in action_on_callback compat powers. Addon packs that run setup commands when a player selects an origin now fire correctly.
release
NeoOrigins v1.11.1 (MC 26.1.x)
v1.11.1+26.117 апр. 2026 г.25Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
**Bug Fixes**
- Fixed Cook class causing exponential saturation on food items, making them unstackable. The broken tick-based scanner has been replaced with one-shot craft/smelt event handlers that boost food exactly once.
- Fixed execute_command compat actions running at player permission level instead of server level. Addon packs using /function calls (e.g. spawning Icarus wings into curio slots) now work for non-op players.
- Fixed entity_action_chosen trigger being silently ignored in action_on_callback compat powers. Addon packs that run setup commands when a player selects an origin now fire correctly.
release
NeoOrigins v1.11.0 (MC 1.21.1)
v1.11.0+1.21.116 апр. 2026 г.69Minecraft: 1.21.1neoforge
Что нового
**New Feature — Advancement-Based Origin Upgrades (Datapack Authorable)**
- Any origin JSON can now declare an 'upgrades' list: a set of advancement/origin/announcement entries
- When a player earns the advancement, their current origin on that layer automatically swaps to the target
- Optional announcement field sends a translatable system message
- Works per-layer (origin + class upgrades run independently)
- Any datapack — modpack, addon, standalone — can author upgrade chains without Java code
**Bug Fixes**
- Fixed necromancer minions (and all summoned mobs) losing ownership info when walking through portals. Minions are now tracked by UUID across dimension changes.
- Fixed Avian slow-fall not working on MC 26.1 — the generic. attribute prefix still exists in 26.1 and the resolver wasn't falling back to it.
release
NeoOrigins v1.11.0 (MC 26.1.x)
v1.11.0+26.116 апр. 2026 г.17Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
**New Feature — Advancement-Based Origin Upgrades (Datapack Authorable)**
- Any origin JSON can now declare an 'upgrades' list: a set of advancement/origin/announcement entries
- When a player earns the advancement, their current origin on that layer automatically swaps to the target
- Optional announcement field sends a translatable system message
- Works per-layer (origin + class upgrades run independently)
- Any datapack — modpack, addon, standalone — can author upgrade chains without Java code
**Bug Fixes**
- Fixed necromancer minions (and all summoned mobs) losing ownership info when walking through portals. Minions are now tracked by UUID across dimension changes.
- Fixed Avian slow-fall not working on MC 26.1 — the generic. attribute prefix still exists in 26.1 and the resolver wasn't falling back to it.
release
NeoOrigins v1.10.1 (MC 1.21.1)
v1.10.1+1.21.116 апр. 2026 г.115Minecraft: 1.21.1neoforge
Что нового
**Bug Fixes**
- Fixed mining speed bonuses (e.g. Miner class, Dwarf, Caveborn, Earth Mage) not applying. Now uses a vanilla attribute that auto-syncs to the client.
- Fixed skills (e.g. Enderian teleport, Phantom hover) breaking after death until world reload (#19).
- Fixed Stonecutter Animal Loot multiplier not stacking correctly across multiple sources.
**Balance**
- Stoneguard's Stonecrusher: now 2.0x mining speed on all blocks (was 3.0x on stone only). The attribute system can't filter by block type.
release
NeoOrigins v1.10.1 (MC 26.1.x)
v1.10.1+26.116 апр. 2026 г.22Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
**Bug Fixes**
- Fixed mining speed bonuses (e.g. Miner class, Dwarf, Caveborn, Earth Mage) not applying. Now uses a vanilla attribute that auto-syncs to the client.
- Fixed skills (e.g. Enderian teleport, Phantom hover) breaking after death until world reload (#19).
- Fixed Stonecutter Animal Loot multiplier not stacking correctly across multiple sources.
**Balance**
- Stoneguard's Stonecrusher: now 2.0x mining speed on all blocks (was 3.0x on stone only). The attribute system can't filter by block type.
release
NeoOrigins v1.10.0 (MC 1.21.1)
v1.10.0+1.21.116 апр. 2026 г.42Minecraft: 1.21.1neoforge
Что нового
**New Origins**
- Added Monster Tamer, Fire Mage, Water Mage, Earth Mage, Air Mage, Shadow Mage, and Gravity Mage origins
**Bug Fixes**
- Fixed players losing their abilities after dying
- Fixed origin selection screen being forced on returning players
- Fixed Gravity Well — now fires a visible dark orb projectile
- Fixed Dwarf and Hiveling size scaling
release
NeoOrigins v1.10.0 (MC 26.1.x)
v1.10.0+26.116 апр. 2026 г.23Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
**New Origins**
- Added Monster Tamer, Fire Mage, Water Mage, Earth Mage, Air Mage, Shadow Mage, and Gravity Mage origins
**Bug Fixes**
- Fixed players losing their abilities after dying
- Fixed origin selection screen being forced on returning players
- Fixed Gravity Well — now fires a visible dark orb projectile
- Fixed Dwarf and Hiveling size scaling
release
NeoOrigins v1.9.1 (MC 1.21.1)
v1.9.1+1.21.115 апр. 2026 г.128Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.9.1
- Abyssal water regen reduced from 2.0 to ~0.33 HP/sec (1 HP per 3 seconds)
- **Breeze origin**: wind charge now fires an actual WindCharge projectile instead of dragon breath
- **Random on death**: fixed client sync — new origin now properly displays after respawn without requiring relog
- **Cooldown bar**: clicking a skill during cooldown no longer visually resets the cooldown bar to full
- **Compat damage immunity**: conditional `modify_damage_taken` powers (e.g. ebon_wing dodge) are no longer translated into unconditional damage immunity
- **Compat command spam**: suppressed "Unknown function" chat spam from addon origin commands
- **Summon minion feedback**: actionbar messages now display when summon fails due to low hunger or max minion cap
- **Origin command**: fixed data ordering in `/origin set` to match selection screen behavior
release
NeoOrigins v1.9.1 (MC 26.1.x)
v1.9.1+26.115 апр. 2026 г.32Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.9.1
- Abyssal water regen reduced from 2.0 to ~0.33 HP/sec (1 HP per 3 seconds)
- **Breeze origin**: wind charge now fires an actual WindCharge projectile instead of dragon breath
- **Random on death**: fixed client sync — new origin now properly displays after respawn without requiring relog
- **Cooldown bar**: clicking a skill during cooldown no longer visually resets the cooldown bar to full
- **Compat damage immunity**: conditional `modify_damage_taken` powers (e.g. ebon_wing dodge) are no longer translated into unconditional damage immunity
- **Compat command spam**: suppressed "Unknown function" chat spam from addon origin commands
- **Summon minion feedback**: actionbar messages now display when summon fails due to low hunger or max minion cap
- **Origin command**: fixed data ordering in `/origin set` to match selection screen behavior
release
NeoOrigins v1.9.0 (MC 1.21.1)
v1.9.0+1.21.114 апр. 2026 г.27Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.9.0
- Added 25+ new conditions: `dimension`, `biome`, `in_tag`, `equipped_item`, `food_level`, `submerged_in`, `on_fire`, `relative_health`, `fall_distance`, `enchantment`, `block`, `light_level`, `nbt`, `scoreboard`, `temperature`, `armor_value`, `using_item`, and more
- Added 15 new actions: `damage`, `feed`, `launch`, `spawn_entity`, `give`, `explode`, `extinguish`, `dismount`, `gain_air`, `trigger_cooldown`, `set_fall_distance`, `set_block`, and more
- Added 11 new Route B power types: `fire_projectile`, `target_action_on_hit`, `self_action_on_kill`, `launch`, `entity_glow`, `prevent_death`, `action_on_land`, and hit-reaction variants
- Added event-based powers: `prevent_item_use`, `restrict_armor`, `prevent_sleep`, `prevent_block_use`, `prevent_entity_use`, `modify_food`, `modify_jump`
- Added Route A translations for `fire_immunity` and `toggle_night_vision`
- Added config option `compat_filtering.min_power_ratio` (default 0.5) — hides addon origins with fewer than 50% of their powers loaded
- Pre-compiled all event-power conditions at load time for better performance
- Fixed memory leak: player event-power state now cleaned up on disconnect
- Fixed screen title rendering as raw translation key
- Fixed blurry UI text on MC 1.21.1
- Improved namespace labels for non-mod addon origins (title-cased with spaces)
release
NeoOrigins v1.9.0 (MC 26.1.x)
v1.9.0+26.114 апр. 2026 г.20Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.9.0
- Added 25+ new conditions: `dimension`, `biome`, `in_tag`, `equipped_item`, `food_level`, `submerged_in`, `on_fire`, `relative_health`, `fall_distance`, `enchantment`, `block`, `light_level`, `nbt`, `scoreboard`, `temperature`, `armor_value`, `using_item`, and more
- Added 15 new actions: `damage`, `feed`, `launch`, `spawn_entity`, `give`, `explode`, `extinguish`, `dismount`, `gain_air`, `trigger_cooldown`, `set_fall_distance`, `set_block`, and more
- Added 11 new Route B power types: `fire_projectile`, `target_action_on_hit`, `self_action_on_kill`, `launch`, `entity_glow`, `prevent_death`, `action_on_land`, and hit-reaction variants
- Added event-based powers: `prevent_item_use`, `restrict_armor`, `prevent_sleep`, `prevent_block_use`, `prevent_entity_use`, `modify_food`, `modify_jump`
- Added Route A translations for `fire_immunity` and `toggle_night_vision`
- Added config option `compat_filtering.min_power_ratio` (default 0.5) — hides addon origins with fewer than 50% of their powers loaded
- Pre-compiled all event-power conditions at load time for better performance
- Fixed memory leak: player event-power state now cleaned up on disconnect
- Fixed screen title rendering as raw translation key
- Fixed blurry UI text on MC 1.21.1
- Improved namespace labels for non-mod addon origins (title-cased with spaces)
release
NeoOrigins v1.8.0 (MC 1.21.1)
v1.8.0+1.21.114 апр. 2026 г.134Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.8.0
- **Fix origin selection GUI not opening on dedicated servers** ([#16](https://github.com/CyberDay1/NeoOrigins/issues/16))
- The origin/layer/power registries are server-side only reload listeners. On dedicated servers, clients had empty data, causing the selection screen to immediately close — even via `/origin gui` or Orb of Origin.
- Server now syncs the full registry to clients on login and before any screen open via a new `SyncOriginRegistryPayload` network packet.
- **Configurable power overrides via TOML config**
- Every built-in power's numeric parameters are now directly editable in `config/neoorigins-common.toml` under `[power_overrides.*]` sections.
- Cooldowns, ranges, damage values, scaling, armor, health, knockback resistance, summon counts — all exposed per-power with their current defaults.
- Only values you change from their defaults are applied as overrides, so datapacks still work normally for untouched fields.
- Overrides take effect on `/reload` or server restart.
- Example: to make Abyssal reflect 50% damage instead of 30%, just edit `[power_overrides.abyssal_thorns_aura] return_ratio = 0.5`
release
NeoOrigins v1.8.0 (MC 26.1.x)
v1.8.0+26.114 апр. 2026 г.17Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.8.0
- **Fix origin selection GUI not opening on dedicated servers** ([#16](https://github.com/CyberDay1/NeoOrigins/issues/16))
- The origin/layer/power registries are server-side only reload listeners. On dedicated servers, clients had empty data, causing the selection screen to immediately close — even via `/origin gui` or Orb of Origin.
- Server now syncs the full registry to clients on login and before any screen open via a new `SyncOriginRegistryPayload` network packet.
- **Configurable power overrides via TOML config**
- Every built-in power's numeric parameters are now directly editable in `config/neoorigins-common.toml` under `[power_overrides.*]` sections.
- Cooldowns, ranges, damage values, scaling, armor, health, knockback resistance, summon counts — all exposed per-power with their current defaults.
- Only values you change from their defaults are applied as overrides, so datapacks still work normally for untouched fields.
- Overrides take effect on `/reload` or server restart.
- Example: to make Abyssal reflect 50% damage instead of 30%, just edit `[power_overrides.abyssal_thorns_aura] return_ratio = 0.5`
release
NeoOrigins v1.7.1 (MC 1.21.1)
v1.7.1+1.21.114 апр. 2026 г.52Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.7.1
- **Fix spider/arachnid wall climbing from compat packs** — `origins:climbing` was listed as "handled separately" but was actually silently skipped, causing wall climbing to never work for Origins addon packs. Now properly translates to `neoorigins:wall_climbing`.
release
NeoOrigins v1.7.1 (MC 26.1.x)
v1.7.1+26.114 апр. 2026 г.19Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.7.1
- **Fix spider/arachnid wall climbing from compat packs** — `origins:climbing` was listed as "handled separately" but was actually silently skipped, causing wall climbing to never work for Origins addon packs. Now properly translates to `neoorigins:wall_climbing`.
release
NeoOrigins v1.7.0 (MC 1.21.1)
v1.7.0+1.21.114 апр. 2026 г.16Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.7.0
- **Enderian: Ender Warp** — active teleport to where you're looking, up to 50 blocks (3s cooldown)
- **Enderian: Hydrophobia rework** — now deals direct contact damage from water and rain instead of only amplifying drown damage
- **Fix blurry info screen** — disabled Minecraft's background blur shader on the Origin/Class info screen (O key), text is now crisp
- **Fix powers lost on death** — Route B compat powers now properly re-apply their effects after respawn (onRespawn falls back to onGranted)
- **Fix stale client state after respawn** — added deferred re-sync to prevent the client from showing empty origin data until relog
- New built-in power type: `neoorigins:damage_in_water` — configurable contact damage from water and rain
release
NeoOrigins v1.7.0 (MC 26.1.x)
v1.7.0+26.114 апр. 2026 г.13Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.7.0
- **Enderian: Ender Warp** — active teleport to where you're looking, up to 50 blocks (3s cooldown)
- **Enderian: Hydrophobia rework** — now deals direct contact damage from water and rain instead of only amplifying drown damage
- **Fix blurry info screen** — disabled Minecraft's background blur shader on the Origin/Class info screen (O key), text is now crisp
- **Fix powers lost on death** — Route B compat powers now properly re-apply their effects after respawn (onRespawn falls back to onGranted)
- **Fix stale client state after respawn** — added deferred re-sync to prevent the client from showing empty origin data until relog
- New built-in power type: `neoorigins:damage_in_water` — configurable contact damage from water and rain
release
NeoOrigins v1.6.1 (MC 1.21.1)
v1.6.1+1.21.113 апр. 2026 г.49Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.6.1
- Fix origin selection screen not appearing for players who join immediately after server boot. The data reload listeners hadn't finished loading when early-joining players triggered the login event. The origin check now retries each tick for up to 5 seconds until data is available.
release
NeoOrigins v1.6.1 (MC 26.1.x)
v1.6.1+26.113 апр. 2026 г.16Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.6.1
- Fix origin selection screen not appearing for players who join immediately after server boot. The data reload listeners hadn't finished loading when early-joining players triggered the login event. The origin check now retries each tick for up to 5 seconds until data is available.
release
NeoOrigins v1.6.0 (MC 1.21.1)
v1.6.0+1.21.113 апр. 2026 г.39Minecraft: 1.21.1neoforge
Что нового
NeoOrigins v1.6.0
**Warden** (High Impact)
- Echolocation: nearby living entities glow, visible through walls
- Sonic Boom: devastating ranged sonic blast (20s cooldown)
- Deep Dark Strength: +4 attack damage
- Ancient Hide: +10 natural armor
- Tremor Sense: permanent night vision
- Hulking Frame: 15% larger than normal
- Daylight Agony: takes 1 damage/sec in direct sunlight
- Lumbering: 30% slower movement speed
**Dwarf** (Medium Impact)
- Compact Frame: 80% normal size
- Stout Constitution: +4 natural armor
- Darkvision: permanent night vision
- Stonecunning: breaks blocks 25% faster
- Efficient Metabolism: uses 25% less hunger
- Sturdy Legs: 15% slower movement speed
- Short Arms: slightly reduced block interaction range
**Breeze** (High Impact)
- Wind Charge: wind projectile that knocks enemies back (5s cooldown)
- Wind Dash: horizontal speed burst (4s cooldown)
- Cushion of Air: permanent slow falling
- Updraft: Jump Boost II
- Tailwind: 15% faster movement speed
- Light Frame: 90% normal size
- Hollow Bones: 4 fewer hearts
**Vampire** (High Impact)
- Undead Nature: harmed by Instant Health, healed by Instant Damage, immune to Poison
- Fangs: +2 attack damage
- Supernatural Speed: 15% faster movement speed
- Predator's Eyes: permanent night vision
- Sunburn: catches fire and takes 2 damage/sec in direct sunlight
- Corpse Vitality: natural regeneration reduced to 40%
- Blood Diet: can only eat raw meat, rotten flesh, and spider eyes
- Running Water: takes double damage from drowning and water
New server config in `neoorigins-common.toml` under `[random_assignment]`:
- `mode = "DISABLED"` (default) — normal selection screen
- `mode = "FIRST_JOIN"` — randomly assigned on first join, no selection screen
- `mode = "EVERY_DEATH"` — randomly re-assigned on each respawn
- `rerolls` — number of rerolls allowed (0 = locked in, -1 = unlimited)
- Mob spawn handler skips non-monster entities and exits early on cancellation
- Tree felling BFS deduplicates positions before enqueuing
- CropGrowthAccelerator uses shuffle-and-iterate instead of random-index removal
- Fixed Orb of Origin recipe not loading on MC 26.1 (ingredient format updated)
- Fixed Vampire food restriction power failing to parse
- Updated README with full origin/class tables and config documentation
- 39 origins, 17 classes, 116+ power types
release
NeoOrigins v1.6.0 (MC 26.1.x)
v1.6.0+26.113 апр. 2026 г.21Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
NeoOrigins v1.6.0
**Warden** (High Impact)
- Echolocation: nearby living entities glow, visible through walls
- Sonic Boom: devastating ranged sonic blast (20s cooldown)
- Deep Dark Strength: +4 attack damage
- Ancient Hide: +10 natural armor
- Tremor Sense: permanent night vision
- Hulking Frame: 15% larger than normal
- Daylight Agony: takes 1 damage/sec in direct sunlight
- Lumbering: 30% slower movement speed
**Dwarf** (Medium Impact)
- Compact Frame: 80% normal size
- Stout Constitution: +4 natural armor
- Darkvision: permanent night vision
- Stonecunning: breaks blocks 25% faster
- Efficient Metabolism: uses 25% less hunger
- Sturdy Legs: 15% slower movement speed
- Short Arms: slightly reduced block interaction range
**Breeze** (High Impact)
- Wind Charge: wind projectile that knocks enemies back (5s cooldown)
- Wind Dash: horizontal speed burst (4s cooldown)
- Cushion of Air: permanent slow falling
- Updraft: Jump Boost II
- Tailwind: 15% faster movement speed
- Light Frame: 90% normal size
- Hollow Bones: 4 fewer hearts
**Vampire** (High Impact)
- Undead Nature: harmed by Instant Health, healed by Instant Damage, immune to Poison
- Fangs: +2 attack damage
- Supernatural Speed: 15% faster movement speed
- Predator's Eyes: permanent night vision
- Sunburn: catches fire and takes 2 damage/sec in direct sunlight
- Corpse Vitality: natural regeneration reduced to 40%
- Blood Diet: can only eat raw meat, rotten flesh, and spider eyes
- Running Water: takes double damage from drowning and water
New server config in `neoorigins-common.toml` under `[random_assignment]`:
- `mode = "DISABLED"` (default) — normal selection screen
- `mode = "FIRST_JOIN"` — randomly assigned on first join, no selection screen
- `mode = "EVERY_DEATH"` — randomly re-assigned on each respawn
- `rerolls` — number of rerolls allowed (0 = locked in, -1 = unlimited)
- Mob spawn handler skips non-monster entities and exits early on cancellation
- Tree felling BFS deduplicates positions before enqueuing
- CropGrowthAccelerator uses shuffle-and-iterate instead of random-index removal
- Fixed Orb of Origin recipe not loading on MC 26.1 (ingredient format updated)
- Fixed Vampire food restriction power failing to parse
- Updated README with full origin/class tables and config documentation
- 39 origins, 17 classes, 116+ power types
release
NeoOrigins v1.5.0 (MC 1.21.1)
v1.5.0+1.21.113 апр. 2026 г.39Minecraft: 1.21.1neoforge
Что нового
v1.5.0
## New Features
- Press **O** to open the Origin Info screen — view your current origin and class details, powers, and descriptions at any time
- Cooldown HUD overlay — small progress bars appear above the hotbar when active powers are on cooldown, showing remaining time per skill slot
## Technical
- New SyncCooldownPayload for server-to-client cooldown synchronization
- Client-side cooldown tracking with tick-accurate countdown
- Tabbed OriginInfoScreen with scrollable detail view per layer
release
NeoOrigins v1.5.0 (MC 26.1.x)
v1.5.0+26.113 апр. 2026 г.23Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v1.5.0
## New Features
- Press **O** to open the Origin Info screen — view your current origin and class details, powers, and descriptions at any time
- Cooldown HUD overlay — small progress bars appear above the hotbar when active powers are on cooldown, showing remaining time per skill slot
## Technical
- New SyncCooldownPayload for server-to-client cooldown synchronization
- Client-side cooldown tracking with tick-accurate countdown
- Tabbed OriginInfoScreen with scrollable detail view per layer
release
NeoOrigins v1.4.1 (MC 1.21.1)
v1.4.1+1.21.112 апр. 2026 г.23Minecraft: 1.21.1neoforge
Что нового
v1.4.1
## Bug Fixes
- Fixed all attribute-based powers silently failing on MC 1.21.1 (size scaling, armor, speed, damage, reach, knockback resistance, etc.)
- MC 1.21.1 uses prefixed attribute names (generic.scale, player.block_interaction_range) but the code was using unprefixed MC 26.1 names
- Affected origins: Inchling, Tiny, Hiveling, Caveborn, Golem, Draconic, Gorgon, Kraken, Titan class, and all origins with attribute modifiers
release
NeoOrigins v1.4.0 (MC 1.21.1)
v1.4.0+1.21.112 апр. 2026 г.15Minecraft: 1.21.1neoforge
Что нового
v1.4.0
## Bug Fixes
- Fixed Avian "Athlete's Diet" granting permanent Saturation effect instead of reducing hunger drain (fixes #14)
- Fixed power toggle state (e.g. toggling off Athlete's Diet) not persisting across logout/relog
- Fixed `hunger_drain_modifier` power type being non-functional — Feline (1.3x), Draconic (1.5x), Tiny (1.8x), Hiveling (1.5x), Gorgon (1.5x), and class hunger modifiers now actually work
## Performance
- Eliminated per-tick layer sorting in ActiveOriginService — origins map now uses natural sort order
- Removed redundant double power lookup in mob spawn suppression handler
- Replaced full player list scan with spatial AABB query for enchantment table bonus
- Fixed memory leak: CompatTickScheduler queue now partitioned by player and cleaned on logout
- Fixed memory leak: network activation debounce map now cleaned on logout
- Fixed memory leak: minion tracker now cleaned on logout
- Replaced Map.copyOf() with unmodifiable view in PlayerOriginData.getOrigins()
## UI
- Origin selection screen now scales proportionally with window size (removed 660px width cap)
- Left panel width adapts to screen size (30% of total, clamped 130-200px)
- Power descriptions in the detail panel now word-wrap instead of clipping
## Balance
- Avian "Athlete's Diet" now reduces all exhaustion by 75% (was: permanent Saturation effect)
release
NeoOrigins v1.4.0 (MC 26.1.x)
v1.4.0+26.112 апр. 2026 г.20Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v1.4.0
## Bug Fixes
- Fixed Avian "Athlete's Diet" granting permanent Saturation effect instead of reducing hunger drain (fixes #14)
- Fixed power toggle state (e.g. toggling off Athlete's Diet) not persisting across logout/relog
- Fixed `hunger_drain_modifier` power type being non-functional — Feline (1.3x), Draconic (1.5x), Tiny (1.8x), Hiveling (1.5x), Gorgon (1.5x), and class hunger modifiers now actually work
## Performance
- Eliminated per-tick layer sorting in ActiveOriginService — origins map now uses natural sort order
- Removed redundant double power lookup in mob spawn suppression handler
- Replaced full player list scan with spatial AABB query for enchantment table bonus
- Fixed memory leak: CompatTickScheduler queue now partitioned by player and cleaned on logout
- Fixed memory leak: network activation debounce map now cleaned on logout
- Fixed memory leak: minion tracker now cleaned on logout
- Replaced Map.copyOf() with unmodifiable view in PlayerOriginData.getOrigins()
## UI
- Origin selection screen now scales proportionally with window size (removed 660px width cap)
- Left panel width adapts to screen size (30% of total, clamped 130-200px)
- Power descriptions in the detail panel now word-wrap instead of clipping
## Balance
- Avian "Athlete's Diet" now reduces all exhaustion by 75% (was: permanent Saturation effect)
release
NeoOrigins v1.3.3 (MC 1.21.1)
v1.3.3+1.21.112 апр. 2026 г.28Minecraft: 1.21.1neoforge
Что нового
v1.3.3
## Bug Fixes
- Fixed dedicated server crash on startup (`BootstrapMethodError: Attempted to load class Screen for invalid dist DEDICATED_SERVER`)
## Additions
- Orb of Origin now appears in JEI (Just Enough Items) with an info panel describing its usage
- Added REI (Roughly Enough Items) integration (1.21.1 only — REI does not yet have an MC 26.1 build)
release
NeoOrigins v1.3.3 (MC 26.1.x)
v1.3.3+26.112 апр. 2026 г.16Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
v1.3.3
## Bug Fixes
- Fixed dedicated server crash on startup (`BootstrapMethodError: Attempted to load class Screen for invalid dist DEDICATED_SERVER`)
## Additions
- Orb of Origin now appears in JEI (Just Enough Items) with an info panel describing its usage
- Added REI (Roughly Enough Items) integration (1.21.1 only — REI does not yet have an MC 26.1 build)
release
NeoOrigins v1.3.2 (MC 1.21.1)
v1.3.2+1.21.111 апр. 2026 г.74Minecraft: 1.21.1neoforge
Что нового
- Save-bricker fix — /kill on Feline no longer permanently corrupts player NBT
- Float-overflow audit — clamps across every damage / heal / knockback / mining-speed multiply, plus VitalsGuards at LOWEST priority as a universal last line of defense
- Save recovery — existing bricked saves auto-repair on reconnect
- Herbalist growth power — no longer spawns grass / seagrass / trees / kelp; limited to BlockTags.CROPS
- Six power JSON fixes — feline/draconic/voidwalker/golem/enderite/frostborn weakness powers now correctly target drowning/fire damage
release
NeoOrigins v1.3.2 (MC 26.1.x)
v1.3.2+26.111 апр. 2026 г.24Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
- Save-bricker fix — /kill on Feline no longer permanently corrupts player NBT
- Float-overflow audit — clamps across every damage / heal / knockback / mining-speed multiply, plus VitalsGuards at LOWEST priority as a universal last line of defense
- Save recovery — existing bricked saves auto-repair on reconnect
- Herbalist growth power — no longer spawns grass / seagrass / trees / kelp; limited to BlockTags.CROPS
- Six power JSON fixes — feline/draconic/voidwalker/golem/enderite/frostborn weakness powers now correctly target drowning/fire damage
release
NeoOrigins v1.3.0 (MC 1.21.1)
v1.3.0+1.21.110 апр. 2026 г.96Minecraft: 1.21.1neoforge
Что нового
## v1.3.0 — Flight Rework, Class Skill Key & Ability Updates
### New Features
- **Elytra-style flight** — Flight power now uses proper elytra glide physics activated by double-jump (press jump while airborne to start gliding)
- **Class Skill keybind** — Dedicated key (H) for class active powers, keeping Skill 1-4 exclusively for origin powers
- **Elytra Boost rework** — Now an active ability that launches you forward while gliding, like a firework rocket (2s cooldown)
### Changes
- **Fireball buff** — Flame Breath now launches 3-4 fireballs with slight random spread
- **Persistent effects** (Night Vision, Glow) are now always-on instead of taking a skill slot
### Fixes
- Flight no longer activates on every normal jump
- Flight properly stops when landing, entering water, or mounting
- Toggling flight off now immediately stops gliding
- Class and origin active powers no longer share the same skill slots
release
NeoOrigins v1.3.0 (MC 26.1+)
v1.3.0+26.110 апр. 2026 г.20Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
## v1.3.0 — Flight Rework, Class Skill Key & Ability Updates
### New Features
- **Elytra-style flight** — Flight power now uses proper elytra glide physics activated by double-jump (press jump while airborne to start gliding)
- **Class Skill keybind** — Dedicated key (H) for class active powers, keeping Skill 1-4 exclusively for origin powers
- **Elytra Boost rework** — Now an active ability that launches you forward while gliding, like a firework rocket (2s cooldown)
### Changes
- **Fireball buff** — Flame Breath now launches 3-4 fireballs with slight random spread
- **Persistent effects** (Night Vision, Glow) are now always-on instead of taking a skill slot
### Fixes
- Flight no longer activates on every normal jump
- Flight properly stops when landing, entering water, or mounting
- Toggling flight off now immediately stops gliding
- Class and origin active powers no longer share the same skill slots
release
Neo Origins 1.2.3
1.2.3+26.1.X9 апр. 2026 г.20Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
Toggle System for Continuous Powers
Powers with continuous effects can now be toggled on/off using Skill keybinds. Affected powers: Phantom Form, Flight, Night Vision, Status Effects, Stealth, Wall Climbing, Item Magnetism, and Glow.
Skill Labels on Info Screen
Active and toggle powers now show their assigned Skill key number on the origin info screen (e.g. [Skill 1 - Toggle], [Skill 2]).
Bug Fixes
Fixed Orb of Origin recipe not loading on MC 1.21.1
Fixed Explorer class starting equipment not loading
Fixed JAR version metadata for 1.21.1
release
NeoOrigins v1.2.3 (MC 1.21.1)
v1.2.3+1.21.19 апр. 2026 г.27Minecraft: 1.21.1neoforge
Что нового
### Toggle System for Continuous Powers
Powers with continuous effects can now be toggled on/off using Skill keybinds. Affected powers: Phantom Form, Flight, Night Vision, Status Effects, Stealth, Wall Climbing, Item Magnetism, and Glow.
### Skill Labels on Info Screen
Active and toggle powers now show their assigned Skill key number on the origin info screen (e.g. [Skill 1 - Toggle], [Skill 2]).
### Bug Fixes
- Fixed Orb of Origin recipe not loading on MC 1.21.1
- Fixed Explorer class starting equipment not loading
- Fixed JAR version metadata for 1.21.1
---
Found a bug? Please report it using the Issues tab on GitHub (https://github.com/CyberDay1/NeoOrigins/issues), or use the Report Issue button on CurseForge or Modrinth.
release
NeoOrigins v1.2.2 (MC 1.21.1)
v1.2.2+1.21.19 апр. 2026 г.19Minecraft: 1.21.1neoforge
Что нового
### Unified MC 26.1+ JAR
The 26.1, 26.1.1, and 26.1.2 builds have been merged into a single JAR. One download now covers all MC 26.1.x versions.
### Bug Reporting
Found a bug? Please report it using the Issues tab on GitHub (https://github.com/CyberDay1/NeoOrigins/issues), or use the Report Issue button on CurseForge or Modrinth.
release
NeoOrigins v1.2.1 (MC 1.21.1)
v1.2.1+1.21.19 апр. 2026 г.108Minecraft: 1.21.1neoforge
Что нового
### Orb of Origin Crafting Recipe
The Orb of Origin is now craftable! Surround a Netherite Ingot with Diamond Blocks (cross) and Gold Blocks (corners) to craft one.
### Escalating XP Cost
Each time you use the Orb of Origin, the XP cost increases by 5 levels. Your first use is free, the second costs 5 levels, the third costs 10, and so on. Creative mode bypasses the cost.
### MC 1.21.1 Backport
NeoOrigins v1.2.0 content is now available for Minecraft 1.21.1 (NeoForge 21.1.224). All 35 origins, 17 classes, config system, and minion summoning are included.
---
Found a bug? Please report it using the Issues tab on GitHub (https://github.com/CyberDay1/NeoOrigins/issues), or use the Report Issue button on CurseForge or Modrinth.
release
NeoOrigins v1.2.1 (MC 26.1.1)
v1.2.1+26.1.19 апр. 2026 г.23Minecraft: 26.1.1neoforge
Что нового
### Orb of Origin Crafting Recipe
The Orb of Origin is now craftable! Surround a Netherite Ingot with Diamond Blocks (cross) and Gold Blocks (corners) to craft one.
### Escalating XP Cost
Each time you use the Orb of Origin, the XP cost increases by 5 levels. Your first use is free, the second costs 5 levels, the third costs 10, and so on. Creative mode bypasses the cost.
### MC 1.21.1 Backport
NeoOrigins v1.2.0 content is now available for Minecraft 1.21.1 (NeoForge 21.1.224). All 35 origins, 17 classes, config system, and minion summoning are included.
---
Found a bug? Please report it using the Issues tab on GitHub (https://github.com/CyberDay1/NeoOrigins/issues), or use the Report Issue button on CurseForge or Modrinth.
release
NeoOrigins v1.2.1 (MC 26.1)
v1.2.1+26.19 апр. 2026 г.19Minecraft: 26.1neoforge
Что нового
### Orb of Origin Crafting Recipe
The Orb of Origin is now craftable! Surround a Netherite Ingot with Diamond Blocks (cross) and Gold Blocks (corners) to craft one.
### Escalating XP Cost
Each time you use the Orb of Origin, the XP cost increases by 5 levels. Your first use is free, the second costs 5 levels, the third costs 10, and so on. Creative mode bypasses the cost.
### MC 1.21.1 Backport
NeoOrigins v1.2.0 content is now available for Minecraft 1.21.1 (NeoForge 21.1.224). All 35 origins, 17 classes, config system, and minion summoning are included.
---
Found a bug? Please report it using the Issues tab on GitHub (https://github.com/CyberDay1/NeoOrigins/issues), or use the Report Issue button on CurseForge or Modrinth.
release
NeoOrigins v1.2.0 (MC 26.1.1)
v1.2.0+26.1.18 апр. 2026 г.26Minecraft: 26.1.1neoforge
Что нового
### NeoOrigins v1.2.0 — The Big Content Update
**14 New Origins** (35 total)
- Inchling, Sporeling, Frostborn, Strider, Siren, Piglin, Hiveling, Cinderborn, Sculkborn, Enderite
- Necromancer — Summon wither skeletons and skeleton archers with life-force link
- Gorgon — Stone-skinned petrifier with devastating melee
- Automaton — Mechanical construct immune to drowning and hunger
- Kraken — Deep-sea predator with tentacle attacks and guardian summons
**17 Built-in Classes** (new system!)
Players choose a class after selecting their origin. Classes are pure bonuses.
- Combat: Warrior, Archer, Berserker, Sentinel, Rogue (stealth + backstab)
- Crafting: Miner, Lumberjack (tree felling), Blacksmith (quality gear), Cook
- Utility: Explorer, Beastmaster, Herbalist, Scout, Merchant (unlimited trades), Cleric (2x potions), Titan
- Opt-out: Nitwit
**Minion Summoning System**
- New summon_minion power type with configurable mob type, caps, cooldowns, hunger cost, despawn timer, equipment loadout, and death-damage feedback
- Evoker cast spell sound + soul/smoke particle effects on summon
- Summoned mobs get configurable equipment and never drop loot
**Config System for Modpack Devs**
- Enable/disable any built-in origin or class via config
- Per-power dimension restrictions
- Disabling all classes auto-skips the class selection screen
**Multi-Version Support**
- Now ships JARs for both Minecraft 26.1 and 26.1.1
**Other**
- Dynamic screen titles per layer
- Full translations for all origins, classes, and powers
- POWER_REFERENCE.txt for modpack creators
release
NeoOrigins v1.2.0 (MC 26.1)
v1.2.0+26.18 апр. 2026 г.14Minecraft: 26.1neoforge
Что нового
### NeoOrigins v1.2.0 — The Big Content Update
**14 New Origins** (35 total)
- Inchling, Sporeling, Frostborn, Strider, Siren, Piglin, Hiveling, Cinderborn, Sculkborn, Enderite
- Necromancer — Summon wither skeletons and skeleton archers with life-force link
- Gorgon — Stone-skinned petrifier with devastating melee
- Automaton — Mechanical construct immune to drowning and hunger
- Kraken — Deep-sea predator with tentacle attacks and guardian summons
**17 Built-in Classes** (new system!)
Players choose a class after selecting their origin. Classes are pure bonuses.
- Combat: Warrior, Archer, Berserker, Sentinel, Rogue (stealth + backstab)
- Crafting: Miner, Lumberjack (tree felling), Blacksmith (quality gear), Cook
- Utility: Explorer, Beastmaster, Herbalist, Scout, Merchant (unlimited trades), Cleric (2x potions), Titan
- Opt-out: Nitwit
**Minion Summoning System**
- New summon_minion power type with configurable mob type, caps, cooldowns, hunger cost, despawn timer, equipment loadout, and death-damage feedback
- Evoker cast spell sound + soul/smoke particle effects on summon
- Summoned mobs get configurable equipment and never drop loot
**Config System for Modpack Devs**
- Enable/disable any built-in origin or class via config
- Per-power dimension restrictions
- Disabling all classes auto-skips the class selection screen
**Multi-Version Support**
- Now ships JARs for both Minecraft 26.1 and 26.1.1
**Other**
- Dynamic screen titles per layer
- Full translations for all origins, classes, and powers
- POWER_REFERENCE.txt for modpack creators
release
NeoOrigins v1.1.0
v1.1.07 апр. 2026 г.23Minecraft: 26.1neoforge
Что нового
Built for Minecraft 26.1 with NeoForge 26.1.0.1-beta.## What's New
- Orb of Origin — new item that lets players reselect their origin at any time (creative only currently)
## Fixes
- Fixed attribute-based powers (speed boosts, armor, knockback resistance, attack modifiers, slow fall, etc.) broken
by Minecraft 26.1's removal of the `generic.` prefix
- Fixed Origins Classes compatibility power translation for the updated attribute format
## Changes
- Updated to Minecraft 26.1.1
- Added Stonecutter multi-version support (MC 26.1 and 26.1.1)
release
Neo Origins 1.0.0
1.0.025 мар. 2026 г.74Minecraft: 26.1neoforge
Что нового
Inital Release