⚔️ RPG Game Framework

Complete Data-Driven RPG System for Unreal Engine 5

Version 2.0.0 UE 5.6 / 5.7 🧭 Navigation System — NEW Multiplayer Ready

⚡ Quick Start — 10 Minutes

1 Enable Plugin

Edit → Plugins → search "RPG Game Framework" → check Enabled → restart editor.

2 Add Components

Open your Character Blueprint → Add Component → search and add any of these 9 components:

  • RPG Stats Component — HP, Mana, Stamina, 6 primary stats, 16 derived stats
  • RPG Leveling Component — XP, levels, stat/skill points
  • RPG Inventory Component — items, gold, weight, stacking
  • RPG Equipment Component — 16 gear slots, set bonuses, durability
  • RPG Skill Component — skill trees, cooldowns, 10-slot hotbar
  • RPG Quest Component — quests, 12 objective types, rewards
  • RPG Dialogue Component — branching NPC conversations, flags
  • RPG Navigation Component NEW — minimap, world map, compass, waypoints, fog of war
  • RPG Save Component — save/load all data (add LAST — auto-discovers others)

3 Create & Assign DataTables

Right-click Content Browser → Miscellaneous → DataTable → pick the Row Structure → fill in rows → assign to component in Details panel. See the DataTables section for exact column names.

4 Test

In BeginPlay: Inventory→AddItemByID("HealthPotion", 5), Inventory→AddGold(100) → Press Play.

💡 Done!

The Save Component auto-discovers all other RPG components. No manual wiring needed.

📋 All DataTables — Complete Reference

Every DataTable with every column. ★ Required = you should fill this. Optional = has a default, skip if not needed.

⚠️ How to Create a DataTable

In Content Browser: Right-click → Miscellaneous → DataTable. In the popup, search the Row Structure name (e.g. type "RPGItemData"). Name your table (e.g. "DT_Items"). Double-click to open and add rows. Row Name = unique ID string (e.g. "HealthPotion").

DT_Items — All Items

Row Structure: FRPGItemData. Assign to RPG Inventory Component → Item Data Table.

ColumnTypeDefaultDescription
ItemID FNameNoneUnique ID — must match Row Name
DisplayName FTextName shown in UI ("Health Potion")
DescriptionFTextTooltip description
IconUTexture2D*nullInventory icon
ItemType ERPGItemTypeMiscellaneousConsumable / Equipment / Weapon / Material / QuestItem / Currency / Miscellaneous
RarityERPGItemRarityCommonCommon / Uncommon / Rare / Epic / Legendary / Mythic
MaxStackSizeint3299How many per stack (1 = no stacking)
Weightfloat0.1Weight per unit
BuyPriceint320Shop buy price
SellPriceint320Shop sell price
EquipmentSlotERPGEquipmentSlotNoneFor Equipment/Weapon: Head, Chest, Legs, Feet, MainHand, OffHand, etc.
WeaponTypeERPGWeaponTypeNoneFor Weapons: Sword, Axe, Bow, Staff, etc.
ArmorTypeERPGArmorTypeNoneFor Equipment: Cloth, Leather, Mail, Plate
StatBonusesFRPGItemStatBonusall 0Stats this equipment gives (see sub-struct below)
SetIDFNameNoneEquipment set ID (matches DT_SetBonuses)
MaxDurabilityint321000 = no durability system
ConsumableEffectFRPGConsumableEffectall 0What happens when consumed (see sub-struct below)
Cooldownfloat0Cooldown after use (seconds)
RequirementsFRPGItemRequirementsall 0Level/stat requirements to equip
WorldMeshTSoftObjectPtr<StaticMesh>nullMesh for dropped item in world
EquippedMeshTSoftObjectPtr<SkeletalMesh>nullMesh when equipped on character
bCanSellbooltrueCan be sold to shops
bCanDropbooltrueCan be dropped on ground
bCanDestroybooltrueCan be destroyed/discarded
bIsUniqueboolfalseOnly one can exist in inventory
bBindOnPickupboolfalseSoulbound on pickup
bBindOnEquipboolfalseSoulbound when equipped

↳ FRPGItemStatBonus (inside StatBonuses)

Expand the StatBonuses row in the DataTable editor to see these fields. Set only what you need — everything defaults to 0.

