File Details
Runic Skills 0.9.3 (Forge 1.20.1)
- R
- Apr 17, 2026
- 1.12 MB
- 40
- 1.20.1
- Forge
File Name
runicskills-0.9.3.jar
Supported Versions
- 1.20.1
Curse Maven Snippet
Changelog
[0.9.3] - 2026-04-16
Balance
- Critical:
limitBreakerAmplifierdefault lowered from999.0fto30.0f. The Limit Breaker perk previously dealt 999 raw damage on a 60-second cooldown — effectively a guaranteed instakill against any non-boss target. New default is a meaningful spike (~15 hearts) that survivors of high-Constitution / heavy-armor builds can endure. luckyDropProbability10 -> 25 andluckyDropModifier2.0 -> 1.5: the previous defaults turned spawner farms into 20-40x loot inflation. Still rewarding for Fortune builds without trivializing all gathering.counterAttackDuration3 -> 1 andcounterAttackPercent50 -> 30: 3-second / 50% counter window made melee mitigation strictly dominant in PvP. Tightened to a 1-second / 30% window so it is a reactive defense, not a passive mitigation aura.treasureHunterProbability500 -> 200: 0.2% per dirt block was too sparse to feel like a perk; 0.5% reads as "rewarding" without becoming a farm.playersMaxGlobalLevel256 -> 320: with 10 skills × 32 max per-skill, the previous 256 cap forced 25.6 avg per skill — players could not reach top-tier perks across multiple trees. 320 allows full specialization across all skills if pursued.
Performance
Skill.getPerks/Skill.getPassives: replaced two-stream().toList()-per-iteration loops with a directfor-each. Eliminates O(n) list allocation per call on the perk/passive registry (called from GUI render and several event paths).
Changed
Perk.isEnabled(Player)no longer short-circuits tofalsewhen the player is inisDeadOrDying(). Perks now remain enabled through the death frame, allowing last-stand counterplay for triggers like Counter Attack and Life Eater on the killing blow.
Assets
- Refreshed
armor_piercing.pngandpassive_life_steal.png(Strength tree icons).
Security
- Critical: removed
CounterAttackSPexploit where the client could supply an arbitrary attack-damage modifier. Counter-attack damage is now computed entirely server-side inCombatEventHandlerand the serverbound packet is no longer registered. The feature was previously broken (direction mismatch with the only sender) and now actually works. SetPlayerTitleSPnow rejects unknown titles, missing capabilities, and titles the player has not unlocked. A malicious client can no longer force admin/locked titles. AddedtitlesUseCustomNameconfig flag (defaulttrue) to gate thesetCustomNamewrite for compatibility with chat/nick mods.- Replaced
ObjectInputStream/ObjectOutputStreaminConfigSyncCPandCommonConfigSyncCPwithFriendlyByteBuffield-by-field encoding plus boundedreadVarInt/readCollectionand aMAX_SYNCED_LISTcap. Closes a Java-serialization gadget surface and prevents unbounded allocations from oversized payloads. - Bumped network channel
PROTOCOL_VERSIONfrom1to2. Old clients will fail fast on join instead of mis-decoding the new wire format.
Fixed
- Joining a server no longer overwrites the user's local
runicskills-common.json5config file. RemovedHandlerCommonConfig.HANDLER.save()fromCommonConfigSyncCPandDynamicConfigSyncCP. - Eliminated dedicated-server crash risks:
SkillCapability,Passive, andPerkno longer importnet.minecraft.client.*orScreen. The no-argSkillCapability.get()was replaced with agetLocal()indirection routed through a client-registered supplier; tooltip building moved to newclient/tooltip/PassiveTooltipandPerkTooltiphelpers. - Fixed
MixVillagerrunaway haggler discount: each call toupdateSpecialPricesnow undoes the previously-applied per-offer delta before applying a fresh one, instead of compounding indefinitely across trade-UI reopens. - Fixed
Utils.intToRoman(was duplicating the thousands array and missing the units array —1994now correctly producesMCMXCIV). - Converted
MixPlayer.getMaxAirSupplyfrom a fragile bare implicit override to an explicit@Inject(method = "getMaxAirSupply", at = @At("RETURN"), cancellable = true)targetingEntity(where the method actually lives). Now resilient to vanilla signature drift. - Documented
MixLivingEntityactiveEffectsinvariants so future patches understand which vanilla guarantees the mixin preserves.
Changed
- Optional integrations (Curios, TacZ, CrayfishGuns, ScorchedGuns2, IronsSpellbooks, ArsNouveau, Apotheosis) are now loaded via
Class.forName(string)so the integration class is never inRunicSkills' constant pool. The mod no longer crashes at load time when a dependency mod is absent. Each integration'sisModLoaded()check still gates instantiation. RegistryClientEventsmoved fromregistry/toclient/event/(matches its actual sidedness).LockItemlost its legacyformatString/getLockItemFromStringparser and the YACL string-encoded round-trip.ConfigSyncCPnow serializes lock items field-by-field viaFriendlyByteBuf(item id, skill enum ordinal, level) with bounds caps.- Added
./gradlew checkSidedImportslint task that fails the build on anyimport net.minecraft.client.*orcom.mojang.blaze3d.*outside the client/integration allowlist. Wired intocheck, so./gradlew buildruns it automatically.
Removed
- Deleted
TetraIntegrationand all references inCombatEventHandler,InteractionEventHandler,RegistryClientEvents, plus thetetra_*Gradle dependencies. The integration was imported but never wired into the mod constructor — dead code.
[0.9.1] - 2026-04-08
Changed
- Renamed project from JustLevelingFork to Runic Skills
- Rebranded mod ID, package, and all internal references
- Changed GUI text color from dark grey to white for improved readability
[0.9.0] - Initial Runic Skills release
Added
- Forked from JustLevelingFork
- Redesigned perk and skill GUI with paginated layout
- Title selection panel with scrollable list
- New skill categories: Endurance, Fortune, Wisdom (replacing Defense, Luck, Building)
- Perk rank system with multi-rank support
- Passive attribute system per skill
- KubeJS integration for scripting
- Ars Nouveau, Tetra, and Apothic Attributes optional integrations
- YACL-based configuration UI

