/
Built for Minecraft 26.1 / 26.1.1 / 26.1.2 and 1.21.1 with NeoForge.
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.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.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.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.)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.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.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.)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_*_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.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
#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).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.2neoorigins-2.1.1+1.21.1.jar — for MC 1.21.1Drop Origins mod content packs (.jar, .zip, or folder) into the originpacks/ folder in your game directory.