NeoOrigins v2.2.25 (MC 1.21.1)
Curse Maven Snippet
What's new
v2.2.25
A documentation release, with a run of server-reported fixes riding along. The API reference index linked barely half of its power types.
entity_model,restrict_itemsandcreative_flightwere documented in full and reachable from nowhere, so a reader who looked one up found nothing and reasonably concluded the feature did not exist. Every type has a row now. The verification pass that followed went back over the reference against the code rather than against the older prose, and it turned into the larger half of the release: fifteen summaries were wrong or misleading about what their class does, five documented fields do not exist under those names, six defaults were wrong, and one power type advertised three verbs that all silently teleport the player somewhere random. The fixes are unrelated to each other and all came from live servers. An invisibility power with a condition on it hid the body and left the armor and held item floating — the unconditional ones always worked, which is why it survived so long. A misconfiguredattribute_modifiercould fill an operator's log for as long as a player held the power, several lines a second, with a message that never said what was wrong. An origin with an empty slot in its power list did not load at all. And a keep-inventory origin dropped the armor it had just promised to keep, but only once your inventory was full, which is what made it look random. A second pass over the older reports found three of them worse than described: a grounded player wearing wings was cutting the elytra sound off for everyone gliding past, the clamp that keeps a phasing origin out of the few blocks it is barred from was collided against every block in range instead, and a player being ridden was the one person in the world who could not see their own rider. Two editor corrections close gaps left open in 2.2.24, and on the compatibility side an Artifacts umbrella finally keeps the sun and the rain off.Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)
Changes
- Ore counts as food for the Caveborn. The four tags listing what a Caveborn can eat besides stone held ingots, nuggets, gems, raw metal and netherite scrap, and no ore at all, so a Caveborn standing at a freshly exposed vein had nothing in front of it that it could eat. Iron, gold and diamond ore now qualify, along with their deepslate forms, and so do nether gold ore, ancient debris and the raw iron and raw gold blocks. One thing worth knowing: ore is a placeable block. Aiming at a surface places it, as it always did, so eating one means aiming where it cannot be placed. That is the same rule the Caveborn's stone diet has always followed. ORIGINS.md lists the tags.
- The four aquatic origins say what keeps them from drying out. Dries Out told you two things — air ticks down while you are out of water, and staying too long suffocates you — so every way of stopping the drain was something you had to be told about or stumble into. The description now names them — rain, standing in a water cauldron, Water Breathing, and an active conduit nearby. Abyssal, Kraken, Merling and Siren all read the same, in every language the mod ships. POWER_TYPES.md says the same beside the type.
Bug Fixes
- An invisibility power with a condition hides armor and held items, not only the body. Powers that turn invisibility on unconditionally were always fine, which is what kept this hidden. The armor-hiding flag was read from the condition-gated capability set, and it only reached the client when something else triggered a power sync — never at the moment the condition itself flipped. So a conditioned power froze the flag at whatever it was worth at the last sync: the body vanished on cue, and the boots and the sword stayed. The flag now comes from the power itself rather than from its live condition state, which is what it always meant ("hide the armor when invisible"), and the client already re-checks whether you are actually invisible before hiding anything. Invisibility itself is unchanged. Cosmetic elytra wings and morph state are left alone on purpose: nothing on the client re-checks those, so treating them the same way would draw wings on a player whose condition is not met.
- A misconfigured
attribute_modifierreports once instead of every few ticks. The power re-tries the attachment whenever it should be active and is not. That is the right behaviour while the attachment can still succeed, and a permanent log flood once it cannot. Naming something that is not an attribute is the common way to get there, and the old message never said so. It does now. If the id is a mob effect —haste,night_visionand friends are the usual ones — it can never resolve as an attribute, and what the effect actually wants is anapply_effectaction. The warning also names the prefixes that were tried, and repeats for the same id are suppressed. - An origin with an empty entry in its power list loads instead of vanishing. A single
nullinpowersfailed the whole origin, so it never reached the picker, and all you got was one line repeating "not a string" once per empty slot, naming the origin but neither the field nor the position that caused it. The empty entries are now dropped and the origin loads with every power actually named in it, with one warning giving the origin id and how many were skipped.upgradesand theadd/removelists insidetier_powersare covered the same way. A trailing comma or a deleted line in a hand-edited file is the usual cause, so it is still worth fixing the file rather than leaving it to the warning. - The creator keybinds stop writing a server warning on every press.
Player X requested the mob creator without permissionwas a keybind collision, not something to act on. The open-creator keys ship unbound, the client sends a packet per press, and the server logged each refusal at warning level — so a player whose key overlapped something they use in normal play filled the operator's log just by playing. Both open paths log at debug now. Refusing a save or an apply still warns, on purpose: those are only reachable from inside the creator screen, so a refusal there is worth an operator's attention. - The elytra loop stops when you land, rather than starting again twenty times a second. True of every origin that flies without an elytra in its chest slot. The guard that ends a flight ran its whole body on every tick the player was on the ground, in water or riding, instead of only on the tick the flight actually ended. On your own client that meant the fall-flying flag going on and straight back off once per tick, and the client starts a fresh elytra sound on the rising edge, so the loops stacked and got louder the longer you stood still. The server side reached further than the player it belonged to: it was broadcasting a stop-sound to every player within 64 blocks, twenty times a second, so standing on the ground with wings silenced the elytra of anyone genuinely gliding past. Both halves now fire once, when flight ends.
- A phasing origin stops sticking inside ordinary blocks. Phasing powers carry a short list of blocks they are not allowed through, and the clamp that enforces it asked the game's general-purpose collision routine to check the player against that list. That routine always adds the surrounding world to whatever list it is handed, so the clamp collided the player against every block within reach — the exact opposite of a blacklist — and a Wraith that strayed near one blocked block froze solid in stone it was entitled to walk through. The clamp now checks the listed blocks and nothing else. The Wraith's own description has been corrected alongside it: it said the Wraith cannot pass obsidian at all, where the apex form is stopped only by bedrock.
- A player being ridden can see who is riding them. Everyone else could. A player is never in their own tracking list, so the update naming their passengers was the one packet that never reached them, and their own client went on drawing an empty back until something unrelated forced a refresh. Consent-based mounts already worked around this by resending it by hand, but that is not the only way to end up ridden: the Apoli-compatible mount action, the built-in one, the
mountpower and summoned minions all take a seat directly, and none had that workaround. The resend now happens where a passenger is seated, so every route is covered. - Keep-inventory puts everything back where it was, instead of dropping your armor once your bag is full. Reported from a live server, and the fullness is the whole of it. Everything kept at death went back through the routine that adds an item to your inventory, and that routine only fills the main thirty-six slots. With the wildcard
*covering every slot you have, the first thirty-six kept stacks refilled the main inventory, and the four armor pieces and the offhand item had nowhere left to go, so the power dropped them on the floor — the one outcome it exists to prevent, and it only happened to players carrying enough to trigger it, which is why it looked arbitrary. Even with room to spare it was never quite right, since armor came back loose in the bag rather than worn. Kept items now return to the exact slot they were taken from, which is empty by construction, because dying is what emptied it. Armor comes back on, the hotbar keeps its layout, and a full inventory can no longer push anything onto the ground. - An origin that cannot find its spawn dimension says which one it wanted. A
spawn_locationnaming a dimension that no loaded world provides gave up without a word, which in game reads as picking the origin and simply not being moved, and in the log reads as nothing at all. The warning now names the dimension and the player, so a typo or a missing mod is the first thing you see rather than something to go hunting for. - An active conduit keeps an aquatic origin from drying out on land. The exemption had been in place for months and could never once have fired. The game only hands Conduit Power to a player who is already in water or rain, so an Abyssal, Kraken, Merling or Siren standing on dry ground beside a conduit was never given the effect the exemption goes looking for. The one case that appeared to work was walking ashore near one: the effect carried out of the water, lasted about thirteen seconds, then lapsed with nothing to renew it. That is why it read as working sometimes rather than never. A conduit now reaches a drying-out player anywhere inside the radius it already uses for everything else, and the bubble row refills while you stand in it instead of holding at whatever it had drained down to. Pack authors get the same reprieve in
attribute_modifier'son_landcondition, which was written to stand down under Conduit Power and never once had the occasion to. It does now — for a player whose origin also carries a drying-out power, since that is who a conduit reaches on dry land. An origin without one is unchanged. See POWER_TYPES.md.
Pack Author Features
- Block conditions written as
all_ofandany_ofstop being marked invalid. Both are the Apoli 2.9+ spellings ofandandor, and the loader has always read them. The block condition catalogue behind the editors, and the generated schema, listed only the short pair, producing the one failure shape an author cannot debug from inside the game: the file works, and the editor says it does not. 2.2.24 documented the workaround of writingandandorthere instead, which you no longer need. Both spellings are now in the catalogue, the schema and the editor pickers, and nothing you have already written changes behaviour. See CONDITIONS.md. status_effect'sambientandshow_particlesadvertise the loader's real defaults. They were declared the wrong way round —ambientas defaulting to false andshow_particlesto true, where the loader does the opposite. A form field or a generated schema told you the inverse of what omitting the key would do. These two are exactly the pair where a wrong default costs nothing at load and shows up only as particles you did not expect, once you are already in game. The reference tables were right all along and are unchanged.- The example pack drops a
tick_actionpower that never fired. The Specter's Dimensional Escape declaredaction_type: teleport_on_damageon a type that dispatches nothing, so the origin advertised a teleport that could not happen, and it was the only worked example of the type an author had to copy. It is removed rather than rewritten, sincecondition_passiveis what to copy for anything that runs on an interval. The Specter's other nine powers are unchanged. MIGRATION.md says what to write instead.
Compatibility (Mod Integrations)
- An Artifacts umbrella keeps the sun and the rain off. Origins that burn in daylight and origins that take rain damage both look for an umbrella before they hurt you, but only Vampires Need Umbrellas ever counted as one, so an Artifacts umbrella held in plain sight did nothing. It works now, held in either hand or worn in a trinket slot, and one umbrella covers both weaknesses rather than only the one it was carried for. What counts as an umbrella is a new
neoorigins:umbrellasitem tag, so a pack can add any other mod's umbrella to it without touching code. COMPATIBILITY.md documents the tag. - Keep-inventory covers trinket slots, and a kept trinket waits for its slot rather than being dumped in your bag. On 26.1 and 26.2 the coverage is new:
slotstook only the vanilla categories there, so a Curios ring matched nothing and dropped on death like anything else. All three versions now readcurio,accessoryortrinketas meaning every trinket slot, or a specific slot id such asringornecklace, and the wildcard*includes them. A kept trinket goes back into the slot it died in. Those mods rebuild their slot counts on their own schedule after a respawn, so a slot that is not writable the instant you land is usually a matter of timing rather than a slot that is genuinely gone: the trinket is held and retried for three seconds instead of being given up on, and only after that does it fall back to your inventory, and to the ground only if that is full as well. Logging out part-way through settles it the same way rather than losing it. Curios is read on every supported version; Accessories on 1.21.1 only, as it has no 26.1 or 26.2 build. POWER_TYPES.md documents the slot names. equipped_itemwithequipment_slot: accessoryreads your trinkets on 26.1 and 26.2. 1.21.1 already did. A slot name the mapper does not recognise falls through to the mainhand, so on those two versions the condition quietly answered about whatever the player happened to be holding. It never errored and never logged, which is the hardest kind of wrong condition to find: the file looks correct, and the power simply behaves as though you had asked about the held item. It now inspects equipped trinkets, with an optionalslot_typeto narrow to a single named slot. CONDITIONS.md documents both fields.
Documentation
- The API reference index lists every power type. It listed barely half of them, so a reader looking up
entity_model,restrict_itemsorcreative_flightfound no row and no link. Every documented type has one now, including a new group for the mod-compatibility types. Four rows were wrong rather than missing:sneaky,stealth,no_projectile_divergenceandtick_actionsat under retired aliases, but none is an alias: all four are registered types with their own implementations. They move to their live categories, andnight_vision's replacement is named correctly aspersistent_effect. See API.md. - Fifteen power-type summaries corrected against the code. Each was re-read against its implementation class rather than against the older prose. The ones that change what you would write:
tick_actiondispatches nothing at all, so "run an action on a repeating interval" described a feature that is not there;no_projectile_divergencepointed atminecraft:projectile_accuracy, an attribute that does not exist, so the suggested modifier could never resolve;wraith_phasenever grants flight;mountneeds no consent unless the server config asks for it; andloot_pool_grantfires once pergrant_id. The rest tighten wording that was true and misleading —modify_flight_speedleaves elytra gliding alone,mob_behavioradds goals rather than replacing the vanilla AI,restrict_itemshas two independent opt-ins,extra_inventorysizes in slots rather than rows, andslime_level_hptracks the current level rather than resetting on death. POWER_TYPES.md carries all fifteen. - Field tables and examples the loader does not match. Five documented fields do not exist under the names given:
knockback_modifier'sdirection,thorns_aura'sreflect_ratio(the real key isreturn_ratio),action_on_hit_taken'samount,persistent_effect'srefresh_interval, and the enchantment item condition'smin_level(the real keys arecomparisonandcompare_to). Worse,action_on_hit_takenadvertisedrestore_health,restore_hungerandgrant_effect, none of which has an implementation: all three fall through to the default and teleport the player somewhere random — and the worked example asked forgrant_effect, so it did the one thing its own title said it would not. Six defaults were wrong, andexplode'sdestruction_typewas documented backwards: absent means no blocks break, not the reverse. Theaction_on_eventexample usedslotanditemon an equipped-item condition, which readsequipment_slotanditem_condition, so it matched any mainhand item rather than the wooden sword it claimed to test. The corrections span POWER_TYPES.md, CONDITIONS.md and ACTIONS.md. - The pack folder layout shows every folder a pack can carry. It listed three, so morphs, entity groups, mob origins and global powers were invisible to anyone reading the pack reference, and the morph feature was documented in full and reachable from nowhere else. The layout now shows all of them, each pointing at its own doc, with a note that the original Origins mod layout still loads unchanged. A hand-written
morph.schema.jsoncomes with it, so the editors read morph files like every other type. See PACK_FORMAT.md. action_over_timeandtick_actionpoint somewhere useful.action_over_timewas a registered alias mentioned nowhere at all — not in the reference, not in the retired table, not in the migration guide. It loaded and ran exactly as written, and an author who inherited one had nothing to read about it. It has a migration entry now, alongside the other types that fold intocondition_passive.tick_actionpointed ataction_on_event, wherecondition_passiveis the closer replacement and takes the same interval field. See MIGRATION.md.- Four reference links that never resolved. The links to
condition_passive,block_target_actionand the cookbook's toggleable-abilities recipe all landed at the top of the page instead of at the section, with the cookbook link broken in two different files. All four now land on the section they name. - What holds off a dry-out, said the same way everywhere it is written down. The origin list had Dries Out as damage out of water in hot biomes, where the power is not biome-gated at all: air drains anywhere on land, and you suffocate when it empties. The power type reference named Water Breathing and Conduit Power without ever saying that rain, a bubble column or standing in a water cauldron counts as being in the water — and it read as though those reprieves applied to
fluid: lavaas well, which is the bare check with none of them. The cookbook's moisture note gains Water Breathing and Create's backtank beside the rest. ORIGINS.md, POWER_TYPES.md and COOKBOOK.md now agree. - The mob origin schema is published alongside the other four.
mob_origin.schema.jsonsits in the schema folder, in the README's table and in its IDE-validator mapping, and in the API reference's validator list, so an editor pointed atdata/*/origins/mob_origins/*.jsonnow checks the file the way it already checked origins, layers, powers and morphs. See schema/README.md. - Attribution for the bundled spectral sword travels with the mod. The blades
spawn_sword_rainsummons are a third-party model under Creative Commons Attribution 4.0, and that licence asks for credit to travel with the file. ACREDITS.mdat the root names the author, the source and the licence it is used under, and points at the bundled font licensing beside it.
This mod has no additional files

