Runic Skills

Runic Skills is a Minecraft 1.20.1 Forge RPG progression mod that adds ten levelable skills, auto-scaling passive bonuses, and hundreds of toggleable perks so players can shape a real build through normal gameplay. Designed for the Runecraft modpack.

File Details

Runic Skills 1.1.0 (Forge 1.20.1)

  • R
  • May 10, 2026
  • 1.22 MB
  • 193
  • 1.20.1
  • Forge

File Name

runicskills-1.1.0.jar

Supported Versions

  • 1.20.1

Curse Maven Snippet

Forge

implementation fg.deobf("curse.maven:runic-skills-1516283:8071098")
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

[1.1.0] - 2026-05-08

Consolidated post-1.0.0 release. Bundles the Botania integration (originally tagged 1.0.1), the magic-tree cross-mod expansion (originally tagged 1.0.2), the eight-alpha Powers framework development (originally tagged 1.1.0-alpha1..alpha8), the dedicated-server YACL safety refactor that the README has been advertising since 1.0.1 was actually fixed, the L2Tabs class-load fix (same shape as the 1.0.0 Legendary Tabs fix, missed at the time), and triage of three CurseForge user reports. 120 perks across five mod integrations + 75 Powers metadata stubs (28 with wired behavior) + a meaningful capability change — the mod now actually runs on dedicated servers without YACL installed.

Added — Botania (42 perks; 18 with effects, 24 default-disabled pending future implementation)

  • Optional integration, class-load-isolated. BOTANIA_* perks register only when botania is loaded and the perk's required_level >= 0; otherwise the RegistryObject<Perk> is null and every event path short-circuits via the existing RegistryPerks.X != null idiom. Botania API confined to two files:
    • integration/BotaniaCompat.java — wraps vazkii.botania.api.BotaniaForgeCapabilities, ManaItemHandler, ManaReceiver, ManaPool. Offers drainNearbyPool / hasNearbyPoolMana / drainPlayerMana / chargePlayerMana / getPlayerManaTotal. Scans bounded to a 12×6×12 AABB.
    • integration/BotaniaIntegration.java — Forge-bus event subscriber, registered via RunicSkills.tryLoadIntegration("botania", ...). Hooks ManaProficiencyEvent, ManaDiscountEvent, ManaItemsEvent and Forge TickEvent.PlayerTickEvent, LivingHurtEvent, CriticalHitEvent, LivingDeathEvent, BlockEvent.BreakEvent, LivingEntityUseItemEvent.Finish.
  • Tier layout mirrors Botania's rune / season / sin / Gaia progression:
    • Wisdom low-tier — Petal-Reader, Rune of Mana: Resonance, Sparkle-Sense, Dowser's Twig, Green Thumb, Livingbark Student.
    • Wisdom mid-tier (Seasonal) — Spring: Agricultor's Eye, Summer: Forager's Palate, Autumn: Loot-Hunter's Intuition, Winter: Still Listener, Manaseer's Lens, Corporea Query.
    • Wisdom high-tier (Sin / Gaia / Elven) — Greed: Cartographer-Prospector, Pride: Far Reach, Sloth: Lazy Swap, Envy: Mirror's Read, Elven Knowledge, Gaia's Witness, Oracle of the Nine Runes.
    • Magic low-tier (Rune) — Inner Wellspring, Rune of Water: Tidewoven, Rune of Fire: Emberheart, Rune of Earth: Stone-Rooted, Rune of Air: Featherstep, Band of Aura: Passive Channel.
    • Magic mid-tier (Seasonal / Lens) — Spring: Verdant Pulse, Summer: Solar Conduit, Autumn: Harvest Tithe, Winter: Frostbound, Lens Mastery: Velocity, Lens Mastery: Potency.
    • Magic high-tier (Sin / Gaia / relic) — Lust: Pixie Affinity, Gluttony: Cake Combustion, Greed: Magnetite, Sloth: Unbound Step, Envy: Mirrored Wrath, Pride: Crown of Reach, Wrath: Thundercall, Gaia's Gift: Relic Attunement, Terrasteel Ascension, Flügel's Grace, Manastorm.
  • Full effect implementations (18 perks): Tidewoven, Resonance, Inner Wellspring, Mirrored Wrath, Emberheart, Solar Conduit, Featherstep, Frostbound, Thundercall, Harvest Tithe, Green Thumb, Livingbark Student, Cake Combustion, Stone-Rooted, Terrasteel Ascension, Crown of Reach, Far Reach, Magnetite. Attribute modifiers piggy-back on the existing RegistryAttributes.RegisterAttribute helper; reach bonuses use Forge's ENTITY_REACH and BLOCK_REACH attributes.
  • Default-disabled (24 perks) — every keybind-activated, custom-render, custom-capability, and projectile/physics perk has its *RequiredLevel defaulted to -1, eliding the perk from the registry until a future implementation pass ships its handler. Pack authors who want them visible (for cosmetic display or a future patch) can set the level back to a positive value: Petal-Reader, Sparkle-Sense, Dowser's Twig, Spring: Agricultor's Eye, Summer: Forager's Palate, Autumn: Loot-Hunter's Intuition, Winter: Still Listener, Manaseer's Lens, Corporea Query, Greed: Cartographer-Prospector, Sloth: Lazy Swap, Envy: Mirror's Read, Elven Knowledge, Gaia's Witness, Oracle of the Nine Runes, Band of Aura: Passive Channel, Spring: Verdant Pulse, Lens Velocity, Lens Potency, Lust: Pixie Affinity, Sloth: Unbound Step, Gaia's Gift: Relic Attunement, Flügel's Grace, Manastorm.
  • Perk icons reuse Botania's own 16×16 item textures via the botania: namespace. Nothing redistributed; paths resolve at render time from Botania's assets.
  • Build: maven.blamejared.com added to repositories, compileOnly fg.deobf("vazkii.botania:Botania:1.20.1-451-FORGE:api") added to dependencies. No runtime jar shipped.
  • mods.toml: optional botania dependency, mandatory = false, ordering = "AFTER", versionRange = "[1.20.1-441,)".