FieldTypeDescription
Strengthint32+STR bonus
Dexterityint32+DEX bonus
Intelligenceint32+INT bonus
Vitalityint32+VIT bonus
Wisdomint32+WIS bonus
Luckint32+LCK bonus
MaxHealthfloatFlat HP bonus
MaxManafloatFlat Mana bonus
MaxStaminafloatFlat Stamina bonus
PhysicalDamagefloatFlat phys damage bonus
MagicDamagefloatFlat magic damage bonus
PhysicalDefensefloatFlat phys defense
MagicDefensefloatFlat magic defense
CriticalChancefloat+Crit chance %
CriticalDamagefloat+Crit damage %
Evasionfloat+Evasion
Accuracyfloat+Accuracy
AttackSpeedfloat+Attack speed

↳ FRPGConsumableEffect (inside ConsumableEffect)

Only for Consumable items. Expand in editor. All defaults to 0 / false.

FieldTypeDescription
HealthRestorefloatHP to restore (e.g. 50)
ManaRestorefloatMana to restore
StaminaRestorefloatStamina to restore
bIsPercentagebooltrue = values are % of max (e.g. 0.5 = 50%)
Durationfloat0 = instant, >0 = over time (seconds)
TemporaryStatBonusFRPGItemStatBonusTemp buff stats (same struct as above)
XPGainint64XP granted on use
ApplyBuffIDFNameCustom buff ID to apply
RemoveDebuffIDFNameCustom debuff ID to remove

↳ FRPGItemRequirements (inside Requirements)

Equipment requirements. All default to 0 (no requirement). Level defaults to 1.

FieldTypeDescription
RequiredLevelint32Min character level (default: 1)
RequiredStrengthint32Min STR needed
RequiredDexterityint32Min DEX needed
RequiredIntelligenceint32Min INT needed
RequiredVitalityint32Min VIT needed
RequiredWisdomint32Min WIS needed
💡 Minimal Item Example

To add a simple Health Potion, you only need: Row Name = "HealthPotion", ItemID = "HealthPotion", DisplayName = "Health Potion", ItemType = Consumable, ConsumableEffect → HealthRestore = 50. Everything else can stay at defaults.

DT_Skills — Skill Definitions

Row Structure: FRPGSkillData. Assign to RPG Skill Component → Skill Data Table.

ColumnTypeDefaultDescription
SkillID FNameNoneUnique ID
DisplayName FTextName shown in UI
DescriptionFTextSkill tooltip
IconUTexture2D*nullSkill icon
SkillType ERPGSkillTypeActiveActive / Passive / Toggle / Ultimate
TargetTypeERPGSkillTargetSelfSelf / SingleEnemy / SingleAlly / AllEnemies / AoE / Cone / Line / Ground
DamageTypeERPGDamageTypePhysicalPhysical / Magic / Fire / Ice / Lightning / Poison / Holy / Dark / Pure
CostFRPGSkillCost0Mana / Stamina / Health cost
DamageScalingFRPGSkillScalingDamage formula scaling
Cooldownfloat0Seconds between uses
MaxLevelint321Max upgradeable level
RequiredCharacterLevelint321Min level to learn
RequiredSkillIDsTArray<FName>emptyPrerequisite skills

DT_SkillTrees — Skill Tree Layouts

Row Structure: FRPGSkillTreeData. Assign to RPG Skill Component → Skill Tree Data Table.

ColumnTypeDefaultDescription
TreeID FNameNoneUnique tree ID ("CombatTree")
TreeName FTextDisplay name ("Combat")
DescriptionFTextTree description
IconUTexture2D*nullTree icon
AllowedClassIDsTArray<FName>emptyWhich classes can access (empty = all)
Nodes TArray<FRPGSkillTreeNode>emptySkill nodes in this tree

↳ FRPGSkillTreeNode (each entry in Nodes array)

FieldTypeDescription
SkillID FNameMust match a row in DT_Skills
PositionFVector2DX/Y for UI layout
PrerequisiteSkillIDsTArray<FName>Skills that must be unlocked first
RequiredPointsInTreeint32Min skill points spent in this tree

DT_Quests — Quest Definitions

Row Structure: FRPGQuestData. Assign to RPG Quest Component → Quest Data Table.

