promotional bannermobile promotional banner

NeoOrigins

A modern port of Origins

File Details

NeoOrigins v2.1.3 (MC 1.21.1)

  • R
  • May 25, 2026
  • 2.06 MB
  • 305
  • 1.21.1
  • NeoForge

File Name

neoorigins-2.1.3+1.21.1.jar

Supported Versions

  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:neoorigins-1495375:8145606"
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

NeoOrigins v2.1.3

Built for Minecraft 26.1 / 26.1.1 / 26.1.2 and 1.21.1 with NeoForge.

v2.1.3

Bug Fixes

  • origins:set_resource action was a silent no-op. The legacy compat layer rewrote origins:set_resource to neoorigins:set_resource but the action dispatcher had no arm for it, so packs porting from Origins++ saw the action listed as "unknown" with no effect. Wired the dispatch arm to read resource + value (or fallback change) and write through CompatAttachments.resourceState(). Same commit aliases xp_levels to the existing xp_level condition (Apoli's plural form) and adds a new saturation_level entity condition reading FoodData.getSaturationLevel().
  • origins:flame_particles failed codec validation. Route B's WELL_KNOWN synth emitted a fieldless neoorigins:particle stub and ParticlePower.CODEC rejected the entry with particle: missing or unknown 'particle' field, dropping the whole power. Synth now passes minecraft:flame as the default particle id so legacy flame_particles references load.
  • Legacy forge: attribute ids resolved to nothing on NeoForge. Packs authored against Forge-era Origins++ pinned attributes like forge:generic.entity_reach, which NeoForge re-registered under neoforge:entity_reach. AttributeModifierPower.resolveAttribute now retries any unresolved forge:* id under the neoforge: namespace with generic. / player. prefix permutations, so existing packs don't need to be rewritten.
  • Origin layer screens displayed the raw layer id instead of the layer JSON's name field. OriginInfoScreen.getLayerDisplayName and OriginEditorScreen.drawLayerLabels both fell back to the translation key / capitalized path even when the layer had a populated name. Both screens now read layer.name() first, only falling back to the translation key / prettified path if blank.
  • Warding Presence ignored its toggle. The spawn-cancel handler used forEachOfType, which doesn't consult AbstractTogglePower.isToggledOff — turning the power off in the HUD still suppressed mob spawns. New forEachOfTypeActive helper on ActiveOriginService gates toggleable powers; event handlers reading toggle-style powers must use it. (Only onTick honors the toggle automatically.)
  • Warding Presence was a no-op for monsters at the default radius. The power's radius default was 24, at or below vanilla's MobCategory.MONSTER 24-block player-distance spawn rule — so monsters were already blocked by vanilla and the power did nothing for the case authors actually wanted. Stoneguard's JSON now sets radius 36 explicitly; the code default stays at 24 to force pack authors to opt in to a meaningful radius.
  • longer_potions didn't extend the first dose. MobEffectEvent.Added fires before vanilla LivingEntity#addEffect inserts the instance into activeEffects. The old handler re-called sp.addEffect(extended) from inside the event; the nested put ran first, then the outer vanilla put overwrote with the original un-extended instance. Net result: first dose looked normal, subsequent doses extended correctly via the merge path. Now mutates the incoming MobEffectInstance via update() so vanilla's subsequent put sees the already-extended values.
  • Cook food bonus stripped eatSeconds, consume effects, and usingConvertsTo (1.21.1 only). The bonus rebuilt FoodProperties through FoodProperties.Builder, which only exposes nutrition / saturation / canAlwaysEat — so suspicious stew lost its random potion effect when boosted, golden apple lost regen, bowls/bottles no longer returned an empty container. New rebuildFood() helper goes through the builder for the bonus fields then constructs the record directly to copy the remaining fields through unchanged. Wayfarer's smoker bonus (MoreSmokerXpPower) gets the same treatment, and re-reads the FOOD component before rebuilding so it stacks cleanly on top of Cook's earlier rebuild when a player has both. The bug is 1.21.1-specific: 26.1's FoodProperties record no longer carries eatSeconds / usingConvertsTo / effects (Mojang moved them to DataComponents.CONSUMABLE and DataComponents.USE_REMAINDER), so the boost path never touches them and the original symptom can't reproduce.
  • MobsIgnorePlayer had no way to disable retaliation. By default the power lets vanilla's getLastHurtByMob() window apply — once the player hits an "ignoring" mob, the mob is allowed to target back briefly so combat feedback loops still work. Pack authors who wanted true peace (Bonewalker, druidic neutrality, etc.) had no knob to turn that off. New passive: true config flag bypasses the retaliation window so the mob never targets the player even if attacked first. Default false keeps existing pack behavior intact.
  • [CompatB] parser warnings deduped per reload. Pack-port sessions were dumping hundreds of WARN lines during datapack load — one per occurrence of every unsupported action/condition/modifier op. One porting log had 268 such lines (22% of bootup output) that collapsed into 6 unique action types + 4 unique condition types. New CompatWarningCollector batches parser-side warnings (unsupported actions / conditions / item-actions / item-conditions, modifier defaults, parse errors, malformed SNBT, per-power compile failures) during a session held open by OriginsCompatPowerLoader.apply(), then emits one sorted summary block at the end. Outside a session each record* call falls back to immediate LOGGER.warn. Wrapped in try/finally so a mid-reload throw can't leak the session.
  • Dropped orphaned lang keys (skeleton_apex_hp, skeleton_rattling, merling_no_drowning) with no power JSON or origin reference, and broadened the stamina power description across all 10 pools from "Physical energy for powerful attacks." to "Physical reserves spent on active abilities." (The old line lied for Stoneguard (utility-only) and Shulk (CC + mobility) and was misleadingly narrow for the rest.)
  • Caveborn / Skeleton edible-power JSONs ate without hunger gating. The six EdibleItemPower configs for stone, iron, gold, diamond, netherite, and bone meal shipped with always_edible: true, so the hunger check at InteractionPowerEvents.java:115 short-circuited and the right-click animation fired even at a full food bar — players could spam-eat the mineral indefinitely. Flipped to false on all six. The codec default in EdibleItemPower.java stays true so external packs that omit the field keep their current behavior.
  • Caveborn mineral effects (haste / speed / luck / strength + resistance) never applied after eating off-tier minerals. The 4 caveborn_*_bonus powers listened on event: item_use_finish, but food_item_in_tag reads the dispatch context as a FoodContext. Per InteractionPowerEvents.java:172–177, ITEM_USE_FINISH dispatches the raw ItemStack; only FOOD_FINISHED wraps it in FoodContext. The cast failed silently so the if_else action took the noop branch and no status indicator appeared. Switched all 4 to food_finished, matching the working aquatic_fish_diet_bonus template.

Documentation

  • New docs/ORIGINS.md — per-origin reference covering every default origin and its evolution tree. Each entry has impact rating, icon, spawn behavior (where applicable), base-power list with one-line glosses, and a tier-delta table for the evolution path. Catalogues all 49 non-class origins.
  • docs/POWER_TYPES.md and field_docs.json aligned with the new no_mob_spawns_nearby 24-block code default. The old docs advertised 48 and used a 48-block example; now reflect the 24 default, call out the vanilla 24-block cutoff, and use a 36-block example matching Stoneguard's own JSON.
  • MobsIgnorePlayer field docs updated to add the passive row
    • an example combining #tag syntax with passive, and to clarify that entity_types already accepts #tag references and that an empty list matches every mob (both were true before but undocumented).

Installation

Download the JAR matching your Minecraft version and drop it into your mods/ folder.

  • neoorigins-2.1.3+26.1.jar — for MC 26.1, 26.1.1, and 26.1.2
  • neoorigins-2.1.1+1.21.1.jar — for MC 1.21.1

Origins Compatibility

Drop Origins mod content packs (.jar, .zip, or folder) into the originpacks/ folder in your game directory.