Compare commits

...

1 Commits

6 changed files with 69 additions and 58 deletions

View File

@ -81,6 +81,35 @@ void UDTFluxModelAsset::AddContestRanking(const FDTFluxContestRankings& NewConte
ContestRankings.Add(NewContestRankings.ContestId, NewContestRankings); 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<FDTFluxPerson> 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) void UDTFluxModelAsset::UpdateOrCreateStageRanking(const FDTFluxStageRankings& InStageRankings)
{ {
FDTFluxStageKey StageKey = InStageRankings.GetCompositeKey(); FDTFluxStageKey StageKey = InStageRankings.GetCompositeKey();

View File

@ -103,7 +103,7 @@ FDTFluxParticipant::FDTFluxParticipant(const TSharedPtr<FJsonObject>& JsonObject
, Status(static_cast<EDTFluxParticipantStatusType>(JsonObject->GetIntegerField(TEXT("status")))) , Status(static_cast<EDTFluxParticipantStatusType>(JsonObject->GetIntegerField(TEXT("status"))))
, Team(JsonObject->GetStringField(TEXT("team"))) , Team(JsonObject->GetStringField(TEXT("team")))
, bIsMassStartParticipant(false) , bIsMassStartParticipant(false)
, LastSplitId(-1) , CurrentSplit(-1)
{ {
UE_LOG(logDTFluxCore, Error, TEXT("Ctor with JSON Object")) UE_LOG(logDTFluxCore, Error, TEXT("Ctor with JSON Object"))
for(uint8 Index = 1; ; Index++) for(uint8 Index = 1; ; Index++)

View File

@ -75,4 +75,10 @@ public:
UFUNCTION() UFUNCTION()
void AddContestRanking(const FDTFluxContestRankings& NewContestRankings); 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);
}; };

View File

@ -99,7 +99,7 @@ public:
, Elite(false) , Elite(false)
, Status(static_cast<EDTFluxParticipantStatusType>(0)) , Status(static_cast<EDTFluxParticipantStatusType>(0))
, bIsMassStartParticipant(false) , bIsMassStartParticipant(false)
, LastSplitId(0) , CurrentSplit(-1)
{ {
Teammate.Reset(); Teammate.Reset();
} }
@ -130,7 +130,7 @@ public:
UPROPERTY(BlueprintReadWrite, Category="DTFlux|model", EditAnywhere) UPROPERTY(BlueprintReadWrite, Category="DTFlux|model", EditAnywhere)
bool bIsMassStartParticipant = false; bool bIsMassStartParticipant = false;
UPROPERTY(BlueprintReadWrite, Category="DTFlux|model") UPROPERTY(BlueprintReadWrite, Category="DTFlux|model")
int LastSplitId = -1; int CurrentSplit = -1;
// void Dump() const; // void Dump() const;
void AddTeammate(const FDTFluxPerson& Person); void AddTeammate(const FDTFluxPerson& Person);

View File

@ -19,19 +19,12 @@ void UDTFluxCoreSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{ {
const UDTFluxGeneralSettings* GeneralSettings = GetDefault<UDTFluxGeneralSettings>(); const UDTFluxGeneralSettings* GeneralSettings = GetDefault<UDTFluxGeneralSettings>();
TSoftObjectPtr<UDTFluxModelAsset> ModelAsset = GeneralSettings->ModelAsset; TSoftObjectPtr<UDTFluxModelAsset> ModelAsset = GeneralSettings->ModelAsset;
// if(ModelAsset.IsValid()) DataStorage = ModelAsset.LoadSynchronous();
// {
// }
// UE_LOG(logDTFluxCore, Error, TEXT("ModelAsset Not Valid"));
DataStorage = DataStorage = Cast<UDTFluxModelAsset>(ModelAsset.LoadSynchronous());
if(!DataStorage) if(!DataStorage)
{ {
UE_LOG(logDTFluxCore, Error, TEXT("DataStorage Not Valid")); UE_LOG(logDTFluxCore, Error, TEXT("DataStorage Not Valid"));
} }
// else
// {
// MakeStorageEditable(DataStorage);
// }
} }
//TODO REMOVE This as it's only for testing purpose //TODO REMOVE This as it's only for testing purpose
NetworkSubsystem = GEngine->GetEngineSubsystem<UDTFluxNetworkSubsystem>(); NetworkSubsystem = GEngine->GetEngineSubsystem<UDTFluxNetworkSubsystem>();
@ -48,44 +41,13 @@ void UDTFluxCoreSubsystem::Deinitialize()
void UDTFluxCoreSubsystem::SaveDataStorage() void UDTFluxCoreSubsystem::SaveDataStorage()
{ {
if(!DataStorage->MarkPackageDirty())
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Unable to make package dirty !!!"))
}
if(DataStorage) if(DataStorage)
{ {
DataStorage->MarkPackageDirty(); UEditorLoadingAndSavingUtils::SavePackages({DataStorage->GetPackage()}, true);
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<UDTFluxModelAsset> ModelAsset = GetDefault<UDTFluxGeneralSettings>()->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"))
}
} }
} }
@ -100,6 +62,7 @@ void UDTFluxCoreSubsystem::RegisterDelegates()
NetworkSubsystem->OnReceivedSplitRanking().BindUFunction(this, "ProcessSplitRanking"); NetworkSubsystem->OnReceivedSplitRanking().BindUFunction(this, "ProcessSplitRanking");
NetworkSubsystem->OnReceivedTeamUpdate().BindUFunction(this, "ProcessTeamList"); NetworkSubsystem->OnReceivedTeamUpdate().BindUFunction(this, "ProcessTeamList");
NetworkSubsystem->OnReceivedTeamStatusUpdate().BindUFunction(this, "ProcessTeamStatusUpdate"); NetworkSubsystem->OnReceivedTeamStatusUpdate().BindUFunction(this, "ProcessTeamStatusUpdate");
NetworkSubsystem->OnReceivedTeamUpdate().BindUFunction(this, "ProcessTeamUpdate");
NetworkSubsystem->OnReceivedSplitSensor().BindUFunction(this, "ProcessSplitSensor"); NetworkSubsystem->OnReceivedSplitSensor().BindUFunction(this, "ProcessSplitSensor");
} }
@ -153,32 +116,41 @@ void UDTFluxCoreSubsystem::ProcessContestRanking(const FDTFluxContestRankings& C
NewContestRankings.SetName( DataStorage->GetContestNameForId(ContestRankings.ContestId)); NewContestRankings.SetName( DataStorage->GetContestNameForId(ContestRankings.ContestId));
DataStorage->AddContestRanking(NewContestRankings); DataStorage->AddContestRanking(NewContestRankings);
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("ContestRankings added for Contest %s"), *NewContestRankings.ContestName); UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("ContestRankings added for Contest %s"), *NewContestRankings.ContestName);
DataStorage->MarkPackageDirty(); SaveDataStorage();
} }
void UDTFluxCoreSubsystem::ProcessStageRanking(const FDTFluxStageRankings& StageRankings) void UDTFluxCoreSubsystem::ProcessStageRanking(const FDTFluxStageRankings& StageRankings)
{ {
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received StageRankings with %i Items"), StageRankings.Rankings.Num()); UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received StageRankings with %i Items"), StageRankings.Rankings.Num());
DataStorage->UpdateOrCreateStageRanking(StageRankings); DataStorage->UpdateOrCreateStageRanking(StageRankings);
DataStorage->MarkPackageDirty(); SaveDataStorage();
} }
void UDTFluxCoreSubsystem::ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings) void UDTFluxCoreSubsystem::ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings)
{ {
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received SplitRanking with %i Items"), SplitRankings.Rankings.Num()); UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received SplitRanking with %i Items"), SplitRankings.Rankings.Num());
DataStorage->UpdateOrCreateSplitRanking(SplitRankings); 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);
} }

