Skip to content

Repository files navigation

Runic Skills

A RPG-style progression mod for Minecraft 1.20.1 Forge. Level ten skills through the actions you already take, unlock perks and passives, gate equipment behind skill thresholds, and earn titles for milestones your world rarely sees.

Minecraft 1.20.1 Forge 47.3.0+ Java 17 License Apache-2.0

Forked from JustLevelingFork in v0.9.0, rebranded and reworked as Runic Skills in v0.9.1. First stable 1.0.0 release shipped the consolidated 0.9.x feature set (item-lock master toggle, perk/passive kill switches, perk-group datapacks) plus the tooltip-matches-enforcement fix. The magic tree grew across the 1.0.x and 1.2.x line — 78+ perks across Iron's Spells 'n Spellbooks (46), Apotheosis + Apothic Attributes (12), Ars Nouveau (11), and cross-mod synergies that activate only when multiple source mods are installed together. 1.1.0 ships the dedicated-server safety refactor (YACL is now genuinely optional on servers — pre-1.1.0 the README claimed this but the code crashed at boot), the L2Tabs class-load fix, and a triage of CurseForge user reports including the /globallimit command bug and the Scholar/enchantment-hiding side effect. 1.2.0 introduces a public Forge event API (SkillLevelUpEvent, PassiveLevelUpEvent, PerkToggleEvent.Pre/Post, TitleEarnedEvent) so external Java mods and KubeJS scripts can hook level changes without reflection, plus four deferred-backlog perks (Apothic Apprentice, Gem-Threaded Armor, Spellsocket, Resonant Affixes), per-integration master-toggle booleans, tooltip word-wrap at GUI scale 4, named-layer HUD overlays so resource packs can relocate them, and bulk-level passives via Shift/Ctrl/Alt-click. 1.3.0 ships two data-driven features authors have been asking for: a custom-skill-visuals datapack layer (override per-skill overview/detail/background art via data/<ns>/runicskills/skill_visuals/*.json with full namespace:path ResourceLocation support) and an FTB Quests integration that registers six native task types (skill_level, global_level, perk_rank, passive_level, title_unlocked, title_selected) wired through an isolated quest bridge so the mod boots cleanly without FTB Quests installed; KubeJS perk/passive helpers also accept arbitrary namespace:path texture ids now. 1.5.0 trims the perk roster to match the target Runecraft pack — all Botania, Blood Magic, and Enigmatic Legacy perks (and their integrations / lock providers) have been removed — and fully wires Apotheosis: the APOTHEOSIS_WISDOM enchantment-cap perk is live, and socketing a gem now requires a Fortune level scaled by the gem's rarity (config toggle apothEnableGemRarityGating, default on). See CHANGELOG.md for the full breakdown.


Table of contents


Overview

Runic Skills adds an unobtrusive, vanilla-respecting progression layer on top of Minecraft. Ten core skills level independently, each bought with the vanilla experience you already earn: you spend XP on a skill from the Skills screen, at a cost that climbs with its level. Each skill funds two kinds of rewards:

  • Perks — discrete, toggleable abilities you unlock at specific skill levels (some with multi-rank tiers — e.g. Haggler I/II/III for progressively deeper villager discounts).
  • Passives — permanent stat modifiers you spend skill points into, e.g. +Attack Damage, +Max Health, +Mana Regen, +Armor Toughness.

On top of the skill system sits a titles subsystem: ~50 earnable prefixes with configurable requirements (kill the Ender Dragon 10 times, mine a Netherite Block, craft 100 Totems) that players can pick to display above their name.

The mod is designed to feel flexible in custom modpacks — almost every number lives in a YACL-backed config, condition types can be registered by other mods, and titles, perk groups and skill artwork are datapack-driven.


Skills

Ten core skills; the player UI calls these "Skills" (internally "aptitudes"):

Skill Focuses Typical level-up actions
Strength Melee damage, heavy armour, sprinting Melee kills, wearing heavier gear
Constitution Max health, kb resistance, armour absorption Taking survivable damage
Dexterity Speed, crit chance, bow & projectile damage Ranged kills, bow shots landed
Endurance Stamina, air supply, environmental resistance Long swims, sprinting, cold exposure
Intelligence Enchanting, XP gain, scholar perk Enchanting, reading books
Building Block-placement speed, haggle discounts, storage perks Placing blocks, villager trading
Wisdom Brewing, farming, and mob-interaction bonuses Brewing, villager interactions
Magic Mana pool, spell damage, mana regen (spellbook mods) Casting spells, studying glyphs
Fortune Lucky drops, rare-loot multipliers Mining ore, breaking grass, fishing
Tinkering Smithing, crafting refunds, tool durability Crafting, smithing table operations

Total level is the sum of all ten; a global cap (playersMaxGlobalLevel) can be set via /globallimit or the config.


Perks, passives, and titles

  • Perks range from vanilla-friendly (Haggler, Scholar, Wormhole Storage) to heavily mod-integrated (Spell Echo for Irons Spellbooks, Glyph Mastery for Ars Nouveau, Ricochet for firearm mods). Most are toggleable from the skills screen so you can disable any perk you don't want active.
  • Passives appear in the skill detail page — spend skill levels on them up to tier caps you unlock with skill level. Attribute additions come from the vanilla or Apothic Attributes registries, so they stack correctly with other gear and mods.
  • Titles are earned, not chosen. Hide or reveal their unlock requirements via the titlesHideRequirements config. Each title is a translation key so modpack makers can reskin them freely without touching code.

Controls

  • Y — default keybind to open the Skills screen (rebindable in Minecraft Controls).
  • In the inventory — a Skills tab appears next to the inventory tab; integrates with L2Tabs and Legendary Tabs when either is installed (see Supported mod integrations).
  • Hover a perk with Shift held — reveals the description, level requirement, rank, and next-rank unlock level.

Installation

Players

  1. Install Minecraft Forge 47.3.0+ for Minecraft 1.20.1.
  2. Drop the runicskills-2.1.1.jar from the latest release into your mods/ folder.
  3. Optionally install YACL (Yet Another Config Lib v3) version 3.5.0+ — it powers the in-game configuration screen. Without it the mod runs normally and the Configure button explains that the screen needs YACL; every setting remains editable in config/RunicSkills/.
  4. Optionally install any of the supported integration mods (see below) — Runic Skills auto-detects them and enables relevant perks/passives/lock-items.

For Tinkers' Construct 3.11.2.166 with Tinkers' Jewelry 1.2.0, use Mantle 1.11.113. Mantle 1.11.97 can hang during parallel initialization of those mods. The Tinkers integration guide explains the recommended runtime and the Forge configuration workaround for packs that must retain the older Mantle release.

No client-side-only nor server-side-only variants; one jar on both sides.

Server operators

  • Drop the same jar on the dedicated server. YACL is not required server-side (1.1.0+; pre-1.1.0 the mod required YACL on the server even though the docs said otherwise).
  • Syncs skill, perk, passive, and title state to clients via a versioned custom Forge network channel (PROTOCOL_VERSION=14). Old clients fail fast instead of desyncing.
  • Optional ops-only commands in /skills, /titles, /globallimit (see Commands).

Supported mod integrations

Runic Skills detects installed mods at runtime and enables matching content without needing a config tweak. Integrations that link against another mod's API are loaded reflectively through tryLoadIntegration, so their classes never enter the main constant pool; integrations that only need Forge events are instantiated directly. Either way a missing dependency leaves that integration inert rather than crashing the mod, and the nine mods this jar links against directly are declared in mods.toml with version ranges, so an incompatible version is refused at load with a clear message.

Integration Effect when present
KubeJS / Rhino Server-side progression events can observe or veto skill level-ups, including advancement-based progression rules. Not content registration: see the note below.
Ars Nouveau 11 form/school perks (Form Focus: Projectile/Touch/Self, Wild Manipulation, per-school Hedgewitch/Emberforged/Stormcaller/Geomancer/Conjurer/Abjurer/Arcane Weaver) on top of the existing spell-damage scaling, mana regen passives, glyph mastery, and familiar gating
Irons Spellbooks 37 magic-tree perks: generic mana/casting (Wellspring, Quickening, Reservoir, Tempo, Spellweaver, Mana Bulwark, Arcane Reprieve, Mana Surge…), per-school triplets (X-mancer / X-Warded / X-Catalyst for all nine schools including Eldritch — including the blood-school perks Blood-mancer / Blood-Warded / Blood Catalyst and Blood Fury), summon perks (Lord of the Dead, Life Leech Bound), plus Spell Echo, Arcane Shield, and Magic-level spell gating
Apotheosis Affix gating, gem attunement, socket bonus interactions, Socket Virtuoso (+N sockets), Affix Affinity (scales with Rare+ affix-item count), Apothic Apprentice (higher-tier +N sockets, stacks with Socket Virtuoso), Gem-Threaded Armor (Endurance: flat ARMOR per equipped socket), Spellsocket (Magic: +effective spell level per N equipped sockets), Resonant Affixes (Magic: ISS spell-damage per Rare+ affix item), Apotheosis Wisdom (enchantment-cap boost via Placebo's GetEnchantmentLevelEvent), plus gem rarity gating — socketing a gem requires a Fortune level scaled by the gem's rarity (uncommon→4, rare→10, epic→18, mythic→26, ancient→32), toggled by apothEnableGemRarityGating (default on)
Apothic Attributes Extended attribute pool for passives plus 10 combat perks (Apothic Critical Mastery, Vampiric Fangs, Reaper's Edge, Evasive, Arrow Mastery, Earthbreaker, Apothic Scholar, Spectral Ward, Ghostbound, Heart of the Healer)
Cross-mod synergy 6 Schoolbridges (Iron's school spell-power bleeds into matching Ars school damage), Unified Arcana (Ars casts refund ISS mana), Triple Threat (+% mana/regen/spell-power when Iron's + Ars + Apotheosis all loaded), Affix Focus (+ISS spell levels when 4+ Rare Apoth items equipped)
Farmers Delight + addons (Dungeons / Fruits / Rustic / Vintage Delight, Brewin' and Chewin') and the Let's Do series (Vinery, Bakery, Brewery, Candlelight, Meadow, Farm & Charm, Beachparty, HerbalBrews) (since 1.6.0) Namespace-driven culinary layer: Master Chef / Culinary Expert boosts apply to food from every configured namespace (culinaryIntegrationNamespaces), plus Green Thumb (bonemeal extra-growth, works on vanilla too), Nourishing Meal (bonus saturation) and Comfort Food (clears a harmful effect). Knives/tools/armor get item locks; ordinary food, crops, seeds and decoration are never locked
Starcatcher (since 1.6.0) Angler's Luck (bonus treasure roll on successful catches), Catch of the Day (daily Luck buff), Angler's Insight (bonus XP per catch); fishing rods and reusable tackle get Fortune/Dexterity locks. Minigame difficulty and bait preservation expose no stable hook upstream and are deliberately untouched
Overgeared (since 1.6.0) Steady Hammer (salvage Poorly Forged → Well Forged), Blueprint Savant (bonus blueprint progress), Metallurgist (bonus alloy/cast smelting output), Master Smith (one bonus quality tier, capped at Perfectly Forged — Masterwork stays Overgeared-exclusive); smithing hammers/tongs/blueprints and forged gear get Tinkering-centric locks, crafting components stay unlocked
Ice and Fire Dragon-slayer perk + dragon-item lock list
Cataclysm Fire-dragon weapon / gear lock items
Mowzie's Mobs Mowzie-weapon lock list
More Vanilla Additional lock-item coverage
Fantasy Armor Armour-piece lock list
Jewelcraft Jewelry lock list
Locks Lock-item tier generation
Natures Aura, Bosses of Mass Destruction, Jet and Elias, Nichirin Dynasty, Saints Dragons, Samurai Dynasty, Siege Machines, Spartan suite, Stalwart Dungeons Lock-item tier generation
Crayfish Gun Mod (unofficial), Scorched Guns 2, TacZ, PointBlank (Vic's) Gun-fire events honour Runic Skills perks/locks
L2Tabs Registers the Skills tab in L2Tabs' strip (priority 3500)
Legendary Tabs (Sfiomn) Registers a native TabBase for the Legendary Tabs sidebar (priority configurable)
CustomNPCs Skills tab joins CustomNPCs' inventory tab strip
FTB Quests (since 1.3.0) Six native task types (skill_level, global_level, perk_rank, passive_level, title_unlocked, title_selected) — see the FTB Quests integration section

If you're a mod author and want Runic Skills to integrate with your mod, open an issue or a PR — each integration is a single Java class with an isModLoaded() gate, see src/main/java/com/otectus/runicskills/integration/.


Commands

All /skills* operator commands require OP level 2.

Command Effect
/skills <player> <skill> <level> Set a player's skill to a specific level.
/skills <player> <skill> add <amount> Add (or subtract, with negative) to a player's skill.
/listskills <player> Dump all ten skill levels for a player.
/skillsreload Re-read the datapack-side config (lock items, titles, conditions) without a server restart.
/respec [player] Full progression reset: every skill back to level 1, all passives, perks and Powers cleared, perk cooldowns and Power runtime state dropped. With no argument it resets the caller and needs no permission — lowering a perk budget can otherwise strand a whole playerbase behind an operator. Naming another player requires permission level 2.
/registeritem <item-id> Register an item as level-gated at runtime (persisted to config on reload).
/globallimit <cap> Set the global-level cap.
/titles <player> <title> set true|false Grant or revoke a title.

Configuration

Configuration surfaces (all under config/RunicSkills/):

  1. Common config (config/RunicSkills/runicskills.common.json5) — YACL-managed, editable via Mods → Runic Skills → Config. Covers skill max-level, XP costs, UI overlays, per-integration toggles, the disabled perk/passive/power lists (and their optional hide-from-UI flags), and the enableItemLocks master toggle.
  2. Lock-item list (config/RunicSkills/runicskills.lockItems.json5) — the per-item skill requirements. Edited directly in the file or with /registeritem; not shown in the YACL screen.
  3. Client config (config/runicskills-client.toml) — Forge config spec. Covers rendering toggles (critical-roll overlay, lucky-drop overlay, perk mod-name display), sort orders, and the Legendary Tabs priority.

Title definitions and their conditions live as datapack JSON under data/runicskills/titles/*.json. After editing any config file in-world, apply it with /skillsreload (no restart needed) — this re-reads every config file and re-syncs to clients.

Disabling vs. hiding perks, passives & powers

These are two separate controls in the common config, and it's worth understanding the difference:

  • Disable — disabledPerks, disabledPassives, disabledPowers (lists of registry names, e.g. "berserker" or "runicskills:berserker"). A disabled entry is blocked: perks can't be enabled/ranked up, passives can't be leveled and lose their attribute modifier, powers can't be equipped. By default the entry is still shown in the UI (locked/greyed) so players can see it exists but is unavailable.
  • Hide — hideDisabledPerks, hideDisabledPassives, hideDisabledPowers (booleans, default false). When a hide flag is true, entries in the corresponding disabled* list are omitted from the UI. Equipped Powers remain visible until unequipped, so their slots can always be reclaimed. A missing-addon recovery control also frees slots belonging to unavailable Powers. Hiding never changes server enforcement. Leaving these off shows disabled entries as locked.

Both are server-authoritative and synced to clients on join, so a dedicated server decides what its players can do and see. Apply changes with /skillsreload. Op-level admin commands like /powers list deliberately keep showing disabled entries (marked [disabled]) so operators retain full visibility.

Disabling item locking

There are four distinct actions — pick the one that matches what you want:

  1. Turn the whole feature off (master toggle). Set enableItemLocks: false in config/RunicSkills/runicskills.common.json5, or untick Enable item locks under Mods → Runic Skills → Config → General. Apply by saving in the UI, running /skillsreload, or restarting. This disables every lock — config entries and integration-generated ones alike.
  2. Disable specific locked items. Edit config/RunicSkills/runicskills.lockItems.json5 and remove the entries you don't want (or run /registeritem <skill> 0 while holding the item to drop a requirement). Apply with /skillsreload.
  3. Disable an integration's auto-generated locks. Each integration has a per-lock toggle (e.g. spartanEnableLockItems) and a master toggle (e.g. enableSpartanIntegration) in the common config. Setting either off stops that integration's locks; the master toggle also disables the integration's other hooks.
  4. Deleting runicskills.lockItems.json5 does NOT disable locking. On the next launch the mod regenerates the default lock list (an INFO line names the file in the log). To turn locking off, use the master toggle in action 1 — not file deletion.

Custom skill visuals

Since 1.3.0, the overview-grid icon, detail-page icon, and detail-page background of every skill can be overridden via datapack. Files live at data/<namespace>/runicskills/skill_visuals/<id>.json:

{
  "skill": "magic",
  "overview_icon": "my_pack:textures/gui/runicskills/magic_overview.png",
  "detail_icon": "my_pack:textures/gui/runicskills/magic_detail.png",
  "background": "my_pack:textures/gui/runicskills/magic_bg.png"
}
  • skill is required and identifies the target by its lowercase name (strength, constitution, dexterity, endurance, intelligence, building, wisdom, magic, fortune, tinkering).
  • overview_icon, detail_icon, and background are all optional. Any field omitted falls back to the legacy hardcoded asset, so you can override a single slot without re-supplying the rest.
  • Texture ids accept either a fully-qualified namespace:path or a bare path. Bare paths resolve to the runicskills namespace for parity with the legacy KubeJS helper.
  • Reloads pick up overrides via the standard datapack reload path (/reload or world load). Removing the JSON restores the default on the next reload.

Client-asset caveat. Texture ids must point at assets the client actually has. Datapack overrides on a dedicated server don't conjure client textures out of thin air — ship the PNGs in a resource pack (or as part of the pack's overrides folder) alongside the JSON.

The same namespaced-texture rule applies to the Perk.add / Passive.add helpers, which take a fully-qualified id since 1.3.0. Those helpers are a Java-side convenience used by the registry itself — they are not reachable from a script; see the KubeJS note below.

The progressive 4-tier "locked icon" array on each skill (the icon that fills in as you level up) is not part of the override — it's a single static slot per skill. Pack authors who want progressive art can replace the underlying runicskills:textures/skill/<name>/locked_*.png files via a resource pack instead.


FTB Quests integration

Since 1.3.0, with FTB Quests Forge installed, Runic Skills registers six task types you can add directly in the FTB Quests editor:

Task id Fields Completes when
runicskills:skill_level skill (string), required_level (int) named skill ≥ required level
runicskills:global_level required_total (int) sum of all skill levels ≥ required total
runicskills:perk_rank perk (string), required_rank (int, default 1) named perk's rank ≥ required rank
runicskills:passive_level passive (string), required_level (int) named passive ≥ required level
runicskills:title_unlocked title (string) named title unlocked on the player
runicskills:title_selected title (string) player is actively wearing the named title

Example task SNBT / JSON:

{ "type": "runicskills:skill_level",     "skill": "magic",        "required_level": 20 }
{ "type": "runicskills:global_level",    "required_total": 100 }
{ "type": "runicskills:perk_rank",       "perk": "berserker",      "required_rank": 1 }
{ "type": "runicskills:passive_level",   "passive": "magic_resist","required_level": 5 }
{ "type": "runicskills:title_unlocked",  "title": "administrator" }
{ "type": "runicskills:title_selected",  "title": "administrator" }

Sticky completion is the default. Once a task completes, it stays complete even if the player respecs or levels a passive back down — matches the "checked off, stays checked" UX players expect from FTB Quests. To opt into live-threshold semantics (task progress reflects current state, including regressions), add "sticky": false to the task block:

{ "type": "runicskills:passive_level", "passive": "magic_resist", "required_level": 5, "sticky": false }

Backfill on login. When a player logs in (or respawns / is cloned after a death), every Runic Skills task is re-evaluated. Authors can ship FTB Quests data after players have already leveled past the threshold without leaving them with phantom-incomplete quests.

Configuration. Disable the integration entirely via enableFTBQuestsIntegration = false in runicskills.common.json5 (or Mods → Runic Skills → Config → Integrations). Task types are not registered when the toggle is off; quests using these types will appear as "unknown" in the editor.


Version matrix

Runic Skills Minecraft Forge Java Network protocol FTB Quests Forge (optional)
2.1.1 1.20.1 47.3.0+ 17 14 [2001.4,2002.0)
2.0.7 1.20.1 47.3.0+ 17 12 [2001.4,2002.0)
2.0.6 1.20.1 47.3.0+ 17 11 [2001.4,2002.0)
2.0.5 1.20.1 47.3.0+ 17 11 [2001.4,2002.0)
2.0.4 1.20.1 47.3.0+ 17 11 [2001.4,2002.0)
2.0.3 1.20.1 47.3.0+ 17 11 [2001.4,2002.0)
2.0.2 1.20.1 47.3.0+ 17 11 [2001.4,2002.0)
2.0.1 1.20.1 47.3.0+ 17 11 [2001.4,2002.0)
2.0.0 1.20.1 47.3.0+ 17 10 [2001.4,2002.0)
1.8.x – 1.9.x 1.20.1 47.3.0+ 17 9 [2001.4,)
1.7.x 1.20.1 47.3.0+ 17 9 [2001.4,)
1.5.x – 1.6.x 1.20.1 47.3.0+ 17 8 [2001.4,) (tested against 2001.4.22)

The protocol column is the one that matters for a server: a client and server on different protocol numbers are refused at connect, by design. 2.0.0 and 2.0.1 are each a breaking bump — every client and the server must be on the same one. 2.0.1 changed the shape of the Power proc packet and added a configuration field, both of which live inside protocol 10, so it could not keep that number without a 2.0.0 peer agreeing on the version and then misreading the wire.

2.1.1 requires protocol 14 on both sides. New integration settings and capability evidence are synchronized from the server. Update clients and servers together.

The 2.1.1 four-mod catalogue implements all 32 perks and 24 Powers. See the implementation record for supported native paths, validation and remaining release checks.

Aqua Attunement requires the separate runicskills-tom-compat-2.1.1.jar, built with gradlew.bat tomCompatJar under build/compat-libs/. Install the companion with the matching core and pinned T.O./Iron's Spellbooks versions on both sides; see the T.O. companion guide.


Building from source

Requirements:

  • JDK 17 (Parchment mappings pin to 17)
  • Gradle 8.10 (the gradlew wrapper pulls this automatically)

Build:

./gradlew build

Artifacts land in build/libs/:

  • runicskills-<version>.jar — the mod jar for distribution. Bundles MixinExtras 0.4.0 under META-INF/jarjar/, which Forge does not supply and this mod's injectors require.
  • runicskills-<version>-slim.jar — the same jar without bundled dependencies. Not for distribution; useful only where MixinExtras is provided by the platform.

No manual setup. A fresh clone builds as-is — nothing to download or drop into libs/ first, and CI's fresh-clone-build job proves it on every push by building with an empty Gradle cache and refusing to start if the checkout contains any untracked file.

Two tab integrations have no public Maven coordinate, so they compile against minimal API surfaces kept in the repo instead of against the real mods:

  • Legendary Tabs (Sfiomn) — a hand-written source stub in src/legendarytabsApi/java, compiled by the legendarytabsApi source set and placed on the compile classpath only. It never enters the shipped jar; the real Legendary Tabs classes load at runtime.
  • L2Tabs (Minecraft-LightLand) — a tracked compile-only stub jar at libs/l2tabs-0.3.3.jar, resolved through flatDir('libs').

Both mirror a specific upstream version (Legendary Tabs 1.20.1-2.0, L2Tabs 0.3.3). If upstream changes those APIs, update the stub and the matching versionRange in mods.toml together — the stub is deliberately minimal, so calling a method it does not declare is a compile error rather than a runtime NoSuchMethodError.

Other tasks:

  • ./gradlew compileJava — compile only (faster iteration).
  • ./gradlew runClient — launch a dev Minecraft client with the mod loaded.
  • ./gradlew checkSidedImports — sided-import lint (enforces that no net.minecraft.client.* or com.mojang.blaze3d.* imports leak into common-side code). Runs automatically as part of check.

Scripting hooks and the public Forge event API

Since 1.2.0, Runic Skills fires four public PlayerEvent-subclass events on MinecraftForge.EVENT_BUS that external Java mods can subscribe to. Since 2.0.5, KubeJS server_scripts can also gate skill progression. The full reference is in docs/API_EVENTS.md and docs/KUBEJS.md; a summary:

Event Cancelable Fires from
SkillLevelUpEvent ✅ SkillLevelUpSP.handle, after validation, before XP consumption
PassiveLevelUpEvent ✅ PassiveLevelUpSP.handle and PassiveLevelDownSP.handle
PerkToggleEvent.Pre ✅ TogglePerkSP.handle, after built-in validation, before state mutation
PerkToggleEvent.Post ❌ TogglePerkSP.handle, after state mutation
TitleEarnedEvent ❌ Title.setRequirement when a title unlocks for a player

KubeJS server script (new in 2.0.5):

// kubejs/server_scripts/runicskills_gates.js
RunicSkillsEvents.skillLevelUp(event => {
    // Only gate purchases, not admin commands
    if (event.cause !== 'purchase') return;
    
    if (event.skill.name === 'magic' && event.newLevel > 30) {
        event.deny('Magic is capped at 30');
    }
});

The server post is authoritative: a cancellation prevents the level-up and charges no XP. See docs/KUBEJS.md for advancement helpers, examples and full details.

What KubeJS cannot do: register content. Earlier versions of this README advertised registering custom skills, perks, passives, titles and conditions from scripts. That was never wired up (RS10-016). The KubeJS plugin registers two bindings and the level-up event group and nothing else, and the underlying obstacle is not a missing binding: skills, perks, passives and Powers are Forge DeferredRegister content, frozen before any script runs. Making it real needs a startup registry event feeding one data-driven catalog, with manifest sync and texture rules to match — a feature, not a binding. Until that exists the claim is gone rather than left standing. Pack authors are not without options in the meantime: titles, perk groups, Power overrides and skill artwork are all datapack-driven, and every number is configurable.


Server / multiplayer notes

  • Protocol version — the custom Forge network channel uses PROTOCOL_VERSION=14; clients on an older Runic Skills version will be rejected at join with a named error. Running a mixed-version modpack server is not supported.
  • Config sync — the server is authoritative for the common config. On join, the server pushes its values to each client; the local runicskills.common.json5 on the client is read for display defaults only.
  • Title display — titles are composed as a name prefix in PlayerEvent.NameFormat. Nothing writes to a player's vanilla custom name, so a nickname, chat, team or tab-list mod keeps ownership of the name and its styling; a name written by a pre-2.0.0 version is cleared once on login. titlesUseCustomName is deprecated and ignored — the conflict it existed to work around can no longer occur. Turn the prefix off entirely with displayTitlesAsPrefix=false.

Known limitations

The mod keeps a machine-checked record of anything it does not fully deliver, and refuses to let you spend a scarce slot on it unknowingly. The full list is in docs/CONTENT_STATUS.md; the shape of it:

  • 0 Powers are INERT. All nineteen Iron's Spells school Powers now have dispatchers and are FULL status; eighteen ship as designed, only reforge_the_shadow substitutes a simpler lever. See docs/CONTENT_STATUS.md for the complete status table.
  • 9 Powers are APPROXIMATE. Each ships a documented substitution for part of its design, is badged in the Powers panel, and has had its tooltip rewritten to describe the lever that actually ships. An approximation you are told about is a design decision; one you are not told about is a bug.
  • Perks: none. That backlog is closed and PerkEffectCoverageTest fails the build if it reopens.
  • Content gated on an absent mod is resolved from the runtime mod list and hidden, never advertised as available.
  • Non-English locales are roughly a quarter translated. Minecraft falls back to English for the rest, so nothing renders as a raw key, but the breadth of the lang/ directory overstates the coverage. checkLangParity keeps the gap declared rather than silent.

Reporting bugs

  • Bug reports and feature requests: use the GitHub issues tracker.
  • When reporting a crash, attach your logs/latest.log (or the crash report under crash-reports/) and your mod list (mods.txt output or a listing of your mods/ directory). Include your config/RunicSkills/runicskills.common.json5 if the bug is config-related.
  • Security issues: open a private advisory instead of a public issue.

Credits and licence

  • Originally forked from JustLevelingFork, with significant reworks to the UI, perk/passive system, title system, and integration architecture.
  • Title assets and the "Runic Skills" rebrand by @otectus.
  • GUI textures, panels, and card artwork by the Runic Skills authors.
  • Released under the Apache License 2.0. See LICENSE (if present) or the SPDX entry for terms.

Third-party mods tested against

Listed under Supported mod integrations. Runic Skills does not bundle any third-party code; each integration is a thin optional compat layer that respects the upstream mod's own licence.

About

Runic Skills is a mod for Minecraft 1.20.1 (Forge) based on the Just Leveling mod - it adds stats, skills and more to the game.

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages