Skip to content

Datapack Customization Guide

For server owners & modpack authors — Regular players: Getting Started.

Customize Fatepath talents, spells, recipes, and TXP behavior through datapacks, resource packs, and config—without modifying MOD source.

What You Can Customize

MethodCustomizable ContentRestart Required
DatapackTalents, spells, talent-gated recipes, tags (mining TXP, etc.)/reload only
Resource PackTalent/spell names, descriptions, effect tooltip textClient resource reload
Config FileTXP rewards, innate count, mana, developmental talent paramsYes

Important limitation: Talent effects[].type and spell type must be types already implemented by the MOD (see reference tables below). Datapacks cannot invent entirely new mechanics — only combine, tune, or replace existing content.


Quick Start

1. Create a Datapack

Create a folder under your world's or server's datapacks/ directory, e.g. my_fatepath_pack/:

my_fatepath_pack/
├── pack.mcmeta
└── data/
    └── mypack/                    ← your namespace (avoid "fatepath" to prevent conflicts)
        ├── talents/
        │   └── combat/
        │       └── heavy_strike.json
        ├── spells/
        │   └── heavy_strike_smite.json
        └── recipe/
            └── special_sword.json

Example pack.mcmeta:

json
{
  "pack": {
    "pack_format": 48,
    "description": "My Fatepath Custom Talents"
  }
}

Match pack_format to your Minecraft version (48 for 1.21.1).

2. Enable and Reload

  • Singleplayer: enable the datapack at world creation or in world settings
  • Server: place in world/datapacks/, run /reload
  • Modpack: include in default datapack list

After reload, check server logs for:

Loaded N talents from data
Loaded N spells from data

Invalid JSON will log Failed to load talent ... or Failed to load spell ....


Talents

File Location

data/<namespace>/talents/<any/path>.json

Each file contains one talent object. The filename does not affect logic, but should match the talent ID for maintainability.

Full Field Reference

FieldTypeRequiredDescription
idstringYesTalent ID, e.g. mypack:combat/heavy_strike
typestringYestalent or skill; legacy innate / acquired still accepted
categorystringRequired for skillTXP category
max_levelintYesMaximum level
cost_per_levelint[]Recommended for acquiredTXP cost per upgrade; length must be ≥ max_level (index 0 = level 1)
prerequisitesarrayNoPrerequisite talents (see below)
effectsarrayNoEffect list (see below)
on_deathobjectNoDeath penalty
mutually_exclusivestring[]NoMutually exclusive talent IDs
weightintRecommended for innateRandom roll weight
raritystringNocommon / uncommon / rare / epic, default common
hiddenboolNoHide from talent UI when true
grant_on_joinint or objectNoLevel granted on first join
toggleableboolNoAllow player to enable/disable in UI

Example: Acquired Passive Talent

json
{
  "id": "mypack:combat/heavy_strike",
  "type": "skill",
  "category": "combat",
  "max_level": 3,
  "cost_per_level": [20, 40, 80],
  "prerequisites": [
    { "talent": "fatepath:combat/strength", "level": 2 }
  ],
  "effects": [
    { "type": "fatepath:attack_damage", "value": [1.0, 2.0, 3.0] }
  ],
  "rarity": "uncommon"
}

Example: Innate Talent

json
{
  "id": "mypack:talent/sturdy",
  "type": "talent",
  "max_level": 1,
  "effects": [
    { "type": "fatepath:armor", "value": 3.0 }
  ],
  "weight": 20,
  "rarity": "common"
}

Example: Death Penalty

json
{
  "on_death": { "lose_levels": 1, "min_level": 0 }
}

Or use "lose_all": true to reset on death.

Effects

Each effect object:

FieldDescription
typeEffect type ID, must be fatepath:<name> (see table below)
valueSingle number, or array indexed by level
scopeOptional, used by some effects (e.g. Insight)
rangeOptional, int or int array

Attribute effects (modify player attributes directly):

typeEffect
fatepath:attack_damageAttack damage +N
fatepath:armorArmor +N
fatepath:max_healthMax health +N
fatepath:luckLuck +N
fatepath:mining_speedMining speed +N% (0.1 = 10%)
fatepath:movement_speedMovement speed +N%
fatepath:fishing_speedFishing speed +N%

Event-driven effects (handled by MOD logic):