ColumnTypeDefaultDescription
QuestID FNameNoneUnique quest ID
DisplayName FTextQuest name in journal
DescriptionFTextQuest description
QuestTypeERPGQuestTypeMain / Side / Daily / etc.
Objectives TArray<FRPGQuestObjective>emptyQuest objectives
RewardsFRPGQuestRewardXP, Gold, Items
RequiredLevelint320Level requirement
RequiredCompletedQuestsTArray<FName>emptyPrerequisite quests
TimeLimitfloat00 = no time limit
bCanAbandonbooltruePlayer can abandon
bAutoCompletebooltrueComplete when all objectives done

DT_Dialogues — Dialogue Trees

Row Structure: FRPGDialogueData. Assign to RPG Dialogue Component → Dialogue Data Table.

ColumnTypeDefaultDescription
DialogueID FNameNoneUnique ID
DialogueNameFTextEditor reference name
NPCID FNameNoneWhich NPC this dialogue belongs to
StartNodeID FNameNoneFirst node in conversation
Nodes TArray<FRPGDialogueNode>emptyAll dialogue nodes
Priorityint320Higher = checked first
StartConditionsTArray<FRPGDialogueCondition>emptyConditions to start dialogue
bOneTimeOnlyboolfalseCan only play once
bMarkAsSeenbooltrueMark as seen after playing
bIsCinematicboolfalseDisable player control
bCanSkipbooltruePlayer can skip

DT_StatsConfig — Stat Scaling (Optional)

Row Structure: FRPGPrimaryStatConfig. Assign to RPG Stats Component → Stats Config Table.

ℹ️ This table is optional

Without it, hardcoded defaults apply: VIT×10 → HP, INT×5+WIS×5 → Mana, STR×1 → PhysDmg, etc. Create this table to customize exactly how each stat scales.

ColumnTypeDefaultDescription
StatType ERPGPrimaryStatStrengthWhich stat: Strength / Dexterity / Intelligence / Vitality / Wisdom / Luck
DisplayNameFTextName shown in UI
DescriptionFTextTooltip for stat
BaseValueint3210Starting value
MinValueint321Minimum allowed
MaxValueint32999Maximum allowed
IconUTexture2D*nullStat icon for UI
MaxHealthPerPointfloat0HP gained per 1 point in this stat
MaxManaPerPointfloat0Mana per point
MaxStaminaPerPointfloat0Stamina per point
PhysicalDamagePerPointfloat0PhysDmg per point
MagicDamagePerPointfloat0MagicDmg per point
PhysicalDefensePerPointfloat0PhysDef per point
MagicDefensePerPointfloat0MagicDef per point
CritChancePerPointfloat0Crit % per point
CritDamagePerPointfloat0Crit damage % per point
EvasionPerPointfloat0Evasion per point
AccuracyPerPointfloat0Accuracy per point
💡 Example: Vitality Row

Row Name = "Vitality", StatType = Vitality, BaseValue = 10, MaxHealthPerPoint = 10.0, MaxStaminaPerPoint = 5.0, PhysicalDefensePerPoint = 0.5

DT_Classes — Character Classes (Optional)

Row Structure: FRPGCharacterClassData. Assign to RPG Stats Component → Class Data Table.

ColumnTypeDefaultDescription
ClassID FNameNoneUnique ID ("Warrior")
ClassNameFTextDisplay name
DescriptionFTextClass description
IconUTexture2D*nullClass icon
BaseStrengthint3210Starting STR
BaseDexterityint3210Starting DEX
BaseIntelligenceint3210Starting INT
BaseVitalityint3210Starting VIT
BaseWisdomint3210Starting WIS
BaseLuckint3210Starting LCK
StrengthGrowthfloat1.0STR gained per level
DexterityGrowthfloat1.0DEX per level
IntelligenceGrowthfloat1.0INT per level
VitalityGrowthfloat1.0VIT per level
WisdomGrowthfloat1.0WIS per level
LuckGrowthfloat1.0LCK per level
StartingSkillIDsTArray<FName>emptySkills unlocked at start
AllowedWeaponTypesTArray<FName>emptyWeapon types this class can equip
AllowedArmorTypesTArray<FName>emptyArmor types this class can equip

DT_LevelData — XP Per Level (Optional)

Row Structure: FRPGLevelData. Assign to Leveling Component.

