diff --git a/Source/DTFluxCore/Private/Assets/DTFluxModelAsset.cpp b/Source/DTFluxCore/Private/Assets/DTFluxModelAsset.cpp index 52dfbcd..1579405 100644 --- a/Source/DTFluxCore/Private/Assets/DTFluxModelAsset.cpp +++ b/Source/DTFluxCore/Private/Assets/DTFluxModelAsset.cpp @@ -81,6 +81,35 @@ void UDTFluxModelAsset::AddContestRanking(const FDTFluxContestRankings& NewConte ContestRankings.Add(NewContestRankings.ContestId, NewContestRankings); } +void UDTFluxModelAsset::UpdateParticipant(const FDTFluxParticipant& Participant) +{ + // TODO : If update is on Bib we are totally lost as we search by bib. + int Bib = Participant.Bib; + if(Participants.Contains(Bib)) + { + TArray InTeammate = Participant.Teammate; + Participants[Bib].Elite = Participant.Elite; + Participants[Bib].ContestId = Participant.ContestId; + Participants[Bib].Club = Participant.Club; + Participants[Bib].Category = Participant.Category; + Participants[Bib].Team = Participant.Team; + Participants[Bib].Status = Participant.Status; + //TODO : Update Person + for(const auto& Person : InTeammate) + { + //Don't know what to do... + } + } +} + +void UDTFluxModelAsset::UpdateParticipantStatus(const FDTFluxTeamStatusUpdate& NewParticipantStatus) +{ + if(Participants.Contains(NewParticipantStatus.Bib)) + { + Participants[NewParticipantStatus.Bib].Status = NewParticipantStatus.Status; + } +} + void UDTFluxModelAsset::UpdateOrCreateStageRanking(const FDTFluxStageRankings& InStageRankings) { FDTFluxStageKey StageKey = InStageRankings.GetCompositeKey(); diff --git a/Source/DTFluxCore/Private/Types/Struct/DTFluxTeamListStruct.cpp b/Source/DTFluxCore/Private/Types/Struct/DTFluxTeamListStruct.cpp index ece59ef..0f09e35 100644 --- a/Source/DTFluxCore/Private/Types/Struct/DTFluxTeamListStruct.cpp +++ b/Source/DTFluxCore/Private/Types/Struct/DTFluxTeamListStruct.cpp @@ -103,7 +103,7 @@ FDTFluxParticipant::FDTFluxParticipant(const TSharedPtr& JsonObject , Status(static_cast(JsonObject->GetIntegerField(TEXT("status")))) , Team(JsonObject->GetStringField(TEXT("team"))) , bIsMassStartParticipant(false) - , LastSplitId(-1) + , CurrentSplit(-1) { UE_LOG(logDTFluxCore, Error, TEXT("Ctor with JSON Object")) for(uint8 Index = 1; ; Index++) diff --git a/Source/DTFluxCore/Public/Assets/DTFluxModelAsset.h b/Source/DTFluxCore/Public/Assets/DTFluxModelAsset.h index b517792..c135617 100644 --- a/Source/DTFluxCore/Public/Assets/DTFluxModelAsset.h +++ b/Source/DTFluxCore/Public/Assets/DTFluxModelAsset.h @@ -75,4 +75,10 @@ public: UFUNCTION() void AddContestRanking(const FDTFluxContestRankings& NewContestRankings); + + UFUNCTION(BlueprintCallable, CallInEditor, Category="DTFlux|Participant") + void UpdateParticipant(const FDTFluxParticipant& Participant); + + UFUNCTION(BlueprintCallable, CallInEditor, Category="DTFlux|Participant") + void UpdateParticipantStatus(const FDTFluxTeamStatusUpdate& NewParticipantStatus); }; diff --git a/Source/DTFluxCore/Public/Types/Struct/DTFluxTeamListStruct.h b/Source/DTFluxCore/Public/Types/Struct/DTFluxTeamListStruct.h index b9fa6d0..262e320 100644 --- a/Source/DTFluxCore/Public/Types/Struct/DTFluxTeamListStruct.h +++ b/Source/DTFluxCore/Public/Types/Struct/DTFluxTeamListStruct.h @@ -99,7 +99,7 @@ public: , Elite(false) , Status(static_cast(0)) , bIsMassStartParticipant(false) - , LastSplitId(0) + , CurrentSplit(-1) { Teammate.Reset(); } @@ -130,7 +130,7 @@ public: UPROPERTY(BlueprintReadWrite, Category="DTFlux|model", EditAnywhere) bool bIsMassStartParticipant = false; UPROPERTY(BlueprintReadWrite, Category="DTFlux|model") - int LastSplitId = -1; + int CurrentSplit = -1; // void Dump() const; void AddTeammate(const FDTFluxPerson& Person); diff --git a/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp b/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp index 6f2d8e3..bd014d8 100644 --- a/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp +++ b/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp @@ -19,19 +19,12 @@ void UDTFluxCoreSubsystem::Initialize(FSubsystemCollectionBase& Collection) { const UDTFluxGeneralSettings* GeneralSettings = GetDefault(); TSoftObjectPtr ModelAsset = GeneralSettings->ModelAsset; - // if(ModelAsset.IsValid()) - // { - // } - // UE_LOG(logDTFluxCore, Error, TEXT("ModelAsset Not Valid")); - DataStorage = DataStorage = Cast(ModelAsset.LoadSynchronous()); + DataStorage = ModelAsset.LoadSynchronous(); if(!DataStorage) { UE_LOG(logDTFluxCore, Error, TEXT("DataStorage Not Valid")); } - // else - // { - // MakeStorageEditable(DataStorage); - // } + } //TODO REMOVE This as it's only for testing purpose NetworkSubsystem = GEngine->GetEngineSubsystem(); @@ -48,44 +41,13 @@ void UDTFluxCoreSubsystem::Deinitialize() void UDTFluxCoreSubsystem::SaveDataStorage() { + if(!DataStorage->MarkPackageDirty()) + { + UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Unable to make package dirty !!!")) + } if(DataStorage) { - DataStorage->MarkPackageDirty(); - UPackage* Package = DataStorage->GetPackage(); - if(Package->IsDirty()) - { - FString PackageName = Package->GetName(); - FString FileExtension = FPackageName::GetAssetPackageExtension(); - FString FilePath = FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir() / PackageName.Replace(TEXT("/"), TEXT("/")) + FileExtension); - FString LongPackageName = DataStorage->GetOutermost()->GetName(); - FString RealAssetPath; - bool bExists = FPackageName::DoesPackageExist(PackageName); - if (!bExists) - { - UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Le package n'existe pas ou est un redirecteur")); - } - bool bSuccess = FPackageName::SearchForPackageOnDisk(LongPackageName, &RealAssetPath); - - if (bSuccess && !RealAssetPath.IsEmpty()) - { - UE_LOG(logDTFluxCoreSubsystem, Log, TEXT("Vrai path trouvé : %s"), *RealAssetPath); - } - else - { - UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Aucun path valide trouvé pour sauvegarder l'asset")); - } - UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Saving DataAsset to %s"), *FilePath); - TSoftObjectPtr ModelAsset = GetDefault()->ModelAsset; - FString RealPath = ModelAsset->GetPathName(); - UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("SoftObjectPath to %s"), *RealPath); - - FSavePackageArgs Args; - Args.TopLevelFlags = RF_Public | RF_Standalone; - Args.bSlowTask = false; - Args.SaveFlags = SAVE_None; - GEditor->SavePackage(Package, DataStorage, *FilePath, Args); - UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("DataAsset Saved")) - } + UEditorLoadingAndSavingUtils::SavePackages({DataStorage->GetPackage()}, true); } } @@ -100,6 +62,7 @@ void UDTFluxCoreSubsystem::RegisterDelegates() NetworkSubsystem->OnReceivedSplitRanking().BindUFunction(this, "ProcessSplitRanking"); NetworkSubsystem->OnReceivedTeamUpdate().BindUFunction(this, "ProcessTeamList"); NetworkSubsystem->OnReceivedTeamStatusUpdate().BindUFunction(this, "ProcessTeamStatusUpdate"); + NetworkSubsystem->OnReceivedTeamUpdate().BindUFunction(this, "ProcessTeamUpdate"); NetworkSubsystem->OnReceivedSplitSensor().BindUFunction(this, "ProcessSplitSensor"); } @@ -153,32 +116,41 @@ void UDTFluxCoreSubsystem::ProcessContestRanking(const FDTFluxContestRankings& C NewContestRankings.SetName( DataStorage->GetContestNameForId(ContestRankings.ContestId)); DataStorage->AddContestRanking(NewContestRankings); UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("ContestRankings added for Contest %s"), *NewContestRankings.ContestName); - DataStorage->MarkPackageDirty(); - + SaveDataStorage(); } void UDTFluxCoreSubsystem::ProcessStageRanking(const FDTFluxStageRankings& StageRankings) { UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received StageRankings with %i Items"), StageRankings.Rankings.Num()); DataStorage->UpdateOrCreateStageRanking(StageRankings); - DataStorage->MarkPackageDirty(); + SaveDataStorage(); } void UDTFluxCoreSubsystem::ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings) { UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received SplitRanking with %i Items"), SplitRankings.Rankings.Num()); DataStorage->UpdateOrCreateSplitRanking(SplitRankings); - DataStorage->MarkPackageDirty(); + SaveDataStorage(); } -void UDTFluxCoreSubsystem::ProcessTeamStatusUpdate() +void UDTFluxCoreSubsystem::ProcessTeamStatusUpdate(const FDTFluxTeamStatusUpdate& NewParticipantStatus) { - //TODO IMPLEMENT ME !!!! + DataStorage->UpdateParticipantStatus(NewParticipantStatus); } -void UDTFluxCoreSubsystem::ProcessSplitSensor() +void UDTFluxCoreSubsystem::ProcessTeamUpdate(const FDTFluxParticipant& Participant) { - //TODO IMPLEMENT ME !!!! + DataStorage->UpdateParticipant(Participant); +} + +void UDTFluxCoreSubsystem::ProcessSplitSensor(const FDTFluxSplitSensorInfo& SplitSensorInfo) +{ + FDTFluxContest Contest; + FDTFluxStageKey StageKey(SplitSensorInfo.ContestId, SplitSensorInfo.StageId); + DataStorage->GetContestById(SplitSensorInfo.ContestId, Contest); + UE_LOG(logDTFluxCoreSubsystem, Log, TEXT("%s %s Split %i Sensor for Participant [Bib] %i "), + *Contest.Name, *Contest.Stages[SplitSensorInfo.StageId].Name, + SplitSensorInfo.SplitId , SplitSensorInfo.Bib); } diff --git a/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h b/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h index dab27f2..436abde 100644 --- a/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h +++ b/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h @@ -8,6 +8,7 @@ #include "Types/Struct/DTFluxRaceDataStructs.h" #include "Types/Struct/DTFluxTeamListStruct.h" #include "Types/Struct/DTFluxRankingStructs.h" +#include "Types/Struct/DTFluxSplitSensor.h" #include "DTFluxCoreSubsystem.generated.h" @@ -87,6 +88,7 @@ protected: virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; // ~Subsystem Interface + UFUNCTION() void SaveDataStorage(); private: UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr; @@ -102,9 +104,11 @@ private: UFUNCTION() void ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings); UFUNCTION() - void ProcessTeamStatusUpdate(); + void ProcessTeamStatusUpdate(const FDTFluxTeamStatusUpdate& NewParticipantStatus); UFUNCTION() - void ProcessSplitSensor(); + void ProcessSplitSensor(const FDTFluxSplitSensorInfo& SplitSensorInfo); + UFUNCTION() + void ProcessTeamUpdate(const FDTFluxParticipant& Participant); UFUNCTION() void SendRequest(const FString& Message); UFUNCTION()