Skip to main content

Difficulty Scaling

Monsters scale with level and punish underleveled players, but they do it by boosting their HP pools - your damage is still intact, you simply have to land more hits on higher-level foes. The system uses true HP modification to increase monster max HP based on their level, so stat upgrades feel rewarding while each level increases the amount of health to burn through. Features:
  • Higher-level monsters deal more damage and are tankier
  • Fighting underleveled is dangerous (gap penalties)
  • 4 difficulty presets: Easy, Normal, Hard, Extreme
  • All values configurable via preset

Difficulty Presets

Example (Level 50 monster, NORMAL):
  • Damage: Base × 1.5 → 1.5× harder
    1 + (50 × 0.01) = 1.5
    If base 10 damage → 15 damage
  • Tankiness: Max HP × 2.63 → 2.63× tankier
    HP mult 1 + (50 × 0.0325) = 2.625
    If base 100 HP → 263 HP (needs 2.63× more hits to kill)

Monster Damage Scaling (Monster → Player)

Formula: Final = Base × (1 + Level × Monster→Player Dmg%/Lvl)

Monster HP Scaling

Formula: Max HP = Base × (1 + Level × HP%/Lvl)
HP Multiplier: 1 + (Level × HP%/Lvl)
Monsters have their max HP increased based on their level. The HP bar reflects the actual increased HP. This approach keeps player damage from being artificially reduced - instead of nerfing your hits, monsters simply require more of them as their HP grows with level. Example (L87, NORMAL):
HP mult 1 + (87 × 0.0325) = 3.83 → if base 100 HP → 383 HP (3.83× more HP).

Gap Damage Bonus (Monster → Player)

Gap damage bonus only applies when the monster is higher level than the player: When Monster Level > Player Level (Positive Gap):
  • Monster deals extra damage
  • Formula: Final = Base × (1 + Gap × 0.01 × GapDmgMult)
When Player Level > Monster Level (Negative Gap):
  • No damage change - gap bonus returns 1.0× (no effect)
  • Negative gaps only affect XP rewards, not damage dealt
Base rate: +1% per level above player (scaled by preset). Gap damage to player can be disabled via EnableGapLevelDamageToPlayer: false in config - monsters will not get bonus damage from level gap.

Gap Defense (Player → Monster)

When you’re below the monster’s level, you can optionally deal less damage via damage resistance. Tiered by gap, this is an extra layer on top of the HP scaling toughness above - disable it if you prefer consistent damage and let the increased HP do the heavy lifting. Formula: Damage Taken = Original / Resistance Multiplier
Resistance Multiplier: 1 / Damage Taken Percentage
Gap defense uses damage resistance (divide by multiplier), not percentage reduction. For example, if you deal 75% damage (gap 11–20, NORMAL), the resistance multiplier is 1 / 0.75 = 1.333× - your damage is divided by 1.333×. Defense cap: the highest gap tier now leaves you dealing 55% (EASY), 50% (NORMAL), 30% (HARD), or 20% (EXTREME) damage - roughly 45% / 50% / 70% / 80% reduction. Monsters stay more killable when underleveled.

Combat Examples


Configuration

File: mods/Zuxaw_RPGLeveling/RPGLevelingConfig.json
Difficulty scaling (monster damage/HP) is controlled by EnableMonsterLevelScale. difficultyPreset sets damage%, HP%, and gap multipliers. EnableGapLevelDefense turns off gap defense (player → monster). EnableGapLevelDamageToPlayer turns off gap damage (monster → player). EnableGapLevelXpReducer turns off XP reduction when underleveled.

Formulas Summary

Monster damage (monster → player):
Final = Base × (1 + Level × Monster→Player Dmg%/Lvl)
Monster HP:
Max HP = Base × (1 + Level × HP%/Lvl)
Gap damage (monster → you):
Final = Base × (1 + Gap × 0.01 × GapDmgMult) (only when Gap > 0, otherwise 1.0×)
Gap defense (you → monster):
Damage Taken = Original / Resistance Multiplier
Resistance Multiplier = 1 / TierValue[Gap]
(capped: EASY/NORMAL min 25% damage, HARD/EXTREME min 10% damage). Disabled when EnableGapLevelDefense is false.
Damage pipeline (you → monster):
Final = (Raw + DamageStatFlat) × DamageStatMult / GapResistanceMult
(Note: Monster HP is increased via HP modifiers. Gap penalties use damage resistance.)
Defense pipeline (monster → you):
Final = Raw × MonsterLevelMult × (1 + Gap × 0.01 × GapDmgMult) × (1 - PlayerDefense)
(Note: Gap bonus only applies when Gap > 0, otherwise multiplier is 1.0×)

Implementation Notes

  • Level-based HP scaling via true HP modification - monsters have increased max HP based on their level
  • Level-based HP scaling via true HP modification - monsters have increased max HP based on their level, so player damage stays consistent but higher-level mobs simply take more hits
  • Mobs display increased HP in their HP bar (reflects actual HP)
  • HP modifiers are applied via EntityStatMap modifiers (similar to HardcoreMode approach)
  • Gap penalties use damage resistance (divide by multiplier) - when you’re underleveled, your damage is divided by a resistance multiplier
  • Gap defense capped per preset: EASY/NORMAL 75% reduction (25% min damage), HARD/EXTREME 90% reduction (10% min damage); monsters remain more killable
  • Gap defense can be disabled via EnableGapLevelDefense: false in config
  • Gap damage bonus only applies when the player is underleveled (positive gap)
  • Negative gaps (player > monster) do not reduce damage - they only affect XP rewards
  • Scaling is always enabled and controlled via difficultyPreset
See Formulas for XP and leveling, and Configuration for main plugin config.