Skill Tree Configuration

Customize reward tiers, choices, and combat targeting

Overview

The skill tree config defines the reward tiers players progress through as they level each skill. Each tier has a level requirement, a set of reward choices, and a number of picks the player must make. See the Skill Trees page for the player-facing experience and the Reward Types page for details on each reward type.

The config file mods/mmoskilltree/skill-tree.json uses an override-based system - your customizations are stored separately from defaults and preserved across mod updates.

A server-owner surface

Skill-tree tiers cannot be shipped by a content pack at all - there is no pack asset type for them, and every override lives in skill-tree.json alone. A pack extends progression a different way: through masteries, quests, abilities and bonus drops, each delivered the ordinary way, a folder you zip and drop into Mods/. See Building the zip.

File Structure

{
  "schemaVersion": 1,
  "overrides": {
    "MINING": {
      "0": {
        "tier": 0,
        "levelRequired": 5,
        "choicesRequired": 1,
        "choices": [
          {
            "id": "mining_luck_1",
            "type": "LUCK",
            "value": 5.0,
            "displayName": "Lucky Strikes I",
            "description": "5% bonus resource chance"
          },
          {
            "id": "mining_stamina_1",
            "type": "STAT_STAMINA",
            "value": 10.0,
            "displayName": "Endurance I",
            "description": "+10 max stamina"
          }
        ]
      }
    }
  }
}

Each skill has up to 10 tiers (numbered 0-9). Only include tiers you want to customize; missing tiers use defaults automatically.

Default Tiers

Every skill uses the same tier progression by default. The Tier column below is the zero-based JSON key you write in overrides - the same numbering the file structure example above uses (its "0" is the first row here):

TierLevel RequiredChoices OfferedPicks Required
0521
11021
21531
32031
43042
54042
65052
76552
88053
910063

Higher tiers offer more choices and require more picks, creating meaningful build decisions at endgame levels.

Node Fields

Each tier node has the following fields:

FieldTypeDefaultDescription
tierintoptionalTier index (0-9)
levelRequiredintoptionalMinimum skill level to unlock this tier
choicesRequiredintoptionalNumber of rewards the player must pick from this tier
choicesarrayoptionalList of reward options available at this tier
* required

Reward Fields

Each entry in the choices array has these fields:

FieldTypeDefaultDescription
id*--Unique identifier for this reward (e.g., mining_luck_1)
type*--Reward type (see table below)
value*--Magnitude of the effect (percentage or flat amount depending on type)
nameKey-optionalLocalization key for the name shown in the skill tree UI. Preferred over displayName
descriptionKey-optionalLocalization key for the description shown in the skill tree UI. Preferred over description
displayName-optionalUntranslated fallback name, read only when nameKey is not set
description-optionalUntranslated fallback description, read only when descriptionKey is not set
combatTarget-optionalRestricts combat rewards to specific weapon types (default: ALL)
* required

Prefer nameKey/descriptionKey over the raw literals for anything a player sees: content display text is meant to be localized rather than hardcoded. See Localization.

Reward Types

Common type values, with their value format. See Reward Types for the full set of 31 reward types, detailed stacking behavior, and per-skill breakdowns.

TypeValue FormatEffect
STAT_HEALTHFlat amountIncreases maximum health
STAT_DAMAGEPercentageIncreases damage dealt
STAT_DEFENSEPercentageReduces damage taken (default ceiling 90%, retunable per server via the DefenseReduction entry in ability-clamps.json)
STAT_SPEEDPercentageIncreases movement speed
STAT_STAMINAFlat amountIncreases maximum stamina
STAT_MANAFlat amountIncreases maximum mana
LUCKPercentageChance to receive bonus resources
BONUS_XPPercentageIncreases XP gained from this skill
CRITICAL_CHANCEPercentageChance to deal critical damage
LIFESTEALPercentageRestore health when dealing damage
KNOCKBACK_RESISTANCEPercentageReduces knockback received
HASTEPercentageIncreases gathering speed
FORTUNEPercentageChance for bonus item drops
VEIN_MINERBlock countBreak connected blocks of the same type
FALL_DAMAGE_REDUCTIONPercentageReduces fall damage taken
EFFECT_DURATIONPercentageEntity effects last longer
COOLDOWN_REDUCTIONPercentageReduces ability cooldowns
SCHOOL_RESISTFractionPermanent resistance to one damage school; stacks across claimed nodes, survives relog/world-hop, removed on respec/full reset
ABILITY_UNLOCKAbility id (as id, not value)Grants an active ability for use via /mmoability; the reward's own id field names the ability, and value is unused

This table covers the common cases. Several reward types read further leaves this page does not repeat - abilityIdFilter and the selfHpRangeMin/selfHpRangeMax/targetHpRangeMin/targetHpRangeMax HP-range gates among them. See Reward Types for the full field set.