ColumnTypeDefaultDescription
Level int321Level number
XPRequired int640XP needed for this level
TotalXPToLevelint640Cumulative XP
StatPointsAwardedint325Stat points given
SkillPointsAwardedint321Skill points given
UnlockedSkillIDsTArray<FName>emptyAuto-unlock skills at this level
UnlockedQuestIDsTArray<FName>emptyQuests that become available
HealthBonusfloat0Flat HP bonus at this level
ManaBonusfloat0Flat Mana bonus
StaminaBonusfloat0Flat Stamina bonus

DT_SetBonuses — Equipment Set Bonuses (Optional)

Row Structure: FRPGSetBonusData. Assign to Equipment Component.

ColumnTypeDefaultDescription
SetID FNameNoneMust match SetID on items in DT_Items
SetNameFTextDisplay name ("Dragon Armor")
SetItemIDsTArray<FName>emptyAll item IDs in the set
PieceBonusesTMap<int32, FRPGItemStatBonus>emptyKey = piece count → Value = stat bonus. Example: 2→{+50HP}, 4→{+100HP, +20Def}
PieceAbilitiesTMap<int32, FName>emptyKey = piece count → Value = ability ID unlocked

Summary — Which Tables Go Where

ComponentProperty Name (Details Panel)DataTableRow StructureRequired?
RPG InventoryItem Data TableDT_ItemsFRPGItemData★ Yes
RPG SkillSkill Data TableDT_SkillsFRPGSkillData★ Yes
RPG SkillSkill Tree Data TableDT_SkillTreesFRPGSkillTreeDataOptional
RPG QuestQuest Data TableDT_QuestsFRPGQuestData★ Yes
RPG DialogueDialogue Data TableDT_DialoguesFRPGDialogueData★ Yes
RPG StatsStats Config TableDT_StatsConfigFRPGPrimaryStatConfigOptional
RPG StatsClass Data TableDT_ClassesFRPGCharacterClassDataOptional
RPG LevelingLevel Data TableDT_LevelDataFRPGLevelDataOptional
RPG EquipmentSet Bonus Data TableDT_SetBonusesFRPGSetBonusDataOptional

📊 Stats System

6 primary stats (STR, DEX, INT, VIT, WIS, LCK) → 16 derived stats → 3 resources (HP/MP/Stamina) with regeneration.

Key Functions

GetPrimaryStat, AllocateStatPoint, ModifyHealth/Mana/Stamina, ApplyDamage, ApplyHealing, RollCritical, AddStatModifier, RemoveModifiersBySource, GetDerivedStat, GetHealthPercent, SetHealthToMax, ResetAllocatedStats

Events

OnStatChanged, OnDerivedStatChanged, OnHealthChanged, OnManaChanged, OnStaminaChanged, OnResourceChanged, OnDeath, OnStatsRecalculated

⬆️ Leveling System

Key Functions

AddXP, AddXPWithBonus, GetCurrentLevel, GetCurrentXP, GetXPForNextLevel, GetXPProgressPercent, GetUnspentStatPoints, GetUnspentSkillPoints, SpendStatPoint, SpendSkillPoint, RefundAllStatPoints

Events

OnXPGained (Amount, Source), OnLevelUp (FRPGLevelUpEvent), OnLevelChanged, OnStatPointsChanged, OnSkillPointsChanged

🎒 Inventory System

Key Functions

AddItemByID, RemoveItem, HasItem, GetItemCount, GetItemInSlot, GetItemData, GetAllSlots, UseItem, AddGold, RemoveGold, GetGold, SwapSlots, SplitStack, SortInventory, IsInventoryFull

Events

OnItemAdded, OnItemRemoved, OnItemUsed, OnGoldChanged, OnInventoryFull, OnInventoryChanged

🛡️ Equipment System

Key Functions

EquipItem, UnequipItem, CanEquipItem, GetEquippedItem, GetTotalEquipmentStats, GetTotalWeaponDamage, GetTotalArmorValue, MeetsRequirements, GetRequirementFailReason, GetSetPieceCount

Events

OnItemEquipped, OnItemUnequipped, OnEquipmentChanged, OnSetBonusChanged

✨ Skills System

Key Functions

