How-To: Save & Load

Goal: persist and restore skill tree state with your own save system - the plugin is data-in, data-out and owns no persistence.

Prerequisites
An initialized manager (Quick Start) and a project save system that can store a TArray of structs.

1. Extract on change

Subscribe to OnSkillTreeStateUpdated, then pull a snapshot to hand to your save system.

cpp
STM->OnSkillTreeStateUpdated.AddDynamic(this, &UMySaveComponent::OnSkillTreeChanged);
void UMySaveComponent::OnSkillTreeChanged()
{
TArray<FCrimsonSkillTree_SaveGameData> Data;
STM->GetAllSkillTreesSaveData(Data);
MyProjectSaveSystem->StoreSkillTreeData(Data);
}

2. Restore after load

cpp
TArray<FCrimsonSkillTree_SaveGameData> Loaded = MyProjectSaveSystem->RetrieveSkillTreeData();
STM->ApplyAllSkillTreesSaveData(Loaded);
Data-in, data-out
FCrimsonSkillTree_SaveGameData / FCrimsonSkillTree_SaveGameNodeState live in CrimsonSkillTree_SaveData.h. Serialize them however your project requires - the plugin never depends on CrimsonSaveSystem or GameplayStatics.
Verify
Save, change allocation, reload - the restored tree matches the saved levels/states. Bump the asset's Version to invalidate incompatible old saves.