typeEffect
fatepath:night_visionPermanent night vision
fatepath:water_breathingPermanent water breathing
fatepath:fire_resistancePermanent fire resistance
fatepath:poison_resistancePoison resistance (developmental)
fatepath:thermal_skinThermal skin (developmental)
fatepath:mining_fortuneBonus drop chance
fatepath:catalyst_smeltingCatalyst smelting on mining
fatepath:fishing_loot_tierFishing loot tier
fatepath:auto_reelAuto reel
fatepath:crop_plant_chancePlanting trigger chance (pair with crop_plant_growth)
fatepath:crop_plant_growthCrop growth boost on planting
fatepath:cobblestone_refineUnlock stone refining recipes
fatepath:imbued_ashWeapon/arrow burn
fatepath:magma_armorMagma armor (low HP trigger)
fatepath:fireballUnlock fireball (requires spell JSON)
fatepath:holy_smiteUnlock holy smite
fatepath:flame_dashUnlock flame dash
fatepath:firestormUnlock firestorm
fatepath:swift_surgeUnlock swift surge
fatepath:cloud_vortexUnlock cloud vortex
fatepath:igniteUnlock ignite (empty-hand interaction)

Unknown type values load but produce no effect (Unhandled talent effect in logs).


Spells

File Location

data/<namespace>/spells/<name>.json

Field Reference

FieldTypeDescription
idstringSpell ID, e.g. mypack:my_fireball
typestringSpell logic type (see table)
required_talentstringLinked talent ID
colorstringSkill wheel color, e.g. "#FF6622"
iconstringWheel icon item ID
hiddenboolHide from wheel/command completion
radiusfloatArea spell radius (firestorm, vortex)
duration_ticksintDuration in ticks (20 = 1 second)
angular_speedfloatVortex angular speed
mana_costintTop-level mana (some spells use levels instead)
levelsarrayPer-level stats; length should match talent max level

Spell Types

typeCast MethodDescription
fatepath:projectile_fireballSkill wheelFireball projectile
fatepath:holy_smiteSkill wheelLightning strike
fatepath:flame_dashSkill wheelForward dash + fire wall
fatepath:area_firestormSkill wheelArea firestorm
fatepath:swift_surgeSkill wheelBrief speed boost
fatepath:area_vortexSkill wheelCloud vortex
fatepath:igniteEmpty-hand right-clickNot shown on skill wheel

levels Array Fields

FieldDescription
damageDamage
scaleProjectile scale (fireball)
sets_fireSets targets on fire
piercePierce count
cooldown_ticksCooldown in ticks
speedProjectile/dash speed
mana_costMana cost at this level
explosion_radiusExplosion radius
target_rangeTarget/dash range
splash_radius / splash_ratioSplash area and ratio
undead_multiplierUndead damage multiplier
debuff_duration_ticksDebuff duration

Example: Custom 3-Level Fireball

Talent:

json
{
  "id": "mypack:combat/arcane_bolt",
  "type": "skill",
  "category": "combat",
  "max_level": 3,
  "cost_per_level": [25, 50, 100],
  "effects": [{ "type": "fatepath:fireball" }],
  "rarity": "rare"
}

Spell:

json
{
  "id": "mypack:arcane_bolt",
  "type": "fatepath:projectile_fireball",
  "required_talent": "mypack:combat/arcane_bolt",
  "color": "#AA44FF",
  "icon": "minecraft:ender_pearl",
  "levels": [
    { "damage": 5.0, "scale": 0.4, "cooldown_ticks": 40, "speed": 1.5, "mana_cost": 10, "explosion_radius": 0.0 },
    { "damage": 8.0, "scale": 0.55, "sets_fire": true, "cooldown_ticks": 80, "speed": 1.6, "mana_cost": 15, "explosion_radius": 1.0 },
    { "damage": 14.0, "scale": 0.75, "sets_fire": true, "pierce": 1, "cooldown_ticks": 120, "speed": 1.7, "mana_cost": 25, "explosion_radius": 2.0 }
  ]
}

Linking rule: Active talents use effect types like fatepath:fireball; the spell JSON's required_talent must point to the same talent ID.


Talent-Gated Recipes

File Location

data/<namespace>/recipe/<name>.json

Example

json
{
  "type": "fatepath:talent_gated",
  "group": "mypack_special",
  "category": "equipment",
  "required_talent": "mypack:crafting/master_smith",
  "ingredients": [
    { "item": "minecraft:iron_ingot" },
    { "item": "minecraft:iron_ingot" },
    { "item": "minecraft:stick" }
  ],
  "result": {
    "id": "minecraft:iron_sword",
    "count": 1
  }
}

