-
Notifications
You must be signed in to change notification settings - Fork 0
Attribute Scaling
Attribute scaling determines how mob stats increase with level. This system allows precise control over health, damage, speed, and other attributes.
Attribute scaling is defined inside structure, biome, or mob override blocks:
{
"structure": "minecraft:stronghold",
"attribute_scaling": {
"minecraft:generic.max_health": {
"base_bonus": 10.0,
"per_level": 0.5,
"operation": "addition"
}
}
}| Field | Type | Default | Description |
|---|---|---|---|
base_bonus |
Double | 0.0 |
Flat bonus applied at level 1 |
per_level |
Double | 0.0 |
Bonus added per level |
operation |
String | "addition" |
How the bonus is applied |
max_bonus |
Double | null |
Maximum total bonus (optional) |
Adds the calculated bonus directly to the attribute:
final_value = base_value + bonus
Example: A zombie with 20 HP at level 50:
{
"minecraft:generic.max_health": {
"base_bonus": 10.0,
"per_level": 0.5,
"operation": "addition"
}
}Bonus = 10 + (0.5 × 50) = 35 Final HP = 20 + 35 = 55 HP
Multiplies the base attribute value:
final_value = base_value × (1 + bonus)
Example: A zombie with 3 attack damage at level 50:
{
"minecraft:generic.attack_damage": {
"base_bonus": 0.0,
"per_level": 0.02,
"operation": "multiply_base"
}
}Bonus = 0 + (0.02 × 50) = 1.0 Final damage = 3 × (1 + 1.0) = 6 damage
Multiplies after all other modifiers:
final_value = (base_value + additions) × (1 + bonus)
Useful for percentage-based scaling that stacks with other effects.
This is the single most important decision when tuning scaling, especially in modpacks with high-HP modded mobs and bosses.
addition adds a flat amount that ignores the mob's base stat. A rule of +2 HP per level gives every mob the same bonus:
| Mob | Base HP | At level 68 (+136 HP) | Result |
|---|---|---|---|
| Zombie | 20 | +136 | 156 HP (×7.8 — brutal) |
| Modded boss | 350 | +136 | 486 HP (×1.4 — barely noticeable) |
The same number is overpowering for weak mobs and trivial for tanky ones. You cannot tune a flat health bonus that feels right for both vanilla mobs and modded bosses at once — this is the classic "my big boss barely scaled" problem.
multiply_base scales relative to each mob's own base stat, so every mob gets proportionally stronger:
| Mob | Base HP | At level 68 (+4%/level = ×3.72 bonus) | Result |
|---|---|---|---|
| Zombie | 20 | ×4.72 total | ~94 HP |
| Modded boss | 350 | ×4.72 total | ~1652 HP |
Both stay threatening at their own scale. For max_health and attack_damage, prefer multiply_base — this is what the bundled example datapack now uses (+4%/level health, +3%/level damage).
Keep addition for stats whose base value is often 0 — armor, armor_toughness, knockback_resistance, attack_knockback. multiply_base of 0 is always 0, so a percentage does nothing for these. Movement speed is also usually left additive (small steps) to avoid runaway speeds.
Want one mob to scale harder than the rest? Don't crank the shared rule — that buffs everything. Put a stronger
attribute_scalingblock (orattribute_multipliers) inside a per-mobmob_overridesentry. See "Scaling specific mobs harder than the rest" on that page.
| Attribute ID | Description | Base Value (Zombie) |
|---|---|---|
minecraft:generic.max_health |
Maximum HP | 20.0 |
minecraft:generic.attack_damage |
Melee damage | 3.0 |
minecraft:generic.armor |
Damage reduction | 0.0 |
minecraft:generic.armor_toughness |
Armor effectiveness | 0.0 |
minecraft:generic.knockback_resistance |
Knockback reduction (0-1) | 0.0 |
minecraft:generic.movement_speed |
Movement speed | 0.23 |
minecraft:generic.follow_range |
Detection range | 35.0 |
minecraft:generic.attack_knockback |
Knockback dealt | 0.0 |
minecraft:generic.attack_speed |
Attack cooldown | 4.0 |
You can use any modded attribute if it's registered properly:
{
"some_mod:custom_attribute": {
"base_bonus": 10.0,
"per_level": 1.0,
"operation": "addition"
}
}Goal: Double health every 100 levels
{
"minecraft:generic.max_health": {
"base_bonus": 0.0,
"per_level": 0.01,
"operation": "multiply_base"
}
}| Level | Multiplier | Zombie HP |
|---|---|---|
| 1 | 1.01 | 20.2 |
| 50 | 1.50 | 30.0 |
| 100 | 2.00 | 40.0 |
| 200 | 3.00 | 60.0 |
Goal: +5 HP per level
{
"minecraft:generic.max_health": {
"base_bonus": 0.0,
"per_level": 5.0,
"operation": "addition"
}
}| Level | Bonus | Zombie HP |
|---|---|---|
| 1 | 5 | 25 |
| 10 | 50 | 70 |
| 50 | 250 | 270 |
| 100 | 500 | 520 |
Goal: Scale damage but cap at +20
{
"minecraft:generic.attack_damage": {
"base_bonus": 2.0,
"per_level": 0.5,
"operation": "addition",
"max_bonus": 20.0
}
}| Level | Calculated | Capped | Zombie Damage |
|---|---|---|---|
| 1 | 2.5 | 2.5 | 5.5 |
| 20 | 12.0 | 12.0 | 15.0 |
| 36 | 20.0 | 20.0 | 23.0 |
| 100 | 52.0 | 20.0 | 23.0 |
Moderate scaling across all stats:
{
"attribute_scaling": {
"minecraft:generic.max_health": {
"base_bonus": 20.0,
"per_level": 1.0,
"operation": "addition",
"max_bonus": 500.0
},
"minecraft:generic.attack_damage": {
"base_bonus": 0.0,
"per_level": 0.02,
"operation": "multiply_base",
"max_bonus": 5.0
},
"minecraft:generic.armor": {
"base_bonus": 2.0,
"per_level": 0.1,
"operation": "addition",
"max_bonus": 20.0
},
"minecraft:generic.movement_speed": {
"base_bonus": 0.0,
"per_level": 0.001,
"operation": "multiply_base",
"max_bonus": 0.5
}
}
}High health, low damage, slow movement:
{
"attribute_scaling": {
"minecraft:generic.max_health": {
"base_bonus": 100.0,
"per_level": 5.0,
"operation": "addition"
},
"minecraft:generic.attack_damage": {
"base_bonus": 0.0,
"per_level": 0.01,
"operation": "multiply_base"
},
"minecraft:generic.armor": {
"base_bonus": 10.0,
"per_level": 0.5,
"operation": "addition"
},
"minecraft:generic.knockback_resistance": {
"base_bonus": 0.5,
"per_level": 0.005,
"operation": "addition",
"max_bonus": 1.0
},
"minecraft:generic.movement_speed": {
"base_bonus": -0.05,
"per_level": 0.0,
"operation": "addition"
}
}
}High damage, low health:
{
"attribute_scaling": {
"minecraft:generic.max_health": {
"base_bonus": 0.0,
"per_level": 0.1,
"operation": "addition"
},
"minecraft:generic.attack_damage": {
"base_bonus": 5.0,
"per_level": 0.1,
"operation": "multiply_base"
},
"minecraft:generic.movement_speed": {
"base_bonus": 0.0,
"per_level": 0.005,
"operation": "multiply_base",
"max_bonus": 1.0
},
"minecraft:generic.attack_speed": {
"base_bonus": 0.0,
"per_level": 0.02,
"operation": "multiply_base"
}
}
}Very fast, moderate stats:
{
"attribute_scaling": {
"minecraft:generic.max_health": {
"base_bonus": 0.0,
"per_level": 0.5,
"operation": "addition"
},
"minecraft:generic.attack_damage": {
"base_bonus": 0.0,
"per_level": 0.03,
"operation": "multiply_base"
},
"minecraft:generic.movement_speed": {
"base_bonus": 0.1,
"per_level": 0.01,
"operation": "multiply_base",
"max_bonus": 2.0
},
"minecraft:generic.follow_range": {
"base_bonus": 10.0,
"per_level": 0.5,
"operation": "addition",
"max_bonus": 100.0
}
}
}The mod only modifies attributes listed in the config whitelist:
[attributes]
allowedAttributes = [
"minecraft:generic.max_health",
"minecraft:generic.attack_damage",
"minecraft:generic.armor",
"minecraft:generic.armor_toughness",
"minecraft:generic.knockback_resistance",
"minecraft:generic.movement_speed",
"minecraft:generic.follow_range",
"minecraft:generic.attack_knockback",
"minecraft:generic.attack_speed"
]Add modded attributes here to enable scaling.
-
Use
max_bonusto prevent scaling from getting out of control - Test at different levels - what works at level 10 may break at level 500
- Balance health and damage - too much of either makes combat unfun
- Consider knockback resistance - high-level mobs should be harder to cheese
- Movement speed caps - values above 2.0 can cause issues
- Start conservative - it's easier to buff than to nerf
Navigation
Quick Links