UMIPQuestDataAsset
Overview
UMIPQuestDataAsset is the primary asset for a single quest: it holds FMIPQuestDefinition (quest tag, tasks, rewards, narrative hooks). GetPrimaryAssetId uses type Quest and the asset name. Editor-only target level fields support the Quest Flow Graph tool (SetComputedEXPReward, SetTargetLevels). Validation is strict on quest tag shape and per-task requirements so runtime line/parent resolution and task UIs do not silently break.
All paths below are relative to Plugins/ModularInventoryPlus/Source/ModularInventoryPlus/.
Key Classes & Files
| Class |
File |
UMIPQuestDataAsset |
Public/DataAsset/MIPQuestDataAsset.h |
FMIPQuestDefinition |
Public/Quest/MIPQuestTypes.h |
IsDataValid |
Private/DataAsset/MIPQuestDataAsset.cpp |
Properties
| Property |
Type |
Description |
QuestDefinition |
FMIPQuestDefinition |
Tag, tasks, rewards, objectives. |
TargetPlayerLevel, TargetPlayerExpPercent, … |
editor |
Quest graph “Set Target Level” helpers (WITH_EDITORONLY_DATA). |
Editor validation
Quest tag depth
If QuestDefinition.QuestTag is valid, its string must contain exactly two dots (three segments: Root.Line.Quest). RequestDirectParent() at runtime assumes this shape.
| Severity |
Condition |
Message |
| Error |
Dot count ≠ 2 |
QuestTag '%s' must be exactly 3 levels deep (Root.Line.Quest). Found %d dot(s). |
Empty task list
If GetTaskDefs() is empty, validation returns early (no per-task errors). Result is Invalid only if errors were already added (e.g. quest tag error).
Per-task checks (all tasks)
For each task at Index:
| Severity |
Condition |
Message |
| Error |
TaskObjective empty/whitespace |
Task objective is empty at index %d |
| Error |
ObjectiveCount <= 0 |
Task objective count is equals or below 0 at index %d |
UMIPGoToLocationQuestTask
| Severity |
Condition |
Message |
| Error |
Data table null |
Data Table is not selected in UMIPGoToLocationQuestTask |
| Error |
Row struct not FMIPMapData |
Data Table row struct must be a child of FMIPMapData in UMIPGoToLocationQuestTask |
| Error |
Row name none |
Row Name is not selected in UMIPGoToLocationQuestTask |
UMIPEliminateMobQuestTask
| Severity |
Condition |
Message |
| Error |
MobTag invalid |
MobTag is not set in UMIPEliminateMobQuestTask |
UMIPChatWithNPCQuestTask
| Severity |
Condition |
Message |
| Error |
ChatTexts empty |
ChatTexts is empty in UMIPChatWithNPCQuestTask |
| Error |
ChatWithNPCTag invalid |
ChatWithNPCTag is not set in UMIPChatWithNPCQuestTask |
Final result: Invalid if Context.GetNumErrors() > 0.
Implementation: Private/DataAsset/MIPQuestDataAsset.cpp (#if WITH_EDITOR).
Integration