View File

@ -8,6 +8,7 @@
#include "Types/Struct/DTFluxRaceDataStructs.h" #include "Types/Struct/DTFluxRaceDataStructs.h"
#include "Types/Struct/DTFluxTeamListStruct.h" #include "Types/Struct/DTFluxTeamListStruct.h"
#include "Types/Struct/DTFluxRankingStructs.h" #include "Types/Struct/DTFluxRankingStructs.h"
#include "Types/Struct/DTFluxSplitSensor.h"
#include "DTFluxCoreSubsystem.generated.h" #include "DTFluxCoreSubsystem.generated.h"
@ -87,6 +88,7 @@ protected:
virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override; virtual void Deinitialize() override;
// ~Subsystem Interface // ~Subsystem Interface
UFUNCTION()
void SaveDataStorage(); void SaveDataStorage();
private: private:
UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr; UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr;
@ -102,9 +104,11 @@ private:
UFUNCTION() UFUNCTION()
void ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings); void ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings);
UFUNCTION() UFUNCTION()
void ProcessTeamStatusUpdate(); void ProcessTeamStatusUpdate(const FDTFluxTeamStatusUpdate& NewParticipantStatus);
UFUNCTION() UFUNCTION()
void ProcessSplitSensor(); void ProcessSplitSensor(const FDTFluxSplitSensorInfo& SplitSensorInfo);
UFUNCTION()
void ProcessTeamUpdate(const FDTFluxParticipant& Participant);
UFUNCTION() UFUNCTION()
void SendRequest(const FString& Message); void SendRequest(const FString& Message);
UFUNCTION() UFUNCTION()