DUXPLIMA Documentation

Progression

The blacksmith level, the XP formula, and the reward policy you can tune.

Every completed trade grants global XP and mastery XP. Global XP raises the blacksmith level; each level grants perk points. All of it lives under progression in config.yml.

progression:
  enabled: true
  levelCurve:
    baseXp: 100
    growthFactor: 1.18
    maxLevel: 100
  masteryCurve:
    baseXp: 60
    growthFactor: 1.14
    maxLevel: 50

Set enabled: false and the whole system (levels, masteries, perks, the two menus, reqLevel gates and the vanilla crafting gate) goes inert.

The curve

XP required to leave level L is:

round(baseXp x growthFactor^(L-1))

With the shipped global curve:

LevelXP to nextTotal XP to get there
1 → 2100100
2 → 3118218
5 → 6194715
10 → 114442,353
20 → 212,32114,663
30 → 3112,15079,095
50 → 51332,8272,181,311

At level maxLevel the requirement is 0, XP stops accumulating on the level bar, and totalXp keeps counting. growthFactor: 1.18 is steep: level 50 costs roughly 3,300 times what level 1 did, and reaching 100 is not a realistic goal on the default curve. Lower it to about 1.10 if you want most of the server past level 30.

What a trade is worth

If the trade sets xpReward, that number is used. Otherwise the default policy computes it:

xp  = defaultTradeXp
xp += (time ÷ 60) x timeXpPerMinute
xp += requirementCount x requirementXpPerRequirement
xp += totalRequiredAmount ÷ requirementAmountDivisor
if 0 ≤ successChance < 100:
    xp x= 1 + ((100 - successChance) ÷ 100) x riskBonusMultiplier
if asCommand:
    xp x= 1.10

Then, in order:

if instantCraft:  xp x= instantCraftMultiplier
if burned:        xp x= burnedTradeXpMultiplier
xp x= 1 + (total GLOBAL_XP_BOOST perk effect)
SettingDefaultEffect
defaultTradeXp20The floor for any trade
timeXpPerMinute5.0Longer crafts pay more
requirementXpPerRequirement4.0More distinct requirements pay more
requirementAmountDivisor16.0Bulk costs pay more, divided by this
riskBonusMultiplier0.35A 70%-chance trade earns 1.105x
instantCraftMultiplier0.65Instant crafts are worth less
burnedTradeXpMultiplier0.10A burned trade still pays a tenth
perkPointsPerLevel1Perk points per level up

The asCommand 1.10x is a fixed constant, not a config value.

Worked example: the shipped Netherite Warlord Blade: time: 420, four requirements totalling 22 items, successChance: 70.

20 + (420÷60 x 5) + (4 x 4) + (22÷16)   = 20 + 35 + 16 + 1.375 = 72.375
x 1 + (30÷100 x 0.35)                    = x 1.105 = 79.97  →  80 XP

Its config sets xpReward: 155 instead, roughly double what the formula would give, which is the point of xpReward: use it when a trade should be worth more than its shape suggests.

Mastery XP

If the trade sets masteryXpReward, that number is used. Otherwise:

masteryXp = max(defaultMasteryXp, resolvedGlobalXp x masteryFromGlobalXpMultiplier)

then the same instantCraft, burned and perk multipliers, with burnedMasteryXpMultiplier and the MASTERY_XP_BOOST perk effect.

SettingDefault
defaultMasteryXp12
masteryFromGlobalXpMultiplier0.60
burnedMasteryXpMultiplier0.25

Mastery keeps a quarter of its XP on a burn, against a tenth for global XP. That gap is deliberate: a run of bad luck still moves you toward burning less.

Which mastery a trade feeds

  1. The trade's masteryKey, if set.
  2. Otherwise the category key the trade was loaded from.

See Masteries.

Level ups

XP is applied, then levels are consumed in a loop, so a single large grant can raise several levels at once and grant a perk point for each. At maxLevel the bar is pinned to 0 and totalXp keeps rising: nothing is lost, it just stops converting.

Duplicate protection

Each grant is written to progression_events keyed by a source id. If the same trade completion is processed twice (a race, a retry after a crash) the second write is recognised as a duplicate and no XP is granted. You will not see doubled XP from a restart mid-completion.

Inspecting and adjusting

/blacksmith admin profile <player>
/blacksmith admin xp add <player> <amount>
/blacksmith admin level set <player> <level>
/blacksmith admin perkpoints <add|set> <player> <amount>

All four need uxmblacksmith.admin. See Commands.

Set the curve before launch, not after

Changing growthFactor later re-prices every level for players who already have them. Their stored level does not move, but the next level suddenly costs a different amount, which reads as a nerf even when it is a buff. Decide the curve while the server is empty.