Added — Iron's Spells 'n Spellbooks (46 perks)

Phase 1a — generic mana & casting (16 perks): Wellspring, Quickening, Reservoir, Tempo, Arcane Recovery, Focus, Mana Bulwark, Arcane Reprieve, Mana Surge, Spellweaver, Resonant Casting, Imbued Focus, Quickcast, Long Channel, Continuous Flow, Charge Mastery. Five are reconciled as permanent irons_spellbooks:* attribute modifiers on a 10-tick throttle (Wellspring → max_mana, Quickening → cast_time_reduction, Reservoir → mana_regen, Tempo → cooldown_reduction, Mana Surge transient on spell_power/mana_regen while HP ≤ threshold). The remainder hook ISS events: LivingDeathEvent (Arcane Recovery), LivingAttackEvent on CastType.LONG (Focus), LivingHurtEvent (Mana Bulwark redirects damage→mana at 2:1), ChangeManaEvent (Arcane Reprieve auto-refill with 120s cooldown, Continuous Flow per-tick drain reduction on CastType.CONTINUOUS), SpellOnCastEvent (Spellweaver every-Nth-cast free, 10s combo window), SpellDamageEvent (Resonant Casting above-95%-mana damage bonus, Long Channel CastType.LONG bonus, Charge Mastery CastType.LONG bonus), ModifySpellLevelEvent (Imbued Focus +1 level), and SpellCooldownAddedEvent.Pre (Quickcast CastType.INSTANT-filtered cooldown reduction).

Charge Mastery: ISS 3.x has no CastType.CHARGE (only NONE/INSTANT/LONG/CONTINUOUS), so the perk treats CastType.LONG as the held-cast equivalent and applies a configurable chargeMasteryPercent damage bonus (default +25%). Stacks multiplicatively with Long Channel.

Phase 1b — school specialist triplets (28 perks): for each of nine ISS schools (Fire, Ice, Lightning, Holy, Ender, Blood, Evocation, Nature, Eldritch) a three-perk triad plus the previously-missing Eldritch Attunement gate. X-mancer grants +% to the school's <school>_spell_power (Magic tree). X-Warded grants +% to <school>_magic_resist (Endurance tree). X-Catalyst is a 1-in-N-chance on-cast signature-effect proc — lightning/holy/ender/evocation/nature/eldritch apply CHARGED/FORTIFY/PLANAR_SIGHT/ECHOING_STRIKES/OAKSKIN/ABYSSAL_SHROUD to the caster; fire/ice/blood apply IMMOLATE/CHILLED/REND to the victim.

Phase 1c — summon/utility (2 perks): Lord of the Dead (caster gains +% summon_damage; newly-spawned IMagicSummon entities owned by the player get +% MULTIPLY_BASE on MAX_HEALTH via EntityJoinLevelEvent). Life Leech Bound (when a player-owned summon damages a target, % of damage returns as mana via MagicData.addMana).