The recipe appears in the recipe book and is craftable only when the player owns and has enabled required_talent. See the built-in stone refining recipes for reference.


Tags

Adjust TXP and talent behavior by extending tags:

TagPathPurpose
Mining TXP blocks#fatepath:mining_txp_blocksBlocks that grant mining TXP
Mining TXP excluded#fatepath:mining_txp_excludedExcluded blocks
Poison training food#fatepath:poison_resistance_training_foodCounts toward poison resistance growth
Catalyst smelting ores#fatepath:catalyst_smelting_oresBlocks for catalyst smelting
Catalyst smelting meat#fatepath:catalyst_smelting_meatItems for catalyst smelting

Extension example in your datapack:

json
{
  "values": [
    "#fatepath:mining_txp_blocks",
    "mymod:custom_ore"
  ]
}

Path: data/mypack/tags/block/mining_txp_blocks.json


Localization (Resource Pack)

Display names are not in JSON — they come from language files.

Key Format

TypeKey FormatExample
Talent nametalent.<namespace>.<dot.path>talent.mypack.combat.heavy_strike
Talent descriptionabove + .descriptiontalent.mypack.combat.heavy_strike.description
Spell namespell.<namespace>.<path>spell.mypack.arcane_bolt
Effect tooltipeffect.fatepath.<effect>effect.fatepath.attack_damage

Resource pack paths:

assets/mypack/lang/zh_cn.json
assets/mypack/lang/en_us.json

Example en_us.json:

json
{
  "talent.mypack.combat.heavy_strike": "Heavy Strike",
  "talent.mypack.combat.heavy_strike.description": "Each blow hits harder.",
  "spell.mypack.arcane_bolt": "Arcane Bolt",
  "spell.mypack.arcane_bolt.description": "Fires a bolt of arcane energy."
}

Server Config

Config file: config/fatepath-common.toml (restart required after changes).

Common tweaks:

toml
talentCount = 2
txpMultiplier = 1.0

[txpRewards]
farmingCropHarvest = 8
miningHardnessMultiplier = 2.0
combatMaxHealthFraction = 0.5
explorationBiomeDiscover = 8
explorationRareBiomeDiscover = 15
explorationDimensionFirst = 25
explorationBiomeSleep = 5

[mana]
max = 100
regenPerSecond = 2.0

See the Configuration page for full details.


Debugging and Testing

Reload Data

/reload

Useful Admin Commands

CommandPurpose
/fatepath talent list [talent|skill]List all loaded talents/skills
/fatepath talent give <player> <talentID> [level]Grant a talent
/fatepath txp give <player> <category> <amount>Grant TXP
/fatepath spell cast <spellID>Test a spell
/fatepath innate roll <player>Re-roll innate talents

See Commands for permission levels.

Troubleshooting

  1. Talent not visible — check hidden, category, unlock status
  2. Spell won't cast — verify required_talent link, mana, cooldown
  3. Effect not working — confirm effects[].type is supported; check server logs
  4. Name shows as raw key — add resource pack lang entries
  5. Recipe missing — ensure talent is granted and not toggled off

Modpack Workflow Tips

  1. Use a separate namespace (e.g. mypack) instead of overwriting fatepath: files
  2. Copy then modify — extract JSON from the MOD jar's data/fatepath/ as a starting point
  3. Design talents and spells in pairs — active skills need both JSON files
  4. Ship resource pack with datapack — so players see proper names
  5. Iterate with commands/fatepath talent give and /fatepath spell cast during development
  6. Tune balance via config — TXP multiplier and mana caps in fatepath-common.toml

Common Scenarios

Tune Existing Talent Values

Copy built-in JSON into your datapack, adjust cost_per_level, effects[].value, or spell levels. Keep the same id to override. Duplicate IDs log a warning; the last loaded wins.

Disable a Talent

You cannot delete built-in talents, but you can:

  • Set very high cost_per_level
  • Set "hidden": true
  • Withhold related TXP in your pack design

Add a Full Skill Line

  1. Write skill JSON with prerequisites
  2. For active skills, add spell JSON with matching required_talent
  3. Add lang entries
  4. /reload and test with commands

Server Progress Tuning

Edit txpMultiplier and [txpRewards] in fatepath-common.toml, restart — no datapack changes needed.


Further Reading

To add entirely new effect or spell logic, MOD source changes are required. Datapacks alone cannot do this.