UnlockSkill, LevelUpSkill, UseSkill, UseSkillFromHotkey, CanUseSkill, GetSkillUseFailReason, IsSkillOnCooldown, GetSkillCooldownRemaining, AssignSkillToHotkey, GetSkillInHotkey, GetAvailableSkills

Events

OnSkillUnlocked, OnSkillLevelUp, OnSkillUsed, OnSkillCooldownStarted, OnSkillCooldownEnded

📜 Quest System

Key Functions

AcceptQuest, AbandonQuest, CompleteQuest, AddObjectiveProgress, OnEnemyKilled, OnItemCollected, OnLocationReached, TrackQuest, GetActiveQuests, GetCompletedQuests, GetFailedQuests, GetQuestData, IsQuestCompleted

Events

OnQuestAccepted, OnQuestCompleted, OnQuestFailed, OnObjectiveProgress, OnObjectiveCompleted

🧭 Quest ↔ Navigation

When bAutoTrackQuests = true on Navigation Component, quest objectives with bShowOnMap = true and valid MarkerLocation auto-appear on minimap, world map, and compass.

💬 Dialogue System

Key Functions

StartDialogue, StartDialogueWithNPC, SelectResponse, AdvanceDialogue, GetCurrentNode, GetAvailableResponses, SetFlag, HasFlag, EndDialogue, HasDialogueAvailable, GetBestDialogueForNPC

Events

OnDialogueStarted, OnDialogueEnded, OnDialogueNodeChanged, OnResponseSelected, OnFlagSet

📖 How-To Guides (Blueprint)

How to: Add a Simple Item to DataTable

1 Create the DataTable

Content Browser → Right-click → Miscellaneous → DataTable. In the popup, search RPGItemData and select it. Name it DT_Items.

2 Add a Row

Double-click DT_Items to open. Click Add at the top. Set Row Name to HealthPotion.

3 Fill Required Fields Only

Set ItemID = HealthPotion, DisplayName = "Health Potion", ItemType = Consumable.

4 Set the Consumable Effect

Expand ConsumableEffect → set HealthRestore = 50. Leave everything else at defaults.

5 Assign to Component

Select your RPG Inventory Component in the character → Details panel → Item Data Table → pick DT_Items.

💡 That's it!

Now AddItemByID("HealthPotion", 5) works. For equipment items, also fill EquipmentSlot and StatBonuses. For weapons, set WeaponType too.

How to: Add Equipment (Iron Sword)

1 In DT_Items, add row "IronSword"

ItemID = IronSword, DisplayName = "Iron Sword", ItemType = Weapon

2 Set equipment fields

EquipmentSlot = MainHand, WeaponType = Sword

3 Set stat bonuses

Expand StatBonusesPhysicalDamage = 15, Strength = 3

4 Optionally set requirements

Expand RequirementsRequiredLevel = 5. Player below level 5 can't equip it.

How to: Build Health/Mana/Stamina Bars

WBP_ResourceBars — Event Construct
① Get Stats Component → Bind to OnResourceChanged
② Switch on Resource enum → Update matching Progress Bar: CurrentValue / MaxValue
Result: Real-time HP/MP/SP bars

How to: Equip from Inventory

Double-click inventory slot
InventoryComponent→GetItemInSlot(Index)
EquipmentComponent→CanEquipItem(Item) → false? → show fail reason
EquipmentComponent→EquipItem(Item) → old item auto-returns to inventory

How to: NPC Quest Giver

BP_QuestNPC — On Interact
QuestComponent→IsQuestCompleted(QuestID)? → turn-in dialogue
② Not active? → show offer → "Accept" → AcceptQuest(QuestID)
③ Kill objectives: enemy death → OnEnemyKilled("GoblinID")

How to: Save / Load

Save System
F5 → SaveComponent→QuickSave()
F9 → SaveComponent→QuickLoad()
Full: SaveGame("Slot_01"), LoadGame("Slot_01"), GetAllSaveSlots()
All 9 components persist automatically — Stats, Leveling, Inventory, Equipment, Skills, Quests, Dialogue, Navigation, Save

How to: Minimap NEW

WBP_Minimap — Circular Minimap
① Image widget → bind brush to GetMinimapRenderTarget()
② Tick: Rotate Image by GetMinimapRotation()
GetMinimapMarkers() → place icons at MinimapPosition × WidgetRadius

