Tags
Creators
Details
v2.2.26+26.1
Compatibility
Changes
A compatibility and origin-content release, led by a startup failure. Installing The One Probe alongside NeoOrigins was enough to be refused at launch, over a version bound that compared our lower bound against the wrong part of TOP's version string. It had never protected anything, and it is gone. Six new pack-author capabilities follow, most of them out of getting one legacy Origins pack to run untouched: a morph can play one of the mob's own animations, or run one of the entity events the game uses to make a mob swing, sparkle or shake;
poseholds the player prone, crouched or upright, which is what a crawling or a serpentine origin needs;prevent_entity_renderhides entities from a single player;using_effective_toolasks whether the swing a player is making is a productive one; andmod_food_nutritionchanges what a meal is worth as it goes down. The origin picker gains two more shapes for the two things people kept asking for (#127): a carousel for anyone who preferred the original mod's chooser, and a grid of cards for anyone who wanted a whole layer visible at once, with the two-panel screen unchanged as the default. Dragon Survival no longer fights it for the screen at join either: whichever mod loses that race now has its screen held and reopened instead of dropped. The Caveborn get copper and emerald diets filling the two gaps in the ore ladder, water breathing and fire resistance to go with them, a wash of the ore's own colour for as long as its effect runs, and descriptions that finally admit the diets refuse on a full stomach. All seven of their diets are rebuilt on common tags, so a modded metal or stone is food without a pack touching anything, and what you eat is now worth what it is: a block feeds twice what an ingot does and holds its effect three times as long, a nugget is worth almost nothing, and ore goes down in creative mode the way bread always has. A pack written for 1.19 or 1.20 gets four more of its breakages repaired as the file is read, with no edit to the zip, and four legacy power mappings that dropped their power silently now land, with the rest walked end to end so none of them can. Alongside those: declining an evolution keeps it declined, fire-immune origins stop burning on campfires and blazes (#129), a fire-resistant helmet shades without wearing out, a slime rehydrates from a water cauldron and from a water bottle, the step-up ability gained an off switch for everyone it kept walking up the block they meant to step down from (#123), the web editor's form view stops refusing to switch off a setting that defaults to on while its block canvas stops writing back fields nobody ever set, an event name a pack guessed at costs it a hook rather than the whole power, a legacy repeating action that names no interval paces itself at Apoli's once a second instead of every tick, the in-game creator checks its ids as strictly as the web editor always has, and the reference has been re-read against the loader in the places it had drifted, gaining pages for the two config files that never had one.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
-
The origin picker comes in three shapes now (#127). It had one: a scrolling list on the left, details on the right. Players who came from the original Origins mod kept asking for its one-at-a-time chooser back, and others wanted a whole layer visible at once. Both are choices rather than replacements. The client setting
ui.picker_layouttakesTWO_PANEL, the default and unchanged;CAROUSEL, one origin at a time with arrows to step through them; andGRID, a wall of origin cards that fits as many as your window allows and pages the rest. A card carries the icon, name and impact dots but has no room for a description, so clicking one opens the same full detail read the other layouts use, and Back returns you to the wall. The search box filters the wall as you type, and the arrow keys page it unless the box has focus. The carousel is a NeoOrigins screen shaped like the original rather than a copy of it, so it keeps whatever theme you are running instead of the old dirt-background window, and browsing in it is selecting: Confirm always applies to whatever is on screen. Layout and skin are independent.theme_overrideandclassic_picker_stylestill control colour and font, and any skin works with any layout. See CLIENT_CONFIG.md. -
A fire-resistant helmet shades you without wearing out. Origins that burn in daylight wear down the helmet protecting them, which is right for an ordinary hat and wrong for one that already survives lava. Netherite helmets now shade for free, the way unbreakable ones always did. It keys off the item's own fire-resistant property rather than a list of names, so a modded helmet that grants itself the same property is covered without us naming it.
-
Declining an evolution keeps it declined. The prompt to evolve was re-offered on every kill after the requirement was met, so refusing it bought a few seconds of quiet and nothing more, and a player near their next tier spent the rest of the session being asked. A decline is now remembered against the tier it was made at, and nothing re-offers that tier: not more kills, not a relog. It stays quiet until you ask for it yourself with
/neoorigins evolve accept, an operator sets your tier, or you spend an Orb of Origin, which resets the ladder to zero outright. The tier is not lost by declining it, only muted, and accepting clears the record so the tier above it prompts normally once its own threshold is reached. See EVOLUTION.md. -
The Caveborn's diets say they will not go down on a full stomach. All eight of them (the Caveborn's seven ores and the Nether origin's fungal diet) refuse when the hunger bar is already full, which is deliberate and matches ordinary food. Nothing said so, and the refusal is completely silent: no message, no eating animation, no sound, so a player at full hunger reads it as the power being broken rather than as being full. Every one of those descriptions now ends by saying it, in all twelve languages the mod ships. The stone diet's list also gained cobbled deepslate, which it has always eaten and never mentioned.
-
The Caveborn eats copper, and copper lets them breathe. The diet ladder jumped straight from stone to iron, skipping the ore a player turns up more of than any other on the way down. Copper now feeds for 3 hunger and 0.6 saturation, which places it neatly between stone and iron, and eating it grants Water Breathing I for a minute. The effect is picked for the gap it fills rather than for the flavour: a Caveborn sees in the dark, ignores the drop and mines bare-handed, but a flooded ravine or a drowned mineshaft stopped them the same as anybody, and copper is what they are already picking up on the way to one. Ingots, raw copper, both ores and both kinds of copper block all count. Like the other six diets it is a tag,
neoorigins:caveborn_eat_copper, so a pack adds a modded copper to it without replacing the power. -
The Caveborn takes on the colour of the ore they ate. Six of the seven diets grant an effect, and while one was running there was nothing about the player that showed which one, least of all to anybody looking at them from the other end of the shaft. The model is now washed in that ore's own colour for as long as its effect lasts, sampled from the item rather than picked by hand: copper orange, iron pale grey, gold yellow, diamond cyan, emerald green, netherite a dark brown. Eat two and the colours average. Nothing about the buffs changes, and each of the six is its own switch in
power_overrides.toml, fromcaveborn_copper_tintthroughcaveborn_netherite_tint, so a server that wants the diets without the colour can turn off as many of them as it likes. Stone has no tint, having no effect to signal. See ORIGINS.md. -
Emerald is the seventh diet, and it buys a trip to the surface. The Caveborn's one real cost is that daylight burns them, and nothing in the origin ever answered it: you either stayed under or you took the damage. Emerald now feeds for 7 hunger and 1.4 saturation, filling the gap the ladder had left between diamond and netherite, and eating one grants Fire Resistance for five minutes. The sunlight damage was always dealt as fire, so this cancels it outright rather than blunting it, and it covers lava on the way back down, which is the other thing that kills miners. Emeralds, both emerald ores and blocks of emerald all count, through
neoorigins:caveborn_eat_emerald. You will still catch fire: Fire Resistance cancels the damage but does not put the flames out, and the sunlight power re-lights you every second you are exposed, so those five minutes above ground are spent visibly alight and entirely unharmed. Step into shade or water and the burn runs out on its own. Emerald is the one Caveborn diet with a renewable supply, since a villager will trade for it. -
A block of ore feeds a Caveborn like a block, and a nugget like a nugget. Every form of a material was worth the same meal, so a raw iron block and a single ingot both restored 4 hunger, and the block was worth eating only if you had nothing else to hand. The nugget was the inverse and the worse half of it: nine nuggets restored 36 hunger where the ingot they make restored 4, and nether gold ore drops nuggets rather than ingots, so the least valuable form of gold in the game was by a wide margin the most efficient food in the origin. What you eat is now worth what it is. A block feeds twice what an ingot or gem does and holds its effect three times as long; a nugget feeds 1 hunger with no saturation and buys fifteen seconds. A block is deliberately not worth the nine that a crafting recipe would suggest, because hunger caps at 20 and most of that food would be discarded the moment it was granted, so the duration is where the value went instead. The arithmetic that matters is that an ingot at 4 hunger and 6.4 saturation now stays ahead of the nine nuggets you could split it into, which is the comparison the old numbers had backwards. See POWER_TYPES.md.
-
The step-up ability has an off switch (#123). An origin or class that steps a full block does it whether you want it to or not, and holding shift does not suppress it, so edging up to a drop or lowering yourself onto a ledge walks you straight up the block you were working around. The game offers no way to ask for a step height that yields to sneaking, so the answer is a switch rather than a rule. The Explorer's Climber's Step, the Rogue's Parkour and the Scout's Tracker's Stride now share a Step Assist ability that turns the step height off and back on, with a low note for off and a high one for on. It defaults to on, so nothing changes for anyone who never presses it, and the state is saved with the rest of your toggles rather than springing back on at the next login. With it off you climb blocks by jumping, the same as everybody else.
-
Fire-immune origins stop burning on campfires and blazes. (#129) The immunity checked four damage types by name (standing in fire, being on fire, lava and magma blocks), which left out campfires and both kinds of fireball, so an origin that is supposed to be unburnable took full damage from a blaze and cooked on a campfire like anyone else. It now asks the game's own
minecraft:is_firetag instead of a hand-written list, which covers those cases, agrees with the matching condition that was already using the tag, and picks up fire damage added by other mods without further work. -
The web editor's form view can turn a default-on setting off. Any boolean whose default is
truecould not be set tofalsefrom the form view: the row drew itself unchecked while the power actually behaved as switched on, and ticking the box and clearing it again wrote nothing at all, so the setting looked changed and was not. An unset field now seeds from the schema's declared default rather than a flatfalse. This affected 68 default-true booleans across the shipped power, action and condition schemas. -
The block editor stops writing fields you never set. A block widget has to display something, so an optional field the power does not carry gets drawn with a stand-in, and the canvas was writing every one of those back when it saved. One drag of an unrelated block was enough to turn a damage-halving power into total immunity, because
modify_damagecame back carryingset_total: 0, a field whose own reference entry says to leave it out if you want the multiplied value kept. Nothing on screen looked any different. A leaf still equal to the stand-in the widget had to show is now left out on the way back, and the fields the loaded file genuinely carried are tracked alongside it, so an author who deliberately means a zero keeps it. Powers the canvas cannot draw are put back at their original position rather than at the end, since the order powers are written in is authored data too. -
An
area_of_effectinside a lingering cloud stays with the cloud (#125). The interval action a lingering area runs is executed as the caster, which is right for kill credit and for anything that spends a resource, but it also meant an area effect nested inside it measured its radius from wherever the caster was standing at that moment. Walk away from your own cloud and the damage walked with you, leaving the cloud drawing particles over nothing. The action still runs as the caster; anarea_of_effectinside it now centres on the cloud. -
The Merchant's restocked trades stop showing as sold out. The class refills nearby villagers' trades on a timer, but it refilled them server-side only. A trade's sold-out cross is drawn from the copy of the offers the client was handed when the screen opened, so a trade that had just been refilled kept its cross, and the only way to clear it was to close the villager and open it again. The refill now resends the offers to whoever has that villager open, which is what vanilla's own restock does. It sends nothing when nothing was actually refilled, so an open trading screen no longer takes a packet every couple of seconds for the life of the interaction.
-
Ore goes down in creative mode, the way bread always has. A Caveborn in creative could not eat any of their seven diets, while every vanilla food in the game ate normally, and because the refusal is silent it read as the power being broken rather than as a rule. Our gate asked whether the hunger bar had room, and creative mode is precisely the case where it never does. It now asks the game's own question instead, which is invulnerable or always-edible or genuinely hungry, at both places that had to know, so the two can no longer drift apart. Fixing that surfaced the other half of the same problem: the meal took one from the stack unconditionally, where vanilla food leaves a creative player's stack alone. It now spends the item through the same call vanilla uses, which declines to spend anything for a player with infinite materials. Both halves apply to every
edible_itempower, not only to the Caveborn's. -
A slime rehydrates from a water cauldron and from a water bottle. The moisture bar refilled from water, rain and bubble columns, which is the game's own in-water test, and a water cauldron does not answer to it: a cauldron is a block carrying a level, not a body of water. A slime standing in a full cauldron therefore dried out at exactly the rate of one standing on bare stone, which is the opposite of what anyone builds a cauldron for. Standing in one now refills at the same rate open water does. Drinking a water bottle tops the bar up as well, by half its length, which gives a drying slime something it can carry rather than a source it has to reach. Neither of these is new ground, and that is the point:
breath_out_of_fluidhas handled the cauldron and the bottle for aquatic origins for some time, and the moisture bar simply never got the same treatment. The bottle amount iswater_bottle_refillon the power, so a pack can retune it or set it to 0 to leave water bottles out of it entirely. See POWER_TYPES.md. -
neoorigins:poseholds the player prone, crouched or upright. A forced pose is the missing piece for a crawling origin, a serpent that never stands, or a form that cannot fit through a full-height door:"pose": "swimming"puts the player flat, which carries the one-block hitbox and the crawl animation everywhere, not only in water. It is a power rather than an action because the pose has to be held and then released, and it takes the usualcondition, plustoggleableanddefault_offand a HUD icon, so a pack can hand the switch to the player. Clearance is deliberately not checked: a forced crawl fits through gaps the player otherwise could not, and whether that is too strong is the pack's call. Releasing it hands the player back to the game, which does check, so nobody ends up standing inside a ceiling. Sleeping, gliding and spin-attack are not offered: those poses carry behaviour a pose alone cannot deliver. See POWER_TYPES.md. -
neoorigins:prevent_entity_renderhides entities from the player who has it. Every living entity matchingentity_conditionstops being drawn for that player alone; everyone else sees it normally and the entity itself is untouched, so it still moves, still attacks and still blocks the way. Pair it with something that applies glowing for an origin that sees only what it has marked. The condition is evaluated on the server, which is what lets it usestatus_effectandnbt: a client is never told another entity's effects, so a client-side check would have quietly matched nothing. The hidden set refreshes every five ticks over living entities within view distance, capped at 1024 per player.origins:prevent_entity_rendermaps onto it, so a legacy pack using it works now rather than loading it as an unsupported no-op. -
A morph can play the mob's own animations.
neoorigins:trigger_morph_animationnames a triggerable animation on the GeckoLib model a player is morphed into, and it plays for everyone who can see them. It needs no dependency and no packet: GeckoLib's own trigger call already routes a client-side entity straight into its animation manager, and the morph is a real client-side entity rather than a static model, so it takes that path for free. One hard limit worth knowing before you plan around it: the only reachable names are the ones the mob's author explicitly registered as triggerable; an unregistered name does nothing at all and logs nothing; and there is no way to discover the list from JSON. Vanilla mobs are not GeckoLib models and do nothing here. AzureLib is shaped the same way and could follow; Citadel is not. See ACTIONS.md. -
A morph can run the mob's entity events.
neoorigins:morph_entity_eventfires the hook the server normally uses to tell clients a mob just did something, whether that is an iron golem's attack swing, a villager's angry particles or a wolf shaking off water, so a morph reacts like the mob instead of only sharing its silhouette. The names come from Minecraft's own table rather than a hand-copied list, so they track the game version, and a rawidbyte is there for modded mobs with events of their own. Three limits are documented rather than papered over: events whose sound plays through the entity itself are silent on a morph, events that set a countdown for the mob's own tick to drain hold that pose instead of playing through it, and particle events that read the mob's movement draw their particles streaking in from the world origin instead. The death byte is refused outright, because on a morph it would fire a client-side death for an entity that was never in the world. -
set_blockplaces where you aimed. It was an entity action only, and it placed at the target's feet, so a right-click power aimed at a block changed the ground the player was standing on instead of the block they clicked. It now resolves the position from whatever context it runs in (a block or bonemeal interaction, a projectile or raycast hit, ablock_action_atoroffsetwrapper), and falls back to the actor's own position when there is no block context, which is what it always did. It is also a block-target verb now, so it can be named directly insideblock_target_actionalongsidestrip,till,path,growandtransform_block. Thekeepfield, which places only into air, was never documented. -
item_conditiongates right-click powers instead of being dropped. Apoli'saction_on_block_useandaction_on_entity_useboth take anitem_conditionmeaning "only with this in hand", and the translator never copied it, so a power that was supposed to fire only while holding a specific item fired for whatever the player happened to be carrying. It is carried across now, along with Apoli's newerheld_item_conditionspelling, and the gate reads the stack out of the interaction rather than only out of a food context. Copying the field alone would have made every one of those powers fail instead, since the gate fails closed and had nothing to read.action_on_block_break,wake_upandbonemealcarry no item gate across. See POWER_TYPES.md. -
neoorigins:using_effective_toolasks whether the swing you are making is a productive one. It matches Apoli's condition of the same name and takes no fields. It answers two things at once, and the first is the half that is easy to get wrong: it is true only while the player is part-way through breaking a block and holding a tool that will actually yield its drops. It is false whenever the player is not mid-break, so it cannot be used to ask "am I holding a pickaxe". A power gated on it fires during mining and at no other time, which makes it the right gate for a mining-flavoured effect and the wrong one for an equipment check. See CONDITIONS.md. -
edible_itemcan pay a different amount for one part of its set. The type read a list of items and tags and paid one number for all of them, so anything whose worth varies by form (an ore against its block, an ingot against its nugget) needed a second power, a second tag and a second copy of every field it shared with the first. The newtierslist puts those bands inside the one power. Each entry carries its ownitemsortagsand its ownnutrition, withsaturationoptional and inherited from the power when it is left out. First match wins, so write the narrow bands first, and anything matching none of them falls back to the power's own values. Bands match alongside the top-level lists rather than within them, so a tier can introduce items the power never otherwise mentions. One thing to know before you tune one: saturation is restored as nutrition times the modifier times two, so a band that doubles both grants four times the saturation, which is almost never what was meant. Leavingsaturationoff is the right default. See POWER_TYPES.md. -
All seven Caveborn diet tags are built out of common tags. The stone diet listed its ten blocks inside the power, so it was the one diet a pack could not extend without replacing the whole file, and the other six listed vanilla item ids, so a modded metal was not food until somebody added it by hand. Every one of them is a tag now, and every one is a union of NeoForge's
c:tags: the six materials take theiringots/,nuggets/,gems/,raw_materials/,ores/andstorage_blocks/entries, and stone takes#c:stonesand#c:cobblestonesalongside basalt and blackstone. A modded metal or stone that registers itself where mods normally do is edible with no pack work at all.netherite_scrapis the one literal id left in the set, since NeoForge publishes no common tag for that item. The rebuild closed a gap nobody had reported as such: the refined storage blocks were in none of the old lists, only the raw ones, so a Caveborn could eat a raw iron block and not an iron block. Adding your own item to a tag works exactly as before, and it lands in the matching value band if there is one. See POWER_TYPES.md. -
mod_food_nutritionchanges what a meal is worth as it is eaten. Nutrition could be retuned only through the legacyorigins:modify_foodpower, so a pack working in the native vocabulary had no way to reach it and no event to hang a condition on.action_on_eventnow carries amod_food_nutritionevent that fires for any food actually eaten, with the item itself in context, sofood_item_in_tagandfood_item_idboth gate it. It runs aftermodify_foodand on whatever that left behind, so a pack can use either or both and neither needs the other to be present. The result is rounded and floored at zero. See EVENTS.md. -
The in-game creator checks your ids the way the web editor does. The generated schemas have always carried a pattern for each id-shaped string field, and only the web editor read them: the in-game creator's text rows took anything and left the mistake to surface at load, far from the field that caused it. Each text row now checks its value against the schema's own pattern as you type and shows the same inline complaint the web editor would. It advises rather than blocks, deliberately: the loader is more forgiving than the patterns in a few places (a particle or dimension written without its
minecraft:prefix loads fine), and an editor that refuses what the game accepts is the failure shape 2.2.26 already removed once. Nothing you can load is ever locked out of saving. -
model_colorstacks, and can be switched off from the config. Two tints active at once resolved to whichever one the capability set happened to hand over first, which is not something a pack can predict or arrange around, so an origin with more than one conditional tint had a colour nobody could design. Overlapping tints now average their channels: two produce their midpoint, three their mean, and every client watching sees the same thing. The type also honours the sharedenabledflag, so a server owner can drop a single tint frompower_overrides.tomlwhile leaving the power that carries it in place. -
Four legacy power mappings that never landed now do.
origins:aquatic,origins:conduit_power_on_landandorigins:nether_spawnwere each mapped onto a NeoOrigins type that does not exist, so a legacy pack using any of them had the power silently dropped: nothing failed, nothing was logged, the origin simply came up missing an ability.origins:creative_flightwas worse in a quieter way. It named a type that does exist, just the wrong one, and had done so for five months. All four are retargeted, and every remaining legacy mapping has been walked end to end on both sides rather than only on the name a pack writes, so the mappings that ship are the ones that resolve. -
An
action_on_eventthat names an event which does not exist no longer costs the whole power. An unrecognisedeventfails the power's decode outright, so a pack that guessed a plausible spelling did not end up with a hook that misbehaved, it ended up with nothing, the ability simply missing from the origin with no sign of why.item_use_startis the common guess, and it now resolves toitem_use, which already fires at exactly that moment for anything with a use duration: a shield going up, a bow drawn, food raised. The accepted spellings are offered by both editors as well, so a pack the game loads is never marked invalid on the way in. A name matching nothing at all still fails loudly rather than being quietly swallowed. Only a spelling whose target already fires at the same instant is ever added this way, since a name pointed at a different moment would load and then do the wrong thing, which is worse than the refusal it replaced. See EVENTS.md. -
A pack that writes
neoorigins:where it meantorigins:is salvaged rather than dropped. The compatibility power types answer toorigins:andapace:and nothing else, so an author writingneoorigins:action_on_item_usegot the power dropped outright, with no line in the log explaining why. It is an easy mistake to make, since the mod is called NeoOrigins and every other type they write really does start withneoorigins:. Such a type is now rewritten back toorigins:, but only when the name is one the compatibility layer actually handles and there is no native type of that name, so the 34 names that exist in both vocabularies keep resolving natively. The "unknown power type" warning is more useful too: powers, actions and conditions share a namespace and a naming style, so it now tells you which of the three an unrecognised id actually belongs to. -
The loot function 1.20.5 deleted no longer takes the whole table down with it.
minecraft:set_nbtis gone, and a loot table naming it fails to parse outright, which cascades into every function and advancement that referenced the table, so items a legacy pack was supposed to hand out simply never arrived, with the failure logged somewhere far from the cause. It is retargeted tominecraft:set_custom_data, which takes the identical field, as the file is read. It is not an NBT-to-components converter and does not pretend to be: a blob carrying a key that became a real data component is left exactly as it was and reported, so the table still fails, but it fails loudly instead of quietly handing out an item with its enchantments missing. -
A legacy
starting_equipmentwritten with a singularstackgrants it. Packs in the wild are written with both spellings; NeoOrigins read only the plural, so a power using the singular was skipped and gave the player nothing, without an error. Both spellings are read now, with the plural winning where a pack has somehow written both. See COMPATIBILITY.md. -
Item NBT paths that step through the deleted
tagfield are repointed. 1.20.5 removedtagfrom item stacks, and this is the worst shape of breakage a pack can carry: a path likeSelectedItem.tag.Foostill parses and still runs; it just resolves to nothing, so neither the command parser nor a load-time check can see anything wrong and the pack fails silently in game. Both spellings are repaired (the dot path, including subscripts, and the brace form inside a selector), and this one runs unconditionally rather than behind a parse check, because on 1.21 no item stack carries atagfield in any context, so there is no valid path of that shape to break. Quoted text is skipped and the commands whose payload is free text are excluded, so atellrawthat happens to mention one is left alone. -
set_blockreaches legacy packs that used it as a block action. In Apoli it is a block action and places at the block the power was aimed at. Because the translator flattens a block action into an entity action, adding the block-side verb alone would not have reached these packs at all; the fix is the context resolution above, which is what makes the flattened form land in the right place. -
A legacy repeating action that names no
intervalfires once a second, not twenty times. Apoli'saction_over_timedefaults its interval to 20 ticks, and packs lean on that: leaving the field out is normal upstream. Our compatibility layer defaulted it to 1, so such a power ran its action on every tick, which is twenty heals, twenty particle bursts or twenty command executions a second, and a pack tuned around the upstream pace ran twenty times hot with nothing in its file to show why. The default is now 20, matching Apoli and matching our owncondition_passive, which has said 20 all along. A power that writes its ownintervalis untouched. -
The compat layer's night-vision and diet mappings outlive the alias table. Five well-known Origins powers (
night_vision,cat_vision,water_vision,carnivore,vegetarian) were compiled into two retired NeoOrigins type names that only still load because the legacy remap catches them on the way in, and that remap is scheduled to go. They now emit the canonical forms directly: an ambient, particle-freepersistent_effectfor the visions, and an event-cancellingaction_on_eventdiet gate for the two food rules, each byte-matching what the remap produced. Nothing changes in game, which is the point: when the aliases retire, these five keep working instead of being the surprise. -
Two condition ids that never existed stop being claimed as supported.
neoorigins:lavaandneoorigins:watersat in the compat condition catalogue with no implementation behind them, put there by a build-time audit that misread the fluid ids insidesubmerged_inandfluid_heightas condition types. A pack writing one was told nothing, since the id was "known", and the condition then failed anyway. Both are gone, the audit no longer manufactures them, and writing one now earns the ordinary unknown-type warning that points you atin_water,in_lavaandsubmerged_in, which are the conditions that exist. -
The game starts again if you have The One Probe installed. This one blocked the mod outright rather than degrading it, and it took no unusual setup to hit: installing TOP alongside NeoOrigins was enough. TOP publishes its version as
1.21_neo-12.0.8, and NeoForge compares version ranges piece by piece from the left, so our lower bound of 12 was tested against the leading1of the Minecraft version and failed every time. The12.0.8was never reached. The message named the right numbers and still made no sense to read: "only supports theoneprobe 12 or above. Currently, theoneprobe is 1.21_neo-12.0.8". NeoForge enforces a range even on an optional dependency, so this was a hard stop at startup. The bound is gone, and it was never doing anything: the integration is already behind a check for whether TOP is loaded, with every TOP-specific reference confined to its own package, so an old or missing TOP cannot reach the code either way. -
Dragon Survival and the origin picker stop knocking each other off the screen. Both mods open a screen when you join, Dragon Survival when its species-choice setting is on and NeoOrigins because the server asked for a pick, and whichever arrived second replaced the first. That is how players were being thrown out of the origin picker, and because it was a race, which screen you lost was not even consistent between joins. The old setting was a plain on/off switch whose two positions were "leave the race alone" and "cancel Dragon Survival's screen outright", so neither of them was what most people wanted. It is now
compat.dragon_species_screens, with three positions:DEFER, the new default, holds Dragon Survival's screen back and opens it the moment the origin picker is finished, so neither mod loses its screen;SUPPRESScancels species screens, as the old "on" did;ALLOWnever interferes, as the old "off" did. The interception runs both ways, so it does not matter which mod wins the race. UnderDEFERandALLOW, a species screen you opened yourself (from an altar, the inventory button or a command) is left alone; only one that would trample the picker is caught. Dragon Survival's appearance editor, skins, abilities and inventory are never touched under any setting. It is a client setting, so nothing changes on the server or in Dragon Survival's own config. See COMPATIBILITY.md. -
Three client-config defaults were documented as their opposites.
hud_ability_displaydefaults toCOOLDOWNS_AND_TOGGLESand was written asALL_ACTIVE_ABILITIES,default_sortdefaults toMANUALand was written asCLASS, andalways_show_iconwas described as having no effect under the default mode when the default mode is exactly where it matters. All three are the shape of error that costs nothing at load and shows up as a HUD or a picker that does not look the way the page said it would. See CLIENT_CONFIG.md. -
Origin layers merge additively, not by replacement. The cookbook told authors that a second pack's layer file replaces the
originsarray and that they should therefore copy the full list across, which is both wrong and the opposite of the sentence immediately before it in the same paragraph. Layers merge by appending, deduplicated by id, with"replace": trueas the opt-out. Copying the full list was at best redundant and at worst a maintenance trap, since the copy goes stale the moment the original pack adds an origin. The ordering rule is spelled out alongside it: display order comes from each origin's ownorderfield, not from position in the array. See COOKBOOK.md. -
The legacy-pack repairs are written down. COMPATIBILITY.md gains a section covering every syntax-level repair applied while a 1.19/1.20 pack is read, what each one does, and what is deliberately not covered. That last part is the one that matters when a pack still misbehaves.
SkullOwneris called out by name: it became the profile component, it is not in the mapped set, and a legacy pack handing out a named player head gets a blank one with no warning. -
starting_equipment's plural form is documented. The type has taken astacksarray for some time and the reference described only the single-item shape, so multi-item kits were being written as several powers. The two shapes do not combine, since a non-emptystacksignores the root item entirely, and onegrant_idseals the whole bundle, so a single bad item id is worth planning around. Both are now spelled out with a worked example. See POWER_TYPES.md. -
prevent_entity_renderand the evolution prompt describe what the code does. The former hides living entities only, so boats, minecarts, item frames and dropped items were never candidates despite the page saying every entity was. The latter had no written description of when the prompt appears or what declining does; EVOLUTION.md now has one, and KUBEJS.md lists theevolutionDeclinedevent beside it with the conditions under which it fires. -
An Orb of Origin does reset your evolution, whatever the page said. EVOLUTION.md claimed the orb left essence kills, tier and a declined tier untouched, and that only two things could clear a decline. Spending an orb clears all three fields, so three things clear a decline, not two. This is worth calling out rather than quietly fixing, because the cookbook had it right on the same page-set: the two documents contradicted each other, and if you planned around the wrong one, an orb has been resetting more than you expected all along.
-
A native
active_abilitycan use a named hotkey, whatever the reference said. POWER_TYPES.md and API.md both stated it could not, and sent authors off to rewrite the power as an Apoli-styleorigins:active_selfto get one. It was never true:keyis not on the codec, but the loader reads it out of the power's own JSON for every active power, native ones included, and binds it like any other. Both denials are gone andkeynow has a row in theactive_abilitytable.neoorigins:togglewent the other way and has lost the field: it declaredkey, so both editors offered it and the schema accepted it, but a toggle is not an active power and a keypress had nothing to run even once it arrived. The toggle section says so now, and points at theactive_abilitythat flips it. -
The power reference's field tables were re-read against the codecs. Four sections listed fields the codec never reads or carried no table at all, and three types had no section anywhere:
apugli:action_on_jump,apugli:action_on_target_deathandaction_over_time. Eleven fields were marked required that are not, and each now says what actually happens instead, which is rarely nothing: a modifier seam given neithermodifiernormodifiersis not refused by the schema, but the loader drops the whole power rather than leaving the multiplier sitting at 1.0. Two entries were simply false.biome_buffwith nobiome_tagdoes not apply everywhere, it applies nowhere, the default being an empty tag that matches no biome; and the rootamplifieron thepersistent_effectfamily overrides the firsteffectsentry alone rather than cascading onto all of them, winning even over one that entry sets for itself.enabled, the per-power kill switch, is written up on the six types that take it. See POWER_TYPES.md. -
The rest of the reference was re-read against the code, not against the older prose. Four more claims did not survive it. The Caveborn's diet section listed five eating powers when there are seven. The copper tint was described as green-orange; it is orange. The burning-under-Emerald-Reprieve note explained itself with a rule about fire immunity that is not how the game works: Fire Resistance cancels fire damage and never puts the fire out, and it is the sunlight power re-lighting you each second that keeps you alight. And the compatibility page promised that a Dragon Survival species screen you opened yourself always behaves as it would without NeoOrigins installed, which holds under
DEFERandALLOWbut not underSUPPRESS. Two sentences describing what Apoli itself declares have been rewritten to describe only what NeoOrigins does, since we cannot verify the first kind and that is exactly how the others got in. -
gameplay.tomlandadmin.tomlhave reference pages at last. Two of the four config files had none, so the options between them (the Orb's XP cost formula, random assignment, the evolution kill thresholds, ocean-origin survival tuning, the command-power blacklist, dimension restrictions) were configurable and written down nowhere but the file's own comments. GAMEPLAY_CONFIG.md and ADMIN_CONFIG.md now cover every section, key, default and range. CONTENT_CONFIG.md also stops calling all four files server configs, because onlycontent.tomlis one: it alone is synced to clients and overridable per world, while the other three load early, apply to the whole install, and enforce server-side. The distinction decides where you edit and whether a per-world copy will be honoured, which is exactly the thing to get right on a page about config files. -
The event contexts say what a handler is actually handed. Eight of them had drifted:
hit_taken,killandprojectile_hitall carry the live, cancellable event in their context and the page did not say so;death's context is the event;landhas a second dispatch site (a per-tick ground-contact detector for landings the fall path never sees) where the context is empty andcancel_eventdeliberately does nothing; and the paragraph onmod_break_speeddescribed a removed event as though it still fired. Alongside them,add_velocitygains its missingspacerow with all eight Apoli reference frames,dashitsset_velocity, andspawn_projectile's count admits it defaults to 1 for a plain projectile and 2 for an orb trail. See EVENTS.md and ACTIONS.md. -
The API index is exhaustive again, and now provably. API.md promises a complete list of everything registered, and it had fallen to roughly two thirds on conditions and actions: 21 conditions, 17 actions and 17 events were registered, working and listed nowhere, so a reader took the absence as the feature not existing, which is the same failure 2.2.25 fixed for power types. All four lists were regenerated from the registries (122 power types, 108 conditions, 95 actions, 51 events, with the 26.2 build counting two types and one action fewer, the KubeJS-backed ids it does not ship) and verified by script in both directions, so an id in the code is on the page and an id on the page is in the code, with zero exceptions either way. The page's description of how legacy packs are translated was corrected in the same pass:
origins:andapace:go through the translator,apoli:andapugli:are canonicalized toorigins:first, and the legacy alias table covers only the odd cross-mod id rather than being the pipeline itself.
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:RUtQ9kfe:qDqSq35S"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:RUtQ9kfe:qDqSq35S"
}

