Advanced Modular Leveling system

A modular, replicated XP and leveling plugin for Unreal Engine (C++ and Blueprint). Data-driven curves, ascension level caps, milestone rewards, and overflow-XP conversion.


Features 

Drop-in componentAdd AMLSLevelComponent to any Actor: players, enemies, weapons, buildings.
3 XP curve typesExplicit array, mathematical formula, or Unreal Float Curve asset.
Ascension gatingHard level caps that must be broken by calling Ascend.
Milestone rewardsGameplay-Tag rewards per level plus custom Blueprint or C++ reward processors.
Overflow XPConvert XP gained at max level into a currency via a tag and multiplier.
Multiplayer readyServer-authoritative with replicated level, XP and ascension phase.
Save system hooksA SaveGame struct for saving and restoring progression.
Blueprint friendlyPure getters, authority-only callables, and assignable events.

Quick Start

  1. Enable the plugin and make sure the GameplayTags module is available in your project.
  2. Create a data asset: Content Browser → Miscellaneous → Data Asset → AMLSLevelUpConfigDataAsset.
  3. Set Max Level, pick an XP Curve Method, and optionally add reward milestones.
  4. Add AMLS Level Component to your Actor (your Character) and assign the data asset to Level Config Data.
  5. On the server, call AddXP whenever the Actor earns experience.
  6. Bind to OnLevelUpDelegate / OnXPChangedDelegate to drive your UI.

