promotional bannermobile promotional banner

Ars 'n Spells

Ars ’n Spells is a Forge 1.20.1 (with limited support for 1.21.1 ala Version 2.x.x) compatibility mod that bridges Ars Nouveau and Iron’s Spells ’n Spellbooks by integrating all mana-related systems.

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

Forge

implementation fg.deobf("curse.maven:ars-n-spells-1447914:7980430")
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

[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 item RegisterEvent and produces a RitualTablet per 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 new ModItemsRegistry.ITEMS (DeferredRegister<Item>) registers the Spell Transcription tablet (when Iron's Spellbooks is loaded) and the new Spell Uninscription tablet (always), and RitualRegistryHandler splices them into Ars's ritualItemMap at common setup so brazier and JEI lookups by ResourceLocation resolve.
  • 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 InscriptionInputs classifier 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_multiplier config (default 1.25, range 0.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 through BridgeManager so 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 multiplies event.getManaCost() in the handler and clears the entry. Ars-side: a new Entry.multiplierApplied one-shot guard prevents double-application across multiple SpellCostCalcEvent fires 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 (default 1.25, range 0.5-5.0) -- multiplier on cross-cast spell base mana cost.
  • New: enable_per_cast_reagent (default false) -- 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 from CrossCastingHandler. NBT-key constants and the inscribe/clear/has-cross-spells operations live here, with no dependency on Minecraft Bootstrap. CrossCastingHandler delegates 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/success centralizes the chat-message styling and nearest-player lookup so the two rituals stay in lockstep.
  • JUnit 5 test harness. testImplementation JUnit 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_REGEN is a percentage-of-pool multiplier (max × regen × 0.01 mana/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 new ManaRegenBridge that 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's MANA_REGEN attribute delta. Max mana modifier is applied first so the regen conversion sees the post-bonus pool.
    • MixinArsPotionEffects.arsnspells$redirectManaRegenPotions -- Ars mana_regen / mana_boost potion effects redirected to Iron's MANA_REGEN now go through the bridge.

Configuration

  • New: cross_system_regen_conversion (default EQUAL_EFFECT) -- Conversion strategy. EQUAL_EFFECT preserves equivalent mana/sec on both sides at any pool size; REFERENCE_POOL uses a fixed pool for predictable conversions; DISABLED blocks cross-system regen translation entirely (Mana Regen enchantments only affect their own system).
  • New: cross_system_regen_multiplier (default 1.0) -- Global dampener for every cross-system regen translation.
  • New: cross_system_regen_reference_pool (default 100.0) -- Reference pool size for REFERENCE_POOL mode.

Cleanup

  • Tightened enchantment mana detection -- EquipmentIntegration.getEnchantmentManaBonus previously 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 named mana_steal, source_friendly). Detection is now anchored to the specific Ars Nouveau enchantment IDs ars_nouveau:mana_regen and ars_nouveau:mana_boost via ForgeRegistries. The heuristic remains load-bearing in ISS_PRIMARY/HYBRID mode where MixinManaCapability suppresses Ars's native regen tick, so this is the only path that surfaces those enchantments to the Iron's pool.