
Neo Origins
A modern port of the classic fabric Origins mod. Backwards compatible with most of your favorite origins expansions.
- Загрузки
- 74K
- Подписчики
- 49
- Обновлён
- 13 августа 2026 г.
- Лицензия
- MIT
Опубликован 25 марта 2026 г.
A modern, ground-up reimplementation of the Origins experience for NeoForge (MC 26.1).
Features 21 built-in origins — Human, Merling, Avian, Blazeling, Elytrian, Enderian, Arachnid, Shulk, Phantom, Feline, Golem, Caveborn, Draconic, Sylvan, Tiny, Revenant, Abyssal, Voidwalker, Stoneguard, Verdant, Umbral.
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 original mod by Apace: https://modrinth.com/mod/origins
Ченджлог
v2.2.24+1.21.1Релиз1.21.1 · 13 августа 2026 г.
A corrective release. The ocean origins hold their depth instead of sinking the moment they stop swimming, four flying origins that glided bare-backed get wings, Sword Immortal can no longer fly empty-handed, and night-vision powers finally say which key toggles them. Most of the rest were failing quietly rather than visibly, which is why none had been reported: the Herbalist's bone meal growth never reached the client and never spent the bone meal, AppleSkin previewed vanilla's food values on every diet origin, two powers of one type shared a single toggle, ten tier night-vision powers each held an ability slot they had no business holding, and
origins:remove_enchantmenthad never been implemented at all. On the compatibility side, two opposite failure shapes are closed: biome conditions that failed closed and could never fire anywhere, and item and block conditions that failed open and matched everything handed to them. Legacy packs load with their origins unchanged. KubeJS scripting also reaches the Minecraft 26.1 build, with scripts moving across unchanged.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
Ocean origins hold their depth instead of sinking when they stop swimming. Holding station used to mean swimming to hold it. A new shared power, Neutral Buoyancy, goes to Merling, Siren, Kraken and Abyssal:
-0.08onminecraft:gravityas anadd_value, conditioned on being fully submerged. That lands the attribute on exactly0.0, and vanilla skips its in-water descent entirely at zero base gravity, so depth holds cleanly rather than trading a sink for a slow float up. Swimming down is unaffected, and puddles and shallows do not trigger it. Conditioned modifiers re-evaluate every five ticks, so expect up to a quarter-second lag at the surface. See COOKBOOK.md.Night-vision powers say how to switch them off. Night vision deliberately has no entry in the HUD ability cluster, because it is not one of the six numbered skills, so nothing in game ever pointed at the key that toggles it and players reasonably concluded there was no toggle at all. Twenty-two power descriptions now end with "Toggle with the Night Vision key (default K)." — worded for the binding rather than the letter, since it is rebindable. Worth knowing alongside it: the setting is remembered per player rather than per origin, so switching it off on one origin and later picking another that has night vision starts you with it already off.
Ten tier night-vision powers stop taking up a numbered ability slot.
persistent_effectdefaultstoggleableto true, and these ten never declared it, so each claimed one of the six skill slots and answered to a stray skill-key press — the exact failure the base night-vision powers forcetoggleable: falseto avoid, and one that reads to a player as night vision switching itself off for no reason. One tier power each on Wraith, Arachnid, Caveborn, Darkness Mage, Feline, Necromancer, Sculkborn, Sporeling, Sylvan and Umbral now sets it explicitly, matching the four conduit powers that always had. They are passive tier buffs, and the Night Vision key remains their off-switch.Elytrian, Phantom, Hiveling and Draconic fly with visible wings. True of every built-in origin that flies without an elytra in its chest slot. The renderer was never at fault:
neoorigins:natural_glideandneoorigins:flightsimply had no way to ask for wings. Both now take the samerender_elytraandtexture_locationpairelytra_flightalready carried, so a pack can put wings on either and point them at its own texture. They default tofalserather thanelytra_flight'strue, deliberately — these types have shipped wingless their whole life, and defaulting them on would put an elytra on the back of every existing pack that uses them. Windwalker's Sky Dancer stays bare on purpose. POWER_TYPES.md documents both.The Herbalist's extra bone meal growth shows up straight away instead of after a rejoin. Bone mealing grass placed one plant and the rest appeared only after a relog. The handler grew the blocks and let vanilla carry on, but vanilla re-checked the target against the live world, found the space filled and returned PASS — and NeoForge replays an item's block changes only on success, so the blocks were there the whole time with no client told. That same PASS also skipped the bone meal being spent, giving a Herbalist unlimited bone meal on grass. The handler now cancels the event, does the work and claims success, keeping vanilla's success roll so the power is exactly as strong as before.
Two powers of the same type on one origin stop sharing a single toggle. Pressing either keybind switched both on. Toggle state was keyed off the power's config rather than the power itself, so two powers that happened to agree collapsed into one flag. The reach was wider than the report:
condition_passivekeyed the same way,persistent_effectkeyed off its effect ids so two tiers of one buff collided, and seven more types includingstealth,flightandphantom_formkeyed off the class name alone and so collided unconditionally. Keys are now the power's own resource id. Flags already saved in a world are still read, so a power you had switched off stays off.A
gameplay.tomlwritten before 2.2.22 has its air drain rate corrected on the next start.[ocean_origins] drain_rate_ticksshipped as10up to 2.2.21 and became1in 2.2.22, but the config system only rewrites a key that is missing or out of range, and10sits well inside the declared 1 to 1200 — so every install that had ever run 2.2.21 kept it. The correction reasons from the file rather than the value, since10is a legitimate setting.gameplay.tomlnow carries aconfig_version, and an unstamped file holding exactly10is moved to1, stamped and logged. Any other value survives, and once stamped the setting is yours again: put it back to10and it stays.AppleSkin previews a diet origin's real food values rather than vanilla's. True of every origin that changes what food is worth.
modify_food_nutritionnever rewrites the item's food data — it corrects hunger and saturation server-side at the moment of eating — so there was nothing on the stack for AppleSkin to read, and an aquatic origin holding a cod was shown vanilla's 2 and 0.4. A new bridge answers AppleSkin's event with the origin-adjusted values, leaving the vanilla figure in place for its usual struck-through comparison. The nutrition-to-saturation scaling now lives in one place called by both the real eat and the preview, so the number shown and the number received cannot drift apart. AppleSkin remains optional.Sword Immortal's flight and Flickering Slash need the sword in hand. A Sword Immortal could fly empty-handed, which the origin's own description rules out. Seven of its ten powers already carried the requirement, and Immortal Body carries none precisely because it is the fall-immune mortal left when you are disarmed; the other two could not, because
neoorigins:creative_flightandneoorigins:active_dashhad noconditionfield for one to go in. Both take one now. On the flight it is re-checked every tick rather than at takeoff, so sheathing mid-air strips the ability there and then and the drop is real — pair a conditional flight with fall-damage immunity if it should be survivable. A blocked dash spends no cooldown. Defaults to absent, so existing powers of both types are unchanged. POWER_TYPES.md documents the field on both.The in-game editor gives list fields a row of real entry boxes instead of a single raw JSON box. Adding one entity type meant typing the brackets and quotes yourself. Thirty-four fields were affected across the schema-driven forms: a power's
items,tags,entity_types,damage_types,slotsandhands, plus the id lists on actions, conditions and item actions. The add-and-remove widget was already in the mod but unreachable, because the layer that reads schemas into the editor's field model never carried across the element pattern the check looks for. The model now carries it, reaching all thirty-four at once. The origin creator is hand-built and the web editor reads the schema directly, so neither was ever affected.The schemas stop advertising fewer verbs than the parsers accept. Working verbs looked unsupported unless you already knew they existed. Block conditions accept ten where the list named four, gaining
adjacent,block_state,heightandoffset; item conditions accept thirteen where the list named seven, gainingall_of,amount,any_of,custom_data,foodandname. All of them already worked if you wrote them, so nothing you have written changes behaviour. Both the list and its validating pattern now come from the editors' own catalogue rather than being maintained by hand beside it. One gap stays open, better said here than found in an editor: the block condition catalogue does not carryall_ofandany_of, so a block condition written that way works in game while the editors mark the file invalid — writeandandorthere instead.origins:remove_enchantmentworks, so a legacy Remove Curse power removes curses. The verb had never been implemented, so the item action parser fell through to its no-op default and the power loaded, gated and ticked while doing nothing, with no error to say so. Both field shapes are accepted, since the docs describe a singularenchantmentstring while real packs commonly write a pluralenchantmentsarray and both are valid upstream.reset_repair_costis read either on the action or on the enclosingequipped_item_action, true in either position winning. An unregistered id matches nothing, and a malformed one warns and is skipped rather than taking the power down. Enchanted books go through vanilla's own dispatch.levelsweakens an enchantment instead of stripping it outright. The first implementation covered three of upstream's four fields and dropped the fourth silently, which is worse than not supporting the verb at all: a pack asking to knock one level off Sharpness V got the whole enchantment torn off while everything looked correct from the pack side.levelsnow reduces each named enchantment by that many and deletes it only at zero or below, matching upstream. Omitting the field still removes outright, since that is what older packs rely on. Nothing is clamped —0subtracts nothing and a negative raises the level, both of which are what upstream's plain subtraction does.A biome-gated power fires in the biome it names.
origins:biomeaccepts a nestedconditionwith its own small grammar, wherein_tagmeans the biome is in a biome tag rather than anything about entity types. Onlytemperaturehad ever been implemented, so every other verb failed closed and a power written that way never activated in any biome at all,in_tagbeing much the most common of them. Now parsed:in_tag,precipitation,high_humidity,constant,not, a nestedbiomeform for or-lists of exact ids, andall_of/any_ofas the Apoli 2.9 spellings ofand/or, each honouringinverted. Two details if you write them:precipitationanswers for your block rather than the biome as a whole, andhigh_humiditykeeps Apoli's0.85verbatim. An unknown sub-type still fails closed, which stays right here.Five item conditions that were passing every stack instead of checking it. An unimplemented item condition returned true — it accepted every stack rather than refusing it — so a herbivore restriction written against a verb we lack permitted meat while the power loaded, gated and ticked in apparent good order. That is the quieter failure of the two, and why these went unreported for so long.
armor_value,meat,constant,harvest_levelanddurabilityare all implemented now. Two are worth knowing precisely:armor_valueis what one stack confers rather than the wearer's total, andmeatresolves through the NeoForge common food tags, so modded meats count. The honest limit: a verb still outside the list goes on passing, since flipping that default would make every unimplemented condition block everything across packs that work today.Four block conditions that were matching every block, and the fallback that hid them. An unimplemented verb compiled to nothing, which
in_block,in_block_anywhereand the narrowneoorigins:blockcheck all read as "match anything", whileon_blockdiscarded the filter outright and turned "standing on X" into "standing on anything".invertedwas no protection, since inversion applies only to a condition that compiled, and it logged at debug with no warning — so a pack reload came back clean whilelight_level,exposed_to_sky,movement_blockingandfluidsat silently always-true: a sun-sensitive origin's slowness and blindness fired in the dark exactly as in the sun. All four verbs are implemented, since closing the fail-open alone would have swung those powers from always on to never on, and an unknown verb now matches nothing. The docs also stop callingin_block_anywherean alias ofin_block: the first samples one block, the second counts every position the hitbox overlaps. See CONDITIONS.md.KubeJS scripting reaches the Minecraft 26.1 build. It was 1.21.1 only because KubeJS had published nothing for 26.1, not because anything was tied to that version. The whole surface is on both builds now: the
NeoOriginsandNeoOriginsEventsglobals, all fifteen events,registerCallbackwith theneoorigins:kubejs_callbackaction behind it, and the two JavaScript-backed power typesneoorigins:js_customandneoorigins:js_active. Scripts move across without porting. Two install notes that are KubeJS's requirements rather than ours: the 26.1 build wants NeoForge 26.1.2.84 or newer before KubeJS will load at all, and on 1.21.1registerPowerneeds Rhino2101.2.8-build.91or newer. The 26.2 build does not get this and cannot yet, since KubeJS has published nothing past Minecraft 26.1.2 to build against — and an unrecognised powertypeis dropped whole, so ajs_custompower copied into a 26.2 pack never appears on the origin and nothing in game says why. KUBEJS.md documents the whole surface.Air drain is counted per air point, not per bubble.
drain_rate_ticksis ticks per single air point, and the HUD draws 300 air as 10 bubbles, so one bubble is 30 points: at1a bubble lasts 1.5 seconds and the full bar 15; at10, 15 seconds and 150. Reading it as ticks per bubble puts you out by a factor of thirty, which is where both reports came from. If your bar genuinely empties slower than the table says, an install predating 2.2.22 still holds the old default of10, which this release moves for you on the next start. POWER_TYPES.md carries the arithmetic beside the table.
v2.2.24+26.2Релиз26.2 · 13 августа 2026 г.
A corrective release. The ocean origins hold their depth instead of sinking the moment they stop swimming, four flying origins that glided bare-backed get wings, Sword Immortal can no longer fly empty-handed, and night-vision powers finally say which key toggles them. Most of the rest were failing quietly rather than visibly, which is why none had been reported: the Herbalist's bone meal growth never reached the client and never spent the bone meal, AppleSkin previewed vanilla's food values on every diet origin, two powers of one type shared a single toggle, ten tier night-vision powers each held an ability slot they had no business holding, and
origins:remove_enchantmenthad never been implemented at all. On the compatibility side, two opposite failure shapes are closed: biome conditions that failed closed and could never fire anywhere, and item and block conditions that failed open and matched everything handed to them. Legacy packs load with their origins unchanged. KubeJS scripting also reaches the Minecraft 26.1 build, with scripts moving across unchanged.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
Ocean origins hold their depth instead of sinking when they stop swimming. Holding station used to mean swimming to hold it. A new shared power, Neutral Buoyancy, goes to Merling, Siren, Kraken and Abyssal:
-0.08onminecraft:gravityas anadd_value, conditioned on being fully submerged. That lands the attribute on exactly0.0, and vanilla skips its in-water descent entirely at zero base gravity, so depth holds cleanly rather than trading a sink for a slow float up. Swimming down is unaffected, and puddles and shallows do not trigger it. Conditioned modifiers re-evaluate every five ticks, so expect up to a quarter-second lag at the surface. See COOKBOOK.md.Night-vision powers say how to switch them off. Night vision deliberately has no entry in the HUD ability cluster, because it is not one of the six numbered skills, so nothing in game ever pointed at the key that toggles it and players reasonably concluded there was no toggle at all. Twenty-two power descriptions now end with "Toggle with the Night Vision key (default K)." — worded for the binding rather than the letter, since it is rebindable. Worth knowing alongside it: the setting is remembered per player rather than per origin, so switching it off on one origin and later picking another that has night vision starts you with it already off.
Ten tier night-vision powers stop taking up a numbered ability slot.
persistent_effectdefaultstoggleableto true, and these ten never declared it, so each claimed one of the six skill slots and answered to a stray skill-key press — the exact failure the base night-vision powers forcetoggleable: falseto avoid, and one that reads to a player as night vision switching itself off for no reason. One tier power each on Wraith, Arachnid, Caveborn, Darkness Mage, Feline, Necromancer, Sculkborn, Sporeling, Sylvan and Umbral now sets it explicitly, matching the four conduit powers that always had. They are passive tier buffs, and the Night Vision key remains their off-switch.Elytrian, Phantom, Hiveling and Draconic fly with visible wings. True of every built-in origin that flies without an elytra in its chest slot. The renderer was never at fault:
neoorigins:natural_glideandneoorigins:flightsimply had no way to ask for wings. Both now take the samerender_elytraandtexture_locationpairelytra_flightalready carried, so a pack can put wings on either and point them at its own texture. They default tofalserather thanelytra_flight'strue, deliberately — these types have shipped wingless their whole life, and defaulting them on would put an elytra on the back of every existing pack that uses them. Windwalker's Sky Dancer stays bare on purpose. POWER_TYPES.md documents both.The Herbalist's extra bone meal growth shows up straight away instead of after a rejoin. Bone mealing grass placed one plant and the rest appeared only after a relog. The handler grew the blocks and let vanilla carry on, but vanilla re-checked the target against the live world, found the space filled and returned PASS — and NeoForge replays an item's block changes only on success, so the blocks were there the whole time with no client told. That same PASS also skipped the bone meal being spent, giving a Herbalist unlimited bone meal on grass. The handler now cancels the event, does the work and claims success, keeping vanilla's success roll so the power is exactly as strong as before.
Two powers of the same type on one origin stop sharing a single toggle. Pressing either keybind switched both on. Toggle state was keyed off the power's config rather than the power itself, so two powers that happened to agree collapsed into one flag. The reach was wider than the report:
condition_passivekeyed the same way,persistent_effectkeyed off its effect ids so two tiers of one buff collided, and seven more types includingstealth,flightandphantom_formkeyed off the class name alone and so collided unconditionally. Keys are now the power's own resource id. Flags already saved in a world are still read, so a power you had switched off stays off.A
gameplay.tomlwritten before 2.2.22 has its air drain rate corrected on the next start.[ocean_origins] drain_rate_ticksshipped as10up to 2.2.21 and became1in 2.2.22, but the config system only rewrites a key that is missing or out of range, and10sits well inside the declared 1 to 1200 — so every install that had ever run 2.2.21 kept it. The correction reasons from the file rather than the value, since10is a legitimate setting.gameplay.tomlnow carries aconfig_version, and an unstamped file holding exactly10is moved to1, stamped and logged. Any other value survives, and once stamped the setting is yours again: put it back to10and it stays.AppleSkin previews a diet origin's real food values rather than vanilla's. True of every origin that changes what food is worth.
modify_food_nutritionnever rewrites the item's food data — it corrects hunger and saturation server-side at the moment of eating — so there was nothing on the stack for AppleSkin to read, and an aquatic origin holding a cod was shown vanilla's 2 and 0.4. A new bridge answers AppleSkin's event with the origin-adjusted values, leaving the vanilla figure in place for its usual struck-through comparison. The nutrition-to-saturation scaling now lives in one place called by both the real eat and the preview, so the number shown and the number received cannot drift apart. AppleSkin remains optional.Sword Immortal's flight and Flickering Slash need the sword in hand. A Sword Immortal could fly empty-handed, which the origin's own description rules out. Seven of its ten powers already carried the requirement, and Immortal Body carries none precisely because it is the fall-immune mortal left when you are disarmed; the other two could not, because
neoorigins:creative_flightandneoorigins:active_dashhad noconditionfield for one to go in. Both take one now. On the flight it is re-checked every tick rather than at takeoff, so sheathing mid-air strips the ability there and then and the drop is real — pair a conditional flight with fall-damage immunity if it should be survivable. A blocked dash spends no cooldown. Defaults to absent, so existing powers of both types are unchanged. POWER_TYPES.md documents the field on both.The in-game editor gives list fields a row of real entry boxes instead of a single raw JSON box. Adding one entity type meant typing the brackets and quotes yourself. Thirty-four fields were affected across the schema-driven forms: a power's
items,tags,entity_types,damage_types,slotsandhands, plus the id lists on actions, conditions and item actions. The add-and-remove widget was already in the mod but unreachable, because the layer that reads schemas into the editor's field model never carried across the element pattern the check looks for. The model now carries it, reaching all thirty-four at once. The origin creator is hand-built and the web editor reads the schema directly, so neither was ever affected.The schemas stop advertising fewer verbs than the parsers accept. Working verbs looked unsupported unless you already knew they existed. Block conditions accept ten where the list named four, gaining
adjacent,block_state,heightandoffset; item conditions accept thirteen where the list named seven, gainingall_of,amount,any_of,custom_data,foodandname. All of them already worked if you wrote them, so nothing you have written changes behaviour. Both the list and its validating pattern now come from the editors' own catalogue rather than being maintained by hand beside it. One gap stays open, better said here than found in an editor: the block condition catalogue does not carryall_ofandany_of, so a block condition written that way works in game while the editors mark the file invalid — writeandandorthere instead.origins:remove_enchantmentworks, so a legacy Remove Curse power removes curses. The verb had never been implemented, so the item action parser fell through to its no-op default and the power loaded, gated and ticked while doing nothing, with no error to say so. Both field shapes are accepted, since the docs describe a singularenchantmentstring while real packs commonly write a pluralenchantmentsarray and both are valid upstream.reset_repair_costis read either on the action or on the enclosingequipped_item_action, true in either position winning. An unregistered id matches nothing, and a malformed one warns and is skipped rather than taking the power down. Enchanted books go through vanilla's own dispatch.levelsweakens an enchantment instead of stripping it outright. The first implementation covered three of upstream's four fields and dropped the fourth silently, which is worse than not supporting the verb at all: a pack asking to knock one level off Sharpness V got the whole enchantment torn off while everything looked correct from the pack side.levelsnow reduces each named enchantment by that many and deletes it only at zero or below, matching upstream. Omitting the field still removes outright, since that is what older packs rely on. Nothing is clamped —0subtracts nothing and a negative raises the level, both of which are what upstream's plain subtraction does.A biome-gated power fires in the biome it names.
origins:biomeaccepts a nestedconditionwith its own small grammar, wherein_tagmeans the biome is in a biome tag rather than anything about entity types. Onlytemperaturehad ever been implemented, so every other verb failed closed and a power written that way never activated in any biome at all,in_tagbeing much the most common of them. Now parsed:in_tag,precipitation,high_humidity,constant,not, a nestedbiomeform for or-lists of exact ids, andall_of/any_ofas the Apoli 2.9 spellings ofand/or, each honouringinverted. Two details if you write them:precipitationanswers for your block rather than the biome as a whole, andhigh_humiditykeeps Apoli's0.85verbatim. An unknown sub-type still fails closed, which stays right here.Five item conditions that were passing every stack instead of checking it. An unimplemented item condition returned true — it accepted every stack rather than refusing it — so a herbivore restriction written against a verb we lack permitted meat while the power loaded, gated and ticked in apparent good order. That is the quieter failure of the two, and why these went unreported for so long.
armor_value,meat,constant,harvest_levelanddurabilityare all implemented now. Two are worth knowing precisely:armor_valueis what one stack confers rather than the wearer's total, andmeatresolves through the NeoForge common food tags, so modded meats count. The honest limit: a verb still outside the list goes on passing, since flipping that default would make every unimplemented condition block everything across packs that work today.Four block conditions that were matching every block, and the fallback that hid them. An unimplemented verb compiled to nothing, which
in_block,in_block_anywhereand the narrowneoorigins:blockcheck all read as "match anything", whileon_blockdiscarded the filter outright and turned "standing on X" into "standing on anything".invertedwas no protection, since inversion applies only to a condition that compiled, and it logged at debug with no warning — so a pack reload came back clean whilelight_level,exposed_to_sky,movement_blockingandfluidsat silently always-true: a sun-sensitive origin's slowness and blindness fired in the dark exactly as in the sun. All four verbs are implemented, since closing the fail-open alone would have swung those powers from always on to never on, and an unknown verb now matches nothing. The docs also stop callingin_block_anywherean alias ofin_block: the first samples one block, the second counts every position the hitbox overlaps. See CONDITIONS.md.KubeJS scripting reaches the Minecraft 26.1 build. It was 1.21.1 only because KubeJS had published nothing for 26.1, not because anything was tied to that version. The whole surface is on both builds now: the
NeoOriginsandNeoOriginsEventsglobals, all fifteen events,registerCallbackwith theneoorigins:kubejs_callbackaction behind it, and the two JavaScript-backed power typesneoorigins:js_customandneoorigins:js_active. Scripts move across without porting. Two install notes that are KubeJS's requirements rather than ours: the 26.1 build wants NeoForge 26.1.2.84 or newer before KubeJS will load at all, and on 1.21.1registerPowerneeds Rhino2101.2.8-build.91or newer. The 26.2 build does not get this and cannot yet, since KubeJS has published nothing past Minecraft 26.1.2 to build against — and an unrecognised powertypeis dropped whole, so ajs_custompower copied into a 26.2 pack never appears on the origin and nothing in game says why. KUBEJS.md documents the whole surface.Air drain is counted per air point, not per bubble.
drain_rate_ticksis ticks per single air point, and the HUD draws 300 air as 10 bubbles, so one bubble is 30 points: at1a bubble lasts 1.5 seconds and the full bar 15; at10, 15 seconds and 150. Reading it as ticks per bubble puts you out by a factor of thirty, which is where both reports came from. If your bar genuinely empties slower than the table says, an install predating 2.2.22 still holds the old default of10, which this release moves for you on the next start. POWER_TYPES.md carries the arithmetic beside the table.
v2.2.24+26.1Релиз26.1, 26.1.1, 26.1.2 · 13 августа 2026 г.
A corrective release. The ocean origins hold their depth instead of sinking the moment they stop swimming, four flying origins that glided bare-backed get wings, Sword Immortal can no longer fly empty-handed, and night-vision powers finally say which key toggles them. Most of the rest were failing quietly rather than visibly, which is why none had been reported: the Herbalist's bone meal growth never reached the client and never spent the bone meal, AppleSkin previewed vanilla's food values on every diet origin, two powers of one type shared a single toggle, ten tier night-vision powers each held an ability slot they had no business holding, and
origins:remove_enchantmenthad never been implemented at all. On the compatibility side, two opposite failure shapes are closed: biome conditions that failed closed and could never fire anywhere, and item and block conditions that failed open and matched everything handed to them. Legacy packs load with their origins unchanged. KubeJS scripting also reaches the Minecraft 26.1 build, with scripts moving across unchanged.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
Ocean origins hold their depth instead of sinking when they stop swimming. Holding station used to mean swimming to hold it. A new shared power, Neutral Buoyancy, goes to Merling, Siren, Kraken and Abyssal:
-0.08onminecraft:gravityas anadd_value, conditioned on being fully submerged. That lands the attribute on exactly0.0, and vanilla skips its in-water descent entirely at zero base gravity, so depth holds cleanly rather than trading a sink for a slow float up. Swimming down is unaffected, and puddles and shallows do not trigger it. Conditioned modifiers re-evaluate every five ticks, so expect up to a quarter-second lag at the surface. See COOKBOOK.md.Night-vision powers say how to switch them off. Night vision deliberately has no entry in the HUD ability cluster, because it is not one of the six numbered skills, so nothing in game ever pointed at the key that toggles it and players reasonably concluded there was no toggle at all. Twenty-two power descriptions now end with "Toggle with the Night Vision key (default K)." — worded for the binding rather than the letter, since it is rebindable. Worth knowing alongside it: the setting is remembered per player rather than per origin, so switching it off on one origin and later picking another that has night vision starts you with it already off.
Ten tier night-vision powers stop taking up a numbered ability slot.
persistent_effectdefaultstoggleableto true, and these ten never declared it, so each claimed one of the six skill slots and answered to a stray skill-key press — the exact failure the base night-vision powers forcetoggleable: falseto avoid, and one that reads to a player as night vision switching itself off for no reason. One tier power each on Wraith, Arachnid, Caveborn, Darkness Mage, Feline, Necromancer, Sculkborn, Sporeling, Sylvan and Umbral now sets it explicitly, matching the four conduit powers that always had. They are passive tier buffs, and the Night Vision key remains their off-switch.Elytrian, Phantom, Hiveling and Draconic fly with visible wings. True of every built-in origin that flies without an elytra in its chest slot. The renderer was never at fault:
neoorigins:natural_glideandneoorigins:flightsimply had no way to ask for wings. Both now take the samerender_elytraandtexture_locationpairelytra_flightalready carried, so a pack can put wings on either and point them at its own texture. They default tofalserather thanelytra_flight'strue, deliberately — these types have shipped wingless their whole life, and defaulting them on would put an elytra on the back of every existing pack that uses them. Windwalker's Sky Dancer stays bare on purpose. POWER_TYPES.md documents both.The Herbalist's extra bone meal growth shows up straight away instead of after a rejoin. Bone mealing grass placed one plant and the rest appeared only after a relog. The handler grew the blocks and let vanilla carry on, but vanilla re-checked the target against the live world, found the space filled and returned PASS — and NeoForge replays an item's block changes only on success, so the blocks were there the whole time with no client told. That same PASS also skipped the bone meal being spent, giving a Herbalist unlimited bone meal on grass. The handler now cancels the event, does the work and claims success, keeping vanilla's success roll so the power is exactly as strong as before.
Two powers of the same type on one origin stop sharing a single toggle. Pressing either keybind switched both on. Toggle state was keyed off the power's config rather than the power itself, so two powers that happened to agree collapsed into one flag. The reach was wider than the report:
condition_passivekeyed the same way,persistent_effectkeyed off its effect ids so two tiers of one buff collided, and seven more types includingstealth,flightandphantom_formkeyed off the class name alone and so collided unconditionally. Keys are now the power's own resource id. Flags already saved in a world are still read, so a power you had switched off stays off.A
gameplay.tomlwritten before 2.2.22 has its air drain rate corrected on the next start.[ocean_origins] drain_rate_ticksshipped as10up to 2.2.21 and became1in 2.2.22, but the config system only rewrites a key that is missing or out of range, and10sits well inside the declared 1 to 1200 — so every install that had ever run 2.2.21 kept it. The correction reasons from the file rather than the value, since10is a legitimate setting.gameplay.tomlnow carries aconfig_version, and an unstamped file holding exactly10is moved to1, stamped and logged. Any other value survives, and once stamped the setting is yours again: put it back to10and it stays.AppleSkin previews a diet origin's real food values rather than vanilla's. True of every origin that changes what food is worth.
modify_food_nutritionnever rewrites the item's food data — it corrects hunger and saturation server-side at the moment of eating — so there was nothing on the stack for AppleSkin to read, and an aquatic origin holding a cod was shown vanilla's 2 and 0.4. A new bridge answers AppleSkin's event with the origin-adjusted values, leaving the vanilla figure in place for its usual struck-through comparison. The nutrition-to-saturation scaling now lives in one place called by both the real eat and the preview, so the number shown and the number received cannot drift apart. AppleSkin remains optional.Sword Immortal's flight and Flickering Slash need the sword in hand. A Sword Immortal could fly empty-handed, which the origin's own description rules out. Seven of its ten powers already carried the requirement, and Immortal Body carries none precisely because it is the fall-immune mortal left when you are disarmed; the other two could not, because
neoorigins:creative_flightandneoorigins:active_dashhad noconditionfield for one to go in. Both take one now. On the flight it is re-checked every tick rather than at takeoff, so sheathing mid-air strips the ability there and then and the drop is real — pair a conditional flight with fall-damage immunity if it should be survivable. A blocked dash spends no cooldown. Defaults to absent, so existing powers of both types are unchanged. POWER_TYPES.md documents the field on both.The in-game editor gives list fields a row of real entry boxes instead of a single raw JSON box. Adding one entity type meant typing the brackets and quotes yourself. Thirty-four fields were affected across the schema-driven forms: a power's
items,tags,entity_types,damage_types,slotsandhands, plus the id lists on actions, conditions and item actions. The add-and-remove widget was already in the mod but unreachable, because the layer that reads schemas into the editor's field model never carried across the element pattern the check looks for. The model now carries it, reaching all thirty-four at once. The origin creator is hand-built and the web editor reads the schema directly, so neither was ever affected.The schemas stop advertising fewer verbs than the parsers accept. Working verbs looked unsupported unless you already knew they existed. Block conditions accept ten where the list named four, gaining
adjacent,block_state,heightandoffset; item conditions accept thirteen where the list named seven, gainingall_of,amount,any_of,custom_data,foodandname. All of them already worked if you wrote them, so nothing you have written changes behaviour. Both the list and its validating pattern now come from the editors' own catalogue rather than being maintained by hand beside it. One gap stays open, better said here than found in an editor: the block condition catalogue does not carryall_ofandany_of, so a block condition written that way works in game while the editors mark the file invalid — writeandandorthere instead.origins:remove_enchantmentworks, so a legacy Remove Curse power removes curses. The verb had never been implemented, so the item action parser fell through to its no-op default and the power loaded, gated and ticked while doing nothing, with no error to say so. Both field shapes are accepted, since the docs describe a singularenchantmentstring while real packs commonly write a pluralenchantmentsarray and both are valid upstream.reset_repair_costis read either on the action or on the enclosingequipped_item_action, true in either position winning. An unregistered id matches nothing, and a malformed one warns and is skipped rather than taking the power down. Enchanted books go through vanilla's own dispatch.levelsweakens an enchantment instead of stripping it outright. The first implementation covered three of upstream's four fields and dropped the fourth silently, which is worse than not supporting the verb at all: a pack asking to knock one level off Sharpness V got the whole enchantment torn off while everything looked correct from the pack side.levelsnow reduces each named enchantment by that many and deletes it only at zero or below, matching upstream. Omitting the field still removes outright, since that is what older packs rely on. Nothing is clamped —0subtracts nothing and a negative raises the level, both of which are what upstream's plain subtraction does.A biome-gated power fires in the biome it names.
origins:biomeaccepts a nestedconditionwith its own small grammar, wherein_tagmeans the biome is in a biome tag rather than anything about entity types. Onlytemperaturehad ever been implemented, so every other verb failed closed and a power written that way never activated in any biome at all,in_tagbeing much the most common of them. Now parsed:in_tag,precipitation,high_humidity,constant,not, a nestedbiomeform for or-lists of exact ids, andall_of/any_ofas the Apoli 2.9 spellings ofand/or, each honouringinverted. Two details if you write them:precipitationanswers for your block rather than the biome as a whole, andhigh_humiditykeeps Apoli's0.85verbatim. An unknown sub-type still fails closed, which stays right here.Five item conditions that were passing every stack instead of checking it. An unimplemented item condition returned true — it accepted every stack rather than refusing it — so a herbivore restriction written against a verb we lack permitted meat while the power loaded, gated and ticked in apparent good order. That is the quieter failure of the two, and why these went unreported for so long.
armor_value,meat,constant,harvest_levelanddurabilityare all implemented now. Two are worth knowing precisely:armor_valueis what one stack confers rather than the wearer's total, andmeatresolves through the NeoForge common food tags, so modded meats count. The honest limit: a verb still outside the list goes on passing, since flipping that default would make every unimplemented condition block everything across packs that work today.Four block conditions that were matching every block, and the fallback that hid them. An unimplemented verb compiled to nothing, which
in_block,in_block_anywhereand the narrowneoorigins:blockcheck all read as "match anything", whileon_blockdiscarded the filter outright and turned "standing on X" into "standing on anything".invertedwas no protection, since inversion applies only to a condition that compiled, and it logged at debug with no warning — so a pack reload came back clean whilelight_level,exposed_to_sky,movement_blockingandfluidsat silently always-true: a sun-sensitive origin's slowness and blindness fired in the dark exactly as in the sun. All four verbs are implemented, since closing the fail-open alone would have swung those powers from always on to never on, and an unknown verb now matches nothing. The docs also stop callingin_block_anywherean alias ofin_block: the first samples one block, the second counts every position the hitbox overlaps. See CONDITIONS.md.KubeJS scripting reaches the Minecraft 26.1 build. It was 1.21.1 only because KubeJS had published nothing for 26.1, not because anything was tied to that version. The whole surface is on both builds now: the
NeoOriginsandNeoOriginsEventsglobals, all fifteen events,registerCallbackwith theneoorigins:kubejs_callbackaction behind it, and the two JavaScript-backed power typesneoorigins:js_customandneoorigins:js_active. Scripts move across without porting. Two install notes that are KubeJS's requirements rather than ours: the 26.1 build wants NeoForge 26.1.2.84 or newer before KubeJS will load at all, and on 1.21.1registerPowerneeds Rhino2101.2.8-build.91or newer. The 26.2 build does not get this and cannot yet, since KubeJS has published nothing past Minecraft 26.1.2 to build against — and an unrecognised powertypeis dropped whole, so ajs_custompower copied into a 26.2 pack never appears on the origin and nothing in game says why. KUBEJS.md documents the whole surface.Air drain is counted per air point, not per bubble.
drain_rate_ticksis ticks per single air point, and the HUD draws 300 air as 10 bubbles, so one bubble is 30 points: at1a bubble lasts 1.5 seconds and the full bar 15; at10, 15 seconds and 150. Reading it as ticks per bubble puts you out by a factor of thirty, which is where both reports came from. If your bar genuinely empties slower than the table says, an install predating 2.2.22 still holds the old default of10, which this release moves for you on the next start. POWER_TYPES.md carries the arithmetic beside the table.
v2.2.23+1.21.1Релиз1.21.1 · 7 августа 2026 г.
Two new tools for pack authors, a pass over the ocean origins, and a fix for a bug that quietly undid part of your origin.
neoorigins:ignore_fluidgeneralisesignore_waterinto a power that removes a fluid from the player's world outright: no buoyancy, no drag, no current push, no drowning, no lava burn, no fog, no swim pose, for modded fluids as much as vanilla ones. It gets there by intercepting fluid detection rather than each effect in turn, which is why third-party mods fall away with it.neoorigins:suppressionis the first status effect NeoOrigins has ever registered: a ready-made ability lock to hang a boss mechanic, a debuff zone, or a PvP counter on. And size powers now stack across the origin and class layers, where picking a class used to wipe the origin layer's size instead of adding to it, so a Golem who took Titan stood at 1.25 rather than 1.55.The aquatic origins get the pass they have been owed. Two vanilla rules were quietly undoing their signature abilities the moment they left the seafloor, so they swam and mined at their best while standing on a block and worst while genuinely swimming, which is the wrong way round. Both are corrected. Merling can see in the dark from tier 0 rather than tier 2, Siren's Beached penalty stops following her into the water, and the night vision key no longer claims success on the forty-nine built-in origins that have no night vision to toggle. Alongside them,
breath_out_of_fluidhonours the drain rate you author, which it had been parsing and then discarding for every custom origin that set one.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
neoorigins:ignore_fluidmakes a fluid stop existing for the player.ignore_waterremoves water's speed penalty and its current pushing, and nothing else: you still float, still drown, still see the blue. The new power removes the fluid entirely. No buoyancy, no drag, no current push, no drowning, no lava burn, no fog or screen overlay, no swim pose. It works by intercepting fluid detection rather than cancelling each behaviour one at a time: the body scan that feeds buoyancy, drag,isInWater(),isInLava()and the swim pose hands back an empty fluid state for an ignored fluid, as does the eye scan behind drowning and the air bar, the camera query behind fog and the underwater distortion, and the block's ownentityInside, which is how modded fluids deliver their damage. Because every vanilla fluid behaviour reads those same values, they all fall away together, and so do most third-party mods, since they ask the same standard questions.ignore_wateris unchanged and still supported: reach for it when you only want the movement penalty gone, and for this when you want the fluid to stop registering at all.Naming a fluid covers its whole type, and a bad id costs you nothing.
fluidtakes a fluid id ("minecraft:lava"), a fluid tag ("#c:milk"), or an array of either;fluidsis the plural spelling, and both keys are read and merged, so it does not matter which one you reach for. An entry without a namespace getsminecraft:. Naming any fluid of a type ignores the type, so"minecraft:water"also coversminecraft:flowing_water, which is what makes poured buckets work. If you give neither key the power defaults to water and lava, so a marker-only entry is never a silent no-op. An unknown or misspelled id is dropped quietly rather than failing the datapack load, which matters because the whole point is naming fluids from mods that may not be installed: parsing never touches the fluid registry, so an id for an absent mod cannot throw at load or during login sync. See POWER_TYPES.md for the field reference and worked examples.What
ignore_fluiddeliberately does not reach. Fluid rendering is untouched: the fluid still draws normally, you simply pass through it as if it were air. A mod that runs its ownlevel.getFluidState(pos)check per tick, rather than asking the entity whether it is in a fluid, is doing its own detection and cannot be intercepted from here. The same goes for anything keyed off the block state rather than the fluid state. And one side effect is intended rather than tolerated: theentityInsideguard is keyed on the block's fluid state, so a waterlogged block's own behaviour is suppressed too while you ignore water, which in practice means bubble columns stop pushing you. That is the honest reading of "water does not affect me". On Minecraft 26.1 and 26.2 there is a further limit, and it is worth reading before you write the pack: those versions track entity fluid interaction only for fluids in theminecraft:waterandminecraft:lavatags, so an entry naming a fluid outside them is accepted and syncs its capability but drives nothing on the movement side. TheentityInsideguard still fires there, so a modded fluid's own damage is still cancelled even where its buoyancy and drag are not. The field shape is identical on every branch on purpose, so a pack written for 1.21.1 loads and validates unchanged on 26.x; just do not expect a modded fluid to stop pushing you there.neoorigins:suppression: a status effect that locks a player out of their abilities. The mod has never registered a status effect of its own before; this is the first, and it exists so you do not have to build an ability lock out of parts. While a player holds it, every active, keybind, and toggle power refuses to fire. A key press or a click in the power GUI gets an action bar line and a short sound, because an input that does nothing needs to come with a reason: unlike a cooldown, there is nothing on the HUD telling the player why. Refusals the player did not ask for stay silent, sinceneoorigins:activate_powerand continuous held-key bindings can both fire every tick and announcing those would flood the action bar. A toggle power that is already on when the effect lands is forced off rather than left on and locked, which would otherwise strand a player mid-transformation with the one key that undoes it refused. The amplifier carries no meaning and is reserved. Delivery is/effectand theneoorigins:apply_effectaction and nothing else: no brewing recipe, no tipped arrow, and no potion item, because a craftable ability lock is a balance decision that belongs to your pack rather than one the mod should make for every world.Passive powers are left to you, because you can already gate them. Suppression covers actives, keybinds, and toggles only. That is not an oversight and it is not a first instalment: put a
power_conditionon a passive that testsneoorigins:has_effectforneoorigins:suppressionand leave the mode at itsDENYdefault, and the power switches off for exactly as long as the effect is held. Building passive suppression into the effect would have duplicated a surface that already works.has_effectandstatus_effectresolve the new effect by id like any other, so nothing else was needed to reach it. See COOKBOOK.md for the worked example.Ocean origins keep their swim bonus when they leave the seafloor. Reported on Discord: aquatic origins sink and swim badly unless they are walking along the bottom. That is exactly what the numbers said should happen. Every ocean origin's swim bonus, and the shared Natural Swimmer power on top of it, is built on
minecraft:water_movement_efficiency, and vanilla halves that attribute outright whenever the swimmer is not on the ground. So the entire swim kit ran at half strength in open water and full strength only while the player was standing on a block, which inverts what an ocean origin is meant to feel like. A new shared power, Open Water, carries+0.25 neoforge:swim_speed, an attribute vanilla reads in the same pass with no such condition, and it is granted to Merling, Siren, Kraken, and Abyssal beside their existing speed powers rather than in place of them. Nothing aboutwater_movement_efficiencychanges, so bottom-walking is as fast as it ever was and this only lifts the mid-water case that was lagging behind it. The figure is deliberately short of parity: cancelling the halving outright would take roughly+0.55, andswim_speedis not water-gated, so that would have shown up as a land movement change as well. About+0.21restores non-sprint terminal velocity underwater, and+0.25clears that with a little room, matches the magnitude Merling's own tier 1 bonus uses, and lifts the vertical swim impulse, which is the part that reads as sinking when it is missing. Pack authors reach the same attribute:neoforge:swim_speedresolves straight from datapack JSON inattribute_modifier, with no alias needed, and COOKBOOK.md now sets out when to reach for it and when forwater_movement_efficiency.Aquatic origins mine at full speed while they are actually swimming. Also reported on Discord, and both halves of the report were accurate: Aqua Affinity says these origins mine at full speed submerged, and they did, but only with their feet planted on a block. Vanilla charges two independent penalties. The first is the submerged-mining attribute, applied when the eyes are in water, which
underwater_mining_speedhas always cancelled. The second is a flat divide by five a few lines later for anyone off the ground, and nothing in the mod touched it, so an aquatic origin paid a fifth of its speed for the whole time it was genuinely swimming and got the full rate only in the one posture the power was least meant for. That fifth is now refunded, gated on all three of eyes in water, off the ground, and holding the power. The off-ground penalty on dry land is a separate anti-cheese rule about mining out of a jump and is deliberately left alone. The correction reads the same synced value the client holds, so break progress is predicted correctly rather than the local player watching the slow animation while the server runs the fast one. Affects Merling, Siren, Kraken, and Abyssal, plus any pack origin usingunderwater_mining_speed.Merling sees in the dark from tier 0, as Siren already did. Reported as the night vision keybind doing nothing on a fresh Merling while working on a Siren. Both are ocean origins that spawn in deep water, so the difference read as a bug rather than a design line, and it was neither: Siren's base power list carried night vision and Merling's carried none at all. Merling only picked it up at tier 2, folded into the Ascended Conduit alongside water breathing and haste, which left two tiers of swimming around a pitch-black ocean floor with no way to see. Deep Sight is now a base power, a straight copy of Siren's Ocean Eyes, and it retires at tier 2 where the conduit takes over, mirroring how Caveborn swaps its base night vision for the ascended one. There is no gap: the same tier overlay that removes the base power grants the conduit, so night vision is continuous from tier 0 upward.
Size powers now stack across the origin and class layers instead of the last pick winning. A Golem (1.3) who takes the Titan class (1.25) should stand at 1.55, and did not: whichever layer was picked most recently took effect and the other was lost, in both directions. The two obvious explanations were both wrong, which is part of what kept this alive. The modifier ids are already namespaced per power, so the origin and class layers were never colliding, and the maths was already additive: the JSON authors an absolute
"scale": 1.3, but the power converts that to a delta and adds it, so the operation was correct too. The fault was in removal. Revoking any one size power cleared everyneoorigins:size_*modifier on scale and on both interaction ranges, and the layer-change step then re-granted only the layer that had actually changed, so the other layer's size was gone for good. That also explains why it looked intermittent: the first time you were granted two size layers they really did stack, and the collapse only happened when you re-picked. The over-broad sweep was not careless, it was guarding a real bug. A power whose JSON is deleted or renamed leaves a modifier behind that nothing owns, and players were once left permanently rescaled by it. So rather than narrowing the sweep and reopening that, the two jobs are now separate: revoking a power clears only the modifiers that power itself created, and the sweep for genuinely orphaned modifiers moved to the layer-change step, which is the one place that knows the full set of powers a player still has and can therefore tell an orphan from another layer's live modifier. Twelve built-in size powers are affected: Golem, Kraken, Inchling, Tiny, Dwarf, Hiveling, Gorgon, Draconic, Breeze, Caveborn, Warden, and the Titan class. Reported on Discord.On Minecraft 26.1 and 26.2, changing any layer wiped every other layer's
attribute_modifierbonuses. Found while porting the fix above, unreported and considerably wider than the size bug. Those two versions had no per-layer sweep at all and cleared every origin-owned attribute modifier whenever any layer changed, so picking a class stripped the max health, armour, and reach your origin granted, and picking an origin stripped the class's, until you relogged. Both branches now use the same targeted sweep as 1.21.1. Players on 26.1 and 26.2 will notice bonuses persisting that used to quietly disappear.breath_out_of_fluidhonours the drain rate you authored. Reported on Discord: a custom origin built in the web editor always dried out in about twenty seconds whatever the field said, twenty ticks and two ticks alike. The power parsed the field correctly and then threw it away. A tick handler overwrote it with the global[ocean_origins] drain_rate_ticksconfig on every pass, so the authored value reached nothing and every custom origin dried out at the server's rate instead of its own. The override was deliberate rather than an oversight, but it was too broad: it was written to drive the four built-in aquatic origins from one config option, and it caught custom powers on the way past. The interval is now resolved per power in the same priority orderbreath_in_fluidalready uses,air_loss_per_secondfirst, thendrain_interval_ticks, thendrain_rateas the legacy spelling, and the config applies only when none of the three is present. That last clause is the whole fix. The four built-in*_dries_outpowers author no drain field at all, so they still track the config exactly as #120 left them, while an origin that names a value gets the value it named; where several such powers apply at once, the tightest interval wins. The schema is what made this reportable rather than merely wrong: it advertiseddrain_ratewith a default of forty and a description of what it would do, with nothing to say it was inert, and the editor builds its form from the schema. All three keys are described now, and POWER_TYPES.md carries the arithmetic, so land time in seconds is roughly(300 * drain_interval_ticks) / 20and the number stays checkable against the behaviour.Siren's Beached penalty no longer follows her into the water. The power carried a fifteen percent movement penalty with no condition on it, so a Siren swam fifteen percent slower than every other ocean origin as well as walking that much slower. It is called Beached and described as a land penalty, which is what the other three ocean origins actually do: Merling, Kraken, and Abyssal all carry
"condition": "on_land"on the same power, and Siren was the odd one out, with the penalty landing hardest exactly where the origin is supposed to be strong. It is gated on land now. Its description also said ten percent while the value has always been-0.15, so the text is corrected to fifteen rather than the value being changed: Merling is the one at ten percent, and the two were most likely copied and only half edited.The night vision key no longer reports success on origins that have none. Pressing it flipped the stored flag and printed a green "Night vision on" whatever you were playing, with no check that your origin had any night vision to switch. That flag is read in exactly one place, when deciding whether to apply a night vision effect an origin actually specifies, so on an origin without one the key was reporting success for an operation that could not have an effect. Forty-nine of the seventy-eight built-in origins are in that position, so this was the common case rather than the corner one. The key now refuses with a message when there is nothing to toggle, leaves the flag untouched, and re-sends the current state, so a client that has drifted still resyncs. A power gated on a condition still counts as owning night vision, since the question is whether the origin has it rather than whether it happens to be lit at that moment: otherwise a Caveborn who walked into daylight would be told they had none. The admin kill switch is unaffected and still takes precedence, so a server that has turned night vision off gives its own message regardless of what the player is playing.
A parameterised particle named by bare id no longer takes the whole power down with it. Found while boot-testing this release against a third-party pack, unreported and not new to this cycle.
mrt_chemist:immunity-shotfailed to load on Minecraft 26.1 and 26.2 with "missing or unknown 'particle' field" while loading fine on 1.21.1, and the pack does nothing unusual: it writes"particle": "minecraft:dragon_breath". Minecraft 26 reclassified four particles that took no arguments on 1.21.1 into parameterised ones,dragon_breath,effect,instant_effectandflash, and the power accepted an argument-free particle only by bare id. So on those versions the four stopped resolving, and because the particle field is required, the failure dropped the entire power rather than just its decoration. A parameterised particle named with no arguments now falls back to its plainest form, opaque white at unit scale with no delay, which for those four is what they looked like before the reclassification, so a pack written for 1.21.1 renders unchanged on 26.x. The same fallback picks upentity_effect,dust,sculk_chargeandshriek, which are parameterised on every version and were equally unusable bare. Particles that need a referent rather than a decoration,block,itemandvibration, still require the object or inline-argument form: there is no honest default for which block, so those stay an error and say so.The Blazeling entries described a version of the origin that has not shipped since 2.2. Checked against the live JSON rather than against the previous text, and four of its powers were wrong: Blaze Scales is +6 max health, not natural armour; Nether-Born grants Speed in the Nether, not faster healing; and Internal Heat costs you hunger twenty-five percent faster, so it is a drawback rather than the passive warmth aura it was written up as. The tier table was wrong in both directions too. The second tier was listed as granting Fire Resistance, which 2.2 replaced with +4 max health, and its removal entry named a power that no longer exists, so it read as removing nothing; the third tier was described as removing the Evolved health bonus when it removes the Ascended one. ORIGINS.md and EVOLUTION.md now match what the origin actually grants.
An
on_firecondition can never be true on a fire-immune origin. Worth knowing before you build a mechanic on it. Fire-immune players have their remaining fire ticks zeroed every tick, which was done deliberately to stop the burning overlay flickering on origins that cannot burn, andon_firereads that same counter. So on Blazeling, or on anything else carryingprevent_action: fire, a power gated onon_fireis not merely unlikely to fire, it is structurally dead. CONDITIONS.md says so now, and points atin_lavaor a dimension test as the workable alternatives.modify_reachscales by default, whatever the cookbook said. COOKBOOK.md had claimed since v1.14 that reach only scales when explicitly enabled. The field has defaulted totrueon every branch for as long as it has existed, so anyone who wrote a size power expecting reach to stay put has been getting scaled reach the whole time. Corrected.How the two layers stack is now written down. The bug above was possible partly because nothing said what the intended behaviour was. POWER_TYPES.md now states the stacking rule under both
size_scalingandattribute_modifier, CLASSES.md has a section on how a class layer combines with the origin layer rather than replacing it, and COOKBOOK.md gains the cross-layer pitfall as a worked case.
v2.2.23+26.2Релиз26.2 · 7 августа 2026 г.
Two new tools for pack authors, a pass over the ocean origins, and a fix for a bug that quietly undid part of your origin.
neoorigins:ignore_fluidgeneralisesignore_waterinto a power that removes a fluid from the player's world outright: no buoyancy, no drag, no current push, no drowning, no lava burn, no fog, no swim pose, for modded fluids as much as vanilla ones. It gets there by intercepting fluid detection rather than each effect in turn, which is why third-party mods fall away with it.neoorigins:suppressionis the first status effect NeoOrigins has ever registered: a ready-made ability lock to hang a boss mechanic, a debuff zone, or a PvP counter on. And size powers now stack across the origin and class layers, where picking a class used to wipe the origin layer's size instead of adding to it, so a Golem who took Titan stood at 1.25 rather than 1.55.The aquatic origins get the pass they have been owed. Two vanilla rules were quietly undoing their signature abilities the moment they left the seafloor, so they swam and mined at their best while standing on a block and worst while genuinely swimming, which is the wrong way round. Both are corrected. Merling can see in the dark from tier 0 rather than tier 2, Siren's Beached penalty stops following her into the water, and the night vision key no longer claims success on the forty-nine built-in origins that have no night vision to toggle. Alongside them,
breath_out_of_fluidhonours the drain rate you author, which it had been parsing and then discarding for every custom origin that set one.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
neoorigins:ignore_fluidmakes a fluid stop existing for the player.ignore_waterremoves water's speed penalty and its current pushing, and nothing else: you still float, still drown, still see the blue. The new power removes the fluid entirely. No buoyancy, no drag, no current push, no drowning, no lava burn, no fog or screen overlay, no swim pose. It works by intercepting fluid detection rather than cancelling each behaviour one at a time: the body scan that feeds buoyancy, drag,isInWater(),isInLava()and the swim pose hands back an empty fluid state for an ignored fluid, as does the eye scan behind drowning and the air bar, the camera query behind fog and the underwater distortion, and the block's ownentityInside, which is how modded fluids deliver their damage. Because every vanilla fluid behaviour reads those same values, they all fall away together, and so do most third-party mods, since they ask the same standard questions.ignore_wateris unchanged and still supported: reach for it when you only want the movement penalty gone, and for this when you want the fluid to stop registering at all.Naming a fluid covers its whole type, and a bad id costs you nothing.
fluidtakes a fluid id ("minecraft:lava"), a fluid tag ("#c:milk"), or an array of either;fluidsis the plural spelling, and both keys are read and merged, so it does not matter which one you reach for. An entry without a namespace getsminecraft:. Naming any fluid of a type ignores the type, so"minecraft:water"also coversminecraft:flowing_water, which is what makes poured buckets work. If you give neither key the power defaults to water and lava, so a marker-only entry is never a silent no-op. An unknown or misspelled id is dropped quietly rather than failing the datapack load, which matters because the whole point is naming fluids from mods that may not be installed: parsing never touches the fluid registry, so an id for an absent mod cannot throw at load or during login sync. See POWER_TYPES.md for the field reference and worked examples.What
ignore_fluiddeliberately does not reach. Fluid rendering is untouched: the fluid still draws normally, you simply pass through it as if it were air. A mod that runs its ownlevel.getFluidState(pos)check per tick, rather than asking the entity whether it is in a fluid, is doing its own detection and cannot be intercepted from here. The same goes for anything keyed off the block state rather than the fluid state. And one side effect is intended rather than tolerated: theentityInsideguard is keyed on the block's fluid state, so a waterlogged block's own behaviour is suppressed too while you ignore water, which in practice means bubble columns stop pushing you. That is the honest reading of "water does not affect me". On Minecraft 26.1 and 26.2 there is a further limit, and it is worth reading before you write the pack: those versions track entity fluid interaction only for fluids in theminecraft:waterandminecraft:lavatags, so an entry naming a fluid outside them is accepted and syncs its capability but drives nothing on the movement side. TheentityInsideguard still fires there, so a modded fluid's own damage is still cancelled even where its buoyancy and drag are not. The field shape is identical on every branch on purpose, so a pack written for 1.21.1 loads and validates unchanged on 26.x; just do not expect a modded fluid to stop pushing you there.neoorigins:suppression: a status effect that locks a player out of their abilities. The mod has never registered a status effect of its own before; this is the first, and it exists so you do not have to build an ability lock out of parts. While a player holds it, every active, keybind, and toggle power refuses to fire. A key press or a click in the power GUI gets an action bar line and a short sound, because an input that does nothing needs to come with a reason: unlike a cooldown, there is nothing on the HUD telling the player why. Refusals the player did not ask for stay silent, sinceneoorigins:activate_powerand continuous held-key bindings can both fire every tick and announcing those would flood the action bar. A toggle power that is already on when the effect lands is forced off rather than left on and locked, which would otherwise strand a player mid-transformation with the one key that undoes it refused. The amplifier carries no meaning and is reserved. Delivery is/effectand theneoorigins:apply_effectaction and nothing else: no brewing recipe, no tipped arrow, and no potion item, because a craftable ability lock is a balance decision that belongs to your pack rather than one the mod should make for every world.Passive powers are left to you, because you can already gate them. Suppression covers actives, keybinds, and toggles only. That is not an oversight and it is not a first instalment: put a
power_conditionon a passive that testsneoorigins:has_effectforneoorigins:suppressionand leave the mode at itsDENYdefault, and the power switches off for exactly as long as the effect is held. Building passive suppression into the effect would have duplicated a surface that already works.has_effectandstatus_effectresolve the new effect by id like any other, so nothing else was needed to reach it. See COOKBOOK.md for the worked example.Ocean origins keep their swim bonus when they leave the seafloor. Reported on Discord: aquatic origins sink and swim badly unless they are walking along the bottom. That is exactly what the numbers said should happen. Every ocean origin's swim bonus, and the shared Natural Swimmer power on top of it, is built on
minecraft:water_movement_efficiency, and vanilla halves that attribute outright whenever the swimmer is not on the ground. So the entire swim kit ran at half strength in open water and full strength only while the player was standing on a block, which inverts what an ocean origin is meant to feel like. A new shared power, Open Water, carries+0.25 neoforge:swim_speed, an attribute vanilla reads in the same pass with no such condition, and it is granted to Merling, Siren, Kraken, and Abyssal beside their existing speed powers rather than in place of them. Nothing aboutwater_movement_efficiencychanges, so bottom-walking is as fast as it ever was and this only lifts the mid-water case that was lagging behind it. The figure is deliberately short of parity: cancelling the halving outright would take roughly+0.55, andswim_speedis not water-gated, so that would have shown up as a land movement change as well. About+0.21restores non-sprint terminal velocity underwater, and+0.25clears that with a little room, matches the magnitude Merling's own tier 1 bonus uses, and lifts the vertical swim impulse, which is the part that reads as sinking when it is missing. Pack authors reach the same attribute:neoforge:swim_speedresolves straight from datapack JSON inattribute_modifier, with no alias needed, and COOKBOOK.md now sets out when to reach for it and when forwater_movement_efficiency.Aquatic origins mine at full speed while they are actually swimming. Also reported on Discord, and both halves of the report were accurate: Aqua Affinity says these origins mine at full speed submerged, and they did, but only with their feet planted on a block. Vanilla charges two independent penalties. The first is the submerged-mining attribute, applied when the eyes are in water, which
underwater_mining_speedhas always cancelled. The second is a flat divide by five a few lines later for anyone off the ground, and nothing in the mod touched it, so an aquatic origin paid a fifth of its speed for the whole time it was genuinely swimming and got the full rate only in the one posture the power was least meant for. That fifth is now refunded, gated on all three of eyes in water, off the ground, and holding the power. The off-ground penalty on dry land is a separate anti-cheese rule about mining out of a jump and is deliberately left alone. The correction reads the same synced value the client holds, so break progress is predicted correctly rather than the local player watching the slow animation while the server runs the fast one. Affects Merling, Siren, Kraken, and Abyssal, plus any pack origin usingunderwater_mining_speed.Merling sees in the dark from tier 0, as Siren already did. Reported as the night vision keybind doing nothing on a fresh Merling while working on a Siren. Both are ocean origins that spawn in deep water, so the difference read as a bug rather than a design line, and it was neither: Siren's base power list carried night vision and Merling's carried none at all. Merling only picked it up at tier 2, folded into the Ascended Conduit alongside water breathing and haste, which left two tiers of swimming around a pitch-black ocean floor with no way to see. Deep Sight is now a base power, a straight copy of Siren's Ocean Eyes, and it retires at tier 2 where the conduit takes over, mirroring how Caveborn swaps its base night vision for the ascended one. There is no gap: the same tier overlay that removes the base power grants the conduit, so night vision is continuous from tier 0 upward.
Size powers now stack across the origin and class layers instead of the last pick winning. A Golem (1.3) who takes the Titan class (1.25) should stand at 1.55, and did not: whichever layer was picked most recently took effect and the other was lost, in both directions. The two obvious explanations were both wrong, which is part of what kept this alive. The modifier ids are already namespaced per power, so the origin and class layers were never colliding, and the maths was already additive: the JSON authors an absolute
"scale": 1.3, but the power converts that to a delta and adds it, so the operation was correct too. The fault was in removal. Revoking any one size power cleared everyneoorigins:size_*modifier on scale and on both interaction ranges, and the layer-change step then re-granted only the layer that had actually changed, so the other layer's size was gone for good. That also explains why it looked intermittent: the first time you were granted two size layers they really did stack, and the collapse only happened when you re-picked. The over-broad sweep was not careless, it was guarding a real bug. A power whose JSON is deleted or renamed leaves a modifier behind that nothing owns, and players were once left permanently rescaled by it. So rather than narrowing the sweep and reopening that, the two jobs are now separate: revoking a power clears only the modifiers that power itself created, and the sweep for genuinely orphaned modifiers moved to the layer-change step, which is the one place that knows the full set of powers a player still has and can therefore tell an orphan from another layer's live modifier. Twelve built-in size powers are affected: Golem, Kraken, Inchling, Tiny, Dwarf, Hiveling, Gorgon, Draconic, Breeze, Caveborn, Warden, and the Titan class. Reported on Discord.On Minecraft 26.1 and 26.2, changing any layer wiped every other layer's
attribute_modifierbonuses. Found while porting the fix above, unreported and considerably wider than the size bug. Those two versions had no per-layer sweep at all and cleared every origin-owned attribute modifier whenever any layer changed, so picking a class stripped the max health, armour, and reach your origin granted, and picking an origin stripped the class's, until you relogged. Both branches now use the same targeted sweep as 1.21.1. Players on 26.1 and 26.2 will notice bonuses persisting that used to quietly disappear.breath_out_of_fluidhonours the drain rate you authored. Reported on Discord: a custom origin built in the web editor always dried out in about twenty seconds whatever the field said, twenty ticks and two ticks alike. The power parsed the field correctly and then threw it away. A tick handler overwrote it with the global[ocean_origins] drain_rate_ticksconfig on every pass, so the authored value reached nothing and every custom origin dried out at the server's rate instead of its own. The override was deliberate rather than an oversight, but it was too broad: it was written to drive the four built-in aquatic origins from one config option, and it caught custom powers on the way past. The interval is now resolved per power in the same priority orderbreath_in_fluidalready uses,air_loss_per_secondfirst, thendrain_interval_ticks, thendrain_rateas the legacy spelling, and the config applies only when none of the three is present. That last clause is the whole fix. The four built-in*_dries_outpowers author no drain field at all, so they still track the config exactly as #120 left them, while an origin that names a value gets the value it named; where several such powers apply at once, the tightest interval wins. The schema is what made this reportable rather than merely wrong: it advertiseddrain_ratewith a default of forty and a description of what it would do, with nothing to say it was inert, and the editor builds its form from the schema. All three keys are described now, and POWER_TYPES.md carries the arithmetic, so land time in seconds is roughly(300 * drain_interval_ticks) / 20and the number stays checkable against the behaviour.Siren's Beached penalty no longer follows her into the water. The power carried a fifteen percent movement penalty with no condition on it, so a Siren swam fifteen percent slower than every other ocean origin as well as walking that much slower. It is called Beached and described as a land penalty, which is what the other three ocean origins actually do: Merling, Kraken, and Abyssal all carry
"condition": "on_land"on the same power, and Siren was the odd one out, with the penalty landing hardest exactly where the origin is supposed to be strong. It is gated on land now. Its description also said ten percent while the value has always been-0.15, so the text is corrected to fifteen rather than the value being changed: Merling is the one at ten percent, and the two were most likely copied and only half edited.The night vision key no longer reports success on origins that have none. Pressing it flipped the stored flag and printed a green "Night vision on" whatever you were playing, with no check that your origin had any night vision to switch. That flag is read in exactly one place, when deciding whether to apply a night vision effect an origin actually specifies, so on an origin without one the key was reporting success for an operation that could not have an effect. Forty-nine of the seventy-eight built-in origins are in that position, so this was the common case rather than the corner one. The key now refuses with a message when there is nothing to toggle, leaves the flag untouched, and re-sends the current state, so a client that has drifted still resyncs. A power gated on a condition still counts as owning night vision, since the question is whether the origin has it rather than whether it happens to be lit at that moment: otherwise a Caveborn who walked into daylight would be told they had none. The admin kill switch is unaffected and still takes precedence, so a server that has turned night vision off gives its own message regardless of what the player is playing.
A parameterised particle named by bare id no longer takes the whole power down with it. Found while boot-testing this release against a third-party pack, unreported and not new to this cycle.
mrt_chemist:immunity-shotfailed to load on Minecraft 26.1 and 26.2 with "missing or unknown 'particle' field" while loading fine on 1.21.1, and the pack does nothing unusual: it writes"particle": "minecraft:dragon_breath". Minecraft 26 reclassified four particles that took no arguments on 1.21.1 into parameterised ones,dragon_breath,effect,instant_effectandflash, and the power accepted an argument-free particle only by bare id. So on those versions the four stopped resolving, and because the particle field is required, the failure dropped the entire power rather than just its decoration. A parameterised particle named with no arguments now falls back to its plainest form, opaque white at unit scale with no delay, which for those four is what they looked like before the reclassification, so a pack written for 1.21.1 renders unchanged on 26.x. The same fallback picks upentity_effect,dust,sculk_chargeandshriek, which are parameterised on every version and were equally unusable bare. Particles that need a referent rather than a decoration,block,itemandvibration, still require the object or inline-argument form: there is no honest default for which block, so those stay an error and say so.The Blazeling entries described a version of the origin that has not shipped since 2.2. Checked against the live JSON rather than against the previous text, and four of its powers were wrong: Blaze Scales is +6 max health, not natural armour; Nether-Born grants Speed in the Nether, not faster healing; and Internal Heat costs you hunger twenty-five percent faster, so it is a drawback rather than the passive warmth aura it was written up as. The tier table was wrong in both directions too. The second tier was listed as granting Fire Resistance, which 2.2 replaced with +4 max health, and its removal entry named a power that no longer exists, so it read as removing nothing; the third tier was described as removing the Evolved health bonus when it removes the Ascended one. ORIGINS.md and EVOLUTION.md now match what the origin actually grants.
An
on_firecondition can never be true on a fire-immune origin. Worth knowing before you build a mechanic on it. Fire-immune players have their remaining fire ticks zeroed every tick, which was done deliberately to stop the burning overlay flickering on origins that cannot burn, andon_firereads that same counter. So on Blazeling, or on anything else carryingprevent_action: fire, a power gated onon_fireis not merely unlikely to fire, it is structurally dead. CONDITIONS.md says so now, and points atin_lavaor a dimension test as the workable alternatives.modify_reachscales by default, whatever the cookbook said. COOKBOOK.md had claimed since v1.14 that reach only scales when explicitly enabled. The field has defaulted totrueon every branch for as long as it has existed, so anyone who wrote a size power expecting reach to stay put has been getting scaled reach the whole time. Corrected.How the two layers stack is now written down. The bug above was possible partly because nothing said what the intended behaviour was. POWER_TYPES.md now states the stacking rule under both
size_scalingandattribute_modifier, CLASSES.md has a section on how a class layer combines with the origin layer rather than replacing it, and COOKBOOK.md gains the cross-layer pitfall as a worked case.
v2.2.23+26.1Релиз26.1, 26.1.1, 26.1.2 · 7 августа 2026 г.
Two new tools for pack authors, a pass over the ocean origins, and a fix for a bug that quietly undid part of your origin.
neoorigins:ignore_fluidgeneralisesignore_waterinto a power that removes a fluid from the player's world outright: no buoyancy, no drag, no current push, no drowning, no lava burn, no fog, no swim pose, for modded fluids as much as vanilla ones. It gets there by intercepting fluid detection rather than each effect in turn, which is why third-party mods fall away with it.neoorigins:suppressionis the first status effect NeoOrigins has ever registered: a ready-made ability lock to hang a boss mechanic, a debuff zone, or a PvP counter on. And size powers now stack across the origin and class layers, where picking a class used to wipe the origin layer's size instead of adding to it, so a Golem who took Titan stood at 1.25 rather than 1.55.The aquatic origins get the pass they have been owed. Two vanilla rules were quietly undoing their signature abilities the moment they left the seafloor, so they swam and mined at their best while standing on a block and worst while genuinely swimming, which is the wrong way round. Both are corrected. Merling can see in the dark from tier 0 rather than tier 2, Siren's Beached penalty stops following her into the water, and the night vision key no longer claims success on the forty-nine built-in origins that have no night vision to toggle. Alongside them,
breath_out_of_fluidhonours the drain rate you author, which it had been parsing and then discarding for every custom origin that set one.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
neoorigins:ignore_fluidmakes a fluid stop existing for the player.ignore_waterremoves water's speed penalty and its current pushing, and nothing else: you still float, still drown, still see the blue. The new power removes the fluid entirely. No buoyancy, no drag, no current push, no drowning, no lava burn, no fog or screen overlay, no swim pose. It works by intercepting fluid detection rather than cancelling each behaviour one at a time: the body scan that feeds buoyancy, drag,isInWater(),isInLava()and the swim pose hands back an empty fluid state for an ignored fluid, as does the eye scan behind drowning and the air bar, the camera query behind fog and the underwater distortion, and the block's ownentityInside, which is how modded fluids deliver their damage. Because every vanilla fluid behaviour reads those same values, they all fall away together, and so do most third-party mods, since they ask the same standard questions.ignore_wateris unchanged and still supported: reach for it when you only want the movement penalty gone, and for this when you want the fluid to stop registering at all.Naming a fluid covers its whole type, and a bad id costs you nothing.
fluidtakes a fluid id ("minecraft:lava"), a fluid tag ("#c:milk"), or an array of either;fluidsis the plural spelling, and both keys are read and merged, so it does not matter which one you reach for. An entry without a namespace getsminecraft:. Naming any fluid of a type ignores the type, so"minecraft:water"also coversminecraft:flowing_water, which is what makes poured buckets work. If you give neither key the power defaults to water and lava, so a marker-only entry is never a silent no-op. An unknown or misspelled id is dropped quietly rather than failing the datapack load, which matters because the whole point is naming fluids from mods that may not be installed: parsing never touches the fluid registry, so an id for an absent mod cannot throw at load or during login sync. See POWER_TYPES.md for the field reference and worked examples.What
ignore_fluiddeliberately does not reach. Fluid rendering is untouched: the fluid still draws normally, you simply pass through it as if it were air. A mod that runs its ownlevel.getFluidState(pos)check per tick, rather than asking the entity whether it is in a fluid, is doing its own detection and cannot be intercepted from here. The same goes for anything keyed off the block state rather than the fluid state. And one side effect is intended rather than tolerated: theentityInsideguard is keyed on the block's fluid state, so a waterlogged block's own behaviour is suppressed too while you ignore water, which in practice means bubble columns stop pushing you. That is the honest reading of "water does not affect me". On Minecraft 26.1 and 26.2 there is a further limit, and it is worth reading before you write the pack: those versions track entity fluid interaction only for fluids in theminecraft:waterandminecraft:lavatags, so an entry naming a fluid outside them is accepted and syncs its capability but drives nothing on the movement side. TheentityInsideguard still fires there, so a modded fluid's own damage is still cancelled even where its buoyancy and drag are not. The field shape is identical on every branch on purpose, so a pack written for 1.21.1 loads and validates unchanged on 26.x; just do not expect a modded fluid to stop pushing you there.neoorigins:suppression: a status effect that locks a player out of their abilities. The mod has never registered a status effect of its own before; this is the first, and it exists so you do not have to build an ability lock out of parts. While a player holds it, every active, keybind, and toggle power refuses to fire. A key press or a click in the power GUI gets an action bar line and a short sound, because an input that does nothing needs to come with a reason: unlike a cooldown, there is nothing on the HUD telling the player why. Refusals the player did not ask for stay silent, sinceneoorigins:activate_powerand continuous held-key bindings can both fire every tick and announcing those would flood the action bar. A toggle power that is already on when the effect lands is forced off rather than left on and locked, which would otherwise strand a player mid-transformation with the one key that undoes it refused. The amplifier carries no meaning and is reserved. Delivery is/effectand theneoorigins:apply_effectaction and nothing else: no brewing recipe, no tipped arrow, and no potion item, because a craftable ability lock is a balance decision that belongs to your pack rather than one the mod should make for every world.Passive powers are left to you, because you can already gate them. Suppression covers actives, keybinds, and toggles only. That is not an oversight and it is not a first instalment: put a
power_conditionon a passive that testsneoorigins:has_effectforneoorigins:suppressionand leave the mode at itsDENYdefault, and the power switches off for exactly as long as the effect is held. Building passive suppression into the effect would have duplicated a surface that already works.has_effectandstatus_effectresolve the new effect by id like any other, so nothing else was needed to reach it. See COOKBOOK.md for the worked example.Ocean origins keep their swim bonus when they leave the seafloor. Reported on Discord: aquatic origins sink and swim badly unless they are walking along the bottom. That is exactly what the numbers said should happen. Every ocean origin's swim bonus, and the shared Natural Swimmer power on top of it, is built on
minecraft:water_movement_efficiency, and vanilla halves that attribute outright whenever the swimmer is not on the ground. So the entire swim kit ran at half strength in open water and full strength only while the player was standing on a block, which inverts what an ocean origin is meant to feel like. A new shared power, Open Water, carries+0.25 neoforge:swim_speed, an attribute vanilla reads in the same pass with no such condition, and it is granted to Merling, Siren, Kraken, and Abyssal beside their existing speed powers rather than in place of them. Nothing aboutwater_movement_efficiencychanges, so bottom-walking is as fast as it ever was and this only lifts the mid-water case that was lagging behind it. The figure is deliberately short of parity: cancelling the halving outright would take roughly+0.55, andswim_speedis not water-gated, so that would have shown up as a land movement change as well. About+0.21restores non-sprint terminal velocity underwater, and+0.25clears that with a little room, matches the magnitude Merling's own tier 1 bonus uses, and lifts the vertical swim impulse, which is the part that reads as sinking when it is missing. Pack authors reach the same attribute:neoforge:swim_speedresolves straight from datapack JSON inattribute_modifier, with no alias needed, and COOKBOOK.md now sets out when to reach for it and when forwater_movement_efficiency.Aquatic origins mine at full speed while they are actually swimming. Also reported on Discord, and both halves of the report were accurate: Aqua Affinity says these origins mine at full speed submerged, and they did, but only with their feet planted on a block. Vanilla charges two independent penalties. The first is the submerged-mining attribute, applied when the eyes are in water, which
underwater_mining_speedhas always cancelled. The second is a flat divide by five a few lines later for anyone off the ground, and nothing in the mod touched it, so an aquatic origin paid a fifth of its speed for the whole time it was genuinely swimming and got the full rate only in the one posture the power was least meant for. That fifth is now refunded, gated on all three of eyes in water, off the ground, and holding the power. The off-ground penalty on dry land is a separate anti-cheese rule about mining out of a jump and is deliberately left alone. The correction reads the same synced value the client holds, so break progress is predicted correctly rather than the local player watching the slow animation while the server runs the fast one. Affects Merling, Siren, Kraken, and Abyssal, plus any pack origin usingunderwater_mining_speed.Merling sees in the dark from tier 0, as Siren already did. Reported as the night vision keybind doing nothing on a fresh Merling while working on a Siren. Both are ocean origins that spawn in deep water, so the difference read as a bug rather than a design line, and it was neither: Siren's base power list carried night vision and Merling's carried none at all. Merling only picked it up at tier 2, folded into the Ascended Conduit alongside water breathing and haste, which left two tiers of swimming around a pitch-black ocean floor with no way to see. Deep Sight is now a base power, a straight copy of Siren's Ocean Eyes, and it retires at tier 2 where the conduit takes over, mirroring how Caveborn swaps its base night vision for the ascended one. There is no gap: the same tier overlay that removes the base power grants the conduit, so night vision is continuous from tier 0 upward.
Size powers now stack across the origin and class layers instead of the last pick winning. A Golem (1.3) who takes the Titan class (1.25) should stand at 1.55, and did not: whichever layer was picked most recently took effect and the other was lost, in both directions. The two obvious explanations were both wrong, which is part of what kept this alive. The modifier ids are already namespaced per power, so the origin and class layers were never colliding, and the maths was already additive: the JSON authors an absolute
"scale": 1.3, but the power converts that to a delta and adds it, so the operation was correct too. The fault was in removal. Revoking any one size power cleared everyneoorigins:size_*modifier on scale and on both interaction ranges, and the layer-change step then re-granted only the layer that had actually changed, so the other layer's size was gone for good. That also explains why it looked intermittent: the first time you were granted two size layers they really did stack, and the collapse only happened when you re-picked. The over-broad sweep was not careless, it was guarding a real bug. A power whose JSON is deleted or renamed leaves a modifier behind that nothing owns, and players were once left permanently rescaled by it. So rather than narrowing the sweep and reopening that, the two jobs are now separate: revoking a power clears only the modifiers that power itself created, and the sweep for genuinely orphaned modifiers moved to the layer-change step, which is the one place that knows the full set of powers a player still has and can therefore tell an orphan from another layer's live modifier. Twelve built-in size powers are affected: Golem, Kraken, Inchling, Tiny, Dwarf, Hiveling, Gorgon, Draconic, Breeze, Caveborn, Warden, and the Titan class. Reported on Discord.On Minecraft 26.1 and 26.2, changing any layer wiped every other layer's
attribute_modifierbonuses. Found while porting the fix above, unreported and considerably wider than the size bug. Those two versions had no per-layer sweep at all and cleared every origin-owned attribute modifier whenever any layer changed, so picking a class stripped the max health, armour, and reach your origin granted, and picking an origin stripped the class's, until you relogged. Both branches now use the same targeted sweep as 1.21.1. Players on 26.1 and 26.2 will notice bonuses persisting that used to quietly disappear.breath_out_of_fluidhonours the drain rate you authored. Reported on Discord: a custom origin built in the web editor always dried out in about twenty seconds whatever the field said, twenty ticks and two ticks alike. The power parsed the field correctly and then threw it away. A tick handler overwrote it with the global[ocean_origins] drain_rate_ticksconfig on every pass, so the authored value reached nothing and every custom origin dried out at the server's rate instead of its own. The override was deliberate rather than an oversight, but it was too broad: it was written to drive the four built-in aquatic origins from one config option, and it caught custom powers on the way past. The interval is now resolved per power in the same priority orderbreath_in_fluidalready uses,air_loss_per_secondfirst, thendrain_interval_ticks, thendrain_rateas the legacy spelling, and the config applies only when none of the three is present. That last clause is the whole fix. The four built-in*_dries_outpowers author no drain field at all, so they still track the config exactly as #120 left them, while an origin that names a value gets the value it named; where several such powers apply at once, the tightest interval wins. The schema is what made this reportable rather than merely wrong: it advertiseddrain_ratewith a default of forty and a description of what it would do, with nothing to say it was inert, and the editor builds its form from the schema. All three keys are described now, and POWER_TYPES.md carries the arithmetic, so land time in seconds is roughly(300 * drain_interval_ticks) / 20and the number stays checkable against the behaviour.Siren's Beached penalty no longer follows her into the water. The power carried a fifteen percent movement penalty with no condition on it, so a Siren swam fifteen percent slower than every other ocean origin as well as walking that much slower. It is called Beached and described as a land penalty, which is what the other three ocean origins actually do: Merling, Kraken, and Abyssal all carry
"condition": "on_land"on the same power, and Siren was the odd one out, with the penalty landing hardest exactly where the origin is supposed to be strong. It is gated on land now. Its description also said ten percent while the value has always been-0.15, so the text is corrected to fifteen rather than the value being changed: Merling is the one at ten percent, and the two were most likely copied and only half edited.The night vision key no longer reports success on origins that have none. Pressing it flipped the stored flag and printed a green "Night vision on" whatever you were playing, with no check that your origin had any night vision to switch. That flag is read in exactly one place, when deciding whether to apply a night vision effect an origin actually specifies, so on an origin without one the key was reporting success for an operation that could not have an effect. Forty-nine of the seventy-eight built-in origins are in that position, so this was the common case rather than the corner one. The key now refuses with a message when there is nothing to toggle, leaves the flag untouched, and re-sends the current state, so a client that has drifted still resyncs. A power gated on a condition still counts as owning night vision, since the question is whether the origin has it rather than whether it happens to be lit at that moment: otherwise a Caveborn who walked into daylight would be told they had none. The admin kill switch is unaffected and still takes precedence, so a server that has turned night vision off gives its own message regardless of what the player is playing.
A parameterised particle named by bare id no longer takes the whole power down with it. Found while boot-testing this release against a third-party pack, unreported and not new to this cycle.
mrt_chemist:immunity-shotfailed to load on Minecraft 26.1 and 26.2 with "missing or unknown 'particle' field" while loading fine on 1.21.1, and the pack does nothing unusual: it writes"particle": "minecraft:dragon_breath". Minecraft 26 reclassified four particles that took no arguments on 1.21.1 into parameterised ones,dragon_breath,effect,instant_effectandflash, and the power accepted an argument-free particle only by bare id. So on those versions the four stopped resolving, and because the particle field is required, the failure dropped the entire power rather than just its decoration. A parameterised particle named with no arguments now falls back to its plainest form, opaque white at unit scale with no delay, which for those four is what they looked like before the reclassification, so a pack written for 1.21.1 renders unchanged on 26.x. The same fallback picks upentity_effect,dust,sculk_chargeandshriek, which are parameterised on every version and were equally unusable bare. Particles that need a referent rather than a decoration,block,itemandvibration, still require the object or inline-argument form: there is no honest default for which block, so those stay an error and say so.The Blazeling entries described a version of the origin that has not shipped since 2.2. Checked against the live JSON rather than against the previous text, and four of its powers were wrong: Blaze Scales is +6 max health, not natural armour; Nether-Born grants Speed in the Nether, not faster healing; and Internal Heat costs you hunger twenty-five percent faster, so it is a drawback rather than the passive warmth aura it was written up as. The tier table was wrong in both directions too. The second tier was listed as granting Fire Resistance, which 2.2 replaced with +4 max health, and its removal entry named a power that no longer exists, so it read as removing nothing; the third tier was described as removing the Evolved health bonus when it removes the Ascended one. ORIGINS.md and EVOLUTION.md now match what the origin actually grants.
An
on_firecondition can never be true on a fire-immune origin. Worth knowing before you build a mechanic on it. Fire-immune players have their remaining fire ticks zeroed every tick, which was done deliberately to stop the burning overlay flickering on origins that cannot burn, andon_firereads that same counter. So on Blazeling, or on anything else carryingprevent_action: fire, a power gated onon_fireis not merely unlikely to fire, it is structurally dead. CONDITIONS.md says so now, and points atin_lavaor a dimension test as the workable alternatives.modify_reachscales by default, whatever the cookbook said. COOKBOOK.md had claimed since v1.14 that reach only scales when explicitly enabled. The field has defaulted totrueon every branch for as long as it has existed, so anyone who wrote a size power expecting reach to stay put has been getting scaled reach the whole time. Corrected.How the two layers stack is now written down. The bug above was possible partly because nothing said what the intended behaviour was. POWER_TYPES.md now states the stacking rule under both
size_scalingandattribute_modifier, CLASSES.md has a section on how a class layer combines with the origin layer rather than replacing it, and COOKBOOK.md gains the cross-layer pitfall as a worked case.
v2.2.22+1.21.1Релиз1.21.1 · 3 августа 2026 г.
A legacy-compatibility and morphing release. The headline: two compatibility actions that packs lean on constantly turn out never to have worked.
apply_effectresolved its effect id only from a bare string, but two hundred and fourteen of the two hundred and twenty-eight uses in the pack corpus nest it in an object, so those powers loaded, appeared on the origin, and applied nothing at all;origins:choiceread the wrong key for its wrapped action, so it rolled a branch and then ran nothing. Both are fixed. Legacy 1.20-era packs also have their.mcfunctionfiles rewritten as they are read, which took a Fairytale Origins test install from forty-two failed function loads down to nine (#118), andentity_modelgrows from a bare model swap into a full morph system with datapack-defined morphs, matching hitboxes, borrowed entity sounds, skin overrides, and first-person arms. Plus ten more legacy Apoli conditions understood instead of failing closed, real editor forms for twenty-nine alias power types that used to render as raw JSON, and three stability fixes: ocean origins no longer hang the server while picking a spawn point,origins:lava_visionno longer paints the whole screen a flat colour (#121), and aquatic origins dry out on land in the fifteen seconds vanilla fish get rather than two and a half minutes (#120), though an existing config file keeps the old value until you edit it.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
entity_modelis now a full morph system, not just a model swap. The power previously took a singleentity_typeand rendered you as that model. It now describes a whole morph.nbtselects a variant (sheep colour, villager profession, slime size);scale(default1.0) sizes both model and hitbox;hitbox(defaulttrue) swaps your actual collision box and eye height to match, so a slime morph really does fit where a slime fits;render_held_itemandrender_armor(both defaulttrue) control whether your gear draws on the morph;first_person(default"item") chooses what you see in your own hands, accepting"item","arm"for the morph's own limb, or"hidden"; andarmnames an explicit bone if the automatic search picks the wrong one. Morph state is broadcast to every client tracking you, so other players see the morph too, not just you.Datapack-defined morphs. A file at
data/<namespace>/neoorigins/morphs/<name>.jsondeclares a reusable morph, and a power references it with"morph": "<id>"instead of spelling every field out inline. A bare name resolves toneoorigins:<name>, and a file whose id matches a built-in overrides it. Ten morphs ship built in (slime, magma cube, sheep, cat, villager, creeper, zombie, skeleton, enderman, and spider), and all are datapack-overridable. An unknown morph id logs a one-time warning and resolves to no morph rather than failing the power. See POWER_TYPES.md for the full field reference.Morphs can borrow the entity's sounds and reskin the player.
entity_sounds(defaulttrue) makes your hurt, death, fall, swim, and splash sounds come from the morph's entity type. Asoundsobject overrides any of them individually by sound-event id (hurt,death,fall_small,fall_big,swim,splash,splash_high_speed). For player-shaped morphs, askinblock setstexture,cape, andelytraasset ids and amodelof"slim"or"wide"; anything left unset falls through to the player's real skin, so you can restyle only the parts you care about. Step sounds still come from the block underfoot, as in vanilla.Twenty-nine legacy alias power types now have real editor forms. Legacy types carried by the compatibility layer (the four persistent-effect aliases, seven
condition_passivealiases, fourteenaction_on_eventaliases, and four stragglers) had no schema branch of their own, so both the web editor and the in-game editor fell back to a raw-JSON box and left the author to spell every field from memory. All twenty-nine are now modelled, and the allowlist that exempted them is empty. Alongside that: the power type picker is grouped by namespace and reads compatibility types straight off the parser rather than the native registry alone, so nothing is missing from the list; scalar-or-array reference fields (roughly twenty of them) render as proper pickers in both editors instead of raw JSON; and the top-levelenabledkill switch andaction_on_event'shit_dealtevent are declared where they were being read but not described. The thirty-one native types that fall back to codec reflection, among themmultiple,status_effect,glow, andnight_vision, get their display name, description, hidden flag, andrequired_modsrows back. Those keys belong to no power's config record, so the fallback path had never offered them even though a datapack could always write them by hand.The schemas no longer reject JSON the mod itself accepts. Three separate cases where the editors flagged a perfectly good file as invalid. The layer schema never declared
standalone, tooknameas a plain string only, and allowed only bare-id or single-object origin entries, while the layer loader accepts all three of the shapes it left out. The item-condition schema demanded atypethat the parser has never needed, so the typelessid/item/tagshorthand, which NeoOrigins' own Jianxian powers use, failed the mod's own schema. Andprevent_actiondeclared its two enums in lowercase only, though the power upper-cases before matching, so the sixteen shipped powers written inSCREAMING_CASEwere all reported invalid while working perfectly in game. All three now describe what the loader actually does.The web editor imports upstream Origins-layout packs. The importer matched only the editor's own native layout, so every pack laid out the Origins way failed at the origin step. It now tries native then compatibility layouts for origins, layers, and powers, the same pairing the server-side loaders already use, with the compatibility pattern excluding sibling directories, so
origins/powers/foo.jsonno longer imports as an origin calledpowers/foo. Three ways it used to lose data are fixed alongside. It read only the nine origin fields the Identity tab covers and discarded the other six, so a round trip through the editor silently stripped evolution tiers, spawn placement, required mods, the special flag, and Figura model keys. Fifty-eight of the seventy-eight shipped origins carry tier powers, so that was the normal case, not an edge one. Unmapped keys now ride along and are written back verbatim, and the import says what it carried. A name written as{"text": "Asura"}was flattened to an empty string, which blanked the name and description of six of NeoOrigins' own origins on import. And importing a built-in power threw on a Svelte proxy and appended nothing at all.lava_visioncan set its fog distances directly. The power took only a multiplicativestrength, which scales both of vanilla's lava fog distances at once, so there was no way to say "fog starts at zero blocks and ends at fifteen". Two optional fields,startandend, now set those two distances in blocks outright, and either may be given on its own, with the plane you leave out still scaled bystrength. Values that cannot describe a fog volume, a multiplier of zero or less, or anendat or beforestart, are discarded rather than applied, so a malformed field can no longer blank the screen. When more than one active power grants lava vision the most generous of each is taken: the largest multiplier, the nearest start, the furthest end. See POWER_TYPES.md for the field reference.Wiring up a spare orb is documented. The four inert orbs (gold, pink, purple, and teal) ship with no behaviour on purpose, for datapacks to bind. A new worked recipe walks the whole path end to end: a custom origin layer, an
action_on_eventpower that opens the layer picker scoped to it, the global-power grant that makes the orb work whatever your origin is, and a crafting recipe for the orb itself. See COOKBOOK.md § 16.Night vision has its own toggle key, default
K. Community feedback asked for night vision to be switchable on any origin that grants it. The switch is a player-level flag rather than a property of one power, so a single keypress covers every tier of a multi-tier origin, and it defaults to on, so nothing changes for players who never press the key. It is deliberately its own keybind rather than an active ability: an earlier attempt spent a skill slot on it and let a stray skill keypress silently disable night vision, which testers reported as "night vision doesn't work". The server stays authoritative: the client asks for a flip and only updates once the server echoes it back, so the admin kill switch cannot be talked around. The key is listed in CLIENT_CONFIG.md.Aquatic origins dry out ten times faster on land (#120).
[ocean_origins] drain_rate_ticksshipped at10, meaning one air point lost every ten ticks out of a supply of three hundred: two and a half minutes of standing on dry land before drowning damage even begins. Vanilla cod and salmon lose one air point per tick, so fifteen seconds, and the power is written to mirror them. The default is now1. The config comment is what produced the wrong number: it correctly described vanilla fish, then recommended16as the fish-comparable setting, which is four minutes. It now gives the arithmetic instead. Land time in seconds is roughly(300 * value) / 20, so the number stays checkable against the behaviour. If you have run the pack before, note that config files are written once and never re-defaulted: an existingconfig/neoorigins/gameplay.tomlkeepsdrain_rate_ticks = 10until you edit that line by hand or delete the file and let it regenerate. If fifteen seconds is too harsh for your pack, raise the number (2is thirty seconds,4is a minute) or setdries_out = falseto switch the mechanic off entirely.Ocean origins no longer lock up the server while looking for somewhere to spawn. Five aquatic origins, plus Forest Dragon and Enderian, find their spawn point by asking the world for the nearest matching biome, and that search ran on the server thread at a radius of 12800 blocks with a sixteen-block step: around thirty million climate samples in the worst case, with nothing able to interrupt it. Under ordinary worldgen an ocean sits a few hundred blocks out and the search finishes in milliseconds, which is exactly why this never surfaced in testing. Install a biome or terrain mod that pushes oceans away from world spawn, or one whose own oceans are not in the
minecraft:is_oceantag, and the search runs to exhaustion instead: the server thread stops responding and Minecraft's sixty-second watchdog kills the server, with nothing thrown, so it reads as a crash with no cause. The search now runs on a worker thread with a five-second budget, bounded by vanilla/locate biome's own numbers (radius 6400, horizontal step 32, vertical step 64), about twenty-seven times fewer samples. One consequence worth knowing: a matching biome that exists only between 6400 and 12800 blocks out is no longer found, and the player spawns normally with a line in the log.[spawn_location] teleports_enabled = falsestill disables the whole path.Origin spawn teleports no longer freeze the server while terrain generates. Once a spawn point was found, the step that turns it into a standable position force-loaded chunks a block at a time, and each of those loads blocks the server thread until the chunk exists. Landing in ungenerated terrain on a pack with worldgen mods installed therefore meant twenty to thirty seconds of a completely unresponsive server before the player was placed. The chunks that step needs are now requested up front through the ordinary chunk ticket system and polled once per tick, so the server keeps running while they generate and the placement happens only once they are all present. If they have not arrived within thirty seconds the teleport is abandoned and the player spawns normally. Placement passes over a candidate column whose clearance check would read outside the loaded area, rather than generating more chunks for it. Because the teleport now lands a generation-time later rather than on the next tick, a player who changes dimension while it is still waiting is left where they are instead of being pulled away.
Two hot server paths stop doing work for players who cannot trigger them. Every monster spawn attempt walked every player in the level and every power they held looking for a spawn-warding power that almost nobody has; that scan is now gated on a cheap per-dimension probe, and the distance check it does reach dropped a square root. Separately, the capability lookup that six server mixins call per tick and per block walked the whole power list and allocated a set on every call; it now consults a cached union of the static capabilities first, used purely as a negative filter: a capability the cache does not contain cannot come from any of those powers, while one it does contain still runs the full live scan, so the shortcut can never answer yes on its own.
Six built-in origins granted the same status effect from two powers at once after a tier upgrade. When a tier adds a power that supersedes a base one, the tier's
removelist is what tears the old power down, and in six cases it was missing an entry. Abyssal at apex kept both its base night vision and water breathing alongside the apex conduit power that already granted them; Caveborn kept an iron-eating haste bonus underneath permanent apex haste; Verdant kept a forest regeneration power underneath permanent apex regeneration; and Kraken, Merling, and Water Mage each kept a conditional water-breathing power underneath an unconditional one. This was not merely redundant. A conditional power clears its own effect when its condition goes false, so stepping out of the water as an Abyssal at apex would strip the permanent water breathing that the apex power was maintaining. All six now remove the superseded power on upgrade, and a new test walks every built-in origin at every tier to stop it recurring.Blacksmith armour toughness now applies per armour slot. A full set of quality-crafted armour granted a single toughness bonus instead of one per piece, because all four pieces shared one attribute-modifier id and the game deduplicates modifiers by id. Each slot now carries its own id, so head, chest, legs, and feet stack independently. Mining speed and attack damage were never affected, since only one held item is ever in play.
Shift-clicking a quality craft no longer loses the buff. Taking a crafted item with shift-click distributes it into your inventory before the crafted-item event fires, so the quality bonus was applied to a stack that had already been merged away and vanished. The buff is now applied to the result slot as it is assembled, which covers both the click-take and shift-click paths. Applying it twice is harmless, so nothing double-dips.
Legacy attribute rewriting no longer corrupts unrelated text. The compatibility layer rewrites 1.20-era attribute ids, but the rule matched
generic.anywhere in a line rather than only in attribute positions, soplaysound minecraft:entity.generic.extinguish_firewas mangled into nonsense, and the same applied to quoted text intellrawandsay. Matching is now anchored to the attribute argument of theattributecommand and to attribute-modifier NBT fields, and skips quoted strings entirely. On Minecraft 1.21.1 the rewrite is gone altogether: 1.21.1 still spells attributesgeneric.armor, and the prefix drop only landed in 1.21.2, so stripping it there turned a valid id into an invalid one.Gravity Mage's Repulse pushes at the strength it was authored with. The power asks for a knockback strength of 2.5, but it spells that field
knockback_strengthwhile the alias it routes through readsstrength, so the field was inert and the ability has been pushing at the 1.0 fallback since it shipped. The name is an easy one to get wrong: Ground Slam and Tidal Wave both genuinely declare aknockback_strengthfield, so it looks right by analogy, and only Repulse goes through the alias. Fixed by making the authored intent the thing that runs, which means this is a live balance change: Repulse now pushes two and a half times as hard as it did.Two Jianxian sword glows were invisible.
glow_alphais a 0-255 integer, and both powers authored it as an 0-1 fraction, which floored to zero. Zero is a legal value rather than "unset", so it was accepted instead of falling back to the default, and the halos never drew at all. Converted to the intended fractions of 255, so Sword Qi and Heaven-Severing Slash gain the glow their author asked for.Commands run by
execute_commandare no longer rewritten when they already work. The legacy-command rewriter is a set of heuristics meant to run only on commands that fail to parse, and the chat path has guarded it that way since #92. Theexecute_commandaction skipped that guard and rewrote everything it was given, so a pack issuing a perfectly valid modern command could have it altered underneath it. It now parses the command first and leaves it alone if it already works.apply_effectnever applied anything in the shape almost every pack writes. Apoli's documented shape nests the effect in an object:"effect": {"effect": "minecraft:speed", "duration": 200, "amplifier": 1}. The compatibility parser resolved the effect id only from a bare"effect"string, so every nested use fell straight through to a silent no-op. Of the two hundred and twenty-eightapply_effectuses in the pack corpus, two hundred and fourteen are that shape, spread over a hundred and twenty-four files, and not one of them did anything: the power loaded, the origin listed it, and no effect was ever applied. The remaining fourteen use theeffects[]array, which the parser truncated to the first entry, so a jellyfish sting that should poison and weaken and slow only poisoned. Between the two, noapply_effectin the corpus took a path the parser handled correctly. Effect resolution now lives in one place that reads all three shapes and returns every effect asked for rather than the first, and the nested object supplies its own duration, amplifier, and display flags, because that is where authors put them. The target-entity path used bytarget_actionandarea_of_effectshares that resolver, so it no longer carries its own copy of both bugs. When nothing resolves, the parser warns and names the three shapes it accepts instead of returning quietly. That silence is the only reason this survived as long as it did.origins:choicerolled a branch and then ran nothing. Each entry in a weightedchoiceis a wrapper record rather than an action, and Apoli keys the wrapped actionelement. The parser readactioninstead, so every branch resolved to a no-op whichever way the roll went, and a power built entirely out of random outcomes looked like it was simply unlucky every time.elementis now read,actionstays accepted as a synonym so anything authored against NeoOrigins' own documentation keeps working, andelementwins when an entry carries both.Legacy
.mcfunctionfiles are now translated as they are read (#118). A function file that fails to compile never runs at all, and never reaches the hook where legacy commands were previously repaired, so packs shipping 1.20 command syntax inside their functions lost those functions silently. Function contents are now rewritten at pack-read time, before the game parses them. Item NBT ingive,item replace, anditem modifybecomes a data-component patch, covering custom names and lore, enchantments, potions, unbreakable, damage, repair cost, custom model data, and hidden tooltip flags, with anything unrecognised preserved undercustom_data.clearis translated as a subset match rather than a component patch, since it takes an item predicate. And 1.20 particle arguments are converted to their 1.21 form fordust,dust_color_transition,block,item, andentity_effect. On a Fairytale Origins test install this took failed function loads from forty-two down to nine on 1.21.1, and most of what remains there needs mods that were not installed. Minecraft 26.1 and 26.2 carry seven more failures on top of those nine, in command shapes that changed after 1.21.1 and are not rewritten yet: thegeneric.attribute prefix, the split ofminecraft:potioninto thrown and lingering entities, andgamerule.Three more legacy power types are implemented:
modify_healing,modify_status_effect_duration, andaction_on_death. All three are authored in six packs in the corpus, and all three were rejected by the schema and dropped by the loader.modify_healingscales all healing, matching Apoli's contract rather than natural regeneration alone;modify_status_effect_durationmultiplies the duration of effects as they are applied; andaction_on_deathfires with the killer available, so it can pair with abientity_action. Their modifier maths reads the 1.16-eramultiply_baseandmultiply_totalspellings these packs actually use, rather than only the modern Apoli names. Reading only the modern names would have left every real use silently doing nothing. All four namespace spellings of each type are declared, so the editors get real forms for them too.1.20-style particle strings are accepted in power JSON. A
particlefield written the old way, as"minecraft:dust 0.1 0.5 0.1 1"with its arguments in one string, previously failed the whole power to load. The leading particle id is now used and the power loads.Ten more legacy conditions are understood instead of failing closed, and two actions accept shapes they were rejecting. When the compatibility layer meets a type it does not know, it refuses to activate the power rather than firing it unconditionally: safe, but the power does nothing. Newly supported:
statistictests a vanilla statistic withcomparisonandcompare_to;nearby_entitiescounts entities by type or tag withindistance(default16) with an optionalbientity_conditionfilter;near_villagercounts real villagers nearby;nbtmatches a partial NBT tree on the target;in_tagmatches the target's entity type against a tag;can_seetests unobstructed line of sight;block_statetests a single blockstate property;heighttests a block's Y coordinate;adjacentcounts matching face neighbours; andalways_activeis an unconditional true. On the action side,andnow accepts a single action as well as a list, andarea_of_effectaccepts both an object-shapedshapeand Apoli's standardbientity_actionfield. See CONDITIONS.md and ACTIONS.md for the field references.origins:lava_visionwhited out the screen (#121). Origins'sandvfields are absolute replacements for vanilla's two lava fog distances, measured in blocks, not multipliers. The translator mappedsonto NeoOrigins' multiplicativestrengthand discardedv, so the ordinary authoring of{"s": 0, "v": 15}, which means "fog starts at zero blocks and ends at fifteen", arrived as a strength of zero: both fog planes scaled to nothing, every pixel fully fogged, a flat sheet of colour. They now map to the power's newstartandend. The screen came out sky blue rather than lava orange because of a second fault in the same path: the fog handler asked whether the player's body was in lava rather than whether the camera was, so standing in a one-block puddle with your eyes in air let it hijack ordinary atmospheric fog. It now runs only when the camera is genuinely in lava. Both faults were reachable on Minecraft 1.21.1 alone, since 26.1 and 26.2 have not drawn lava fog at all since the 26.1 render rework stubbed the handler out. That stub is lifted this release as well, so all three builds run the same fixed path rather than two of them running none of it.origins:water_visionis no longer translated into lava vision. It was routed ontolava_vision, which is not remotely what it does, and inherited the whiteout above along the way. Upstream it is not a power type at all: it is an instance oforigins:toggle_night_vision. It now becomes NeoOrigins'night_visiongated on asubmerged_inwater condition, which is what the original power actually gives the player.apugli:action_on_jumpandapugli:action_on_target_deathload at all. Both were registered as aliases ontoaction_on_event, and neither ever reached the alias table: the loader rewritesapugli:toorigins:before the alias pass runs, and then drops any power it cannot route, so by the time the table was asked, it was being asked about an id it has never held. A pack shipping either one lost the whole power without a word. The authored id is now kept in reserve and offered to the alias table on the drop path only, so nothing that already loaded changes route.prevent_entity_useno longer blocks every interaction. The power ignored itsentity_conditionandbientity_condition, so once granted it blocked the player from using any entity at all rather than only the ones the pack named. Those conditions are now compiled and tested against the entity you interact with, and if they cannot be compiled the power is refused with a warning instead of over-blocking./power hasis registered. Legacy packs test for a power withpower has <target> <power>inside their functions, and NeoOrigins registeredgrant,revoke, andremovebut nothas, so any function containing it failed to compile and was lost entirely. It now returns a result usable withexecute ifandstore result, and resolves multiple-power ids the same waygrantdoes.The Blacksmith class can now craft quality gear at modded workstations.
quality_equipmentgains anintercept_menuslist of menu-type ids whose result slot should also grant the quality buff, and the built-in Blacksmith power opts into Overgeared's four smithing anvils. Detection is entirely data-driven, with no compile-time dependency: an id for a mod that is not installed simply never matches, so the list is harmless either way, and pack authors can add workstations from any mod without a code change.The
damageaction'sdamage_typefield is documented. It has been read since 2.0.x and the editors describe it, but ACTIONS.md still listedsource.nameas the only way to choose a damage source.damage_typeresolves against the damage-type registry, so unlike the fixed keyword list it reaches datapack-defined types.THEMING.md now matches the theming code. The field table had gone stale:
flatandpanel_colorhave been parsed since the classic skin came back, but neither was listed, so there was no documented route to building a flat theme at all. The page also never mentionedclassic_picker_style, the accessibility option that outranks every theme. A pack ships a theme, a player has that option turned on, and the theme has no visible effect, with nothing on the page to explain the symptom. And the bundled-font section named two files that do not exist: the assets are lowercased on disk, because NeoForge's resource-path validator rejects uppercase path segments, so anyone following the old names was chasing a missing file.
v2.2.22+26.2Релиз26.2 · 3 августа 2026 г.
A legacy-compatibility and morphing release. The headline: two compatibility actions that packs lean on constantly turn out never to have worked.
apply_effectresolved its effect id only from a bare string, but two hundred and fourteen of the two hundred and twenty-eight uses in the pack corpus nest it in an object, so those powers loaded, appeared on the origin, and applied nothing at all;origins:choiceread the wrong key for its wrapped action, so it rolled a branch and then ran nothing. Both are fixed. Legacy 1.20-era packs also have their.mcfunctionfiles rewritten as they are read, which took a Fairytale Origins test install from forty-two failed function loads down to nine (#118), andentity_modelgrows from a bare model swap into a full morph system with datapack-defined morphs, matching hitboxes, borrowed entity sounds, skin overrides, and first-person arms. Plus ten more legacy Apoli conditions understood instead of failing closed, real editor forms for twenty-nine alias power types that used to render as raw JSON, and three stability fixes: ocean origins no longer hang the server while picking a spawn point,origins:lava_visionno longer paints the whole screen a flat colour (#121), and aquatic origins dry out on land in the fifteen seconds vanilla fish get rather than two and a half minutes (#120), though an existing config file keeps the old value until you edit it.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
entity_modelis now a full morph system, not just a model swap. The power previously took a singleentity_typeand rendered you as that model. It now describes a whole morph.nbtselects a variant (sheep colour, villager profession, slime size);scale(default1.0) sizes both model and hitbox;hitbox(defaulttrue) swaps your actual collision box and eye height to match, so a slime morph really does fit where a slime fits;render_held_itemandrender_armor(both defaulttrue) control whether your gear draws on the morph;first_person(default"item") chooses what you see in your own hands, accepting"item","arm"for the morph's own limb, or"hidden"; andarmnames an explicit bone if the automatic search picks the wrong one. Morph state is broadcast to every client tracking you, so other players see the morph too, not just you.Datapack-defined morphs. A file at
data/<namespace>/neoorigins/morphs/<name>.jsondeclares a reusable morph, and a power references it with"morph": "<id>"instead of spelling every field out inline. A bare name resolves toneoorigins:<name>, and a file whose id matches a built-in overrides it. Ten morphs ship built in (slime, magma cube, sheep, cat, villager, creeper, zombie, skeleton, enderman, and spider), and all are datapack-overridable. An unknown morph id logs a one-time warning and resolves to no morph rather than failing the power. See POWER_TYPES.md for the full field reference.Morphs can borrow the entity's sounds and reskin the player.
entity_sounds(defaulttrue) makes your hurt, death, fall, swim, and splash sounds come from the morph's entity type. Asoundsobject overrides any of them individually by sound-event id (hurt,death,fall_small,fall_big,swim,splash,splash_high_speed). For player-shaped morphs, askinblock setstexture,cape, andelytraasset ids and amodelof"slim"or"wide"; anything left unset falls through to the player's real skin, so you can restyle only the parts you care about. Step sounds still come from the block underfoot, as in vanilla.Twenty-nine legacy alias power types now have real editor forms. Legacy types carried by the compatibility layer (the four persistent-effect aliases, seven
condition_passivealiases, fourteenaction_on_eventaliases, and four stragglers) had no schema branch of their own, so both the web editor and the in-game editor fell back to a raw-JSON box and left the author to spell every field from memory. All twenty-nine are now modelled, and the allowlist that exempted them is empty. Alongside that: the power type picker is grouped by namespace and reads compatibility types straight off the parser rather than the native registry alone, so nothing is missing from the list; scalar-or-array reference fields (roughly twenty of them) render as proper pickers in both editors instead of raw JSON; and the top-levelenabledkill switch andaction_on_event'shit_dealtevent are declared where they were being read but not described. The thirty-one native types that fall back to codec reflection, among themmultiple,status_effect,glow, andnight_vision, get their display name, description, hidden flag, andrequired_modsrows back. Those keys belong to no power's config record, so the fallback path had never offered them even though a datapack could always write them by hand.The schemas no longer reject JSON the mod itself accepts. Three separate cases where the editors flagged a perfectly good file as invalid. The layer schema never declared
standalone, tooknameas a plain string only, and allowed only bare-id or single-object origin entries, while the layer loader accepts all three of the shapes it left out. The item-condition schema demanded atypethat the parser has never needed, so the typelessid/item/tagshorthand, which NeoOrigins' own Jianxian powers use, failed the mod's own schema. Andprevent_actiondeclared its two enums in lowercase only, though the power upper-cases before matching, so the sixteen shipped powers written inSCREAMING_CASEwere all reported invalid while working perfectly in game. All three now describe what the loader actually does.The web editor imports upstream Origins-layout packs. The importer matched only the editor's own native layout, so every pack laid out the Origins way failed at the origin step. It now tries native then compatibility layouts for origins, layers, and powers, the same pairing the server-side loaders already use, with the compatibility pattern excluding sibling directories, so
origins/powers/foo.jsonno longer imports as an origin calledpowers/foo. Three ways it used to lose data are fixed alongside. It read only the nine origin fields the Identity tab covers and discarded the other six, so a round trip through the editor silently stripped evolution tiers, spawn placement, required mods, the special flag, and Figura model keys. Fifty-eight of the seventy-eight shipped origins carry tier powers, so that was the normal case, not an edge one. Unmapped keys now ride along and are written back verbatim, and the import says what it carried. A name written as{"text": "Asura"}was flattened to an empty string, which blanked the name and description of six of NeoOrigins' own origins on import. And importing a built-in power threw on a Svelte proxy and appended nothing at all.lava_visioncan set its fog distances directly. The power took only a multiplicativestrength, which scales both of vanilla's lava fog distances at once, so there was no way to say "fog starts at zero blocks and ends at fifteen". Two optional fields,startandend, now set those two distances in blocks outright, and either may be given on its own, with the plane you leave out still scaled bystrength. Values that cannot describe a fog volume, a multiplier of zero or less, or anendat or beforestart, are discarded rather than applied, so a malformed field can no longer blank the screen. When more than one active power grants lava vision the most generous of each is taken: the largest multiplier, the nearest start, the furthest end. See POWER_TYPES.md for the field reference.Wiring up a spare orb is documented. The four inert orbs (gold, pink, purple, and teal) ship with no behaviour on purpose, for datapacks to bind. A new worked recipe walks the whole path end to end: a custom origin layer, an
action_on_eventpower that opens the layer picker scoped to it, the global-power grant that makes the orb work whatever your origin is, and a crafting recipe for the orb itself. See COOKBOOK.md § 16.Night vision has its own toggle key, default
K. Community feedback asked for night vision to be switchable on any origin that grants it. The switch is a player-level flag rather than a property of one power, so a single keypress covers every tier of a multi-tier origin, and it defaults to on, so nothing changes for players who never press the key. It is deliberately its own keybind rather than an active ability: an earlier attempt spent a skill slot on it and let a stray skill keypress silently disable night vision, which testers reported as "night vision doesn't work". The server stays authoritative: the client asks for a flip and only updates once the server echoes it back, so the admin kill switch cannot be talked around. The key is listed in CLIENT_CONFIG.md.Aquatic origins dry out ten times faster on land (#120).
[ocean_origins] drain_rate_ticksshipped at10, meaning one air point lost every ten ticks out of a supply of three hundred: two and a half minutes of standing on dry land before drowning damage even begins. Vanilla cod and salmon lose one air point per tick, so fifteen seconds, and the power is written to mirror them. The default is now1. The config comment is what produced the wrong number: it correctly described vanilla fish, then recommended16as the fish-comparable setting, which is four minutes. It now gives the arithmetic instead. Land time in seconds is roughly(300 * value) / 20, so the number stays checkable against the behaviour. If you have run the pack before, note that config files are written once and never re-defaulted: an existingconfig/neoorigins/gameplay.tomlkeepsdrain_rate_ticks = 10until you edit that line by hand or delete the file and let it regenerate. If fifteen seconds is too harsh for your pack, raise the number (2is thirty seconds,4is a minute) or setdries_out = falseto switch the mechanic off entirely.Ocean origins no longer lock up the server while looking for somewhere to spawn. Five aquatic origins, plus Forest Dragon and Enderian, find their spawn point by asking the world for the nearest matching biome, and that search ran on the server thread at a radius of 12800 blocks with a sixteen-block step: around thirty million climate samples in the worst case, with nothing able to interrupt it. Under ordinary worldgen an ocean sits a few hundred blocks out and the search finishes in milliseconds, which is exactly why this never surfaced in testing. Install a biome or terrain mod that pushes oceans away from world spawn, or one whose own oceans are not in the
minecraft:is_oceantag, and the search runs to exhaustion instead: the server thread stops responding and Minecraft's sixty-second watchdog kills the server, with nothing thrown, so it reads as a crash with no cause. The search now runs on a worker thread with a five-second budget, bounded by vanilla/locate biome's own numbers (radius 6400, horizontal step 32, vertical step 64), about twenty-seven times fewer samples. One consequence worth knowing: a matching biome that exists only between 6400 and 12800 blocks out is no longer found, and the player spawns normally with a line in the log.[spawn_location] teleports_enabled = falsestill disables the whole path.Origin spawn teleports no longer freeze the server while terrain generates. Once a spawn point was found, the step that turns it into a standable position force-loaded chunks a block at a time, and each of those loads blocks the server thread until the chunk exists. Landing in ungenerated terrain on a pack with worldgen mods installed therefore meant twenty to thirty seconds of a completely unresponsive server before the player was placed. The chunks that step needs are now requested up front through the ordinary chunk ticket system and polled once per tick, so the server keeps running while they generate and the placement happens only once they are all present. If they have not arrived within thirty seconds the teleport is abandoned and the player spawns normally. Placement passes over a candidate column whose clearance check would read outside the loaded area, rather than generating more chunks for it. Because the teleport now lands a generation-time later rather than on the next tick, a player who changes dimension while it is still waiting is left where they are instead of being pulled away.
Two hot server paths stop doing work for players who cannot trigger them. Every monster spawn attempt walked every player in the level and every power they held looking for a spawn-warding power that almost nobody has; that scan is now gated on a cheap per-dimension probe, and the distance check it does reach dropped a square root. Separately, the capability lookup that six server mixins call per tick and per block walked the whole power list and allocated a set on every call; it now consults a cached union of the static capabilities first, used purely as a negative filter: a capability the cache does not contain cannot come from any of those powers, while one it does contain still runs the full live scan, so the shortcut can never answer yes on its own.
Six built-in origins granted the same status effect from two powers at once after a tier upgrade. When a tier adds a power that supersedes a base one, the tier's
removelist is what tears the old power down, and in six cases it was missing an entry. Abyssal at apex kept both its base night vision and water breathing alongside the apex conduit power that already granted them; Caveborn kept an iron-eating haste bonus underneath permanent apex haste; Verdant kept a forest regeneration power underneath permanent apex regeneration; and Kraken, Merling, and Water Mage each kept a conditional water-breathing power underneath an unconditional one. This was not merely redundant. A conditional power clears its own effect when its condition goes false, so stepping out of the water as an Abyssal at apex would strip the permanent water breathing that the apex power was maintaining. All six now remove the superseded power on upgrade, and a new test walks every built-in origin at every tier to stop it recurring.Blacksmith armour toughness now applies per armour slot. A full set of quality-crafted armour granted a single toughness bonus instead of one per piece, because all four pieces shared one attribute-modifier id and the game deduplicates modifiers by id. Each slot now carries its own id, so head, chest, legs, and feet stack independently. Mining speed and attack damage were never affected, since only one held item is ever in play.
Shift-clicking a quality craft no longer loses the buff. Taking a crafted item with shift-click distributes it into your inventory before the crafted-item event fires, so the quality bonus was applied to a stack that had already been merged away and vanished. The buff is now applied to the result slot as it is assembled, which covers both the click-take and shift-click paths. Applying it twice is harmless, so nothing double-dips.
Legacy attribute rewriting no longer corrupts unrelated text. The compatibility layer rewrites 1.20-era attribute ids, but the rule matched
generic.anywhere in a line rather than only in attribute positions, soplaysound minecraft:entity.generic.extinguish_firewas mangled into nonsense, and the same applied to quoted text intellrawandsay. Matching is now anchored to the attribute argument of theattributecommand and to attribute-modifier NBT fields, and skips quoted strings entirely. On Minecraft 1.21.1 the rewrite is gone altogether: 1.21.1 still spells attributesgeneric.armor, and the prefix drop only landed in 1.21.2, so stripping it there turned a valid id into an invalid one.Gravity Mage's Repulse pushes at the strength it was authored with. The power asks for a knockback strength of 2.5, but it spells that field
knockback_strengthwhile the alias it routes through readsstrength, so the field was inert and the ability has been pushing at the 1.0 fallback since it shipped. The name is an easy one to get wrong: Ground Slam and Tidal Wave both genuinely declare aknockback_strengthfield, so it looks right by analogy, and only Repulse goes through the alias. Fixed by making the authored intent the thing that runs, which means this is a live balance change: Repulse now pushes two and a half times as hard as it did.Two Jianxian sword glows were invisible.
glow_alphais a 0-255 integer, and both powers authored it as an 0-1 fraction, which floored to zero. Zero is a legal value rather than "unset", so it was accepted instead of falling back to the default, and the halos never drew at all. Converted to the intended fractions of 255, so Sword Qi and Heaven-Severing Slash gain the glow their author asked for.Commands run by
execute_commandare no longer rewritten when they already work. The legacy-command rewriter is a set of heuristics meant to run only on commands that fail to parse, and the chat path has guarded it that way since #92. Theexecute_commandaction skipped that guard and rewrote everything it was given, so a pack issuing a perfectly valid modern command could have it altered underneath it. It now parses the command first and leaves it alone if it already works.apply_effectnever applied anything in the shape almost every pack writes. Apoli's documented shape nests the effect in an object:"effect": {"effect": "minecraft:speed", "duration": 200, "amplifier": 1}. The compatibility parser resolved the effect id only from a bare"effect"string, so every nested use fell straight through to a silent no-op. Of the two hundred and twenty-eightapply_effectuses in the pack corpus, two hundred and fourteen are that shape, spread over a hundred and twenty-four files, and not one of them did anything: the power loaded, the origin listed it, and no effect was ever applied. The remaining fourteen use theeffects[]array, which the parser truncated to the first entry, so a jellyfish sting that should poison and weaken and slow only poisoned. Between the two, noapply_effectin the corpus took a path the parser handled correctly. Effect resolution now lives in one place that reads all three shapes and returns every effect asked for rather than the first, and the nested object supplies its own duration, amplifier, and display flags, because that is where authors put them. The target-entity path used bytarget_actionandarea_of_effectshares that resolver, so it no longer carries its own copy of both bugs. When nothing resolves, the parser warns and names the three shapes it accepts instead of returning quietly. That silence is the only reason this survived as long as it did.origins:choicerolled a branch and then ran nothing. Each entry in a weightedchoiceis a wrapper record rather than an action, and Apoli keys the wrapped actionelement. The parser readactioninstead, so every branch resolved to a no-op whichever way the roll went, and a power built entirely out of random outcomes looked like it was simply unlucky every time.elementis now read,actionstays accepted as a synonym so anything authored against NeoOrigins' own documentation keeps working, andelementwins when an entry carries both.Legacy
.mcfunctionfiles are now translated as they are read (#118). A function file that fails to compile never runs at all, and never reaches the hook where legacy commands were previously repaired, so packs shipping 1.20 command syntax inside their functions lost those functions silently. Function contents are now rewritten at pack-read time, before the game parses them. Item NBT ingive,item replace, anditem modifybecomes a data-component patch, covering custom names and lore, enchantments, potions, unbreakable, damage, repair cost, custom model data, and hidden tooltip flags, with anything unrecognised preserved undercustom_data.clearis translated as a subset match rather than a component patch, since it takes an item predicate. And 1.20 particle arguments are converted to their 1.21 form fordust,dust_color_transition,block,item, andentity_effect. On a Fairytale Origins test install this took failed function loads from forty-two down to nine on 1.21.1, and most of what remains there needs mods that were not installed. Minecraft 26.1 and 26.2 carry seven more failures on top of those nine, in command shapes that changed after 1.21.1 and are not rewritten yet: thegeneric.attribute prefix, the split ofminecraft:potioninto thrown and lingering entities, andgamerule.Three more legacy power types are implemented:
modify_healing,modify_status_effect_duration, andaction_on_death. All three are authored in six packs in the corpus, and all three were rejected by the schema and dropped by the loader.modify_healingscales all healing, matching Apoli's contract rather than natural regeneration alone;modify_status_effect_durationmultiplies the duration of effects as they are applied; andaction_on_deathfires with the killer available, so it can pair with abientity_action. Their modifier maths reads the 1.16-eramultiply_baseandmultiply_totalspellings these packs actually use, rather than only the modern Apoli names. Reading only the modern names would have left every real use silently doing nothing. All four namespace spellings of each type are declared, so the editors get real forms for them too.1.20-style particle strings are accepted in power JSON. A
particlefield written the old way, as"minecraft:dust 0.1 0.5 0.1 1"with its arguments in one string, previously failed the whole power to load. The leading particle id is now used and the power loads.Ten more legacy conditions are understood instead of failing closed, and two actions accept shapes they were rejecting. When the compatibility layer meets a type it does not know, it refuses to activate the power rather than firing it unconditionally: safe, but the power does nothing. Newly supported:
statistictests a vanilla statistic withcomparisonandcompare_to;nearby_entitiescounts entities by type or tag withindistance(default16) with an optionalbientity_conditionfilter;near_villagercounts real villagers nearby;nbtmatches a partial NBT tree on the target;in_tagmatches the target's entity type against a tag;can_seetests unobstructed line of sight;block_statetests a single blockstate property;heighttests a block's Y coordinate;adjacentcounts matching face neighbours; andalways_activeis an unconditional true. On the action side,andnow accepts a single action as well as a list, andarea_of_effectaccepts both an object-shapedshapeand Apoli's standardbientity_actionfield. See CONDITIONS.md and ACTIONS.md for the field references.origins:lava_visionwhited out the screen (#121). Origins'sandvfields are absolute replacements for vanilla's two lava fog distances, measured in blocks, not multipliers. The translator mappedsonto NeoOrigins' multiplicativestrengthand discardedv, so the ordinary authoring of{"s": 0, "v": 15}, which means "fog starts at zero blocks and ends at fifteen", arrived as a strength of zero: both fog planes scaled to nothing, every pixel fully fogged, a flat sheet of colour. They now map to the power's newstartandend. The screen came out sky blue rather than lava orange because of a second fault in the same path: the fog handler asked whether the player's body was in lava rather than whether the camera was, so standing in a one-block puddle with your eyes in air let it hijack ordinary atmospheric fog. It now runs only when the camera is genuinely in lava. Both faults were reachable on Minecraft 1.21.1 alone, since 26.1 and 26.2 have not drawn lava fog at all since the 26.1 render rework stubbed the handler out. That stub is lifted this release as well, so all three builds run the same fixed path rather than two of them running none of it.origins:water_visionis no longer translated into lava vision. It was routed ontolava_vision, which is not remotely what it does, and inherited the whiteout above along the way. Upstream it is not a power type at all: it is an instance oforigins:toggle_night_vision. It now becomes NeoOrigins'night_visiongated on asubmerged_inwater condition, which is what the original power actually gives the player.apugli:action_on_jumpandapugli:action_on_target_deathload at all. Both were registered as aliases ontoaction_on_event, and neither ever reached the alias table: the loader rewritesapugli:toorigins:before the alias pass runs, and then drops any power it cannot route, so by the time the table was asked, it was being asked about an id it has never held. A pack shipping either one lost the whole power without a word. The authored id is now kept in reserve and offered to the alias table on the drop path only, so nothing that already loaded changes route.prevent_entity_useno longer blocks every interaction. The power ignored itsentity_conditionandbientity_condition, so once granted it blocked the player from using any entity at all rather than only the ones the pack named. Those conditions are now compiled and tested against the entity you interact with, and if they cannot be compiled the power is refused with a warning instead of over-blocking./power hasis registered. Legacy packs test for a power withpower has <target> <power>inside their functions, and NeoOrigins registeredgrant,revoke, andremovebut nothas, so any function containing it failed to compile and was lost entirely. It now returns a result usable withexecute ifandstore result, and resolves multiple-power ids the same waygrantdoes.The Blacksmith class can now craft quality gear at modded workstations.
quality_equipmentgains anintercept_menuslist of menu-type ids whose result slot should also grant the quality buff, and the built-in Blacksmith power opts into Overgeared's four smithing anvils. Detection is entirely data-driven, with no compile-time dependency: an id for a mod that is not installed simply never matches, so the list is harmless either way, and pack authors can add workstations from any mod without a code change.The
damageaction'sdamage_typefield is documented. It has been read since 2.0.x and the editors describe it, but ACTIONS.md still listedsource.nameas the only way to choose a damage source.damage_typeresolves against the damage-type registry, so unlike the fixed keyword list it reaches datapack-defined types.THEMING.md now matches the theming code. The field table had gone stale:
flatandpanel_colorhave been parsed since the classic skin came back, but neither was listed, so there was no documented route to building a flat theme at all. The page also never mentionedclassic_picker_style, the accessibility option that outranks every theme. A pack ships a theme, a player has that option turned on, and the theme has no visible effect, with nothing on the page to explain the symptom. And the bundled-font section named two files that do not exist: the assets are lowercased on disk, because NeoForge's resource-path validator rejects uppercase path segments, so anyone following the old names was chasing a missing file.
Комментарии
Загружаем…