Armour and level swap

The best way to persist data across levels is by storing it in your GameInstance. You can have your Pawn query the game instance on BeginPlay.

For example, if you keep your data on the equipped armor in a custom struct called FEquippedArmour you can do something like this:

//within your MyGameInstance.h

UCLASS(Blueprintable, BlueprintType)
class MYGAME_API MyGameInstance : public UGameInstance {
    GENERATED_BODY()

    public:

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Character State")
    FEquippedArmour EquippedArmour;

};

//within your MyPawn.h

UCLASS(Blueprintable, BlueprintType)
class MYGAME_API AMyPawn : public APawn {
    GENERATED_BODY()

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

    UFUNCTION(BlueprintCallable, , Category = "State|Equipment")
    void ApplyEquippedArmour();

    UFUNCTION(BlueprintCallable, , Category = "State|Equipment")
    void StoreEquippedArmour();

};


//within MyPawn.cpp

void AMyPawn::BeginPlay()
{
    ApplyEquippedArmour();

}

void AMyPawn::ApplyEquippedArmour()
{
    UMyGameInstance* GameInstance = UGameplayStatics::GetGameInstance(GetWorld());
    if (GameInstance)
    {
        FEquippedArmour& Armour = GameInstance.EquippedArmour;
        ApplyHelmet(Armour.Helmet);
        ApplyBreastplate(Armour.Breastplate);
        ApplyShield(Armour.Shield);
        ...
    }

}

void AMyPawn::StoreEquippedArmour()
{
    UMyGameInstance* GameInstance = UGameplayStatics::GetGameInstance(GetWorld());
    if (GameInstance)
    {
        GameInstance.EquippedArmour = FEquippedArmour(GetHelmet(), GetBreastplate(), GetShield()...);

    }

}