Added — Apotheosis & Apothic Attributes (12 perks)

Socket Virtuoso (+N effective sockets via GetItemSocketsEvent). Affix Affinity (counts Rare-or-better equipped affixes via AffixHelper.getRarity(), multiplies ATTACK_DAMAGE and caps damage reduction at 1 - count × reduction on LivingHurtEvent). Ten stat-stick perks reconciled on a 10-tick throttle against ALObjects.Attributes.*: Apothic Critical Mastery (CRIT_CHANCE + CRIT_DAMAGE), Vampiric Fangs (LIFE_STEAL), Reaper's Edge (CURRENT_HP_DAMAGE), Evasive (DODGE_CHANCE), Arrow Mastery (ARROW_DAMAGE + ARROW_VELOCITY), Earthbreaker (MINING_SPEED), Apothic Scholar (EXPERIENCE_GAINED), Spectral Ward (PROT_PIERCE flat + PROT_SHRED percent), Ghostbound (GHOST_HEALTH), Heart of the Healer (HEALING_RECEIVED + OVERHEAL). Two rename clashes resolved against existing Fortune-tree CRITICAL_MASTERY and Intelligence-tree SCHOLAR by prefixing apothic_.

Added — Ars Nouveau (11 perks)

Form & utility (4 perks): Form Focus filters by Spell.getCastMethod() identity on the MethodProjectile/MethodTouch/MethodSelf singletons — Projectile and Self reduce mana cost via SpellCostCalcEvent, Touch boosts outgoing damage via SpellDamageEvent.Pre. Wild Manipulation reduces cost for any spell whose recipe contains a SpellSchools.MANIPULATION-tagged glyph (via a shared spellContainsSchool helper).

Per-school (7 perks): Hedgewitch (Water cost + damage), Emberforged (Fire damage), Stormcaller (Air damage), Geomancer (Earth damage), Conjurer (Conjuration cost), Abjurer (Abjuration damage/magnitude), Arcane Weaver (Manipulation damage). All cost reductions floor at 1 Source. The doc's Necromant variant was dropped — Ars Nouveau 4.12.x SpellSchools has no NECROMANCY enum (only Abjuration/Conjuration/Manipulation and the four elementals).

Added — Cross-mod synergy (9 perks)

Six Schoolbridges (require ISS + Ars): each reads the caster's ISS <school>_spell_power attribute and bleeds a configurable fraction into outgoing Ars damage of the matched school — Fire→ELEMENTAL_FIRE, Ice→ELEMENTAL_WATER, Lightning→ELEMENTAL_AIR, Nature→ELEMENTAL_EARTH, Holy→ABJURATION, Ender→MANIPULATION. Unified Arcana (ISS + Ars): refunds a percent of Ars cast cost to the caster's ISS mana pool via SpellResolveEvent.Post. Triple Threat (ISS + Ars + Apotheosis): tick-reconciled +% modifiers on max_mana/mana_regen/spell_power, only active when all three mods are loaded. Affix Focus (ISS + Apotheosis): on ModifySpellLevelEvent, grants +N effective spell levels when the player has N or more Rare-or-better Apothic affix items equipped. Every cross-mod perk is null-registered when any required mod is missing — perks disappear from the tree rather than rendering as inert icons.

Added — Powers framework (75 catalogue, 28 wired, 11 of 15 Crowns)

A new tiered abilities subsystem (Marks / Seals / Crowns) sits as a peer to the existing Perks tree. 75 Powers metadata entries are registered (5 per ISS school × 9 + 5 per cross-cutting category × 6); 28 have wired event-handler behaviors; the remaining 47 are equip-eligible no-op stubs that the UI can enumerate while their handlers ship in a follow-up. ISS-school Powers null-register when irons_spellbooks is absent; cross-cutting Powers are mod-agnostic. See RUNIC_SKILLS_POWERS.md for the full design spec.