How to: Enemy Markers on Minimap NEW

BP_Enemy — BeginPlay
NavigationComp→AddActorMarker(Self, "Goblin", Enemy, Red) → store MarkerID
② On death → RemoveMarker(StoredMarkerID)

📚 Quick Reference — Enums

EnumValues
ERPGPrimaryStatStrength, Dexterity, Intelligence, Vitality, Wisdom, Luck
ERPGDerivedStatMaxHealth, MaxMana, MaxStamina, PhysicalDamage, MagicDamage, PhysicalDefense, MagicDefense, CriticalChance, CriticalDamage, Evasion, Accuracy, AttackSpeed, MovementSpeed, HealthRegen, ManaRegen, StaminaRegen
ERPGItemTypeConsumable, Equipment, Weapon, Material, QuestItem, Currency, Miscellaneous
ERPGItemRarityCommon, Uncommon, Rare, Epic, Legendary, Mythic
ERPGEquipmentSlotNone, Head, Chest, Hands, Legs, Feet, Shoulders, Back, MainHand, OffHand, TwoHand, Ring1, Ring2, Necklace, Trinket1, Trinket2
ERPGWeaponTypeNone, Sword, Axe, Mace, Dagger, Spear, Bow, Crossbow, Staff, Wand, Shield, Greatsword, Greataxe, Scythe
ERPGArmorTypeNone, Cloth, Leather, Mail, Plate
ERPGSkillTypeActive, Passive, Toggle, Ultimate
ERPGSkillTargetSelf, SingleEnemy, SingleAlly, AllEnemies, AllAllies, AreaOfEffect, Cone, Line, Ground
ERPGDamageTypePhysical, Magic, Fire, Ice, Lightning, Poison, Holy, Dark, Pure
ERPGQuestStateLocked, Available, Active, Completed, Failed, Abandoned
ERPGObjectiveTypeKill, Collect, Deliver, TalkTo, Escort, Explore, Interact, Reach, Survive, Craft, UseSkill, Custom
ERPGMarkerType NEWPlayer, Waypoint, QuestObjective, QuestTurnIn, NPC, Enemy, Shop, Chest, SavePoint, Teleporter, AreaEntrance, PartyMember, Custom
ERPGPOIState NEWHidden, Discovered, Visited, Completed

🛠️ Troubleshooting

Can't add items to DataTable / DataTable empty

  1. Did you pick the correct Row Structure when creating the DataTable? For items it must be FRPGItemData — search "RPGItemData" in the popup
  2. After adding a row, set the Row Name (top-left of each row) — this is the lookup key
  3. Make sure ItemID matches the Row Name exactly (case-sensitive)
  4. Assign the DataTable to the correct component slot in Details panel

Item not appearing in inventory after AddItemByID

  1. Is Item Data Table assigned on Inventory Component?
  2. Does the ItemID string match the Row Name exactly? (case-sensitive!)
  3. Is inventory full? Check IsInventoryFull()
  4. Check return value of AddItemByID — false means it failed

Stats Config / Skill Tree / Class tables show "None"

These are optional DataTables. The plugin works without them using hardcoded defaults. To create them:

  1. Stats Config: Create DataTable with row FRPGPrimaryStatConfig → assign to Stats Component → Stats Config Table
  2. Skill Trees: Create DataTable with row FRPGSkillTreeData → assign to Skill Component → Skill Tree Data Table
  3. Classes: Create DataTable with row FRPGCharacterClassData → assign to Stats Component → Class Data Table

Minimap shows black NEW

  1. bEnableMinimap = true?
  2. MinimapCaptureHeight — too low = inside geometry
  3. GetMinimapRenderTarget() returns valid reference?
  4. Image widget brush bound to the render target?

Quest markers not showing NEW

  1. bAutoTrackQuests = true?
  2. Quest Component on same actor as Navigation Component?
  3. Quest objective has bShowOnMap = true AND MarkerLocation ≠ (0,0,0)?

Equipment stats not applying

  1. Stats Component on same actor as Equipment Component?
  2. Item's StatBonuses filled in DataTable? (expand the struct)
💡 Debug Tips

Use Print String to verify values. Bind to component events and print when they fire. Check Output Log for warnings. For DataTable issues: open DT in editor and verify your row data is correct.