File Details
Ars 'n Spells 1.8.9 (Forge 1.20.1)
- R
- Apr 25, 2026
- 237.75 KB
- 1.2K
- 1.20.1
- Forge
File Name
ars_n_spells-1.8.9.jar
Supported Versions
- 1.20.1
Curse Maven Snippet
[1.8.9] - 2026-04-25
New Features
- Cross-Spell Inscription is now reachable in survival. The Spell Transcription ritual has been functional in code since v1.8.3, but the ritual tablet that activates it had no acquisition path: Ars Nouveau iterates
RitualRegistry.getRitualMap()during its own itemRegisterEventand produces aRitualTabletper ritual, but that loop runs before Ars 'n' Spells's common-setup registration so our ritual was never picked up. The mod now owns its tablet items: a newModItemsRegistry.ITEMS(DeferredRegister<Item>) registers the Spell Transcription tablet (when Iron's Spellbooks is loaded) and the new Spell Uninscription tablet (always), andRitualRegistryHandlersplices them into Ars'sritualItemMapat common setup so brazier and JEI lookups byResourceLocationresolve. - Apparatus recipe gates the Spell Transcription tablet. Datapack recipe at data/ars_n_spells/recipes/apparatus/spell_transcription.json: novice Ars spellbook reagent + Iron's spellbook + archwood log + source gem block on pedestals, 2000 source. The recipe loader silently drops the recipe when Iron's isn't installed, matching the tablet-registration gate.
- Spell Transcription rewritten with strict disambiguation. Validation now runs to completion before any item mutation. The new
InscriptionInputsclassifier sorts dropped items in the three-block work area into three disjoint buckets (sources, inscribed, blank-target candidates); each violation produces a lang-keyed message naming the offending items and the rule. Distinct paths for empty range, no source, multiple sources (counted and listed), no target, multiple targets (counted and listed), already-inscribed items in range ("uninscribe first"), Ars-rooted target (decision 5 defensive guard against right-click handler shadowing), and source re-parse failure. - Spell-to-spell direct copy is intentionally not auto-resolved -- the user must uninscribe first. Predictable beats clever; a "smart" fallback that picked one direction would silently corrupt the wrong item.
- New Spell Uninscription ritual. Mirrors the transcribe flow with stricter intake (no sources or blanks in range, exactly one inscribed item). Strips both the cross-spell list and the cycle index and collapses an empty residual root tag to null, so the result is bit-identical to a fresh blank target and the same item can be re-inscribed cleanly. Iron's-independent: the tablet and ritual register without Iron's loaded so a player can still clean up legacy inscribed items after Iron's is removed. Apparatus recipe at data/ars_n_spells/recipes/apparatus/spell_uninscription.json: blank parchment reagent + water bucket + source gem + archwood log, 500 source. Cheaper than transcribe by design -- uninscribing is a fix, not a feat.
- Cross-cast cost multiplier. New
cross_cast_cost_multiplierconfig (default1.25, range0.5-5.0) charges a flat overhead on cross-cast spells. Applies symmetrically to Iron's spells cast from non-Iron's items and Ars spells cast from non-Ars items, exactly once per cast, after base cost calculation and before mana deduction. Routed throughBridgeManagerso it composes with the active mana mode and the SEPARATE-mode dual-cost split. Iron's-side: SEPARATE-mode multiplies the base before splitting; non-SEPARATE multipliesevent.getManaCost()in the handler and clears the entry. Ars-side: a newEntry.multiplierAppliedone-shot guard prevents double-application across multipleSpellCostCalcEventfires per resolve. Direct casts (no cross-cast context entry) are never touched. - Theming. Inscribe plays enchantment-glyph particles (
ParticleTypes.ENCHANT) + the enchantment-table sound; uninscribe plays ash + smoke + a fire-extinguish sound.
Configuration
- New:
cross_cast_cost_multiplier(default1.25, range0.5-5.0) -- multiplier on cross-cast spell base mana cost. - New:
enable_per_cast_reagent(defaultfalse) -- reserved hook for a future per-cast reagent system. No-op today; documented so future work can be gated without re-shuffling config keys.
Internal
CrossCastNbt-- new pure helper extracted fromCrossCastingHandler. NBT-key constants and the inscribe/clear/has-cross-spells operations live here, with no dependency on MinecraftBootstrap.CrossCastingHandlerdelegates its add and clear methods to the helper; the on-disk shape is unchanged.InscriptionInputs/InscriptionSource/RitualFeedback-- new files in the rituals package.InscriptionInputs.classify(...)is the shared classifier consumed by both transcribe and uninscribe rituals;RitualFeedback.error/successcentralizes the chat-message styling and nearest-player lookup so the two rituals stay in lockstep.- JUnit 5 test harness.
testImplementationJUnit 5.10.2 in build.gradle;useJUnitPlatform(). Two test classes:CrossCastNbtRoundTripTest(5 cases) -- empty-baseline round-trip, unrelated-NBT preservation, inscribe→uninscribe→inscribe identity, cycle-index strip, multi-inscription bulk clear.InscriptionInputsPredicateTest(7 cases) -- empty tag, null tag, empty list shape, inscribed tag, unrelated root NBT, conflicting non-root NBT (must pass per spec), wrong tag type at the cross-spells key.- All 12 tests green under
./gradlew test.
Documentation
- README's "Cross-mod spell casting" section rewritten end-to-end to walk through the new survival flow: tablet crafting, strict source/target rules, cost multiplier, and the uninscribe ritual.
[1.8.8] - 2026-04-24
Bug Fixes
- Cross-system mana regen unit mismatch fixed -- Iron's
MANA_REGENis a percentage-of-pool multiplier (max × regen × 0.01mana/sec); Ars Nouveau regen is absolute mana/sec. Three callsites previously wrote a value from one system directly into the other without converting units, so an Ars enchantment like Mana Regen III on wizard armor compounded into hundreds of mana/sec instead of the intended single-digit boost. All cross-system regen translations now route through a newManaRegenBridgethat converts via the wearer's current max pool.ArsManaCalcHandler.onManaRegenCalc(ARS_PRIMARY mode) -- Iron's gear regen attribute is now converted to mana/sec before being added to the Ars regen event.EquipmentIntegration.applyArsBonusesToIrons(ISS_PRIMARY/HYBRID mode) -- Ars-side regen bonuses are now converted to the equivalent Iron'sMANA_REGENattribute delta. Max mana modifier is applied first so the regen conversion sees the post-bonus pool.MixinArsPotionEffects.arsnspells$redirectManaRegenPotions-- Arsmana_regen/mana_boostpotion effects redirected to Iron'sMANA_REGENnow go through the bridge.
Configuration
- New:
cross_system_regen_conversion(defaultEQUAL_EFFECT) -- Conversion strategy.EQUAL_EFFECTpreserves equivalent mana/sec on both sides at any pool size;REFERENCE_POOLuses a fixed pool for predictable conversions;DISABLEDblocks cross-system regen translation entirely (Mana Regen enchantments only affect their own system). - New:
cross_system_regen_multiplier(default1.0) -- Global dampener for every cross-system regen translation. - New:
cross_system_regen_reference_pool(default100.0) -- Reference pool size forREFERENCE_POOLmode.
Cleanup
- Tightened enchantment mana detection --
EquipmentIntegration.getEnchantmentManaBonuspreviously string-matched any enchantment whose description ID contained"mana"or"source"and granted +50 max mana per level, which silently caught unrelated enchantments (e.g. anything namedmana_steal,source_friendly). Detection is now anchored to the specific Ars Nouveau enchantment IDsars_nouveau:mana_regenandars_nouveau:mana_boostviaForgeRegistries. The heuristic remains load-bearing inISS_PRIMARY/HYBRIDmode whereMixinManaCapabilitysuppresses Ars's native regen tick, so this is the only path that surfaces those enchantments to the Iron's pool.

