COWMODSКаталог модов

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

Автор: otectus27,9 тыс.19обновлён 2 окт. 2026 г.
Механики игрыМагияУтилиты

Описание

Ars 'n' Spells

Ars 'n' Spells bridges Ars Nouveau and Iron's Spells 'n Spellbooks into one seamless magic experience. Unify your mana, share progression between spell systems, scale your power across both mods — and even weave Ars spells into real Iron's spellbooks, cast straight from Iron's native spell wheel. All fully configurable.

Works with Minecraft 1.20.1 on Forge.


Requirements

ModRequired?
Ars Nouveau (4.12.7+)Yes
Iron's Spells 'n Spellbooks (3.15.0 – 3.x)No — falls back to native Ars behavior if absent. Tested against both 3.15.0 and 3.16.2.
Covenant of the Seven (Sanctified Legacy)No — enables LP and aura ring systems (2.2.6 recommended for the aura HUD)
Blood MagicNo — optional LP source for Ring of Seven Curses
Apotheosis + Apothic CuriosNo — lets affix/socket mana stats on curios feed the unified pool
Ars Elemental / Too Many GlyphsNo — supported and covered by the automated test suite
JEI / EMINo — internal proxy entries are hidden from both when present

(Curios is required by Ars Nouveau, so it is always present.)


Mana Unification

The core of Ars 'n' Spells: five configurable modes that control how the two mana pools interact.

ModeHow it works
ISS Primary (default)Iron's mana is the single source of truth. Ars reads and drains from Iron's pool.
Ars PrimaryArs mana is authoritative. Iron's spells drain from Ars mana.
HybridShared bidirectional pool. Choose which HUD bar to display.
SeparateIndependent pools. Cross-mod casts split costs between both (configurable split).
DisabledNo integration — each mod uses its own pool.

