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
| Method | Customizable Content | Restart Required |
|---|---|---|
| Datapack | Talents, spells, talent-gated recipes, tags (mining TXP, etc.) | /reload only |
| Resource Pack | Talent/spell names, descriptions, effect tooltip text | Client resource reload |
| Config File | TXP rewards, innate count, mana, developmental talent params | Yes |
Important limitation: Talent
effects[].typeand spelltypemust 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.jsonExample pack.mcmeta:
{
"pack": {
"pack_format": 48,
"description": "My Fatepath Custom Talents"
}
}Match
pack_formatto 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 dataInvalid JSON will log Failed to load talent ... or Failed to load spell ....
Talents
File Location
data/<namespace>/talents/<any/path>.jsonEach file contains one talent object. The filename does not affect logic, but should match the talent ID for maintainability.
Full Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Talent ID, e.g. mypack:combat/heavy_strike |
type | string | Yes | talent or skill; legacy innate / acquired still accepted |
category | string | Required for skill | TXP category |
max_level | int | Yes | Maximum level |
cost_per_level | int[] | Recommended for acquired | TXP cost per upgrade; length must be ≥ max_level (index 0 = level 1) |
prerequisites | array | No | Prerequisite talents (see below) |
effects | array | No | Effect list (see below) |
on_death | object | No | Death penalty |
mutually_exclusive | string[] | No | Mutually exclusive talent IDs |
weight | int | Recommended for innate | Random roll weight |
rarity | string | No | common / uncommon / rare / epic, default common |
hidden | bool | No | Hide from talent UI when true |
grant_on_join | int or object | No | Level granted on first join |
toggleable | bool | No | Allow player to enable/disable in UI |
Example: Acquired Passive Talent
{
"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
{
"id": "mypack:talent/sturdy",
"type": "talent",
"max_level": 1,
"effects": [
{ "type": "fatepath:armor", "value": 3.0 }
],
"weight": 20,
"rarity": "common"
}Example: Death Penalty
{
"on_death": { "lose_levels": 1, "min_level": 0 }
}Or use "lose_all": true to reset on death.
Effects
Each effect object:
| Field | Description |
|---|---|
type | Effect type ID, must be fatepath:<name> (see table below) |
value | Single number, or array indexed by level |
scope | Optional, used by some effects (e.g. Insight) |
range | Optional, int or int array |
Attribute effects (modify player attributes directly):
| type | Effect |
|---|---|
fatepath:attack_damage | Attack damage +N |
fatepath:armor | Armor +N |
fatepath:max_health | Max health +N |
fatepath:luck | Luck +N |
fatepath:mining_speed | Mining speed +N% (0.1 = 10%) |
fatepath:movement_speed | Movement speed +N% |
fatepath:fishing_speed | Fishing speed +N% |
Event-driven effects (handled by MOD logic):
| type | Effect |
|---|---|
fatepath:night_vision | Permanent night vision |
fatepath:water_breathing | Permanent water breathing |
fatepath:fire_resistance | Permanent fire resistance |
fatepath:poison_resistance | Poison resistance (developmental) |
fatepath:thermal_skin | Thermal skin (developmental) |
fatepath:mining_fortune | Bonus drop chance |
fatepath:catalyst_smelting | Catalyst smelting on mining |
fatepath:fishing_loot_tier | Fishing loot tier |
fatepath:auto_reel | Auto reel |
fatepath:crop_plant_chance | Planting trigger chance (pair with crop_plant_growth) |
fatepath:crop_plant_growth | Crop growth boost on planting |
fatepath:cobblestone_refine | Unlock stone refining recipes |
fatepath:imbued_ash | Weapon/arrow burn |
fatepath:magma_armor | Magma armor (low HP trigger) |
fatepath:fireball | Unlock fireball (requires spell JSON) |
fatepath:holy_smite | Unlock holy smite |
fatepath:flame_dash | Unlock flame dash |
fatepath:firestorm | Unlock firestorm |
fatepath:swift_surge | Unlock swift surge |
fatepath:cloud_vortex | Unlock cloud vortex |
fatepath:ignite | Unlock ignite (empty-hand interaction) |
Unknown
typevalues load but produce no effect (Unhandled talent effectin logs).
Spells
File Location
data/<namespace>/spells/<name>.jsonField Reference
| Field | Type | Description |
|---|---|---|
id | string | Spell ID, e.g. mypack:my_fireball |
type | string | Spell logic type (see table) |
required_talent | string | Linked talent ID |
color | string | Skill wheel color, e.g. "#FF6622" |
icon | string | Wheel icon item ID |
hidden | bool | Hide from wheel/command completion |
radius | float | Area spell radius (firestorm, vortex) |
duration_ticks | int | Duration in ticks (20 = 1 second) |
angular_speed | float | Vortex angular speed |
mana_cost | int | Top-level mana (some spells use levels instead) |
levels | array | Per-level stats; length should match talent max level |
Spell Types
| type | Cast Method | Description |
|---|---|---|
fatepath:projectile_fireball | Skill wheel | Fireball projectile |
fatepath:holy_smite | Skill wheel | Lightning strike |
fatepath:flame_dash | Skill wheel | Forward dash + fire wall |
fatepath:area_firestorm | Skill wheel | Area firestorm |
fatepath:swift_surge | Skill wheel | Brief speed boost |
fatepath:area_vortex | Skill wheel | Cloud vortex |
fatepath:ignite | Empty-hand right-click | Not shown on skill wheel |
levels Array Fields
| Field | Description |
|---|---|
damage | Damage |
scale | Projectile scale (fireball) |
sets_fire | Sets targets on fire |
pierce | Pierce count |
cooldown_ticks | Cooldown in ticks |
speed | Projectile/dash speed |
mana_cost | Mana cost at this level |
explosion_radius | Explosion radius |
target_range | Target/dash range |
splash_radius / splash_ratio | Splash area and ratio |
undead_multiplier | Undead damage multiplier |
debuff_duration_ticks | Debuff duration |
Example: Custom 3-Level Fireball
Talent:
{
"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:
{
"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'srequired_talentmust point to the same talent ID.
Talent-Gated Recipes
File Location
data/<namespace>/recipe/<name>.jsonExample
{
"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:
| Tag | Path | Purpose |
|---|---|---|
| Mining TXP blocks | #fatepath:mining_txp_blocks | Blocks that grant mining TXP |
| Mining TXP excluded | #fatepath:mining_txp_excluded | Excluded blocks |
| Poison training food | #fatepath:poison_resistance_training_food | Counts toward poison resistance growth |
| Catalyst smelting ores | #fatepath:catalyst_smelting_ores | Blocks for catalyst smelting |
| Catalyst smelting meat | #fatepath:catalyst_smelting_meat | Items for catalyst smelting |
Extension example in your datapack:
{
"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
| Type | Key Format | Example |
|---|---|---|
| Talent name | talent.<namespace>.<dot.path> | talent.mypack.combat.heavy_strike |
| Talent description | above + .description | talent.mypack.combat.heavy_strike.description |
| Spell name | spell.<namespace>.<path> | spell.mypack.arcane_bolt |
| Effect tooltip | effect.fatepath.<effect> | effect.fatepath.attack_damage |
Resource pack paths:
assets/mypack/lang/zh_cn.json
assets/mypack/lang/en_us.jsonExample en_us.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:
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.0See the Configuration page for full details.
Debugging and Testing
Reload Data
/reloadUseful Admin Commands
| Command | Purpose |
|---|---|
/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
- Talent not visible — check
hidden,category, unlock status - Spell won't cast — verify
required_talentlink, mana, cooldown - Effect not working — confirm
effects[].typeis supported; check server logs - Name shows as raw key — add resource pack lang entries
- Recipe missing — ensure talent is granted and not toggled off
Modpack Workflow Tips
- Use a separate namespace (e.g.
mypack) instead of overwritingfatepath:files - Copy then modify — extract JSON from the MOD jar's
data/fatepath/as a starting point - Design talents and spells in pairs — active skills need both JSON files
- Ship resource pack with datapack — so players see proper names
- Iterate with commands —
/fatepath talent giveand/fatepath spell castduring development - 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
- Write skill JSON with
prerequisites - For active skills, add spell JSON with matching
required_talent - Add lang entries
/reloadand 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.