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.

AMLSLevelComponent to any Actor: players, enemies, weapons, buildings.Ascend.AMLS Level Component to your Actor (your Character) and assign the data asset to Level Config Data.AddXP whenever the Actor earns experience.OnLevelUpDelegate / OnXPChangedDelegate to drive your UI.// C++
if (UAMLSLevelComponent* Level = Actor->FindComponentByClass<UAMLSLevelComponent>()) { Level->OnLevelUpDelegate.AddDynamic(this, &AMyClass::HandleLevelUp); Level->AddXP(250); // server only }
UAMLSLevelComponent)Starts at Level 1, 0 XP, Ascension Phase 1. Functions marked Authority only run on the server.
| Function | Type | Description |
|---|---|---|
| AddXP(Amount) | Authority | Adds XP and processes chained level-ups. At absolute max level, XP is routed to overflow conversion. |
| SetLevel(NewLevel) | Authority | Adds XP and processes chained level-ups. At absolute max level, XP is routed to overflow conversion. |
| AddLevels(LevelsToAdd) | Authority | Grants flat levels, respecting ascension caps. |
| Ascend() | Authority | Moves to the next ascension phase if CanAscend() is true. |
| ResetProgression() | Authority | Resets level, XP and phase to defaults (useful for prestige). |
| LoadProgressionSaveData(Data) | Authority | Restores progression from a save struct. |
| GetProgressionSaveData() | Pure | Returns an FAMLSProgressionSaveData snapshot. |
| GetCurrentLevel /GetCurrentXP | Pure | Current values. |
| GetXPRequiredForNextLevel | Pure | XP needed to complete the current level. |
| GetRemainingXPToNextLevel | Pure | XP needed to complete the current level. |
| GetXPProgressPercentage | Pure | 0.0 – 1.0 progress bar value. |
| GetCurrentLevelCap | Pure | 0.0 – 1.0 progress bar value. |
| GetCurrentLevelCap | Pure | Hard cap for the current ascension phase. |
| IsAtCurrentLevelCap/IsAtAbsoluteMaxLevel | Pure | Cap checks. |
| CanAscend | Pure | True when at the current cap and not at absolute max. |
| GetCurrentAscensionPhase | Pure | Current phase (starts at 1). |
| GetRequiredAscensionPhaseForLevel | Pure | Phase required to reach a given level. |
| HasReachedLevel(Level) | Pure | True if current level ≥ target. |
| GetLevelStatus(Level) | Pure | Returns FAMLSLevelStatusData: bHasReached, bRequiresAscension, bIsAbsoluteMaxLevel, bIsInvalid. Ideal for level-map UIs. |
| GetRewardsForLevel(Level) | Pure | Reward items configured for a level. |
UAMLSLevelUpConfigDataAsset)| Property | Default | Description |
|---|---|---|
| Max Level | 50 | Absolute highest level (min 2). |
| XP Curve Method | Formulaic | Explicit Array, Formulaic, or Float Curve Asset. |
| System ID | Player | Identifier used to match reward processors to this asset. |
| Use Ascension System | false | Enables level caps that require Ascend(). |
| Ascension Level Caps | empty | Cap per phase, e.g. [20, 40]. |
| Explicit XP Thresholds | empty | Index 0 = XP to leave level 1. Missing entries fall back to Level × FormulaBaseXP. |
| Formula Base XP / Multiplier / Exponent | 100 / 1.2 / 1.5 | See formula below. |
| Visual Curve Asset | none | Float curve: X = level, Y = XP required. |
| Reward Milestones | empty | Per-level lists of (RewardTag, RewardCount). |
| Custom Processor Milestones | empty | Per-level reward processor class. |
| Convert Overflow XP To Currency | false | Enables overflow conversion at max level. |
| Overflow Currency Tag | none | Tag sent with the conversion event. |
| Overflow Conversion Multiplier | 10.0 | Currency = max(1, round(XP × multiplier)). |
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 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
Ascend() on the server.OnAscendedDelegate fires, and any banked XP continues leveling.CanAscend() to enable your Ascend button, and GetLevelStatus() to show ascension locks on a level map.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.
For custom logic, subclass UAMLSLevelUpRewardProcessor (in C++ or Blueprint) and register it under Custom Processor Milestones for the desired level.
NativeProcessTag.IAMLSLevelableInterface, otherwise the call is skipped with a warning.// C++
class UMyRewardProcessor : public UAMLSLevelUpRewardProcessor
{
protected:
virtual void NativeProcessTag(AActor* Target, const TArray<FAMLSLevelRewardItem>& Items, int32 Level) override;
};IAMLSLevelableInterface)Implement on Actors that should receive callbacks. Blueprint-implementable.
| Function | Description |
|---|---|
| GetLevelComponent() | Return the Actor's UAMLSLevelComponent. |
| OnLevelUp(NewLevel) | Called on level-up: apply stats, heal, unlock content. |
| Event | Parameters | Fires when |
|---|---|---|
| OnLevelUpDelegate | NewLevel, Owner | A level is gained (also on clients when level replicates). |
| OnXPChangedDelegate | CurrentXP, XPToNextLevel, Percent | XP or level changes; also on BeginPlay. |
| OnRewardsProcessedDelegate | LevelAchieved, Rewards, Owner | A level with rewards or a processor is reached. |
| OnOverflowXPConvertedDelegate | WastedXP, CurrencyEarned, CurrencyTag, Owner | XP is earned at max level with conversion enabled. |
| OnAscendedDelegate | NewAscensionPhase, Owner | The ascension phase changes. |
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.
bCanEverTick = false, so there is no per-frame cost.Reward.Stat must exist in your project's Gameplay Tags.