Runic Skills 1.4.0 (Forge 1.20.1)
Curse Maven Snippet
What's new
[1.4.0] - 2026-06-14 — Over-GUI denial messaging, integration audit & perk-backlog drain
Broad audit/stabilization pass, a unified over-GUI denial-message system (network protocol 5 → 6), the Runecraft lock-provider coverage audit, and a large drain of the inert-perk backlog.
Removed — Botania / Blood Magic / Enigmatic Legacy perks (not in the Runecraft pack)
Purged every perk tied to these three mods (identified authoritatively by each perk's
<Integration>.isModLoaded() gate, not just naming), removing the bloat and config surface for mods
the target pack doesn't ship:
- Botania (~40 perks): the entire
BotaniaIntegrationperk block (allBOTANIA_*, the rune / seasonal / sin / capstone perks) plusBotaniaIntegration,BotaniaCompat, thebotaniaconfig group (83 fields), allperk.runicskills.botania_*lang, the namespace texture helper, and the BotaniacompileOnlybuild dependency. - Blood Magic (12 perks):
BLOOD_MASTERY,RITUAL_SAGE,CRIMSON_BOND,BLOOD_SACRIFICE_RECOVERY,BLOOD_SHIELD,BLOOD_WARD,BLOOD_RITUALIST,BLOOD_INSCRIPTION,SACRED_GEOMETRY,BLOOD_CHANNEL,BLOOD_EMPOWER,RITUAL_EFFICIENCY+BloodMagicIntegrationand its lock-item provider. Kept: the Iron's Spellbooks blood-school perks (BLOOD_ATTUNEMENT,BLOOD_MANCER,BLOOD_WARDED,BLOOD_CATALYST— ISS is in the pack) andBLOOD_FURY(generic crit life-steal, re-gated to drop its Blood-Magic dependency). - Enigmatic Legacy (7 perks):
ANCIENT_STRENGTH,CURSE_WARD,ARTIFACT_HUNTER,ENIGMATIC_VITALITY,ENIGMATIC_PROTECTION,ENIGMATIC_WISDOM,ENIGMATIC_UNDERSTANDING+EnigmaticLegacyIntegrationand theenigmaticlegacylock-discovery provider. Kept: the generic perks that were merely flavored that way (ARMOR_OF_FAITH,SOUL_SUSTENANCE,MYSTIC_ANALYSIS,SAGES_FOCUS) andCATACLYSMS_WRATH(gated on Cataclysm, which is in the pack). - Removed the corresponding effect sites (
BLOOD_WARD/BLOOD_EMPOWERinPerkEffectsHandler,BLOOD_SHIELDinCombatEventHandler), the integration enable-toggles and theirCommonConfigSyncCPsync, 125 config fields, 126 lang keys, 61 orphaned texture constants, andBOTANIA_RUNIC_SKILLS_INTEGRATION.md.
Apotheosis — proper incorporation (audit + wire inert perks)
Audited the 14 existing Apotheosis perks against the real 7.4.8 deobf API: zero drift — every
ALObjects.Attributes.* id, GetItemSocketsEvent/ItemSocketingEvent usage, and AffixHelper/
SocketHelper/DynamicHolder call is correct. Wired the inert APOTHEOSIS_WISDOM via Placebo's
GetEnchantmentLevelEvent (the same event Apotheosis uses to extend caps), raising present
enchantments' effective levels by the perk's amplifier for the holder. APOTHEOSIS_GEMS stays
allowlisted with a documented reason: gem rarity is rolled inside GemLootPoolEntry with no
player-attributable Forge event in 7.4.8, so there is no faithful hook short of fragile loot-internal ASM.
Added — Apotheosis gem rarity gating
Gems are not affix items, so the existing Fortune affix-rarity gating never covered them. Now gem
socketing is gated by the gem's own LootRarity (i.e. how powerful it is), reusing the same
per-rarity Fortune thresholds (apothRarityUncommonLevel … apothRarityAncientLevel). Implemented
via Apotheosis's ItemSocketingEvent.CanSocket (@HasResult → setResult(DENY)), reading rarity
through GemInstance.unsocketed(stack).rarity(), with an over-GUI denial banner. Toggle:
apothEnableGemRarityGating (default on; common gems are always ungated).
Fixed — crashes & correctness
- P0 capability-sync NPEs.
SyncSkillCapabilityCP.send()/.handle()dereferenced the@NullableSkillCapability.get()/getLocal()with no guard;send()is reached from ~30 sites incl. player world-join, so a capability-attach race could crash login. Both are now null-guarded. /registeritemfirst-launch crash.HandlerLockItemsConfig.lockItemList, plusLockItem.Skills(field default and varargs constructor) were immutableList.of(...)/Stream.toList(); the command's.add()/.remove()/.set()threwUnsupportedOperationExceptionuntil the config file had been written once. All three are now mutableArrayLists.InteractionEventHandlerNPE on unregistered/removed-mod items (Objects.requireNonNull(getKey())) — now deny-safe, matching theSkillCapabilityfix.PlayerLifecycleHandlertitle NPE — re-fetched the title and dereferenced the nullable result despite null-checking a different variable (fires on every chat/tab render); reuses the checked ref.CraftingEventHandlerLUCKY_DROP captured aPlayerref in a deferredTickTaskthat could be offline a tick later; now captures the UUID and re-resolves.TacZIntegration— guarded the uncheckedModernKineticGunItemcast (ClassCastException) and the uncheckedSkillCapability.get()(NPE).- Capability serialization —
serializeNBT/copyFromused unguarded.get()for skill/passive/title maps (NPE/dataloss if a registry entry was missing); nowgetOrDefaultlike the perk path.
Fixed — robustness & hardening
- Client-bound packet decoders
DynamicConfigSyncCP,PerkGroupsSyncCP,PowerOverridesSyncCPnow bounds-check counts/splits (DecoderException) so a malformed/hostile server can't crash clients (matches the existingConfigSyncCPguard). - Rate limiters added to
PassiveLevelUpSP/PassiveLevelDownSP/SetPlayerTitleSP/OpenEnderChestSP. - Null guards on
Perk.getToggle(),Skill.getLevel(),OverlaySkillGui, andMixForgeGui's camera-entity cast (spectator/detached camera). MixTrueInvisibilityEffectnow gated onirons_spellbooksin the mixin plugin (no classloader WARN when ISS is absent)./globallimitand/updateskilllevelreject< 1(a non-positiveskillMaxLevelbroke the rank divisor);/updateskilllevelnow reports failure instead of success on its rejection path.
Fixed — denial messages now render over open GUIs
- Item-lock warning hidden behind the crafting menu. The skill-requirement overlay
(
runicskills:skill_overlay) is a Forge HUD layer, which Forge does not render while a containerScreenis open — so trying to craft a too-high-level item (e.g. a lockpick) fired the "You can't use this item yet" warning but it never drew.OverlaySkillGuinow also renders via aScreenEvent.Render.Posthook, so the warning always shows over the GUI. The HUD and screen paths are mutually exclusive (no double-draw). - Other denial messages were also behind/again in chat. Spell-gating (Iron's Spellbooks
school_locked/spell_gated, Ars Nouveauars_spell_gated/ars_familiar_gated) usedsendSystemMessage(chat, hidden behind screens), and the Apotheosis affix-rarity gate was sent throughPlayerMessagesCP, which never handled that key — so it displayed nothing at all (and carried only one of its two args). All of these now route through a newOverlayNoticeGui/NoticeOverlayCPover-GUI banner. The Apotheosis banner now passes both the required Fortune level and the rarity name. - Network
PROTOCOL_VERSIONbumped5 → 6for the addedNoticeOverlayCPpacket.
Integration — lock-provider coverage audit (Runecraft)
- Re-verified lock namespaces against the Runecraft item-registry dump and the mod jars' asset folders.
Added two previously-uncovered gear mods: Epic Knights: Antique Legacy (real namespace
antiquelegacy, notepic_knights_antique_legacy) and Call of the Yucatan (call_of_yucutan). docs/INTEGRATION_MATRIX.mdupdated (1.3.9) with the audit provenance and corrected install flags.- Corrected stale "scaffold / lands in batch 4" javadoc + log lines on the Saints' Dragons, Nichirin
Dynasty, and Enigmatic Legacy integrations — their
onLivingHurtperk effects (DRACONIC_FURY, NICHIRIN_BLADE, ANCIENT_STRENGTH) are already implemented, not pending.
Docs / metadata
pack.mcmetadata-pack format 12 → 15 (1.20.1);mod_descriptionfilled in; deadmapping_channel/mapping_versionproperties removed;CLAUDE.mdmixin count corrected (14: 4 client / 10 common).- README/CurseForge command names (
/skillsreload,/registeritem,/respec,/listskills) and config paths (config/RunicSkills/runicskills.common.json5) corrected. - Removed dead
CounterAttackSPpacket class and an unused YACL group lang key. - Added a guard comment in
RegistryCommonEventsexplaining the deliberate static-via-annotation / instance-via-manual-register split (so it isn't "deduplicated" into breakage).
Perk backlog (completion pass — ongoing)
New registry/events/PerkEffectsHandler (data-driven effect tables) plus extensions to
CombatEventHandler. Implemented real gameplay effects for 122 of the 340 inert perks
(allowlist 340 → 218), each gated on isEnabled + its existing config field and removed from
perk_no_effect_allowlist.txt (enforced by PerkEffectCoverageTest). Categories wired so far:
damage-type/conditional damage reduction, knockback resistance, block-reflect, attribute modifiers
(movement/armor/attack-speed/health/reach/luck), experience multipliers + XP-orb healing, mob & ore/
block bonus drops, mining speed, outgoing-damage conditionals (mounted/boss/weapon-id/life-steal),
arrow on-hit effects + recovery + ranged bonuses, absorption/regen/barrier, food (saturation/buffs/
iron-stomach), crafting output, anvil-cost reduction, passive item repair, and potion-duration perks
(via the BENEFICIAL_EFFECT attribute). Approximations are flagged with APPROX comments.
1.4.0 batch — +49 perks (allowlist 218 → 169). A second drain of the backlog, all faithful
vanilla-1.20.1 hooks gated on isEnabled + the perk's config field:
- Dodge subsystem:
DODGE_ROLL/EVASION/SPELL_DODGEcancel a qualifyingLivingHurtEventand open a window consumed byPHANTOM_STRIKE(next-hit bonus). - Survive-lethal:
UNDYING_WILL(chance) andMYTHICAL_BERSERKER(+ rage window) cancelLivingDeathEventto 1 HP with a 60 s lockout (not a permanent totem);BLOODLUST(post-kill attack-speed window) andSTALWART_STRIKER(heal on hostile-mob kill) on the killer side. - Defense:
THICK_SKIN(flat),SHIELD_WALL(blocking),SIEGE_DEFENSE(inside any structure),DRACONIC_CONSTITUTION(elemental),SAMURAI_RESOLVE(post-hit window),ADAPTATION(same-source decay),IMMOVABLE_OBJECT(no knockback while blocking),POISON_IMMUNITY. - Combat/ranged:
CRITICAL_MASTERY(CriticalHitEvent),RAPID_FIRE/CROSSBOW_EXPERT(draw speed),MULTISHOT_MASTERY(EntityJoinLevelEventfan),RICOCHET/TRICK_SHOT(arrow on-hit),CHAIN_LIGHTNING_STRIKE,ENCHANTED_MISSILES,THORNS_MASTERY,TRACKING(Glowing). - Attributes:
FLEET_FOOTED/SWIMMERS_ENDURANCE(move/swim speed),WAR_TACTICIAN(attack speed),TELEKINESIS(block reach), and the LUCK-loot group (TREASURE_SENSE,SCAVENGER,RARE_FIND,MASTER_LOOTER,LUCKY_EXPLORER,LUCKY_FISHING,ADVENTURERS_LUCK). - Gathering/world:
VEIN_MINER(bounded flood-fill),LUMBERJACK/TERRAFORMER(break speed),PROSPECTOR/FORTUNES_FAVOR/SERENDIPITY(bonus ore),RAINBOW_LOOT(enchanted drops),NATURES_BLESSING(heal on natural blocks),UNBREAKABLE/UNBREAKING_MASTERY(durability),SMOKE_BOMB(low-HP invisibility),PHOENIX_RISING(respawn HP).
The remaining 169 inert perks and the Power backlog continue in subsequent batches; many of those describe effects with no faithful vanilla-1.20.1 hook (mod-pool mechanics, enchant-table internals, stamina/zipline/colony/dynamic-light/ore-X-ray features) that require the optional mod's API or custom client rendering — these stay transparently allowlisted rather than faked.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include

