promotional bannermobile promotional banner

NeoOrigins

A modern port of Origins
Back to Files

NeoOrigins v2.2.22 (MC 1.21.1)

File nameneoorigins-2.2.22+1.21.1.jar
Uploader
CyberDayCyberDay
Uploaded
Aug 3, 2026
Downloads
3.1K
Size
11.5 MB
Mod Loaders
NeoForge
File ID
8567670
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:neoorigins-1495375:8567670"

Learn more about Curse Maven

What's new

A legacy-compatibility and morphing release. The headline: two compatibility actions that packs lean on constantly turn out never to have worked. apply_effect resolved its effect id only from a bare string, but two hundred and fourteen of the two hundred and twenty-eight uses in the pack corpus nest it in an object, so those powers loaded, appeared on the origin, and applied nothing at all; origins:choice read the wrong key for its wrapped action, so it rolled a branch and then ran nothing. Both are fixed. Legacy 1.20-era packs also have their .mcfunction files rewritten as they are read, which took a Fairytale Origins test install from forty-two failed function loads down to nine (#118), and entity_model grows from a bare model swap into a full morph system with datapack-defined morphs, matching hitboxes, borrowed entity sounds, skin overrides, and first-person arms. Plus ten more legacy Apoli conditions understood instead of failing closed, real editor forms for twenty-nine alias power types that used to render as raw JSON, and three stability fixes: ocean origins no longer hang the server while picking a spawn point, origins:lava_vision no longer paints the whole screen a flat colour (#121), and aquatic origins dry out on land in the fifteen seconds vanilla fish get rather than two and a half minutes (#120), though an existing config file keeps the old value until you edit it.

Supports: Minecraft 26.1.x (Java 25) · Minecraft 26.2 (Java 25) · Minecraft 1.21.1 (Java 21)

  • entity_model is now a full morph system, not just a model swap. The power previously took a single entity_type and rendered you as that model. It now describes a whole morph. nbt selects a variant (sheep colour, villager profession, slime size); scale (default 1.0) sizes both model and hitbox; hitbox (default true) swaps your actual collision box and eye height to match, so a slime morph really does fit where a slime fits; render_held_item and render_armor (both default true) control whether your gear draws on the morph; first_person (default "item") chooses what you see in your own hands, accepting "item", "arm" for the morph's own limb, or "hidden"; and arm names an explicit bone if the automatic search picks the wrong one. Morph state is broadcast to every client tracking you, so other players see the morph too, not just you.

  • Datapack-defined morphs. A file at data/<namespace>/neoorigins/morphs/<name>.json declares a reusable morph, and a power references it with "morph": "<id>" instead of spelling every field out inline. A bare name resolves to neoorigins:<name>, and a file whose id matches a built-in overrides it. Ten morphs ship built in (slime, magma cube, sheep, cat, villager, creeper, zombie, skeleton, enderman, and spider), and all are datapack-overridable. An unknown morph id logs a one-time warning and resolves to no morph rather than failing the power. See POWER_TYPES.md for the full field reference.

  • Morphs can borrow the entity's sounds and reskin the player. entity_sounds (default true) makes your hurt, death, fall, swim, and splash sounds come from the morph's entity type. A sounds object overrides any of them individually by sound-event id (hurt, death, fall_small, fall_big, swim, splash, splash_high_speed). For player-shaped morphs, a skin block sets texture, cape, and elytra asset ids and a model of "slim" or "wide"; anything left unset falls through to the player's real skin, so you can restyle only the parts you care about. Step sounds still come from the block underfoot, as in vanilla.

  • Twenty-nine legacy alias power types now have real editor forms. Legacy types carried by the compatibility layer (the four persistent-effect aliases, seven condition_passive aliases, fourteen action_on_event aliases, and four stragglers) had no schema branch of their own, so both the web editor and the in-game editor fell back to a raw-JSON box and left the author to spell every field from memory. All twenty-nine are now modelled, and the allowlist that exempted them is empty. Alongside that: the power type picker is grouped by namespace and reads compatibility types straight off the parser rather than the native registry alone, so nothing is missing from the list; scalar-or-array reference fields (roughly twenty of them) render as proper pickers in both editors instead of raw JSON; and the top-level enabled kill switch and action_on_event's hit_dealt event are declared where they were being read but not described. The thirty-one native types that fall back to codec reflection, among them multiple, status_effect, glow, and night_vision, get their display name, description, hidden flag, and required_mods rows back. Those keys belong to no power's config record, so the fallback path had never offered them even though a datapack could always write them by hand.

  • The schemas no longer reject JSON the mod itself accepts. Three separate cases where the editors flagged a perfectly good file as invalid. The layer schema never declared standalone, took name as a plain string only, and allowed only bare-id or single-object origin entries, while the layer loader accepts all three of the shapes it left out. The item-condition schema demanded a type that the parser has never needed, so the typeless id / item / tag shorthand, which NeoOrigins' own Jianxian powers use, failed the mod's own schema. And prevent_action declared its two enums in lowercase only, though the power upper-cases before matching, so the sixteen shipped powers written in SCREAMING_CASE were all reported invalid while working perfectly in game. All three now describe what the loader actually does.

  • The web editor imports upstream Origins-layout packs. The importer matched only the editor's own native layout, so every pack laid out the Origins way failed at the origin step. It now tries native then compatibility layouts for origins, layers, and powers, the same pairing the server-side loaders already use, with the compatibility pattern excluding sibling directories, so origins/powers/foo.json no longer imports as an origin called powers/foo. Three ways it used to lose data are fixed alongside. It read only the nine origin fields the Identity tab covers and discarded the other six, so a round trip through the editor silently stripped evolution tiers, spawn placement, required mods, the special flag, and Figura model keys. Fifty-eight of the seventy-eight shipped origins carry tier powers, so that was the normal case, not an edge one. Unmapped keys now ride along and are written back verbatim, and the import says what it carried. A name written as {"text": "Asura"} was flattened to an empty string, which blanked the name and description of six of NeoOrigins' own origins on import. And importing a built-in power threw on a Svelte proxy and appended nothing at all.

  • lava_vision can set its fog distances directly. The power took only a multiplicative strength, which scales both of vanilla's lava fog distances at once, so there was no way to say "fog starts at zero blocks and ends at fifteen". Two optional fields, start and end, now set those two distances in blocks outright, and either may be given on its own, with the plane you leave out still scaled by strength. Values that cannot describe a fog volume, a multiplier of zero or less, or an end at or before start, are discarded rather than applied, so a malformed field can no longer blank the screen. When more than one active power grants lava vision the most generous of each is taken: the largest multiplier, the nearest start, the furthest end. See POWER_TYPES.md for the field reference.

  • Wiring up a spare orb is documented. The four inert orbs (gold, pink, purple, and teal) ship with no behaviour on purpose, for datapacks to bind. A new worked recipe walks the whole path end to end: a custom origin layer, an action_on_event power that opens the layer picker scoped to it, the global-power grant that makes the orb work whatever your origin is, and a crafting recipe for the orb itself. See COOKBOOK.md § 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_ticks shipped at 10, meaning one air point lost every ten ticks out of a supply of three hundred: two and a half minutes of standing on dry land before drowning damage even begins. Vanilla cod and salmon lose one air point per tick, so fifteen seconds, and the power is written to mirror them. The default is now 1. The config comment is what produced the wrong number: it correctly described vanilla fish, then recommended 16 as the fish-comparable setting, which is four minutes. It now gives the arithmetic instead. Land time in seconds is roughly (300 * value) / 20, so the number stays checkable against the behaviour. If you have run the pack before, note that config files are written once and never re-defaulted: an existing config/neoorigins/gameplay.toml keeps drain_rate_ticks = 10 until you edit that line by hand or delete the file and let it regenerate. If fifteen seconds is too harsh for your pack, raise the number (2 is thirty seconds, 4 is a minute) or set dries_out = false to switch the mechanic off entirely.

  • Ocean origins no longer lock up the server while looking for somewhere to spawn. Five aquatic origins, plus Forest Dragon and Enderian, find their spawn point by asking the world for the nearest matching biome, and that search ran on the server thread at a radius of 12800 blocks with a sixteen-block step: around thirty million climate samples in the worst case, with nothing able to interrupt it. Under ordinary worldgen an ocean sits a few hundred blocks out and the search finishes in milliseconds, which is exactly why this never surfaced in testing. Install a biome or terrain mod that pushes oceans away from world spawn, or one whose own oceans are not in the minecraft:is_ocean tag, and the search runs to exhaustion instead: the server thread stops responding and Minecraft's sixty-second watchdog kills the server, with nothing thrown, so it reads as a crash with no cause. The search now runs on a worker thread with a five-second budget, bounded by vanilla /locate biome's own numbers (radius 6400, horizontal step 32, vertical step 64), about twenty-seven times fewer samples. One consequence worth knowing: a matching biome that exists only between 6400 and 12800 blocks out is no longer found, and the player spawns normally with a line in the log. [spawn_location] teleports_enabled = false still disables the whole path.

  • Origin spawn teleports no longer freeze the server while terrain generates. Once a spawn point was found, the step that turns it into a standable position force-loaded chunks a block at a time, and each of those loads blocks the server thread until the chunk exists. Landing in ungenerated terrain on a pack with worldgen mods installed therefore meant twenty to thirty seconds of a completely unresponsive server before the player was placed. The chunks that step needs are now requested up front through the ordinary chunk ticket system and polled once per tick, so the server keeps running while they generate and the placement happens only once they are all present. If they have not arrived within thirty seconds the teleport is abandoned and the player spawns normally. Placement passes over a candidate column whose clearance check would read outside the loaded area, rather than generating more chunks for it. Because the teleport now lands a generation-time later rather than on the next tick, a player who changes dimension while it is still waiting is left where they are instead of being pulled away.

  • Two hot server paths stop doing work for players who cannot trigger them. Every monster spawn attempt walked every player in the level and every power they held looking for a spawn-warding power that almost nobody has; that scan is now gated on a cheap per-dimension probe, and the distance check it does reach dropped a square root. Separately, the capability lookup that six server mixins call per tick and per block walked the whole power list and allocated a set on every call; it now consults a cached union of the static capabilities first, used purely as a negative filter: a capability the cache does not contain cannot come from any of those powers, while one it does contain still runs the full live scan, so the shortcut can never answer yes on its own.

  • Six built-in origins granted the same status effect from two powers at once after a tier upgrade. When a tier adds a power that supersedes a base one, the tier's remove list is what tears the old power down, and in six cases it was missing an entry. Abyssal at apex kept both its base night vision and water breathing alongside the apex conduit power that already granted them; Caveborn kept an iron-eating haste bonus underneath permanent apex haste; Verdant kept a forest regeneration power underneath permanent apex regeneration; and Kraken, Merling, and Water Mage each kept a conditional water-breathing power underneath an unconditional one. This was not merely redundant. A conditional power clears its own effect when its condition goes false, so stepping out of the water as an Abyssal at apex would strip the permanent water breathing that the apex power was maintaining. All six now remove the superseded power on upgrade, and a new test walks every built-in origin at every tier to stop it recurring.

  • Blacksmith armour toughness now applies per armour slot. A full set of quality-crafted armour granted a single toughness bonus instead of one per piece, because all four pieces shared one attribute-modifier id and the game deduplicates modifiers by id. Each slot now carries its own id, so head, chest, legs, and feet stack independently. Mining speed and attack damage were never affected, since only one held item is ever in play.

  • Shift-clicking a quality craft no longer loses the buff. Taking a crafted item with shift-click distributes it into your inventory before the crafted-item event fires, so the quality bonus was applied to a stack that had already been merged away and vanished. The buff is now applied to the result slot as it is assembled, which covers both the click-take and shift-click paths. Applying it twice is harmless, so nothing double-dips.

  • Legacy attribute rewriting no longer corrupts unrelated text. The compatibility layer rewrites 1.20-era attribute ids, but the rule matched generic. anywhere in a line rather than only in attribute positions, so playsound minecraft:entity.generic.extinguish_fire was mangled into nonsense, and the same applied to quoted text in tellraw and say. Matching is now anchored to the attribute argument of the attribute command and to attribute-modifier NBT fields, and skips quoted strings entirely. On Minecraft 1.21.1 the rewrite is gone altogether: 1.21.1 still spells attributes generic.armor, and the prefix drop only landed in 1.21.2, so stripping it there turned a valid id into an invalid one.

  • Gravity Mage's Repulse pushes at the strength it was authored with. The power asks for a knockback strength of 2.5, but it spells that field knockback_strength while the alias it routes through reads strength, so the field was inert and the ability has been pushing at the 1.0 fallback since it shipped. The name is an easy one to get wrong: Ground Slam and Tidal Wave both genuinely declare a knockback_strength field, so it looks right by analogy, and only Repulse goes through the alias. Fixed by making the authored intent the thing that runs, which means this is a live balance change: Repulse now pushes two and a half times as hard as it did.

  • Two Jianxian sword glows were invisible. glow_alpha is a 0-255 integer, and both powers authored it as an 0-1 fraction, which floored to zero. Zero is a legal value rather than "unset", so it was accepted instead of falling back to the default, and the halos never drew at all. Converted to the intended fractions of 255, so Sword Qi and Heaven-Severing Slash gain the glow their author asked for.

  • Commands run by execute_command are no longer rewritten when they already work. The legacy-command rewriter is a set of heuristics meant to run only on commands that fail to parse, and the chat path has guarded it that way since #92. The execute_command action skipped that guard and rewrote everything it was given, so a pack issuing a perfectly valid modern command could have it altered underneath it. It now parses the command first and leaves it alone if it already works.

  • apply_effect never applied anything in the shape almost every pack writes. Apoli's documented shape nests the effect in an object: "effect": {"effect": "minecraft:speed", "duration": 200, "amplifier": 1}. The compatibility parser resolved the effect id only from a bare "effect" string, so every nested use fell straight through to a silent no-op. Of the two hundred and twenty-eight apply_effect uses in the pack corpus, two hundred and fourteen are that shape, spread over a hundred and twenty-four files, and not one of them did anything: the power loaded, the origin listed it, and no effect was ever applied. The remaining fourteen use the effects[] array, which the parser truncated to the first entry, so a jellyfish sting that should poison and weaken and slow only poisoned. Between the two, no apply_effect in the corpus took a path the parser handled correctly. Effect resolution now lives in one place that reads all three shapes and returns every effect asked for rather than the first, and the nested object supplies its own duration, amplifier, and display flags, because that is where authors put them. The target-entity path used by target_action and area_of_effect shares that resolver, so it no longer carries its own copy of both bugs. When nothing resolves, the parser warns and names the three shapes it accepts instead of returning quietly. That silence is the only reason this survived as long as it did.

  • origins:choice rolled a branch and then ran nothing. Each entry in a weighted choice is a wrapper record rather than an action, and Apoli keys the wrapped action element. The parser read action instead, so every branch resolved to a no-op whichever way the roll went, and a power built entirely out of random outcomes looked like it was simply unlucky every time. element is now read, action stays accepted as a synonym so anything authored against NeoOrigins' own documentation keeps working, and element wins when an entry carries both.

  • Legacy .mcfunction files are now translated as they are read (#118). A function file that fails to compile never runs at all, and never reaches the hook where legacy commands were previously repaired, so packs shipping 1.20 command syntax inside their functions lost those functions silently. Function contents are now rewritten at pack-read time, before the game parses them. Item NBT in give, item replace, and item modify becomes a data-component patch, covering custom names and lore, enchantments, potions, unbreakable, damage, repair cost, custom model data, and hidden tooltip flags, with anything unrecognised preserved under custom_data. clear is translated as a subset match rather than a component patch, since it takes an item predicate. And 1.20 particle arguments are converted to their 1.21 form for dust, dust_color_transition, block, item, and entity_effect. On a Fairytale Origins test install this took failed function loads from forty-two down to nine on 1.21.1, and most of what remains there needs mods that were not installed. Minecraft 26.1 and 26.2 carry seven more failures on top of those nine, in command shapes that changed after 1.21.1 and are not rewritten yet: the generic. attribute prefix, the split of minecraft:potion into thrown and lingering entities, and gamerule.

  • Three more legacy power types are implemented: modify_healing, modify_status_effect_duration, and action_on_death. All three are authored in six packs in the corpus, and all three were rejected by the schema and dropped by the loader. modify_healing scales all healing, matching Apoli's contract rather than natural regeneration alone; modify_status_effect_duration multiplies the duration of effects as they are applied; and action_on_death fires with the killer available, so it can pair with a bientity_action. Their modifier maths reads the 1.16-era multiply_base and multiply_total spellings these packs actually use, rather than only the modern Apoli names. Reading only the modern names would have left every real use silently doing nothing. All four namespace spellings of each type are declared, so the editors get real forms for them too.

  • 1.20-style particle strings are accepted in power JSON. A particle field written the old way, as "minecraft:dust 0.1 0.5 0.1 1" with its arguments in one string, previously failed the whole power to load. The leading particle id is now used and the power loads.

  • Ten more legacy conditions are understood instead of failing closed, and two actions accept shapes they were rejecting. When the compatibility layer meets a type it does not know, it refuses to activate the power rather than firing it unconditionally: safe, but the power does nothing. Newly supported: statistic tests a vanilla statistic with comparison and compare_to; nearby_entities counts entities by type or tag within distance (default 16) with an optional bientity_condition filter; near_villager counts real villagers nearby; nbt matches a partial NBT tree on the target; in_tag matches the target's entity type against a tag; can_see tests unobstructed line of sight; block_state tests a single blockstate property; height tests a block's Y coordinate; adjacent counts matching face neighbours; and always_active is an unconditional true. On the action side, and now accepts a single action as well as a list, and area_of_effect accepts both an object-shaped shape and Apoli's standard bientity_action field. See CONDITIONS.md and ACTIONS.md for the field references.

  • origins:lava_vision whited out the screen (#121). Origins' s and v fields are absolute replacements for vanilla's two lava fog distances, measured in blocks, not multipliers. The translator mapped s onto NeoOrigins' multiplicative strength and discarded v, so the ordinary authoring of {"s": 0, "v": 15}, which means "fog starts at zero blocks and ends at fifteen", arrived as a strength of zero: both fog planes scaled to nothing, every pixel fully fogged, a flat sheet of colour. They now map to the power's new start and end. The screen came out sky blue rather than lava orange because of a second fault in the same path: the fog handler asked whether the player's body was in lava rather than whether the camera was, so standing in a one-block puddle with your eyes in air let it hijack ordinary atmospheric fog. It now runs only when the camera is genuinely in lava. Both faults were reachable on Minecraft 1.21.1 alone, since 26.1 and 26.2 have not drawn lava fog at all since the 26.1 render rework stubbed the handler out. That stub is lifted this release as well, so all three builds run the same fixed path rather than two of them running none of it.

  • origins:water_vision is no longer translated into lava vision. It was routed onto lava_vision, which is not remotely what it does, and inherited the whiteout above along the way. Upstream it is not a power type at all: it is an instance of origins:toggle_night_vision. It now becomes NeoOrigins' night_vision gated on a submerged_in water condition, which is what the original power actually gives the player.

  • apugli:action_on_jump and apugli:action_on_target_death load at all. Both were registered as aliases onto action_on_event, and neither ever reached the alias table: the loader rewrites apugli: to origins: before the alias pass runs, and then drops any power it cannot route, so by the time the table was asked, it was being asked about an id it has never held. A pack shipping either one lost the whole power without a word. The authored id is now kept in reserve and offered to the alias table on the drop path only, so nothing that already loaded changes route.

  • prevent_entity_use no longer blocks every interaction. The power ignored its entity_condition and bientity_condition, so once granted it blocked the player from using any entity at all rather than only the ones the pack named. Those conditions are now compiled and tested against the entity you interact with, and if they cannot be compiled the power is refused with a warning instead of over-blocking.

  • /power has is registered. Legacy packs test for a power with power has <target> <power> inside their functions, and NeoOrigins registered grant, revoke, and remove but not has, so any function containing it failed to compile and was lost entirely. It now returns a result usable with execute if and store result, and resolves multiple-power ids the same way grant does.

  • The Blacksmith class can now craft quality gear at modded workstations. quality_equipment gains an intercept_menus list of menu-type ids whose result slot should also grant the quality buff, and the built-in Blacksmith power opts into Overgeared's four smithing anvils. Detection is entirely data-driven, with no compile-time dependency: an id for a mod that is not installed simply never matches, so the list is harmless either way, and pack authors can add workstations from any mod without a code change.

  • The damage action's damage_type field is documented. It has been read since 2.0.x and the editors describe it, but ACTIONS.md still listed source.name as the only way to choose a damage source. damage_type resolves against the damage-type registry, so unlike the fixed keyword list it reaches datapack-defined types.

  • THEMING.md now matches the theming code. The field table had gone stale: flat and panel_color have been parsed since the classic skin came back, but neither was listed, so there was no documented route to building a flat theme at all. The page also never mentioned classic_picker_style, the accessibility option that outranks every theme. A pack ships a theme, a player has that option turned on, and the theme has no visible effect, with nothing on the page to explain the symptom. And the bundled-font section named two files that do not exist: the assets are lowercased on disk, because NeoForge's resource-path validator rejects uppercase path segments, so anyone following the old names was chasing a missing file.

This mod has no related projects