Conversion rates between the two mana systems are fully configurable, and cross-system mana regen is unit-converted properly (Iron's percentage regen vs Ars flat regen) so stacked regen gear never spirals out of control.

The mod automatically hides the redundant mana bar so your HUD stays clean.

Changing the mode (applied live, no restart): in singleplayer, open Mods → Ars 'n' Spells → Config and click the Mana Mode row to cycle it; server operators can run /ans mode set <mode>; or edit the config file directly. Confirm the active mode with /ans mode.


Gear & Spell Integration

  • Gear perks cross over — Ars armor bonuses apply to Iron's mana pool (and vice versa), depending on your active mode.
  • Curios & Apotheosis affixes — Mana stats on worn curios (rings, amulets, belts) cross over too, including those rolled by Apotheosis / Apothic Curios affixes and sockets (and by Magical Jewelry, Jewelcraft, and similar). The read is generic — no hard Apotheosis dependency — and can be turned off with the read_curio_attribute_modifiers config. (Combat-only stats like crit or armor pierce are not mana/spell-power and are not bridged.)
  • Spell scaling — Ars spell potency scales with Iron's spell power attributes using additive stacking (not multiplicative). Elemental bonuses are applied based on your first glyph. A configurable spell_power_cap (default 3.0) prevents extreme values.
  • Enchantments — Mana-related enchantments from both mods are respected regardless of which pool is active.

Resonance

When your mana is nearly full (above 95% by default), you gain a Resonance bonus that boosts spell damage. A reward for mana-efficient play. Configurable per mod, with adjustable strength, linger duration, and a damage cap.


Source Jar Synergy

Standing near Ars Nouveau Source Jars passively boosts your mana regeneration. The bonus is configurable via source_jar_synergy_multiplier (default 5.0), with tunable scan interval and radius plus a dedicated off switch (enable_source_jar_synergy). The scan is position-cached for performance and never force-loads chunks.


Cross-Mod Progression & Affinity

  • Progression sharing — Casting Ars spells grants Iron's school progression, and vice versa.
  • Affinity tracking — The mod tracks your spell school usage over time, with optional decay for unused schools.

Cross-Spell Inscription

Cast spells from either mod using items from the other mod through a tablet-driven inscribe / uninscribe ritual flow. Both ritual tablets are crafted at the Enchanting Apparatus and are fully datapack-defined, so pack authors can retune ingredients without code.

Spell Transcription — bind a foreign spell onto an item

  1. Craft the Spell Transcription tablet. Reagent: a novice Ars Nouveau spellbook. Pedestals: any tiered Iron's spellbook, an archwood log, and a source gem block. Costs 2000 source.
  2. Set up the brazier. Place the tablet on a Ritual Brazier and drop two items within ~3 blocks:
    • exactly one source — a filled Ars Nouveau spell parchment, focus, or spellbook, or an Iron's Spellbooks scroll
    • exactly one blank target item to receive the inscription
  3. Activate. Strict disambiguation: more than one of either category, or any already-inscribed item in range, fails the ritual with a chat message that names the items it saw and the rule. Items that already carry an Ars Nouveau spell at root NBT are rejected as targets so right-click resolution stays unambiguous. On success the source is consumed, the target gains the cross-cast inscription, and a binding theme of enchantment-glyph particles + the enchantment-table sound marks the inscribe.
  4. Cast. Right-click the target. Sneak-right-click cycles between multiple inscriptions on the same item.

Mana costs flow through the active unification mode and respect your configured conversion rates. In Separate mode, costs split between both pools according to your dual-cost percentages. Cross-cast spells pay an overhead set by cross_cast_cost_multiplier (default 1.25 = 25% extra) — applied symmetrically to both directions, once per cast, before mana deduction.

Spell Uninscription — strip an inscription cleanly

If you change your mind, the Spell Uninscription ritual returns an inscribed item to a bit-identical fresh-blank state so it can be re-inscribed cleanly.

  1. Craft the Spell Uninscription tablet. Reagent: a blank parchment. Pedestals: a water bucket, a source gem, and an archwood log. 500 source.
  2. Activate with exactly one inscribed item in range and nothing else — sources or stray blanks fail the ritual rather than risk stripping the wrong stack.
  3. The cross-cast NBT is removed cleanly (spells list, cycle index, and any empty residual tag), with an ash + smoke dissolution theme.

The uninscribe ritual works without Iron's Spellbooks loaded, so legacy inscribed items can still be cleaned up after Iron's is removed.


The Spell Loom — Export Ars Spells into Iron's Spellbooks (3.0.0)

Design a spell with Ars Nouveau's tools, weave it onto a real Iron's scroll at the Spell Loom, bind it into a real Iron's spellbook — and cast it from Iron's own native spell wheel, right alongside your Iron's spells. The Ars spell rides as an Ars 'n' Spells sidecar on the real Iron item, so the book's own Iron's spells are never touched. This leg requires Iron's Spellbooks.

  1. Weave. Craft the Spell Loom (gold ingot, 2× lapis, a book, and 3× obsidian on a crafting table) and right-click it. Drop your Ars spell source (parchment, focus, or spellbook) and a blank Iron's scroll into the slots, then give your spell a name, pick a nature, choose an icon, and press Inscribe. Out comes a real Iron's scroll carrying your spell. (Ops can also use /ans export_to_irons_scroll for a quick, metadata-free export.)

  2. Bind. Run the Spellbook Binding ritual (its apparatus tablet appears only when Iron's is installed — 2500 source), or hold both and run /ans bind_scroll_to_irons_book. The ritual works on dropped items, not your inventory: throw the scroll and an Iron's spellbook on the ground within three blocks of the brazier, then right-click the brazier with an empty hand to light it. Nothing else may be lying in that radius — a single stray item aborts the ritual rather than risk binding the wrong stack. The scroll is consumed and the spell is appended to the book with your chosen name and icon; re-binding the same spell is rejected (dedup by spell payload).

    ⚠️ Not Ars Nouveau's own "Binding" ritual. Ars ships a ritual named literally Binding, which makes Bound Scripts for familiars and ignores scrolls. You want Spellbook Binding.

  3. Cast. Your Ars spell shows up as its own entry in Iron's native spell-selection wheel. Select it and right-click like any Iron's spell — it casts the real Ars spell through the full cross-cast pipeline (mana mode, cost multiplier, scaling, cooldowns). Up to 8 Ars spells per book, and your native Iron's spells cast exactly as before.

Pack authors: gate the whole feature with allow_ars_spells_in_irons_spellbooks, or cap spells per book with max_ars_cross_spells_per_irons_spellbook.

(Generic inscribed items that aren't Iron's spellbooks still cast via right-click, with sneak-right-click to cycle.)


Unified Cooldowns

An optional system that groups similar spells across both mods into shared cooldown categories. Prevents spell spam by locking out related spells when one is cast. Disabled by default.


Covenant of the Seven Integration

When Covenant of the Seven (Sanctified Legacy) is installed, two powerful ring systems unlock.

Ring of Seven Curses — Life Point Casting

Wearing the Cursed Ring converts all mana costs into Life Points (LP).

  • Blood Magic Priority (default) — Draws LP from Blood Magic's Soul Network first, falls back to player health.
  • Blood Magic Only — Soul Network only.
  • Health Only — Always costs health (100 LP = 5 hearts).

If you run out of LP:

  • Safe Mode (default) — Spell is cancelled, you take minor damage (you will never die from this).
  • Death Mode — The spell casts... but it kills you.

LP costs scale with configurable base multipliers, per-tier scaling for Ars glyphs, and per-level plus rarity scaling for Iron's spells. The whole system has a master toggle (enable_lp_system) that every LP path honors — scrolls included.

Ring of Seven Virtues — Aura Casting

Wearing the Virtue Ring converts your Ars mana costs into Aura — Covenant of the Seven's own regenerating resource, complete with its own HUD bar. Covenant owns the pool, regen, and persistence; Ars 'n' Spells simply maps the mana cost onto it, scaled by ars_virtue_aura_multiplier. Iron's spells under the ring are handled natively by Covenant. If you run dry, the spell simply fails.

Ring Conflict: Wearing both rings at the same time cancels both effects — you'll use normal mana instead, and receive a warning notification.

Blasphemy Curios — School Discounts

Thirteen Blasphemy curio variants (Fire, Ice, Lightning, Holy, Ender, Blood, Evocation, Nature, Eldritch, Aqua, Geo, Wind, Dormant) each provide:

  • 15% base mana discount on all spells
  • +10% bonus when the spell's school matches the curio's element (25% total)

Discounts stack multiplicatively with ring costs, and a matching Blasphemy also deeply discounts LP costs (blasphemy_lp_discount, default 85% off).


Scroll Cost Enforcement

Iron's Spellbooks scrolls respect your resource costs. This has only actually worked since 3.2.1 — in every earlier build the enforcement silently did nothing and scrolls cast for free.

ModeBehavior
Full (default)Scrolls consume mana and LP/aura like normal casting.
LP OnlyScrolls are mana-free, but LP is still consumed for Cursed Ring wearers.
FreeNo resource cost for scrolls (LP from Cursed Ring still applies).

Configuration

Everything is configurable via the per-world server config <world>/serverconfig/ars_n_spells-server.toml (server-authoritative and auto-synced — on multiplayer the in-game config screen is read-only). Major options include:

  • Master toggles for mana unification, resonance, cooldowns, progression, affinity, LP, and aura
  • Mana conversion rates, dual-cost split percentages, and cross-system regen conversion
  • LP system — source mode, death penalty, base/tier/rarity multipliers, minimum costs
  • Aura system — master toggle and mana→aura cost multiplier (the pool itself belongs to Covenant)
  • Curio discounts — base discount, matching-school bonus, Blasphemy LP discount
  • Curio attribute bridge — read_curio_attribute_modifiers (default on): mirror Apotheosis/Apothic Curios affix & socket mana stats across the unified pool
  • Spell scaling — power cap for Iron's attribute stacking
  • Source Jar synergy — off switch, regen multiplier, scan interval and radius
  • Cross-casting — cost multiplier, spellbook-binding toggle, and per-book spell cap
  • Scroll cost mode
  • Debug mode with end-to-end cross-cast tracing for troubleshooting

All options ship with balanced defaults — install and play, or fine-tune to your liking.


Commands

CommandPermissionDescription
/ans mode--Show current mana unification mode
/ans mode set <mode>Op 2Switch the mana unification mode live (no restart)
/ans mana getdefault--View the current default max mana
/ans mana setdefault <value>Op 2Set the default max mana
/ans info <player>Op 2Show mana, aura, resonance, and ring status
/ans debugOp 2Toggle debug mode at runtime
/ans aura--Show your own current aura
/ans export_to_irons_scrollOp 2Export the held Ars spell onto a real Iron's scroll — the Spell Loom is the survival route
/ans bind_scroll_to_irons_bookOp 2Bind a held exported scroll into a held Iron's spellbook

FAQ / Troubleshooting

Q: Ars mana isn't changing in ISS Primary mode. A: Make sure Iron's Spells 'n Spellbooks (3.15.0+) is installed. Check logs for mixin load failures.

Q: I can't craft the Spell Transcription or Spellbook Binding tablet. A: Fixed in 3.0.1 — update the mod. The recipes accept any tiered Iron's spellbook.

Q: My game crashes when I put an exported scroll in Iron's Inscription Table. A: Fixed in 3.1.0. Older scrolls are repaired automatically the first time the mod touches them. The Inscription Table can't read an Ars spell, so it now refuses politely — use the Spellbook Binding ritual or /ans bind_scroll_to_irons_book instead.

Q: A spell in my wheel does nothing when I select it. A: If you unbound it earlier, that's a leftover ghost entry from a pre-3.1.0 version; bind anything to that book and it gets cleaned up. Otherwise check the log for ars_cross_ warnings, which name the exact cause.

Q: I see weird ars_cross_1 scrolls in JEI/EMI. A: Fixed in 3.1.0 — those are internal plumbing and are now hidden from recipe viewers and the creative menu.

Q: My Ars spells cost nothing while wearing the Ring of Seven Virtues. A: Fixed in 3.1.0. With enable_virtue_aura_system disabled, nothing was charging aura or mana. Normal mana is now used, as the setting describes.

Q: An addon glyph is treated as the wrong element. A: Override it with a datapack — no mod update needed. See the Spell schools section of the README.

Q: I see two mana bars. A: Verify your mana mode is set correctly. Check for overlay conflicts from other UI mods.

Q: "Insufficient LP" even though I have enough hearts. A: Make sure lp_source_mode isn't set to BLOOD_MAGIC_ONLY without Blood Magic installed. The default (BLOOD_MAGIC_PRIORITY) falls back to health.

Q: Scrolls are casting for free. A: Check that scroll_cost_mode is set to full (the default).


License

GNU GPLv3

Последние версии

Все версии →
release

Ars 'n Spells 3.3.5

3.3.5
2 окт. 2026 г.4,6 тыс.Minecraft: 1.21.1neoforge
Скачать
Что нового
## [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 in `ars_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 `AbstractSpell` passed, 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 mirrored `max_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_primary` hotbar 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 `runGameTestServer` sets `-Dans.gametest.castProbe=true`, which applies that mixin. - `-PwithIrons316RuntimeGameTests` runs 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.py` accepts 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.md` lists 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_cap` does not limit. **This changes damage for players with that perk**; set `enable_ars_damage_for_irons_damage = false` to 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) and `multi_school_power_policy` (`primary` by default, as before; `max` or `average` let a multi-school spell scale with another of its schools; affinity and progression still credit the first school). `/ans debug combat` shows 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_discount` reduces Ars and Iron's cast costs by `virtue_ring_discount` (0.20), and all of them together by at most `max_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_discounts` covers 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 info` also 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_mode` comment 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.py` now ships here too and checks both directions, including GameTest coverage.
release

Ars 'n Spells 3.3.5

3.3.5
2 окт. 2026 г.1,9 тыс.Minecraft: 1.20.1forge
Скачать
Что нового
## [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 in `ars_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 `AbstractSpell` passed, 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 mirrored `max_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_primary` hotbar 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 `runGameTestServer` sets `-Dans.gametest.castProbe=true`, which applies that mixin. - `-PwithIrons316RuntimeGameTests` runs 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.py` accepts 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.md` lists 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_cap` does not limit. **This changes damage for players with that perk**; set `enable_ars_damage_for_irons_damage = false` to 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) and `multi_school_power_policy` (`primary` by default, as before; `max` or `average` let a multi-school spell scale with another of its schools; affinity and progression still credit the first school). `/ans debug combat` shows 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_discount` reduces Ars and Iron's cast costs by `virtue_ring_discount` (0.20), and all of them together by at most `max_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_discounts` covers 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 info` also 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_mode` comment 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.py` now ships here too and checks both directions, including GameTest coverage.
release

Ars 'n Spells 3.2.4

3.2.4
4 сент. 2026 г.4 тыс.Minecraft: 1.21.1neoforge
Скачать
Что нового
## [3.2.4] - 2026-09-02 — Performance Improvements ### Improved * **Mana Well** rituals now use a much lighter player check instead of repeatedly scanning nearby entities. * Reduced unnecessary per-tick mod compatibility checks. * Shared mana limits now only sync when the value actually changes, reducing unnecessary network traffic. * **Resonance** now syncs only when its value changes instead of every few seconds. No gameplay, config, network protocol, or save-data changes.
release

Ars 'n Spells 3.2.4

3.2.4
4 сент. 2026 г.1,5 тыс.Minecraft: 1.20.1forge
Скачать
Что нового
## [3.2.4] - 2026-09-02 — Performance Improvements ### Improved * **Mana Well** rituals now use a much lighter player check instead of repeatedly scanning nearby entities. * Reduced unnecessary per-tick mod compatibility checks. * Shared mana limits now only sync when the value actually changes, reducing unnecessary network traffic. * **Resonance** now syncs only when its value changes instead of every few seconds. No gameplay, config, network protocol, or save-data changes.
release

Ars 'n Spells 3.2.2

3.2.2
29 авг. 2026 г.1,1 тыс.Minecraft: 1.21.1neoforge
Скачать
Что нового
## [3.2.2] - 2026-08-28 A major stability, compatibility, and polish update focused on **rituals, mana integration, scroll reliability, spellbook compatibility, and cleaner Ars Nouveau ↔ Iron's Spells integration**. ### New Ars 'n' Spells Creative Tab Ars 'n' Spells now has its own dedicated Creative Mode tab containing: * Spell Loom * Spell Transcription Tablet * Spellbook Binding Tablet * Spell Uninscription Tablet * Mana Infusion Tablet * Mana Well Tablet These items no longer clutter the vanilla Functional Blocks or Ars Nouveau tabs, while remaining available through Creative Search and JEI/EMI. Items requiring Iron's Spells 'n Spellbooks only appear when Iron's is installed. ### Mana Infusion & Mana Well Rituals Two previously inaccessible rituals can now actually be crafted and used. * **Mana Infusion** grants mana to the nearest player when completed. * **Mana Well** regenerates mana for players inside its area. Both now have: * Craftable ritual tablets. * Proper item models and textures. * Enchanting Apparatus recipes. * Full localization. Both require **Iron's Spells 'n Spellbooks**. ### Fixed Fake Ars 'n' Spells Loot Scrolls Iron's loot systems could previously generate useless scrolls containing Ars 'n' Spells' internal `ars_cross_*` proxy spells. These could appear in: * Exploration chests. * Mystery Scroll Pouches. * Mob drops. * Wandering Trader offers. * Other Iron's random-spell rewards. They now correctly opt out of random loot generation. Existing dud proxy scrolls are repaired into **blank Iron's scrolls** when used instead of consuming resources or doing nothing. Missing proxy descriptions have also been added so any remaining visible proxy displays readable text instead of a raw translation key. ### Fixed One Mana Bar Compatibility Fixed a mixin conflict with **One Mana Bar** that could prevent entire modpacks from starting. * Mana integration now uses safer compatibility hooks. * `ARS_PRIMARY` behavior continues to work when other mods replace Iron's casting logic. * Optional integration failures now disable the affected feature instead of bringing down the entire modpack. * Startup diagnostics now correctly report which integrations actually loaded. ### Fixed Iron's Scroll Costs Iron's scrolls had unintentionally been casting **completely free** in previous releases. They now correctly follow: `scroll_cost_mode` Available behavior includes: * `full` — normal spell cost. **Default** * `lp_only` — pay LP instead. * `free` — intentionally retain free casting. ### Fixed Hybrid Mana Wipes Fixed a serious issue where casting an Ars Nouveau spell in **HYBRID mana mode** could unexpectedly delete a large portion of the player's mana. * Ars and Iron's now agree on the correct maximum mana. * Equipment bonuses are handled properly. * Dimension changes no longer break the shared mana ceiling. * Mana validation and actual costs now use the same calculation. * Very cheap spells no longer accidentally round down to free casts. ### Fixed Iron's Inscription Table Crashes ANS-exported scrolls could previously crash clients or dedicated servers when used with Iron's **Inscription Table**. * Newly exported scrolls now contain valid Iron's scroll data. * Older affected scrolls are repaired when encountered. * Incompatible ANS carriers are safely rejected. * Empty spells can no longer accidentally be written into spellbooks. ### Fixed Spell Loom Scroll Crashes * Fixed malformed or outdated Spell Loom scrolls potentially crashing the client when hovered. * Invalid scroll data now fails safely. * Improved validation and repair of legacy exported scrolls. * Empty carriers no longer incorrectly enter Iron's normal casting path. ### Fixed Unbinding Ars Spells Removing an Ars spell from an Iron's spellbook now properly removes its entry from the spell wheel. Previously, unbinding could leave behind selectable but unusable spell entries. ### Fixed Virtue Ring Free Casting Fixed the **Virtue Ring** allowing completely free Ars spellcasting when its Aura system was disabled. Mana and Aura behavior now consistently follows the intended configuration. ### Cleaner JEI, EMI & Creative Menus Internal `ars_cross_*` proxy spells are now hidden from normal player-facing lists and recipes. They no longer clutter: * JEI * EMI * Iron's Scrolls tab * Scroll Forge recipes * Arcane Anvil recipes * Random Iron's loot The proxies remain internally available so existing bound spellbooks continue working. ### Improved Spell School Detection Ars spells are now assigned to magical schools more accurately. This improves: * Elemental affinity. * Iron's spell-power scaling. * Multi-school glyph handling. * Ars Elemental compatibility. Filter glyphs no longer incorrectly determine an entire spell's school. Addon glyph-school mappings can also be supplied through datapacks. ### Missing Addon Glyph Protection Stored spells are now checked to make sure **all required glyphs still exist**. Previously, uninstalling a glyph addon could silently remove missing glyphs and leave behind a different but still castable spell. ANS now refuses to bind or cast incomplete spells and reports which glyphs are missing. ### Improved Spellbook Detection Iron's spellbooks are now detected through Iron's supported interfaces and tags rather than relying on item-name matching. This improves compatibility with custom and addon spellbooks. ### Fixed Ritual & Spell Textures * Ritual tablets now use proper Ars 'n' Spells artwork instead of missing textures. * Added fallback icons for Ars spells shown through Iron's spell wheel. * Added automated checks to prevent items from shipping without required models or textures. ### Additional Reliability Improvements * Spell-related transactions now use Minecraft game time, avoiding problems caused by lag or paused worlds. * ANS-owned item data now includes a schema version for safer future migrations. * Improved warning rate limits to prevent malformed scrolls from flooding server logs. * Added stronger automated checks for mixins, item assets, rituals, scrolls, and addon compatibility. * Expanded compatibility testing with **Ars Elemental** and **Too Many Glyphs**. ### Compatibility * Existing worlds remain compatible. * Existing bound spellbooks continue to work. * Existing malformed ANS scrolls are repaired when encountered where possible. * Datapack support remains compatible. * Optional integrations now fail more safely instead of preventing the entire game from loading.
release

Ars 'n Spells 3.2.2

3.2.2
29 авг. 2026 г.428Minecraft: 1.20.1forge
Скачать
Что нового
## [3.2.2] - 2026-08-28 A major stability, compatibility, and polish update focused on **rituals, mana integration, scroll reliability, spellbook compatibility, and cleaner Ars Nouveau ↔ Iron's Spells integration**. ### New Ars 'n' Spells Creative Tab Ars 'n' Spells now has its own dedicated Creative Mode tab containing: * Spell Loom * Spell Transcription Tablet * Spellbook Binding Tablet * Spell Uninscription Tablet * Mana Infusion Tablet * Mana Well Tablet These items no longer clutter the vanilla Functional Blocks or Ars Nouveau tabs, while remaining available through Creative Search and JEI/EMI. Items requiring Iron's Spells 'n Spellbooks only appear when Iron's is installed. ### Mana Infusion & Mana Well Rituals Two previously inaccessible rituals can now actually be crafted and used. * **Mana Infusion** grants mana to the nearest player when completed. * **Mana Well** regenerates mana for players inside its area. Both now have: * Craftable ritual tablets. * Proper item models and textures. * Enchanting Apparatus recipes. * Full localization. Both require **Iron's Spells 'n Spellbooks**. ### Fixed Fake Ars 'n' Spells Loot Scrolls Iron's loot systems could previously generate useless scrolls containing Ars 'n' Spells' internal `ars_cross_*` proxy spells. These could appear in: * Exploration chests. * Mystery Scroll Pouches. * Mob drops. * Wandering Trader offers. * Other Iron's random-spell rewards. They now correctly opt out of random loot generation. Existing dud proxy scrolls are repaired into **blank Iron's scrolls** when used instead of consuming resources or doing nothing. Missing proxy descriptions have also been added so any remaining visible proxy displays readable text instead of a raw translation key. ### Fixed One Mana Bar Compatibility Fixed a mixin conflict with **One Mana Bar** that could prevent entire modpacks from starting. * Mana integration now uses safer compatibility hooks. * `ARS_PRIMARY` behavior continues to work when other mods replace Iron's casting logic. * Optional integration failures now disable the affected feature instead of bringing down the entire modpack. * Startup diagnostics now correctly report which integrations actually loaded. ### Fixed Iron's Scroll Costs Iron's scrolls had unintentionally been casting **completely free** in previous releases. They now correctly follow: `scroll_cost_mode` Available behavior includes: * `full` — normal spell cost. **Default** * `lp_only` — pay LP instead. * `free` — intentionally retain free casting. ### Fixed Hybrid Mana Wipes Fixed a serious issue where casting an Ars Nouveau spell in **HYBRID mana mode** could unexpectedly delete a large portion of the player's mana. * Ars and Iron's now agree on the correct maximum mana. * Equipment bonuses are handled properly. * Dimension changes no longer break the shared mana ceiling. * Mana validation and actual costs now use the same calculation. * Very cheap spells no longer accidentally round down to free casts. ### Fixed Iron's Inscription Table Crashes ANS-exported scrolls could previously crash clients or dedicated servers when used with Iron's **Inscription Table**. * Newly exported scrolls now contain valid Iron's scroll data. * Older affected scrolls are repaired when encountered. * Incompatible ANS carriers are safely rejected. * Empty spells can no longer accidentally be written into spellbooks. ### Fixed Spell Loom Scroll Crashes * Fixed malformed or outdated Spell Loom scrolls potentially crashing the client when hovered. * Invalid scroll data now fails safely. * Improved validation and repair of legacy exported scrolls. * Empty carriers no longer incorrectly enter Iron's normal casting path. ### Fixed Unbinding Ars Spells Removing an Ars spell from an Iron's spellbook now properly removes its entry from the spell wheel. Previously, unbinding could leave behind selectable but unusable spell entries. ### Fixed Virtue Ring Free Casting Fixed the **Virtue Ring** allowing completely free Ars spellcasting when its Aura system was disabled. Mana and Aura behavior now consistently follows the intended configuration. ### Cleaner JEI, EMI & Creative Menus Internal `ars_cross_*` proxy spells are now hidden from normal player-facing lists and recipes. They no longer clutter: * JEI * EMI * Iron's Scrolls tab * Scroll Forge recipes * Arcane Anvil recipes * Random Iron's loot The proxies remain internally available so existing bound spellbooks continue working. ### Improved Spell School Detection Ars spells are now assigned to magical schools more accurately. This improves: * Elemental affinity. * Iron's spell-power scaling. * Multi-school glyph handling. * Ars Elemental compatibility. Filter glyphs no longer incorrectly determine an entire spell's school. Addon glyph-school mappings can also be supplied through datapacks. ### Missing Addon Glyph Protection Stored spells are now checked to make sure **all required glyphs still exist**. Previously, uninstalling a glyph addon could silently remove missing glyphs and leave behind a different but still castable spell. ANS now refuses to bind or cast incomplete spells and reports which glyphs are missing. ### Improved Spellbook Detection Iron's spellbooks are now detected through Iron's supported interfaces and tags rather than relying on item-name matching. This improves compatibility with custom and addon spellbooks. ### Fixed Ritual & Spell Textures * Ritual tablets now use proper Ars 'n' Spells artwork instead of missing textures. * Added fallback icons for Ars spells shown through Iron's spell wheel. * Added automated checks to prevent items from shipping without required models or textures. ### Additional Reliability Improvements * Spell-related transactions now use Minecraft game time, avoiding problems caused by lag or paused worlds. * ANS-owned item data now includes a schema version for safer future migrations. * Improved warning rate limits to prevent malformed scrolls from flooding server logs. * Added stronger automated checks for mixins, item assets, rituals, scrolls, and addon compatibility. * Expanded compatibility testing with **Ars Elemental** and **Too Many Glyphs**. ### Compatibility * Existing worlds remain compatible. * Existing bound spellbooks continue to work. * Existing malformed ANS scrolls are repaired when encountered where possible. * Datapack support remains compatible. * Optional integrations now fail more safely instead of preventing the entire game from loading.
release

Ars 'n Spells 3.0.1

3.0.1
6 июл. 2026 г.4,4 тыс.Minecraft: 1.21.1neoforge
Скачать
Что нового
## [3.0.1] — full 3.0.x parity with 1.20.1: native spell wheel + Spell Loom (2026-07-05) Ports the entire Forge 1.20.1 3.0.0/3.0.1 line (including its audit remediation) onto NeoForge 1.21.1, aligning version numbers so 3.0.1 means the same feature set on both game versions. Compile targets: **Ars Nouveau 5.11.1 / Iron's Spellbooks 1.21.1-3.16.0** (the Iron's pin was bumped from 3.15.6 to match the play instance; every API this release touches was re-verified against the 3.16.0 jar). Build- and test-verified (60 JUnit tests, 0 failures); in-game runtime validation per TESTING_GUIDE. ### Added — Ars spells in Iron's native spell wheel (3.0.0 feature A+B) - **Export → bind workflow.** An Ars Nouveau spell is exported onto a real `irons_spellbooks:scroll` carrier (`ArsSpellExportUtil`), then bound onto a real Iron's spellbook (`IronsBookBindingUtil.appendArsSpellToBook`), where it appears as **its own entry in Iron's native spell wheel** and casts through Iron's native right-click flow. - **Proxy-spell pool.** Eight real registered Iron's spells (`ars_n_spells:ars_cross_1..8`, `ArsCrossProxyRegistry` on `SpellRegistry.SPELL_REGISTRY_KEY`) drive the wheel entries. Each proxy has mana cost 0 (the delegated Ars cast pays the real cost exactly once), ENDER school (never blocked by "not learned"), instant cast, no cooldown. `IronsProxySlotWriter` grows the book's native container capacity so the player's real Iron's spells are never evicted. - **Data model.** `CrossModSpell` gains additive `proxy_pool_id` / `custom_name` / `nature` / `icon_symbol` fields with backward-compatible codecs — components written by 2.6.1 decode unchanged, and entries without proxy metadata encode byte-identically to the 2.6.1 shape. - **Wheel cosmetics.** New client mixin `MixinAbstractSpellArsIcon` (gated on Iron's presence, `require = 0`) substitutes the player-chosen name and a whitelisted nature/icon texture in the wheel. 17 icon textures ship under `textures/gui/icons/spell/`, plus `textures/gui/spell_icons/ars_cross_1..8.png` as Iron's un-mixed fallback path so a skipped mixin degrades gracefully instead of showing a missing texture. - **Spellbook Binding ritual** (`spellbook_binding` tablet, apparatus recipe, brazier ritual): drop one carrier scroll + one Iron's spellbook; validates fully before mutating, consumes ONE scroll (stacks preserved), reports DUPLICATE/BOOK_FULL precisely. Config: `allow_ars_spells_in_irons_spellbooks` (default true) and `max_ars_cross_spells_per_irons_spellbook` (default -1 = pool-size bound). - **Commands** `/ans export_to_irons_scroll` and `/ans bind_scroll_to_irons_book` (permission 2). - **Tooltips.** `CrossSpellTooltipHandler` (client) shows inscribed-spell entries and cast/cycle hints on any inscribed item. - Right-clicking an Iron's **spellbook** now always defers to Iron's native flow — the ANS sidecar right-click cast no longer hijacks spellbook clicks. ### Added — Spell Loom workstation (3.0.0 feature C) - **First block in the mod**: craftable Spell Loom (gold + lapis + book + obsidian). Right-click opens a 3-slot menu (Ars source + blank Iron's scroll → carrier output) with a name field and nature/icon cyclers. The inscribe action is a server-authoritative payload (`SpellLoomExportPayload`): the server re-reads the block entity slots, validates the scroll, clamps the name to 40 chars, and whitelists nature/icon keys. Hoppers can interact via the item-handler block capability. Ships blockstate/models/textures, loot table, shaped recipe, and recipe-unlock advancement (all at singular 1.21 datapack paths). ### Fixed — audit ports from the 1.20.1 3.0.x line - **ANS-CRIT-005 (world-load deadlock risk):** `RegenSynergyHandler`'s Source-Jar scan now verifies all covered chunks are loaded (non-loading `hasChunk` via new pure `ChunkScanUtil`) before reading block states, clamps Y to build height, and skips-and-retries near unloaded chunks. New config: `enable_source_jar_synergy` (kill switch, default true), `source_jar_scan_interval_ticks` (20, 1–200), `source_jar_scan_radius` (4, 1–8). - **ANS-CRIT-002 / ANS-HIGH-030 (SEPARATE-mode mana integrity):** the Iron's share of a dual-cost cast is now pre-paid atomically with the sufficiency check during Ars cost-calc (previously the post-cast TAIL consume silently swallowed failures — a one-way Ars drain), and a failed Ars leg **refunds** the pre-paid Iron's share via the secondary bridge. - **F1 (apparatus recipes uncraftable with Iron's loaded):** pedestal ingredient `irons_spellbooks:spell_book` is not a registered item (Iron's ships 16 tiered books). Recipes now use the new `#ars_n_spells:irons_spell_books` tag (entries `required: false`, so the tag loads Iron's-less). - **3.0.1 config screen:** full legibility pass (owned near-opaque background so blur mods can't frost it, bounded panel, row stripes with hover, real button chrome with shared render/click geometry, description truncation + hover tooltip, scrollbar) and full read-only gating in multiplayer. Fixed "Reset Toggles" wrongly setting `enable_cooldown_system` to true (TOML default is false). Moved to `client/screen/` (audit F3). - **Payload registration hardening:** all payloads register unconditionally (an Iron's-gated registration could fail channel negotiation when server/client disagree on Iron's presence); network protocol bumped to "2" so 2.6.1 ↔ 3.0.1 cross-connects are cleanly rejected. - **F5:** the remaining direct `enable_mana_unification` read in `RegenSynergyHandler` now routes through `BridgeManager.isUnificationEnabled()`. **F6:** `/reload`-safety of the ritual-tablet splice documented on `RitualRegistryHandler`. ### Removed — dead configuration (ANS-MED-044 / F4 + subsystem-gone keys) - Removed 59 config keys no code ever read: the Ars Glyph Bonuses and Iron's School Bonuses sections, 4 resonance caps, category-cooldown keys, `allow_discount_stacking`, the Performance keys (`mana_sync_interval`, `enable_caching`, `cache_duration`), `hybrid_sync_rate`, `allow_mana_overflow`, and — 1.21.1-only, because Blood Magic / Covenant of the Seven have no 1.21.1 builds — the entire Cursed Ring LP, Aura, and Blasphemy sections plus `hide_mana_bar_with_ring` and `scroll_cost_mode` (its reader mixin was never ported; re-add key + mixin together if the feature returns). Kept: `virtue_ring_discount` and `max_total_curio_discount` (repurposed by the live curio discount system) and the resonance master keys (parity with 1.20.1).
release

Ars 'n Spells 3.0.1

3.0.1
6 июл. 2026 г.3,1 тыс.Minecraft: 1.20.1forge
Скачать
Что нового
## [3.0.1] - 2026-07-05 ### Fixed config screen readability/blur issue - The in-game config screen now paints its own near-opaque background and a bordered content panel instead of relying on the vanilla translucent dim — client blur mods/shaders (the "frosted glass" look) can no longer make it unreadable. Rows have background stripes with hover highlight, high-contrast shadowed text, and the ON/OFF and Mana Mode controls are drawn as real bordered buttons whose hitboxes exactly match the drawn rect (previously a 20px hitbox floated over a 35px row). Long descriptions truncate with a hover tooltip instead of overflowing. ([ConfigScreenFactory.java](src/main/java/com/otectus/arsnspells/config/ConfigScreenFactory.java)) - **Fixed: boolean toggles were clickable in multiplayer read-only mode** — the click silently mutated only the client's SERVER-config mirror (cycle rows were already gated). All row controls are now gated on `canMutate`, render disabled on dedicated-server clients, and the screen shows "Read-only: server-managed config. Edit the server TOML or use /ans commands." - "Reset Toggles" now resets `enable_cooldown_system` to its actual TOML default (`false`); it previously set it to `true`. ### Source Jar synergy: kill switch + tuning (follow-up to the ANS-CRIT-005 chunk-load deadlock fix) - Fixed in 2.6.2/3.0.0 and hardened here: the Source Jar synergy scan could touch (and synchronously load) chunks during player tick in ≤2.6.1, which could contribute to chunk-load deadlocks. The scan now remains guarded by a non-loading `hasChunk` check, and this release adds server-owner controls around it. - New keys under `Source Jar Synergy`: `enable_source_jar_synergy` (default `true` — the supported off switch; when `false` the periodic scan is skipped entirely), `source_jar_scan_interval_ticks` (default 20, range 1–200), and `source_jar_scan_radius` (default 4, hard cap 8 — at most a 2×2 chunk area). Existing TOMLs are auto-upgraded with defaults; no keys renamed. The multiplier keeps its 0.1 minimum — use the kill switch to disable, not a zero multiplier. The kill switch is also exposed as a toggle in the config screen. - The chunk-coverage math behind the scan guard moved to [ChunkScanUtil.java](src/main/java/com/otectus/arsnspells/util/ChunkScanUtil.java) with direct unit coverage; skipped scans are still retried and never cached. - With `debug_mode = true`, a rate-limited counter summary (scans run / skipped due to unloaded chunks / jar hits, plus a slow-scan warning) is logged at most once per minute — counters only, never per-block. ### Fixed: crash at boot on installs without Iron's Spellbooks - `MixinArsPotionEffects` targets an Ars Nouveau class but its bytecode references Iron's `AttributeRegistry`; on an Iron's-less install the mixin processor failed with `ClassMetadataNotFoundException` while transforming `ManaCapEvents`, which made Ars Nouveau itself fail to load and killed the server during startup. The mixin is now gated on Iron's presence in [ArsNSpellsMixinPlugin.java](src/main/java/com/otectus/arsnspells/mixin/ArsNSpellsMixinPlugin.java) — it only has an effect when Iron's is the primary mana system, so nothing is lost. (Found because the Iron-less GameTest profile could not boot.) ### Full-codebase audit remediation Remediation from the 3.0.1 full-codebase audit (see [AUDIT_FINDINGS.md](AUDIT_FINDINGS.md), [AUDIT_ARCHITECTURE.md](AUDIT_ARCHITECTURE.md)). #### Fixed: transcription/binding ritual tablets were uncraftable when Iron's is loaded - Both apparatus recipes used pedestal ingredient `irons_spellbooks:spell_book`, which is **not a registered item** — Iron's registers only tiered books (`copper_spell_book`, …, `legendary_spell_book`). With Iron's installed, both recipes failed to parse (`JsonSyntaxException: Unknown item`) and the Spell Transcription / Spellbook Binding tablets could not be crafted. The recipes now accept any tiered Iron's spell book via a new shipped item tag [`ars_n_spells:irons_spell_books`](src/main/resources/data/ars_n_spells/tags/items/irons_spell_books.json) (all entries optional, so the tag also loads cleanly on Iron's-less installs). Pack makers can override the tag to restrict tiers. - `pack.mcmeta` now declares the correct 1.20.1 data-pack format (15; was 12). #### Fixed: LP cost participants gated on inconsistent config toggles - `MixinSanctifiedAbstractSpell` bypassed Covenant of the Seven's native LP/death check based on `enable_mana_unification` instead of the LP system's own `enable_lp_system` master toggle: with unification off + LP on, both ANS and Covenant processed the cost (the double-penalty/instant-death interaction the bypass exists to prevent); with unification on + LP off, Covenant was bypassed with nobody charging LP. The scroll LP path in `MixinScrollItem` had no LP-system gate at all, so scrolls kept charging LP with the system disabled. Both now key off `enable_lp_system` (default unchanged: `true`). #### Changed - Mode-dependent features (equipment mana bridging, Source Jar synergy, mana-bar hiding) now consistently respect `mana_unification_mode = "disabled"` even when the `enable_mana_unification` master toggle is still `true` — previously each site re-implemented the precedence check and this state behaved inconsistently. `BridgeManager.isUnificationEnabled()` is the documented single source of truth. - The three scroll LP action-bar messages are now translatable (`message.ars_n_spells.lp.*`); English text unchanged. - `ConfigScreenFactory` moved from the common `config` package to `client/screen` (it is a client `Screen`; the old location risked dedicated-server classloading if ever referenced from common code). - Removed the redundant `MixinIronsManaBarOverlay` — `ManaBarController` already cancels Iron's mana-bar overlay via `RenderGuiOverlayEvent.Pre` before the mixin's injection point could ever run. Visual behavior unchanged. - Removed the dead `IronsLPHandler.storePendingScrollLP` (no callers; scroll costs stage through `ScrollLPTracker`). If any pack invoked it reflectively, that call will now fail to resolve. ## [3.0.0] - 2026-07-02 ### Export Ars spells onto Iron's scrolls and bind them into spellbooks The Ars → scroll → spellbook workflow is the headline 3.0.0 feature. An Ars Nouveau spell can now be exported onto a real `irons_spellbooks:scroll` and then bound into a real Iron's spellbook, where it casts through Ars 'n' Spells' existing server-authoritative cross-cast pipeline. The Ars spell is preserved as an opaque ANS sidecar payload (`arsnspells:cross_spells`) on the real Iron item, coexisting untouched with Iron's own `ISB_Spells` container — no lossy translation into Iron's registry slot model. - **New binding ritual + tablet.** [SpellbookBindingRitual.java](src/main/java/com/otectus/arsnspells/rituals/SpellbookBindingRitual.java) consumes a carrier scroll and appends its Ars entry onto a spellbook in range, with full pre-mutation validation and translated feedback. The tablet is registered in [ModItemsRegistry.java](src/main/java/com/otectus/arsnspells/registry/ModItemsRegistry.java) only when Iron's is loaded; the [recipe](src/main/resources/data/ars_n_spells/recipes/apparatus/spellbook_binding.json) is wrapped in `forge:conditional`. - **New export/bind utilities.** [ArsSpellExportUtil.java](src/main/java/com/otectus/arsnspells/spell/ArsSpellExportUtil.java) and [IronsBookBindingUtil.java](src/main/java/com/otectus/arsnspells/spell/IronsBookBindingUtil.java) recognize Iron items by registry id (no top-level Iron's imports) and dedup bound spells by their serialized `ars_spell` payload, not the shared placeholder id. - **New commands.** `/ans export_to_irons_scroll` and `/ans bind_scroll_to_irons_book` (permission level 2) provide a developer/admin path. [ArsNSpellsCommands.java](src/main/java/com/otectus/arsnspells/commands/ArsNSpellsCommands.java). - **Cross-spell tooltips.** [CrossSpellTooltipHandler.java](src/main/java/com/otectus/arsnspells/events/CrossSpellTooltipHandler.java) surfaces embedded Ars spells, the active index, and cast/cycle hints on Iron scrolls and spellbooks (still used for generic non-spellbook carriers). ### Ars spells in Iron's native spell wheel + the Spell Loom workstation Bound Ars spells now appear as their own entries in **Iron's native spell-selection wheel** and cast through Iron's native right-click flow (instead of the ANS sidecar right-click), and are authored at a new **Spell Loom** block. - **Registered proxy-spell pool.** [ArsCrossProxySpell](src/main/java/com/otectus/arsnspells/spell/irons/ArsCrossProxySpell.java) + [ArsCrossProxyRegistry](src/main/java/com/otectus/arsnspells/spell/irons/ArsCrossProxyRegistry.java) register a finite pool (`ars_cross_1..8`) of real Iron's `AbstractSpell`s into `SpellRegistry`. Each occupies one wheel slot; its `onCast` reads the casting book's sidecar entry (matched by pool id) and delegates to `CrossCastingHandler.castArsSpell`, so cost flows once through `onArsSpellCost`/`BridgeManager` (proxy `getManaCost` is 0; no double-charge). Iron's-gated; never classloads without Iron's. These are **real registered spells, not forged ids** — avoiding the lookup/UI-crash risks of fake Iron's spell ids. - **Native container write.** [IronsProxySlotWriter](src/main/java/com/otectus/arsnspells/spell/irons/IronsProxySlotWriter.java) adds each proxy into *grown* container capacity, so a player's existing Iron's spells are never evicted. [IronsBookBindingUtil.appendArsSpellToBook](src/main/java/com/otectus/arsnspells/spell/IronsBookBindingUtil.java) allocates a distinct pool id (the wheel de-dupes by spell id) and enforces the per-book cap; it returns a typed `AppendResult` (`ADDED`/`DUPLICATE`/`BOOK_FULL`/`FAILED`). - **Custom name + icon in the wheel.** Client-only [MixinAbstractSpellArsIcon](src/main/java/com/otectus/arsnspells/mixin/irons/MixinAbstractSpellArsIcon.java) substitutes the per-spell name and icon for proxy entries (`require = 0`, so a future Iron's change degrades to a static fallback rather than crashing). The loom's chosen **icon symbol** (spark/flame/leaf/bolt/star/eye/drop/moon — 8 shipped 16×16 icons) takes priority; the nature icon is the fallback. The icon **color** control was dropped pre-release: Iron's `getSpellIconResource` returns a plain texture path with no tint hook, so a color could never render. Both the nature and icon keys are whitelisted server-side in [SpellLoomExportPacket](src/main/java/com/otectus/arsnspells/network/SpellLoomExportPacket.java) so crafted packets can't stamp NBT that resolves to a missing texture. - **Native right-click preserved.** [CrossCastingHandler.onRightClickItem](src/main/java/com/otectus/arsnspells/spell/CrossCastingHandler.java) now defers to Iron's native flow for Iron's spellbooks (no more hijack); the ANS right-click/sneak-cycle path remains for generic inscribed items. - **Spell Loom workstation.** New block + block entity + menu + screen ([block/](src/main/java/com/otectus/arsnspells/block/), [SpellLoomMenu.java](src/main/java/com/otectus/arsnspells/menu/SpellLoomMenu.java), [SpellLoomScreen.java](src/main/java/com/otectus/arsnspells/client/screen/SpellLoomScreen.java)): drop an Ars source + a blank Iron's scroll, set a name/nature/icon, and inscribe a carrier scroll via the server-authoritative [SpellLoomExportPacket](src/main/java/com/otectus/arsnspells/network/SpellLoomExportPacket.java). Craftable; appears in the Functional Blocks creative tab. - **New config.** `allow_ars_spells_in_irons_spellbooks` (default `true`) and `max_ars_cross_spells_per_irons_spellbook` (default `-1` = no cap, bounded by the pool size 8) under Cross-Cast Inscription. - **Localised diagnostics.** The previously-raw `arsnspells.crosscast.invalid.*` validator messages are now translated. - **Limitation / compat.** At most 8 Ars spells per book show in the native wheel (Iron's `SpellData` stores only id/level/locked and the wheel merges by id). Network protocol version bumped `2 → 3`. ### Pending-cost race fix (free-cast / mischarge on rapid casts) The Virtue Ring (aura), Cursed Ring (LP), and Iron's-LP handlers staged a pending resource cost at cost-calc and consumed it at the deferred resolve. They each used a **single-entry** `Map<UUID, PendingX>`, so back-to-back casts of delayed-resolution spells (e.g. Ars projectiles whose `SpellResolveEvent.Post` fires on impact) overwrote each other's staged cost — the first cast paid the second's price and the second cast went free. - **Per-player FIFO queue.** [VirtueRingHandler.java](src/main/java/com/otectus/arsnspells/events/VirtueRingHandler.java), [CursedRingHandler.java](src/main/java/com/otectus/arsnspells/events/CursedRingHandler.java), and [IronsLPHandler.java](src/main/java/com/otectus/arsnspells/events/IronsLPHandler.java) now store a `Deque<PendingX>` per player: enqueue at cost-calc, poll FIFO (skipping expired heads) at resolve. No cast goes free and no staged cost is dropped. Empty deques are evicted by the periodic sweep and on logout, not in the hot consume path (which would race a concurrent cost-calc reusing the same deque). ### Critical fix: world-load deadlock (also shipped standalone as 2.6.2) - **Fixed a server-thread deadlock while loading chunks.** The Source-Jar regen-synergy scan ([RegenSynergyHandler.java](src/main/java/com/otectus/arsnspells/events/RegenSynergyHandler.java)) called `getBlockState` across a 9×4×9 volume around each player with no loaded-chunk check; near an unloaded chunk border (login, teleport, dimension change, chunk streaming) this forced a synchronous chunk load on the server thread, freezing the game inside `ServerChunkCache.getChunkBlocking`. The scan now verifies the (at most 4) covered chunks are loaded first and retries next cycle otherwise, never caching a result from a skipped scan; its Y range is clamped to world build height. (ANS-CRIT-005) ### High-severity fixes - **Closed a post-cast invulnerability window.** In safe mode (`death_on_insufficient_lp = false`), [LPDeathPrevention](src/main/java/com/otectus/arsnspells/events/LPDeathPrevention.java)'s death-event safety net cancelled ANY lethal magic/sacrifice damage while the LP-immune flag was set — and the flag lingers up to ~3s after every successful Cursed-Ring cast, silently negating unrelated killing blows (PvP spells, hostile casters, Blood Magic effects). The death handler now enforces the same same-tick scope as the hurt handler. (ANS-HIGH-028) - **Server config values are now applied at world load.** The mana-bridge mode was cached at common setup, before the SERVER-type config file is read, so a non-default `mana_unification_mode` / `enable_mana_unification` in `ars_n_spells-server.toml` was silently ignored until someone ran `/ans mode set`. [BridgeManager](src/main/java/com/otectus/arsnspells/bridge/BridgeManager.java) now re-selects on every config load/reload and initializes defensively (DISABLED until real values exist). The init banner/self-check now logs once per session instead of on every world load. (ANS-HIGH-029) - **Failed SEPARATE-mode cross-casts no longer drain Iron's mana.** The Iron's share of a dual-cost cross-cast is pre-consumed during the Ars cost-calc (ANS-CRIT-002); if the Ars leg then failed (insufficient Ars mana, downstream cancel), that payment was silently kept. [CrossCastingHandler](src/main/java/com/otectus/arsnspells/spell/CrossCastingHandler.java) now records the pre-payment on the cast context and refunds it via the secondary bridge on every failed-cast path. (ANS-HIGH-030) ### Medium fixes - **Scroll `full` cost mode now actually charges mana.** [MixinScrollItem](src/main/java/com/otectus/arsnspells/mixin/irons/MixinScrollItem.java) validated the mana cost and then charged nothing (Iron's scrolls never deduct mana natively). The cost is now staged at HEAD and consumed at RETURN only when Iron's accepts the use, via the new `CastingAuthority.consumeIronsSpellMana` (mirrors the validation conversion exactly). (ANS-MED-043) - **Scroll LP staging migrated to per-player FIFO.** [ScrollLPTracker](src/main/java/com/otectus/arsnspells/compat/ScrollLPTracker.java) used a single overwriting slot, so a second scroll use before the first's RETURN clobbered the first's staged cost (the same race the ring handlers' deque migration fixed); entries leaked until logout if another mod suppressed the RETURN. Now a per-player deque with a 5s TTL and opportunistic eviction. (ANS-MED-042) - **Removed ~20 config options that were never read** (silent modpack-tuning traps): the entire *Ars Glyph Bonuses* section (`amplify_damage_bonus`, `extend_time_duration_bonus`, `split_projectile_count`, `pierce_armor_penetration`, `sensitive_crit_bonus`), the entire *Iron's School Bonuses* section (`enable_school_bonuses`, `school_bonus_multiplier`, ten `*_school_*` per-level values), four of the five resonance caps (`max_duration_multiplier`, `max_projectile_split`, `max_chain_chance`, `max_area_multiplier` — only `max_damage_multiplier` is enforced), `enable_category_cooldowns`, `cooldown_reduction_cap`, `allow_discount_stacking`, `mana_sync_interval`, `enable_caching`, `cache_duration`. Setting any of these had no effect; they can return alongside real implementations. (ANS-MED-044) - **Rituals consume one item, not the whole stack.** [SpellTranscriptionRitual](src/main/java/com/otectus/arsnspells/rituals/SpellTranscriptionRitual.java) and [SpellbookBindingRitual](src/main/java/com/otectus/arsnspells/rituals/SpellbookBindingRitual.java) discarded the entire source/scroll `ItemEntity`; a stacked input (Iron's scrolls stack to 16) lost the extras. ### Hardening / consistency - **Fixed packet ids.** [PacketHandler](src/main/java/com/otectus/arsnspells/network/PacketHandler.java) registered `ResonanceSyncPacket` only when Iron's was loaded, shifting every later message id with Iron's presence. All packets now register unconditionally with fixed ids (the packet touches no Iron's classes). - [CooldownSyncPacket](src/main/java/com/otectus/arsnspells/network/CooldownSyncPacket.java) wraps its client-mirror write in the same `DistExecutor` client guard as its sibling S2C packets. - [MixinArsPotionEffects](src/main/java/com/otectus/arsnspells/mixin/ars/MixinArsPotionEffects.java) resolves its two target `MobEffect`s once instead of reverse-registry-scanning every active effect twice per player tick. (OPT-019) - [MixinResourceBarOverlay](src/main/java/com/otectus/arsnspells/mixin/covenant/MixinResourceBarOverlay.java)'s label `@Redirect` is pinned to `ordinal = 0` so a future Covenant build can't get stray " / peak" suffixes on other bars. - Deleted dead `util/SafeCasterContext.java` (zero callers; superseded by reading `event.context` directly). - The in-game config screen's save toast now says the save is scheduled (the write is async; the log is the source of truth) instead of unconditionally claiming success. - The Spell Loom recipe ships an unlock advancement (recipe toast on picking up a book); the loom's icon button label is now translatable (`ars_n_spells.spell_loom.icon` + `ars_n_spells.icon.*`). ### Tests - **Iron-loaded GameTests.** [CrossCastGameTests.java](src/main/java/com/otectus/arsnspells/gametest/CrossCastGameTests.java) replaces the previous unconditional `helper.succeed()` placeholders with a real CYCLE test driven through `CrossCastingHandler.serverHandleCast` and an Iron-loaded export→bind→coexist round-trip on real `irons_spellbooks` items. The round-trip self-skips when Iron's is absent and runs under the new opt-in `-PwithIronsRuntimeGameTests` profile ([build.gradle](build.gradle)). - New unit tests: chunk-guard source assertions for the deadlock fix, death-handler tick scope, SEPARATE-mode refund bookkeeping, ScrollLPTracker FIFO/mana-cost carriage. ### Dev environment (build-time only, no player impact) - **Compile classpath corrected to Ars Nouveau 4.12.7.** `ars_nouveau_file` pointed at CurseMaven file 4781441, which is Ars **4.5.0** — the mod compiled against a different Ars API than the `[4.12.7,4.13)` range mods.toml requires. Now pinned to file 6688854 (4.12.7). - **Forge build target 47.2.0 → 47.4.0**, the minimum Iron's 3.15+ accepts (players have been on 47.4.x all along; `loaderVersion` stays `[47,)`). - **Runnable dev environment.** GeckoLib + Curios (Ars' runtime graph) are now `runtimeOnly`, and PlayerAnimator rides the `-PwithIronsRuntimeGameTests` profile, so `runClient`/`runGameTestServer` boot without hand-copied jars. GameTest structure templates are staged from `src/test/resources/gameteststructures/` into the run dir by the new `stageGameTestStructures` task (vanilla/Forge ship none — the suite previously crashed at batch setup with "Could not find structure file gameteststructures/platform.snbt").
release

Ars 'n Spells 2.6.0

2.6.0
15 июн. 2026 г.927Minecraft: 1.20.1forge
Скачать
Что нового
## [2.6.0] - 2026-06-14 ### Apotheosis / Apothic Curios mana bridge Affixed and socketed **curios** (rings, amulets, belts) now contribute their mana stats to the unified Ars ↔ Iron's pool. The equipment scanner already read attribute modifiers off armor and weapons — so Apotheosis affixes there always worked — but the curio path read only `IManaEquipment` and Ars enchantments, so an affixed/socketed ring's max-mana or mana-regen never reached the cross-mod bridge. A Mana Battery Ring took effect in its own system's pool but was invisible to the other. - **Curios attribute modifiers are now read and mirrored.** [EquipmentIntegration.java](src/main/java/com/otectus/arsnspells/equipment/EquipmentIntegration.java) enumerates worn curios via the Curios API (`CuriosApi.getCuriosInventory(...).findCurios(...)`) and reads each slot's aggregated attribute modifiers (`CuriosApi.getAttributeModifiers(slotContext, uuid, stack)`), summing Ars `max_mana`/`mana_regen` and Iron's `max_mana`/`mana_regen` through the **same `sumModifiers` helper and ADDITION-only rule the armor path uses**. This routes Apotheosis (with Apothic Curios) affixes & sockets — and any other curio mana gear such as Magical Jewelry or Jewelcraft — through the existing bridge. No double-counting: the curio's own pool already gets the modifier natively; the bridge only mirrors it to the other system, exactly as armor does. - **No hard Apotheosis dependency.** The read is generic (any mod's curio mana attributes), gated behind the new `read_curio_attribute_modifiers` config (default on) and wrapped so any API surprise degrades to "no bonus" rather than a crash. - **Spell power needed no change** — it is read from the player's *total* attribute, so affix spell power on armor/weapons/curios already counted. Apothic Attributes' own attributes (crit, armor pierce, fire/cold damage) are combat-only and out of scope for the mana/spell bridge. - **Build:** [build.gradle](build.gradle) adds a `compileOnly` Curios API dependency (`5.9.1+1.20.1`, the version Ars Nouveau bundles at runtime). Curios is always present at runtime via Ars, so this only puts the slot-aware API on the compile classpath. ### Ring / aura-HUD correctness and hardening - **Aura-bar peak tracker is now lock-free.** [ClientAuraPeakTracker.java](src/main/java/com/otectus/arsnspells/client/ClientAuraPeakTracker.java) stores the personal peak in an `AtomicInteger` with a monotonic `getAndUpdate` ratchet, so the render-thread read in the HUD mixin composes cleanly with client-tick writes (and stays correct if a sync writer is ever added). - **Covenant version-drift probe.** [ArsNSpellsClient.java](src/main/java/com/otectus/arsnspells/client/ArsNSpellsClient.java) logs at startup whether Covenant of the Seven is at the version the aura-bar HUD mixin (`MixinResourceBarOverlay`) was bytecode-verified against (2.2.6). The mixin uses `require = 0`, so a mismatch can't crash the client; this makes the silent fallback diagnosable instead. - **Virtue aura system honors its toggle.** [VirtueRingHandler.java](src/main/java/com/otectus/arsnspells/events/VirtueRingHandler.java) now short-circuits its handlers when `ENABLE_VIRTUE_AURA_SYSTEM` is off. - **Dead alternate-resource stubs removed.** [CastingAuthority.java](src/main/java/com/otectus/arsnspells/casting/CastingAuthority.java) dropped the never-implemented `detectAlternateResourceCost`/`validateAlternateResource` path (it always returned null/true); Cursed/Virtue ring costs are owned by their dedicated event handlers. ### Performance (render + tick hot paths) - **OPT-008:** [MixinArsPotionEffects.java](src/main/java/com/otectus/arsnspells/mixin/ars/MixinArsPotionEffects.java) only churns the mana attribute modifiers when the value actually changed, instead of a remove/add every server tick (which forced an attribute recompute). - **OPT-009:** [ManaBarController.java](src/main/java/com/otectus/arsnspells/client/ManaBarController.java) matches mana overlays on the `ResourceLocation` namespace/path directly (allocation-free `equals`) instead of `toString()` + substring scan every overlay every frame. The matchers are extracted as pure, package-private, unit-testable methods. - **OPT-010 / MED-019:** [OverlayDiagnostics.java](src/main/java/com/otectus/arsnspells/client/OverlayDiagnostics.java) registers its per-frame render subscriber on the Forge bus only while diagnostics are enabled (zero dispatch cost when off, the default), and uses a `TreeSet` for already-sorted iteration. - **IronsLP debug trace gated.** [IronsLPHandler.java](src/main/java/com/otectus/arsnspells/events/IronsLPHandler.java) builds its per-cast entry-trace strings only when `LOGGER.isDebugEnabled()`. ### Tests - New unit coverage for the above: [ClientAuraPeakTrackerTest](src/test/java/com/otectus/arsnspells/client/ClientAuraPeakTrackerTest.java) (monotonic ratchet), [ManaBarControllerOverlayMatchTest](src/test/java/com/otectus/arsnspells/client/ManaBarControllerOverlayMatchTest.java) (overlay matchers), and [VirtueRingAuraToggleTest](src/test/java/com/otectus/arsnspells/config/VirtueRingAuraToggleTest.java) (toggle gating).
release

Ars 'n Spells 2.5.0

2.5.0
15 июн. 2026 г.1,8 тыс.Minecraft: 1.21.1neoforge
Скачать
Что нового
## [2.5.0] — 1.21.1 compatibility & correctness (2026-06-06) A correctness-focused compatibility release on top of the build-verified 2.0.1 core. The bridge / cross-casting / progression / resonance / rituals stack is unchanged; this release fixes the largest parity gaps, restores two silently-broken datapack features, and hardens optional-mod handling. Compile targets stay pinned to the build-verified **Ars Nouveau 5.11.1 / Iron's Spellbooks 3.15.6**; the target pack runs **AN 5.11.7 / ISS 3.16.0** at runtime (event- and registry-based code tolerates the delta — see *Known limitations*). **Build- and test-verified; in-game runtime validation remains pending** (the build environment runs no Minecraft). ### Fixed — datapack paths (were build-green but runtime-broken) - **Ritual recipes are obtainable again.** The Spell Transcription / Uninscription apparatus recipes shipped under the 1.20.1 plural path `data/ars_n_spells/recipes/…`, which Minecraft 1.21 no longer reads (it loads `recipe/`, singular — verified against the Ars Nouveau and Iron's jars). They never loaded, so the ritual tablets were uncraftable in survival. Moved to `data/ars_n_spells/recipe/apparatus/`. - **Ritual recipes now parse.** Once relocated, the same apparatus recipes surfaced a second carryover — the 1.20.1 recipe schema (`output`/`item`, `reagent` as an array), which fails AN's current `enchanting_apparatus` codec with `No key result`. Migrated to the 1.21 form (`result` with `id`+`count`, `reagent` as a single object); verified against the live pack (AN 5.11.7) so the Transcription/Uninscription tablets craft at the Enchanting Apparatus. A `ResourcePresenceTest` schema check now guards the format. - **Curio spell discount works again.** The `#ars_n_spells:curio_spell_discount` item tag shipped at the plural `tags/items/` path (1.20.1) instead of 1.21's `tags/item/`, so it never loaded and the discount was permanently inert. Moved to `tags/item/`, and the tag now ships a sensible default (`#irons_spellbooks:school_focus`, optional). ### Added / changed — affinity now covers every Iron's addon school - **Dynamic, addon-aware affinity.** Affinity was keyed by a hardcoded 16-value `AffinityType` enum, so the ~19 addon schools in the target pack (`cataclysm_spellbooks:abyssal`, `iss_magicfromtheeast:spirit`, `somakespells:aqua`, …) earned no affinity at all — the Iron's handler dropped every school not in the enum. Affinity is now stored as a `Map<String,Integer>` keyed by the full school id (mirroring progression), so **every registered Iron's school tracks automatically**, with no per-mod code. New `SchoolKeys` (the single canonical-key source shared by both handlers and the damage-scaling site) and an Iron's-gated `SchoolIndex` registry snapshot for `/ans` diagnostics. - **Fixed the mirrored Ars-side drop bug.** `aqua`/`geo`/`wind` (words the Ars glyph heuristic emits but the enum lacked) threw in `AffinityType.valueOf` and were silently lost; they now track under `ars_n_spells:*` keys. - **Safe save migration.** `AffinityData` uses a versioned codec; a 2.0.x save (bare map of enum-name keys) migrates losslessly — the nine elemental tracks are renamed (`FIRE` → `irons_spellbooks:fire`) with counts intact and re-stamped on first save (idempotent). **Owner decision (default):** the seven legacy category/source buckets (OFFENSIVE/DEFENSIVE/UTILITY/MOVEMENT/ARCANE/PRIMAL/HYBRID) are dropped on migration — they were never real schools and current code never wrote them. Back up saves if you want to be cautious; flip to quarantine on request. - `/ans info <player>` now lists the player's non-zero affinity tracks and (with Iron's) the registered school count. ### Added — Curios discount, both sides - The tagged-curio mana discount now applies to **Iron's** casts too (`SpellOnCastEvent.setManaCost`), not just Ars casts. The slot scan is shared via a new `compat/curios/CuriosAccess`. New `max_total_curio_discount` config (default 0.50) caps the combined discount so stacked curios can't trivialise mana cost. ### Hardened — optional-mod & version resilience - All mana/resolver mixin injects now carry `require = 0`, so an Ars/Iron's point-release method-signature change fails soft (skips the inject) instead of crashing mod load. The mixin plugin additionally probes the Ars target classes (`ManaCap`/`ManaData`/ `SpellResolver`) so a class rename also fails soft. (Shadow *field* drift remains fatal — the eventual event-first migration is the real fix; see *Known limitations*.) - New `compat.ModPresence` (cached multi-mod presence) + `compat.CompatIds`; `IronsCompat` delegates to them. Lightweight foundation; the full module framework is deferred. - New `#ars_n_spells:magical_companions` entity-type tag (aggregates `#ars_nouveau:familiar` + `#irons_spellbooks:summons`, optional) as datapack scaffolding for future summon synergy. ### Tests - `ResourcePresenceTest` asserts every shipped data/asset file exists, parses, and sits at the correct singular 1.21 path (regression guard for the directory-flattening bug above). - `SchoolKeysTest` pins the Ars↔Iron's key agreement and the aqua/geo/wind fix. - `AffinityDataMigrationTest` covers the versioned codec round-trip and the 2.0.x → 2.5.0 legacy migration (rename, bucket drop, re-stamp, clamp). ### Known limitations - **Compile vs runtime version delta.** Pinned to AN 5.11.1 / ISS 3.15.6; pack runs 5.11.7 / 3.16.0. A post-2.5.0 task is to validate in-game and optionally move the compile classpath up. Mixin **shadow-field** drift (e.g. an AN field rename) would still crash on load — `require = 0` covers method drift only; migrating the mana bridge to AN/ISS events is the durable fix and is deferred. - **In-game validation pending** (build env has no Minecraft): cast one spell per addon school → affinity increments under the correct id; load a 2.0.x save → elemental tracks migrate with counts intact, buckets dropped; tagged-curio cast drops cost on both Ars and Iron's within the clamp; client + dedicated-server boot with/without Iron's and Curios; ritual tablets craftable at the apparatus. - Covenant LP / aura / virtue / blasphemy remain **N/A** (Branch B). The dead Covenant config keys are intentionally retained to match the canonical 2.0.1 config.