#pragma once #include "CoreMinimal.h" #include "DTFluxPursuitManager.h" #include "Containers/Deque.h" #include "Subsystems/EngineSubsystem.h" #include "Types/Struct/DTFluxRaceDataStructs.h" #include "Types/Struct/DTFluxTeamListStruct.h" #include "Types/Struct/DTFluxRankingStructs.h" #include "Types/Struct/DTFluxSplitSensor.h" #include "DTFluxCoreSubsystem.generated.h" class UDTFluxNetworkSubsystem; /** Forward Decl */ class UDTFluxModelAsset; class UDTFluxPursuitManager; /** * */ UCLASS(Blueprintable, BlueprintType) class DTFLUXCORESUBSYSTEM_API UDTFluxCoreSubsystem : public UEngineSubsystem { GENERATED_BODY() public: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSplitRankings, FDTFluxSplitRankings&, SplitRankings); UPROPERTY(BlueprintAssignable, Category="DTFlux|Core Subsystem") FOnSplitRankings OnSplitRankings; DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnStageRankings, FDTFluxStageRankings&, StageRankings); UPROPERTY(BlueprintAssignable, Category="DTFlux|Core Subsystem") FOnStageRankings OnStageRankings; DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnContestRankings, FDTFluxContestRankings&, ContestRankings); UPROPERTY(BlueprintAssignable, Category="DTFlux|Core Subsystem") FOnContestRankings OnContestRankings; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnTeamList); UPROPERTY(BlueprintAssignable, Category="DTFlux|Core Subsystem") FOnTeamList OnTeamList; DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnTeamStatusUpdate, FDTFluxParticipant, TeamUpdated); UPROPERTY(BlueprintAssignable, Category="DTFlux|Core Subsystem") FOnTeamStatusUpdate OnTeamStatusUpdate; DECLARE_DELEGATE_TwoParams(FOnRequestedStageRankings, const FDTFluxStageKey&, const FDTFluxContestRankings&); FOnRequestedStageRankings OnRequestedStageRankings; // // DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnTeamUpdate, FDateTime, ReceivedAt, FDTFluxParticipant, TeamUpdatedList); // UPROPERTY(BlueprintAssignable, Category="DTFlux|Core Subsystem") // FOnTeamUpdate OnTeamUpdate; UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void SendTeamListRequest(); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void SendRaceDataRequest(); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void SendContestRankingRequest(int InContestId); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void SendStageRankingRequest(int InContestId, int InStageId, bool bShouldIncludeSplitRanking = true); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void RequestAllStageRankingOfContest(int InContestId, int InStageId, bool bShouldIncludeSplitRanking = true); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void SendSplitRankingRequest(int InContestId, int InStageId, int InSplitId); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void RequestAllSplitRankingOfContest(int InContestId, int InStageId); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") FDTFluxStageRankings GetStageRankings(FDTFluxStageKey StageKey); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void RequestAllSplitRankingOfStage(int InContestId, int InStageId, int InSplitId); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") const FDTFluxParticipant GetParticipant(int InBib); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void RefreshStorage(); UFUNCTION() TArray GetCurrentContestsId(); UFUNCTION() TArray GetCurrentContests(); UFUNCTION() TArray GetContestsIdForTime(const FDateTime Time); UFUNCTION() bool GetContestForId(const int Id, FDTFluxContest& OutContest); UFUNCTION() TArray GetContestsForTime(const FDateTime Time); UFUNCTION() void RequestRankingsForStages(const TArray RequestedStages) const; UFUNCTION() TArray GetContests(); UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void LaunchPursuitSequenceFor(const TArray ContestIds); DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnPursuitSequenceReady, const TArray, NextFocusPursuits, const TArray, NextPursuit, bool, bIsTrtuncate); UPROPERTY(BlueprintAssignable, Category="DTFlux|Pursuit") FOnPursuitSequenceReady OnPursuitSequenceReady; UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") void InitPursuit(const TArray Contests); protected: // ~Subsystem Interface virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; // ~Subsystem Interface UPROPERTY() UDTFluxPursuitManager* PursuitManager = nullptr; UFUNCTION() void SaveDataStorage(); private: UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr; UFUNCTION() void ProcessRaceData(const FDTFluxRaceData& RaceDataDefinition); UFUNCTION() void ProcessTeamList(const FDTFluxTeamListDefinition& TeamListDefinition); UFUNCTION() void ProcessContestRanking(const FDTFluxContestRankings& ContestRankings); UFUNCTION() void ProcessStageRanking(const FDTFluxStageRankings& StageRankings); UFUNCTION() void ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings); UFUNCTION() void ProcessTeamStatusUpdate(const FDTFluxTeamStatusUpdate& NewParticipantStatus); UFUNCTION() void ProcessSplitSensor(const FDTFluxSplitSensorInfo& SplitSensorInfo); UFUNCTION() void ProcessTeamUpdate(const FDTFluxTeamListDefinition& TeamListDefinition); UFUNCTION() void SendRequest(const FString& Message); UFUNCTION() void RegisterDelegates(); UPROPERTY() UDTFluxModelAsset* DataStorage = nullptr; };