Framework infrastructure:

  • Power / PowerTier / PowerSchool (registry/powers/) — Power is pure metadata (tier, school ResourceLocation, governing skill, level gate, ICD, optional required mod-id); behavior lives in PowerEventDispatcher keyed by Power.getName(), matching the existing Perk pattern.
  • RegistryPowersDeferredRegister<Power> parallel to RegistryPerks, with 75 RegistryObject<Power> entries and getPower/getByTier/getBySchool/isDisabled static helpers.
  • SkillCapability extended — new fields equippedMarks: List<String> (cap 5), equippedSeals: List<String> (cap 3), equippedCrown: String, powerCooldowns: Map<String,Long> (absolute game-time), powerWindows: Map<String,Long>. NBT keys power.equippedMarks / power.equippedSeals / power.equippedCrown / powerCooldowns / powerWindows, round-tripped in serializeNBT / deserializeNBT / copyFrom. Slot caps enforced inside equipPower().
  • PowerOverrides JSON loader at data/<ns>/powers/*.json. Schema: { required_skill_level, icd_ticks, values: { k: number } } — every field optional; packs can tune one knob without overriding the rest. PowerOverridesReloadListener extends SimpleJsonResourceReloadListener mirrors the PerkGroupsReloadListener pattern. Dispatcher reads via PowerOverridesManager.valueOr(power, "damage_multiplier_bonus", fallback).
  • Three new network packetsPowerOverridesSyncCP (server → client, pushes tuned values on login and /skillsreload), PowerProcCP (server → client, 8-particle enchant-rune burst at the player for proc feedback), PowerEquipSP (player → server, equip/unequip with server-authoritative skill/tier/mod-gate validation).
  • PowerEventDispatcher (registry/events/PowerEventDispatcher.java) — single Forge-bus subscriber registered only when ISS is loaded. Subscribes to SpellOnCastEvent, SpellDamageEvent, LivingDamageEvent, LivingDeathEvent, LivingHurtEvent, CriticalHitEvent, SpellTeleportEvent, LivingDropsEvent, PlayerTickEvent, PlayerLoggedOutEvent. Every handler short-circuits via isEquipped(player, ro) which honours the disabledPowers config.
  • PowerRuntime (common/powers/) — bundles 8 shared per-player services into one static container: nested SpellHistory (ring-buffer of recent casts), DamageTypeMemory, ProcWindows, InternalCooldowns, TargetTags, AllyDetector (same-team players + owned-summon chains), PositionBuffer (60-tick rolling snapshot for Unraveled), SummonRegistry. Cleared on PlayerLoggedOutEvent; transient (persistent Power state lives on SkillCapability).
  • IronsSpellbooksPowerCompat — class-load-isolated wrapper for every io.redspace.ironsspellbooks.* symbol the dispatcher touches (MagicData, AttributeRegistry.MAX_MANA, SchoolRegistry, SpellRegistry, 10 MobEffectRegistry entries, event accessors). Same pattern as BotaniaCompat; ISS API is quarantined.
  • disabledPowers config — list of Power registry ids or fully-qualified names, admin kill-switch parallel to disabledPerks/disabledPassives.

75 Powers catalogue:

  • 45 ISS-school Powers — 5 per school (Mark/Mark/Seal/Seal/Crown) across Fire, Ice, Lightning, Holy, Ender, Evocation, Nature, Blood, Eldritch. All Magic-gated (30/60/90 for Mark/Seal/Crown).
  • 30 cross-cutting Powers — 5 per category (Mark/Mark/Seal/Seal/Crown) across Projectile (Dexterity), Channel (Magic), Summon (Wisdom), Mobility (Dexterity), Weapon-Caster (Strength), Utility (Wisdom).

28 wired behaviors (47 still-stubbed):

  • 11 Marks — Sanctified Strike (HOLY +25% vs UNDEAD), Poisoner's Thumb (+15% vs poisoned), Brittle (+15% vs chilled), Blind Witness (+20% vs blinded), Crimson Tithe (heal 10% of blood-school damage dealt), Kindle (+20% FIRE vs immolate), Fortifying Bond (fortify self-pulse on HOLY casts), Forbidden Knowledge (Eldritch cast → 10s window where kills double drops), Rooted (Regeneration I pulse while standing still under oakskin), Step Between (SpellTeleportEvent opens a 30-tick window; next spell +20%), Vex Taunt (player-summon hits → 30% chance to redirect mob aggro).
  • 6 Seals — Skybreaker (airborne Lightning cast opens window for +25% next damage; lightning-school kill clears Ascension cooldown), Guided Fate (any projectile +20% vs guiding_bolt-marked target), Harvest the Weak (blood-school kill on ≤30%-HP target stacks HEALTH_BOOST), Crackle Arc (player-melee + self-charged chains 4 magic damage to nearest hostile within 4 blocks; 10-tick ICD), Sacrifice Cascade (irons_spellbooks:sacrifice cast applies REND in 8-block radius + flat 15-mana refund), Counterspell Riposte (irons_spellbooks:counterspell cast opens 4s window; next damage +20%).
  • 11 Crowns (9 of 9 ISS-school + 2 of 6 cross-cutting):
    • The Heart's Toll (Blood)SpellOnCastEvent deducts 5% of current HP via magic source on blood-school casts; SpellDamageEvent applies +30% above the 10%-HP floor and −50% below it. JSON-tunable on all four magnitudes.
    • Pyroclasm (Fire) — entities dying with immolate near a Pyroclasm-equipped player detonate a 3-block fire AOE for 6 damage and reapply 4s immolate. Per-player rolling cap of 6 detonations per 2s window prevents chain-collapse.
    • Unraveled (Ender) — first consumer of PowerRuntime.PositionBuffer. Cancels LivingDeathEvent, teleports the player to a 60-tick-old snapshot, restores 30% HP / 50% mana, clears all MobEffects. 10-minute ICD, committed only on a successful rewind (no-ops cleanly if there's no past position).
    • The Apocrypha Awakens (Eldritch) — inverted mana relationship: ≤20% mana → Eldritch costs 50% less + damage +40%; ≥80% mana → damage −20%; between thresholds → unchanged.
    • Thunder Lord (Lightning) — every lightning-school damage instance opens a 4s proc window; while active, onPlayerTick every 40 ticks strikes the nearest hostile mob within 10 blocks for 3 magic damage. Non-recursive (uses vanilla magic() source, not ISS lightning).
    • The Grove Remembers (Nature)LivingDamageEvent from the player; if target carries ≥3 harmful MobEffects, +30% damage on that hit.
    • Herald of Dawn (Holy)LivingHurtEvent on the equipped player, only on the hit that crosses the 30%-HP threshold (HP-fraction was above 30% before this damage, ≤30% after); heals self for 8 HP, applies 8s fortify, AABB-scans 12 blocks for {allies (heal+fortify) | hostile mobs in combat (10 holy damage)}. 30s ICD.
    • Glacial Sovereign (Ice) — first non-trivial consumer of PowerRuntime.SpellHistory.countSinceTick. Every 20 ticks, if the player has cast ≥3 ice-school spells in the last 15s, scans a 12-block AABB and extends every active chilled instance on non-ally living entities by 20 ticks (capped at 200 ticks total).
    • Folded Space (Mobility cross-cutting)SpellTeleportEvent opens a 60-tick window; the next teleport-class spell to cast within that window pays 50% mana cost. Teleport spells matched via explicit allowlist (teleport, blink, frost_step, blood_step) — Magic Missile and Eldritch Blast also live in Ender school and would falsely qualify under a school filter.
    • Warmage's Covenant (Weapon-Caster cross-cutting) — first CriticalHitEvent subscriber. A successful melee crit (vanilla or Result.ALLOW) opens a 10-tick window; the next SpellDamageEvent from the player consumes it for +25% damage.
    • Trickster's Aria (Evocation) — first ISS-targeted mixin in the project. MixTrueInvisibilityEffect injects at HEAD of io.redspace.ironsspellbooks.effect.TrueInvisibilityEffect.onDealDamage(LivingHurtEvent) and cancels the invisibility-strip when the attacker has the Power equipped, the suppress window is active, and the damage's directEntity is a Projectile. Melee/touch damage still breaks invis (preserves the spec's counterplay clause). Sibling .firstshot window: first projectile-form SpellDamageEvent while active fires for +50%. Mixin uses @Pseudo + remap = false so the project still loads cleanly when ISS is absent — sets the pattern for future ISS-targeted hooks.

PowersScreen UI (client/screen/PowersScreen.java): three-column Marks/Seals/Crown panel with school-color-coded names (Fire orange, Ice cyan, Lightning yellow, Holy ivory, Ender violet, Blood crimson, Evocation green, Nature olive, Eldritch mint), Equip/Unequip vanilla Button per row, hover tooltip (translated name, tier, school, description, skill requirement, disabled-config flag), independent per-column scroll. Equip clicks send PowerEquipSP; the SyncSkillCapabilityCP resync rebuilds the buttons on the next frame. Runestone-slab visual polish: translucent dark title band with amber rules + amber title text; color-coded slot counter (Marks 3/5 · Seals 2/3 · Crown 1/1, red when full / green when free / dim grey when empty); per-column translucent backing panels with amber column-header underlines; equipped-row marker (2px amber stripe + prefix + bright-green name); amber-tinted hover band; footer hint band (Esc to close · Scroll to navigate · Hover for details). All chrome via GuiGraphics.fill calls — no new texture assets.

/powers admin command (op-2 gated, mirrors /titles): /powers list [mark|seal|crown] (color-coded by equipped/disabled/grey), /powers view (caller's slot counter + equipped names), /powers equip <power> (tab-completion, bypasses skill-level gate for testing but respects tier slots and disabledPowers), /powers unequip <power> (suggestions narrow to equipped names).

OPEN_POWERS_SCREEN keybind (default U, sits next to the existing Y for Skills). Registered in RunicSkillsClient.ClientProxy.registerKeys.

75 new lang keys in en_us.json: power.runicskills.<id> + power.runicskills.<id>.description for every Power, plus key.runicskills.open_powers, screen.runicskills.powers.{title,equip,unequip,no_capability}, 3 tier.runicskills.*, 6 school.runicskills.*. Other locales fall back to en_us pending native translations.

Added — Comment-triage configs

  • enableScholarEnchantmentHiding (HandlerCommonConfig, default false). Decouples the Scholar perk from the global enchantment-hiding mixin — see Fixed below. Mirrored through CommonConfigSyncCP.
  • chargeMasteryPercent (HandlerCommonConfig, default 25, range 1–200). Damage-bonus percent on CastType.LONG ISS spells when Charge Mastery is enabled.
  • docs/SMOKE_TESTS.md — runtime regression checklist, populated for the 1.1.0 fixes.
  • COMMENT_TRIAGE.md at repo root — public-facing per-comment ledger mapping each CurseForge report to its fix or "needs more info" status.

Fixed

  • Dedicated server crashed on boot when YACL was absent. mods.toml had YACL declared mandatory=true, side="CLIENT" so the FML manifest check passed, but RunicSkills.<init> unconditionally called Configuration.Init(), triggering the static initializer of every Handler*Config class — each of which built a ConfigClassHandler from dev.isxander.yacl3.config.v2.api.*. With YACL declared runtimeOnly and absent from the server's mods/ folder, the JVM threw NoClassDefFoundError: dev/isxander/yacl3/config/v2/api/ConfigClassHandler mid-construction. README has been advertising "YACL is not required server-side" since 1.0.1 — the code now matches. Fixed by introducing com.otectus.runicskills.config.storage.ConfigHolder<T>, a server-safe wrapper that mirrors the previous ConfigClassHandler API surface (.instance(), .load(), .save(), .generateGui()) without referencing any YACL type in its bytecode. Persistence uses plain Gson against the existing runicskills.*.json5 files, with a JSON5-comment-stripper for backward compat with YACL-written files. The YACL UI moves to client/config/YaclConfigUiBuilder (loaded only when the user opens the in-game config screen, reached via reflection from ConfigHolder). mods.toml flips to mandatory=false.
  • Client crashed at mod construction when L2Tabs was absent. Identical shape to the 1.0.0 Legendary Tabs crash, missed at the time: RunicSkillsClient$ClientProxy is a @EventBusSubscriber class loaded by Forge via Class.forName(..., true, loader) at mod construction. The clientSetup method contained an inline lambda () -> TabRegistry.registerTab(3500, TabRunicSkills::new, ...) — the verifier eager-resolved TabRunicSkills's BaseTab superclass, which fails when L2Tabs is absent even though the if (isModLoaded()) guard means the lambda would never run. Fixed by extracting registration into client/integration/L2TabsClientIntegration.registerTab() and passing it as a method reference, mirroring the Legendary Tabs treatment.
  • /globallimit <n> rejected every in-game invocation as "client-side" (CurseForge report). The execute method had a backwards guard: if (source.getEntity() instanceof Player) { fail }. In singleplayer the integrated server's command source IS the local ServerPlayer, and on dedicated servers any op invoking the command also runs as a ServerPlayer, so the guard rejected every legitimate path; only rcon/console worked. Brigadier commands registered via RegisterCommandsEvent already only run on the logical server, and requires(s -> s.hasPermission(2)) already gates op-only access. Guard removed.
  • disabledPerks and disabledPassives were invisible in the YACL config UI (CurseForge report — "how do you disable certain perks?"). Both fields had @SerialEntry and @ListGroup annotations but no @AutoGen, so they persisted to disk but never appeared in the in-game config screen. Added @AutoGen(category="common", group="general") to both.
  • Scholar perk → enchantment-hiding side effect (CurseForge report — "is there a way to disable hiding the enchantments?"). The MixItemStack.appendEnchantmentNames mixin keyed off RegistryPerks.SCHOLAR.isEnabled() to decide whether to globally hide every enchantment name on every item. When a user added "scholar" to disabledPerks (the natural way to "turn off" the perk), isEnabled() returned false, so the mixin took the hide branch — globally erasing enchantment text from every tooltip in the world. Decoupled: a new enableScholarEnchantmentHiding config (default false) is the only thing that controls hiding. The Scholar perk is now solely about its XP/enchanting bonus.
  • Per-integration "Generated N lock items" log lines spammed at INFO (CurseForge report — "ice and fire disabled repeating forever"). The closest match in source was the INFO log at IceAndFireIntegration.java:75 firing once per HandlerSkill.ForceRefresh(). Demoted all six per-integration "Generated N lock items" log lines (Spartan, Blood Magic, Ice and Fire, Locks Reforged, Samurai Dynasty, More Vanilla, Jewelcraft) from INFO to DEBUG.
  • Item-lock requirement tooltips ignored the enableItemLocks master toggle (originally noted in 1.0.1). RegistryClientEvents.onTooltipDisplay appended the "Requirements:" block whenever HandlerSkill.getValue(...) returned a non-null list, without consulting the config that gates server-side enforcement. Players who disabled item locks could freely use tools like the trident but still saw "Requires Level X" text. Fixed by checking enableItemLocks before rendering — when locks are off, the requirement block is hidden so the UI matches enforcement. The synced value from CommonConfigSyncCP is authoritative on joined clients; pre-join/main-menu tooltips fall back to the local config value.

Changed

  • Bumped network channel PROTOCOL_VERSION from 3 to 5. Single coherent jump that absorbs every wire-format growth since the last public release: (a) five 1.0.0-era kill-switch fields on CommonConfigSyncCP (maxActivePerks, disabledPerks, disabledPassives, perkSwapCooldownTicks, skillLevelUpCostMultiplier) plus the new PerkGroupsSyncCP packet for datapack-driven perk groups; (b) one new boolean enableScholarEnchantmentHiding on CommonConfigSyncCP for the Scholar/enchantment-hiding decoupling; (c) three new Powers packets (PowerOverridesSyncCP, PowerProcCP, PowerEquipSP) plus the new equipped-Powers / powerCooldowns / powerWindows fields propagated via SyncSkillCapabilityCP. Old 1.0.0 clients connected to 1.1.0 servers (and vice versa) get a clean connection refusal instead of a silent state-corruption bug. Clients and servers must update together.
  • mods.toml YACL dependency flipped from mandatory=true to mandatory=false, ordering set to AFTER. YACL is now genuinely optional everywhere; the server side doesn't need it (config persists via plain Gson) and the client side falls back to the parent screen with a log warning when the user clicks Configure without YACL installed.
  • Sided-import lint extended to forbid dev.isxander.yacl3.* executable-class imports (ConfigClassHandler, serializer.*, gui.*, api.*) outside client/config/. Annotation-only imports (@SerialEntry, @AutoGen, @IntField, @FloatField, @Boolean, @ListGroup) remain allowed because their RUNTIME retention doesn't trigger class loading on the server. Single best guardrail against re-introducing the dedicated-server crash.
  • ISS compile dep bumped from curse-maven file id 55392437402504 (pre-3.15 → 3.15.x). The older artifact predates SpellCooldownAddedEvent which Phase-1a Quickcast needs.
  • Phase 1a texture-path audit. Corrected ten HandlerResources entries to match the real ISS item sheet: upgrade_orb_cast_timecast_time_ring, upgrade_orb_mana_regenmana_ring, antique_amuletconcentration_amulet, mana_potionenchanted_ward_amulet, greater_mana_potiongreater_healing_potion, apprentice_spellbookchronicle, affinity_ringarcane_rune, scroll_of_hastescroll, ancient_codexchronicle_old, arcane_debrisarcane_essence. Perks were functional before but rendered as missing-texture pink/black boxes.
  • apothItem() helper path fix. Apotheosis uses textures/items/ (plural) not the vanilla textures/item/. Every Apotheosis perk icon now resolves correctly.
  • Two design-doc rename clashes resolved: doc's "Mana Shield" → MANA_BULWARK (doc's "Arcane Barrier" was already in use as an Endurance-tree perk), doc's "Second Wind" → ARCANE_REPRIEVE (Constitution tree already has SECOND_WIND).
  • PlayerLifecycleHandler extensionsonPlayerLoggedInEvent now also sends PowerOverridesSyncCP alongside the existing config / perk-group / skill-capability syncs; onAddReloadListeners now also registers PowerOverridesReloadListener alongside PerkGroupsReloadListener. RunicSkillsClient.ClientProxy.registerKeys now also registers OPEN_POWERS_SCREEN (default U).
  • VERSION file synced to 1.1.0 — through 1.0.1 it was left at 1.0.0, partially corrected to 1.0.2 in the 1.0.2 source-only release, and now matches the published version.

Removed

  • attribItem() helper from HandlerResources. attributeslib has no textures/item/*.png assets — the helper was dead code.

Skipped (design-doc flagged risky, deferred to 1.2.0+)

  • Perks — Pack Caller (requires SummonManager internals), Eldritch Apprentice (Eldritch-research XP has no public API), Gemsmith (deep affix-gem iteration on GetAffixModifiersEvent), Lucky Loot (global loot modifier with no player-context routing), Spawner Mage, Enchanter's Insight, Library Dedication, Ritualist, Ars Scholar, Glyphsmith, Mythical Scribe, Bookwyrm's Apprentice, Enchanter-Arms, Apparatus Synergy, Split-Caster; plus eleven Phase-3 capstones — Resonant Affixes, Gem-Fueled Casting, Spellsocket, Adaptive Caster, Apothic Apprentice, Glyph-Imbued Gem, Sourcelink Affix, Dead King's Debt, Spawner Sanctuary, Ritualized Reforge, Gem-Threaded Armor, Arcane Syncretism. Reasons documented in the original phase commit messages.
  • Powers — 4 cross-cutting Crowns remaining: Arcanist's Barrage (Projectile), The Long Note (Channel), The Conductor (Summon — needs SummonManager wrap, same blocker as Pack Caller), The Still Mind (Utility).
  • Powers — design-deferred halves of shipped Crowns: Glacial Sovereign's "Chilled accumulation rate doubled" half (application rate not mutable from the dispatcher) and Ice Tomb death-deny half (needs LivingDeathEvent cancel + scheduled re-kill timer scaffold); The Grove Remembers's heal-reduction half (vanilla LivingHealEvent lacks an attacker pointer for target-tagging); Folded Space's CD-bypass half (no per-spell cooldown override on SpellOnCastEvent); Thunder Lord's CD-reduction half (no per-spell-id cooldown mutator on cast events); Apocrypha Awakens's smooth damage curve between thresholds (shipped as discrete bands).
  • Powers — broader design items: Power Points budget (the doc's 1-PP-per-50-total-skill formula isn't enforced; current MVP allows 5/3/1 for any qualified player; follow-up: add maxActivePowers config to PowerEquipSP); full ally-detection beyond same-team players + owned-summon chains; codec-driven MapCodec-polymorphic Trigger/Effect dispatch (shipped the simpler numeric-override JSON which covers the admin-tuning use case without the polymorphic registration burden).

Notes

  • Save-compatible with 1.0.0. No NBT schema breakage. Existing runicskills.common.json5 files (whether written by YACL pre-1.1.0 or by pack admins) load cleanly through ConfigHolder's comment-stripper. Field names are unchanged; values are preserved. The new Powers fields on SkillCapability default to empty (equippedMarks / equippedSeals empty lists, equippedCrown empty string, powerCooldowns / powerWindows empty maps) so 1.0.x saves migrate trivially. Players who unlocked any of the 24 default-disabled Botania perks before will simply see them disappear from the tree — their NBT rank entries are preserved and will reactivate if a pack admin sets the *RequiredLevel back to a positive value.
  • Tested: ./gradlew clean build passes (compile + sided-imports + new YACL forbid + jar assembly + reobf). Runtime smoke testing per docs/SMOKE_TESTS.md is required before CurseForge upload — primary regression rows: dedicated server boot without YACL installed (the flagship fix this release exists for), client boot without L2Tabs, /globallimit from singleplayer with cheats, disabledPerks=["scholar"] no longer hiding enchantments. Powers behavior tests recommended per Power; the most useful spot-checks are the doc-flagged risky ones (Unraveled rewind, Trickster's Aria invisibility-suppress + first-shot bonus, The Heart's Toll HP cost + damage curve, Glacial Sovereign chilled-extension on a stack of mobs).
  • Localization: 9 of 17 locale files fall back to en_us for the new Powers strings and the enableScholarEnchantmentHiding / chargeMasteryPercent config labels; native translations are a follow-up.
  • Supersession note: This entry replaces the source-only 1.0.1, 1.0.2, and 1.1.0-alpha1..alpha8 tags. Only 1.1.0 ships to CurseForge. The earlier tags remain in git history for reference.