
Ars 'n Spells
Ars ’n Spells bridges Ars Nouveau and Iron’s Spells ’n Spellbooks, creating deeper synergy between two major magic systems. Harness mana, spell power, glyphcraft, and spellbooks together through new compatibility features, cross-mod progression
3.3.5
Compatibility
Changes
[3.3.5] - 2026-09-27
Fixed
- Iron's spells no longer stop with "Cast stopped. Check your resources; details are in the server log." when another mod checks mana inside Iron's own mana payment. 3.3.4 took the price as soon as Iron's final cost event ended, before Iron's own mana check and write. A mod that checks affordability at that point, such as Animus on NeoForge 1.21.1, saw the pool already debited and cancelled the cast; ANS refunded it and logged
Effect boundary not reached. Any spell costing more than half the remaining pool failed. ANS now takes the price where Iron's writes its own mana debit and replaces that write, so such a check sees the pool as Iron's would, and a top-up made there pays for the cast. The cost event then states what ANS will take from the pool Iron's reads: the converted amount inars_primary, the Iron's share of a dual-cost split, and 0 for bound Ars spells and LP-paid casts. No Forge 1.20.1 mod is known to act at that point; the change keeps both builds' payment code the same. - A cast that another mod cancels before its effect now costs nothing and is not reported as a payment failure: no warning and no "Cast stopped" message. Iron's own follow-through runs as it would without ANS, and debug mode logs
stage=vetoed_before_effect. - The startup self-check now names each handler it needs and also covers the payment and cast-ticker mixins. Before, any ANS method on
AbstractSpellpassed, so a failed payment mixin would not have been reported. - Channelled Iron's spells no longer stop with a payment failure when mana runs low. 3.3.4 turned off Iron's own end-of-channel check, so a channel such as BielGG's Crystal Barrage (250 mana per pulse) ran into a pulse the caster could not pay and stopped with "Cast stopped. Check your resources; details are in the server log." ANS now checks after every paid pulse, at that pulse's final price and in the pool that paid it. When the balance cannot cover another pulse, the channel finishes as Iron's native final pulse, with cooldown, scroll consumption and completion. Final-price modifiers such as BielGG's Thorn Ring are honoured; Iron's own check only ever saw the base cost.
ars_primary: Iron's mana regeneration can no longer lower the Ars pool. Iron's regeneration reads and writes the Ars balance in this mode but clamped it to Iron's mirroredmax_mana, which is rounded down to a whole number and can briefly lag the real Ars maximum. That clamp removed mana without any cast. It is the only such path found and the most likely cause of the reported dip while scrolling the hotbar, although the report itself has not been reproduced. Regeneration may now only raise the balance.- The shared-pool ceiling is no longer computed before an equipment change has taken effect. Forge fires the change event before vanilla swaps the item's attribute modifiers, so ANS now reconciles at the end of the player's tick instead. Delayed ceiling updates are merged per player, so an older maximum can no longer be applied after a newer one.
- Ars spells cast from Iron's spell wheel counted as successful even when Ars refused them, for example for lack of mana, because Ars's caster reports success either way. Success now comes from Ars's own resolver. A refused cast no longer grants the first cross-cast advancement.
- A Cursed Ring LP shortage on an Iron's cast is now reported as LP, not as Iron's mana.
- A resource shortage now says what was needed and what was available, for example "Not enough Iron's mana for Crystal Barrage: 250 needed, 180 available.", instead of the generic message. Shortages are ordinary gameplay and are no longer logged as warnings; debug mode records one line per failed cast with the price and resource. Other payment faults still warn, now including the price. These diagnostic lines identify the player by a pseudonymous token instead of their UUID.
- Config migration: only a config file without a schema stamp is checked for being newly generated, so a stamped 3.3.0–3.3.2 file can no longer be mistaken for a new one. Files from 3.3.3 and 3.3.4 receive only the new 3.3.5 step.
Added
inscribed_ars_default_cooldown_ticks(Cross-Cast Inscription, 0–12000 ticks, 20 ticks = 1 s): Iron's cooldown after an Ars spell bound into an Iron's spellbook casts successfully from Iron's spell wheel. It uses Iron's own cooldown system, so Iron's cooldown reduction, the wheel's cooldown display and saving across relogs all apply. A failed, refused or unpaid cast starts no cooldown. Newly generated configs use 40 ticks (2 s); configs from earlier versions migrate to 0, which keeps the previous behaviour. Changes take effect on the next cast after the config reloads. The setting is also on the in-game settings screen. Books that reuse the same proxy slot share its cooldown. Ordinary Ars casts, ordinary Iron's spells and Iron's spells inscribed into Ars items are unaffected, and the optional category cooldowns remain a separate check.- Debug mode logs both mana pools, the Iron's ceiling, the selected slot and the held item whenever equipment reconciliation changes something (at most ten lines per second per player). It also logs each regeneration write that was refused because it would have lowered the Ars pool.
- New GameTests cover: channels that run out of mana in all five modes; a SWORD channel with a halved final cost; a delayed SWORD cast charged once at its final price;
ars_primaryhotbar cycling with Iron's regeneration; removal of a real maximum-mana bonus; and the inscribed cooldown after success, failure, zero, cooldown reduction, shared slots and category cooldowns. - New GameTests reproduce the NeoForge Scorch report with a GameTest-only mixin at the call Animus uses: an affordability check in all five modes at conversion rates 0.5, 1 and 3, a top-up of an underfunded cast, a cancel before the effect, and a channel under the check. Only
runGameTestServersets-Dans.gametest.castProbe=true, which applies that mixin. -PwithIrons316RuntimeGameTestsruns the Iron's-loaded GameTests against Iron's Spellbooks 1.20.1-3.16.3 (with irons_lib 1.20.1-2.1.0) instead of the 3.15.0 build pin.tools/pack_presets.pyaccepts config schema 3 as well as 2; before this change it would have refused every 3.3.5 config.docs/3.3.5/config-reference.mdlists every key of this release.
Compatibility
- Tested: Minecraft 1.20.1, Forge 47.4.10, Ars Nouveau 4.12.7, Iron's Spellbooks 1.20.1-3.15.0 and 1.20.1-3.16.3. BielGG's Spells Addon 1.5-patchwork was inspected from its jar but not run, because it also requires L_Ender's Cataclysm and Lionfish API. Details and the remaining limits are in
docs/3.3.5/. - Animus 1.20.1-3.0.35 was inspected from its jar: it works through Iron's cast check and cost events and does not act inside Iron's mana payment. It was not run. The Iron's GameTests also passed with Covenant of the Seven 2.2.6-hotfix loaded.
- Ars Affinity has no Forge 1.20.1 release and is not supported on this build. It is covered by the NeoForge 1.21.1 build.
Forge / NeoForge parity
The Forge 1.20.1 and NeoForge 1.21.1 builds now have the same features, configuration, commands, datapack tags and translations, except for integrations whose mod has no build for the other Minecraft version (Covenant of the Seven and Too Many Glyphs exist only for 1.20.1; Ars Affinity and Ars Elemancy only for 1.21.1). docs/3.3.5/parity-review.md lists every remaining difference and why. This build gains:
- Cross-mod combat stats in both directions. Iron's spell power already scaled Ars spell damage. The Ars Spell Damage Bonus perk now also adds to Iron's spell damage as a flat bonus, which
spell_power_capdoes not limit. This changes damage for players with that perk; setenable_ars_damage_for_irons_damage = falseto keep the 3.3.4 behaviour. New Spell Scaling keys:enable_cross_mod_combat_stats,enable_irons_power_for_ars_damage,enable_ars_damage_for_irons_damage(all on by default and independent of the mana mode) andmulti_school_power_policy(primaryby default, as before;maxoraveragelet a multi-school spell scale with another of its schools; affinity and progression still credit the first school)./ans debug combatshows the settings, both mods' spell-damage attributes and the last scaled hit in each direction. - Tagged-curio discount. Each worn curio in
#ars_n_spells:curio_spell_discountreduces Ars and Iron's cast costs byvirtue_ring_discount(0.20), and all of them together by at mostmax_total_curio_discount(0.50). A cast that cost mana never becomes free. With Covenant installed, the Blasphemy discount still applies after it. The shipped tag lists Iron's school focus items, which are not normally wearable; packs add their own curios.enable_curio_discountscovers both discounts. #ars_n_spells:cross_cast_blacklist. Ars Zero's five multi-phase glyphs only work inside a Spell Staff. A spell using them is now refused by the Spell Loom,/ans export_to_irons_scroll, Spell Transcription and every cross-cast, with a message naming the glyphs./ans infoalso lists the player's affinity levels and the number of registered Iron's schools. Its raw Iron's mana line is translatable, and the ring-bypass flag appears only with Covenant installed.- Server stop now also clears staged scroll costs, cast-validation scopes, in-flight cross-casts, combat diagnostics and log throttles.
- The "Cross spell selected" message is translatable, and cross-cast refusals are shown in red.
- Config comments match the NeoForge build. The
mana_unification_modecomment no longer claims a restart is needed, because mode changes apply live. - The debug-only startup lock check looks at
ars_n_spells-server.toml, not the pre-2.0.1-common.toml. - New GameTests: combat bridge (11),
ParityBehaviourGameTests(Source Jar synergy, gear bonus per mode, potion mirroring, tagged curios), uninscription teardown, the Curios attribute toggle, Ars Zero profile, resolver-hook and blacklist checks, proxy pool reuse and the carrier reconciler.tools/verify_loader_parity.pynow ships here too and checks both directions, including GameTest coverage.
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:NlMT8pQt:5OeZngO7"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:NlMT8pQt:5OeZngO7"
}
