A modern, ground-up reimplementation of the Origins experience for NeoForge (MC 26.1).
Much of what it ships beyond the vanilla Origins set arrived as
community suggestions, and some of those suggestions may have been shaped by
addons that covered the same ground first. Where an origin here lines up with
one of theirs, the idea is theirs:
51 built-in power types — attribute modifiers, status effects, flight, wall climbing, damage modification, active abilities, biome effects, starting equipment, and more.
Hot-reload — /reload rebuilds all origins and powers without restarting the server.
Origins pack compatibility — drop existing Origins mod content packs into /config/originpacks/ and they load automatically.
Data-driven — all origins and powers defined in JSON; fully overridable via datapacks.
> 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.
> 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.
> 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.
> 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.
> 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).
> 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).
> 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).
> 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.
---
> 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.
---
> 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.
---