SCHOOL_RESIST value is a fraction, not a whole percent

Every other percentage reward on this page uses a whole-percent-point value (e.g. LUCK at value: 5.0 = 5%, HASTE at value: 5.0 = 5% faster). SCHOOL_RESIST breaks that convention: its value is a native fraction, so 0.05 = 5% resistance. Copying the percentage-reward pattern for a SCHOOL_RESIST node is off by 100x.

Combat Targeting

Combat rewards (STAT_DAMAGE, CRITICAL_CHANCE, LIFESTEAL) can be restricted to specific weapon types using the combatTarget field. This lets you create weapon-specific bonuses like "Swords deal +10% damage" instead of a global damage boost.

SCHOOL_RESIST uses the same combatTarget field for a different purpose: instead of a weapon type, it takes one of the 9 damage school names (Fire, Ice, Lightning, Water, Arcane, Void, Poison, Life, Physical; case-insensitive) - the field's meaning flips from "weapon type" to "damage school" for this one reward type. Physical is worth knowing about: it is the school of every plain weapon strike and of any hit that names no school at all, so resistance to it is the broadest node of the set.

ValueApplies To
ALLAll combat skills (default)
MELEESwords, Daggers, Polearms, Staves, Axes, Blunt, Unarmed
RANGEDArchery
MAGICWands, Spellbooks
ARTILLERYBombs, Guns
SWORDSSwords skill only
DAGGERSDaggers skill only
POLEARMSPolearms skill only
STAVESStaves skill only
AXESAxes skill only
BLUNTBlunt skill only
ARCHERYArchery skill only
UNARMEDUnarmed skill only

If combatTarget is omitted, the reward defaults to ALL and applies to every combat skill.

Override Semantics

  • Missing tiers use defaults automatically - only include tiers you want to change
  • Missing skills use defaults - only include skills you want to customize
  • Overriding a tier replaces the entire tier (all choices must be specified)
  • New defaults added in mod updates propagate without losing your customizations
  • Reference file at mods/mmoskilltree/_reference/defaults-skill-tree.json shows all defaults

Admin Editor

The "Edit Skill Tree" button in /mmoadmin provides a visual editor for skill tree configuration. You can browse tiers per skill, modify reward choices, adjust level requirements, and change picks required - all without editing JSON files directly.

Skill Tree admin editor showing tiers, reward choices, and level requirements

Disabling Tiers & Reset

Disable a Tier

Set a tier's choices to an empty array to disable it:

"overrides": {
  "MINING": {
    "9": {
      "tier": 9,
      "levelRequired": 100,
      "choicesRequired": 0,
      "choices": []
    }
  }
}

Players will skip that tier entirely.

Skill Tree Reset

Players can respec their skill tree choices via the reset button in the /skilltree UI. To disable this, toggle "Allow Skill Tree Reset" in /mmoadmin General Settings, or set "allowSkillTreeReset": false in skill-config.json.

Commands

# Reload all configs (including skill tree)
/mmoconfig reload

# Reset all configs to defaults
/mmoconfig reloaddefaults

# Reset a player's skill tree choices (lets them re-pick)
/mmoconfig resetrewards --args=PlayerName

Examples

Custom Tier Override

Make Mining tier 1 (level 10) offer 3 choices instead of 2:

"overrides": {
  "MINING": {
    "1": {
      "tier": 1,
      "levelRequired": 10,
      "choicesRequired": 1,
      "choices": [
        {
          "id": "mining_luck_2",
          "type": "LUCK",
          "value": 8.0,
          "nameKey": "skilltree.mining.lucky_strikes_2.name",
          "descriptionKey": "skilltree.mining.lucky_strikes_2.desc"
        },
        {
          "id": "mining_stamina_2",
          "type": "STAT_STAMINA",
          "value": 15.0,
          "nameKey": "skilltree.mining.endurance_2.name",
          "descriptionKey": "skilltree.mining.endurance_2.desc"
        },
        {
          "id": "mining_haste_1",
          "type": "HASTE",
          "value": 5.0,
          "nameKey": "skilltree.mining.quick_hands_1.name",
          "descriptionKey": "skilltree.mining.quick_hands_1.desc"
        }
      ]
    }
  }
}

Adding Combat Targeting

Make a Swords damage reward that only applies to swords:

{
  "id": "swords_damage_melee",
  "type": "STAT_DAMAGE",
  "value": 10.0,
  "nameKey": "skilltree.swords.blade_mastery.name",
  "descriptionKey": "skilltree.swords.blade_mastery.desc",
  "combatTarget": "SWORDS"
}

Changing Picks Required

Require 3 picks at tier 5 (level 30) for Woodcutting:

"overrides": {
  "WOODCUTTING": {
    "4": {
      "tier": 4,
      "levelRequired": 30,
      "choicesRequired": 3,
      "choices": [
        // ... your 4+ choices here
      ]
    }
  }
}