// C++ 
if (UAMLSLevelComponent* Level = Actor->FindComponentByClass<UAMLSLevelComponent>()) { Level->OnLevelUpDelegate.AddDynamic(this, &AMyClass::HandleLevelUp); Level->AddXP(250); // server only }
If no config asset is assigned, a warning is logged and fallback values are used (level cap 50, XP required = level × 100).

Level Component (UAMLSLevelComponent)

Starts at Level 1, 0 XP, Ascension Phase 1. Functions marked Authority only run on the server.

FunctionTypeDescription
AddXP(Amount)AuthorityAdds XP and processes chained level-ups. At absolute max level, XP is routed to overflow conversion.
SetLevel(NewLevel)AuthorityAdds XP and processes chained level-ups. At absolute max level, XP is routed to overflow conversion.
AddLevels(LevelsToAdd)AuthorityGrants flat levels, respecting ascension caps.
Ascend()AuthorityMoves to the next ascension phase if CanAscend() is true.
ResetProgression()AuthorityResets level, XP and phase to defaults (useful for prestige).
LoadProgressionSaveData(Data)AuthorityRestores progression from a save struct.
GetProgressionSaveData()PureReturns an FAMLSProgressionSaveData snapshot.
GetCurrentLevel /GetCurrentXPPureCurrent values.
GetXPRequiredForNextLevelPureXP needed to complete the current level.
GetRemainingXPToNextLevelPureXP needed to complete the current level.
GetXPProgressPercentagePure0.0 – 1.0 progress bar value.
GetCurrentLevelCapPure0.0 – 1.0 progress bar value.
GetCurrentLevelCapPureHard cap for the current ascension phase.
IsAtCurrentLevelCap/IsAtAbsoluteMaxLevelPureCap checks.
CanAscendPureTrue when at the current cap and not at absolute max.
GetCurrentAscensionPhasePureCurrent phase (starts at 1).
GetRequiredAscensionPhaseForLevelPurePhase required to reach a given level.
HasReachedLevel(Level)PureTrue if current level ≥ target.
GetLevelStatus(Level)PureReturns FAMLSLevelStatusData: bHasReached, bRequiresAscension, bIsAbsoluteMaxLevel, bIsInvalid. Ideal for level-map UIs.
GetRewardsForLevel(Level)PureReward items configured for a level.

Config Data Asset (UAMLSLevelUpConfigDataAsset)

PropertyDefaultDescription
Max Level50Absolute highest level (min 2).
XP Curve MethodFormulaicExplicit Array, Formulaic, or Float Curve Asset.
System IDPlayerIdentifier used to match reward processors to this asset.
Use Ascension SystemfalseEnables level caps that require Ascend().
Ascension Level CapsemptyCap per phase, e.g. [20, 40].
Explicit XP ThresholdsemptyIndex 0 = XP to leave level 1. Missing entries fall back to Level × FormulaBaseXP.
Formula Base XP / Multiplier / Exponent100 / 1.2 / 1.5See formula below.
Visual Curve AssetnoneFloat curve: X = level, Y = XP required.
Reward MilestonesemptyPer-level lists of (RewardTag, RewardCount).
Custom Processor MilestonesemptyPer-level reward processor class.
Convert Overflow XP To CurrencyfalseEnables overflow conversion at max level.
Overflow Currency TagnoneTag sent with the conversion event.
Overflow Conversion Multiplier10.0Currency = max(1, round(XP × multiplier)).

Formulaic curve

XP required = round( FormulaBaseXP × Level ^ FormulaExponent × FormulaMultiplier )   (minimum 1)

With defaults, level 1 needs 120 XP and level 10 needs about 3,795 XP. No XP is required at or beyond Max Level.


Ascension System

Ascension lets you gate progression behind a player action (materials, quest, boss). Enable Use Ascension System and define caps:

AscensionLevelCaps = [20, 40, 50]   // Phase 1 cap 20, Phase 2 cap 40, Phase 3 cap 50
    1. The player levels normally until they hit the cap; surplus XP stays banked.
    2. Your game verifies the cost, then calls Ascend() on the server.
    3. The phase increases, OnAscendedDelegate fires, and any banked XP continues leveling.
    Use CanAscend() to enable your Ascend button, and GetLevelStatus() to show ascension locks on a level map.

    Rewards & Processors

    Reward milestones

    Add entries to Reward Milestones with a target level and a list of reward items (Gameplay Tag + count). When the level is reached, OnRewardsProcessedDelegate broadcasts the items so your game can grant them.

    Custom reward processors

    For custom logic, subclass UAMLSLevelUpRewardProcessor (in C++ or Blueprint) and register it under Custom Processor Milestones for the desired level.

    // C++
    class UMyRewardProcessor : public UAMLSLevelUpRewardProcessor
    {
    protected:
        virtual void NativeProcessTag(AActor* Target, const TArray<FAMLSLevelRewardItem>& Items, int32 Level) override;
    };

    Levelable Interface (IAMLSLevelableInterface)

    Implement on Actors that should receive callbacks. Blueprint-implementable.

    FunctionDescription
    GetLevelComponent()Return the Actor's UAMLSLevelComponent.
    OnLevelUp(NewLevel)Called on level-up: apply stats, heal, unlock content.

    Events (Delegates)

    EventParametersFires when
    OnLevelUpDelegateNewLevel, OwnerA level is gained (also on clients when level replicates).
    OnXPChangedDelegateCurrentXP, XPToNextLevel, PercentXP or level changes; also on BeginPlay.
    OnRewardsProcessedDelegateLevelAchieved, Rewards, OwnerA level with rewards or a processor is reached.
    OnOverflowXPConvertedDelegateWastedXP, CurrencyEarned, CurrencyTag, OwnerXP is earned at max level with conversion enabled.
    OnAscendedDelegateNewAscensionPhase, OwnerThe ascension phase changes.

    Save & Load

    FAMLSProgressionSaveData contains SavedLevel, SavedXP, SavedAscensionPhase and is tagged SaveGame. Store it in your SaveGame object.

    // Save
    SaveObj->Progression = LevelComp->GetProgressionSaveData();
    // Load (server)
    LevelComp->LoadProgressionSaveData(SaveObj->Progression);

    On load, values are validated against the current caps and pending XP is processed.

    Multiplayer & Replication

    • All state-changing functions run on the server only.
    • CurrentLevel, CurrentXP and CurrentAscensionPhase replicate to clients with RepNotify, which re-fires the matching delegates for UI.
    • Reward processing and overflow conversion happen on the server; replicate resulting items through your own systems.

    Notes

    • The component sets bCanEverTick = false, so there is no per-frame cost.
    • Reward tags such as Reward.Stat must exist in your project's Gameplay Tags.
    • Reward and processor milestones are matched by exact level number.


    Copyright KhalidBen 2026. All rights reserved.