From 6c9256d033449800ff228cdee91a184b89f46454 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Wed, 24 Apr 2024 10:59:48 -0400 Subject: [PATCH] 40. Periodic Gameplay Effects --- .../Gasa/AbilitySystem/GasaAttributeSet.cpp | 4 +- .../Gasa/AbilitySystem/GasaEffectActor.cpp | 5 +- .../Gasa/AbilitySystem/GasaEffectActor.h | 5 +- Project/Source/Gasa/Game/GasaGameState.cpp | 11 +- Project/Source/Gasa/Game/GasaGameState.cpp~ | 147 ++++++++++++++++++ 5 files changed, 159 insertions(+), 13 deletions(-) create mode 100644 Project/Source/Gasa/Game/GasaGameState.cpp~ diff --git a/Project/Source/Gasa/AbilitySystem/GasaAttributeSet.cpp b/Project/Source/Gasa/AbilitySystem/GasaAttributeSet.cpp index 119eca9..d8588df 100644 --- a/Project/Source/Gasa/AbilitySystem/GasaAttributeSet.cpp +++ b/Project/Source/Gasa/AbilitySystem/GasaAttributeSet.cpp @@ -8,9 +8,9 @@ UGasaAttributeSet::UGasaAttributeSet() { - InitHealth( 100.f ); + InitHealth( 50.f ); InitMaxHealth( 100.f ); - InitMana( 50.f ); + InitMana( 25.f ); InitMaxMana( 50.f ); } diff --git a/Project/Source/Gasa/AbilitySystem/GasaEffectActor.cpp b/Project/Source/Gasa/AbilitySystem/GasaEffectActor.cpp index f4b4783..fc73561 100644 --- a/Project/Source/Gasa/AbilitySystem/GasaEffectActor.cpp +++ b/Project/Source/Gasa/AbilitySystem/GasaEffectActor.cpp @@ -17,8 +17,7 @@ void AGasaEffectActor::ApplyEffectToActor(AActor* Actor, TSubclassOfMakeEffectContext(); Context.AddSourceObject(Actor); - + FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( EffectClass, 1.0f, Context ); - if (Spec.IsValid()) - AS->ApplyGameplayEffectSpecToSelf( * Spec.Data ); + AS->ApplyGameplayEffectSpecToSelf( * Spec.Data ); } diff --git a/Project/Source/Gasa/AbilitySystem/GasaEffectActor.h b/Project/Source/Gasa/AbilitySystem/GasaEffectActor.h index 49d3be8..24ae180 100644 --- a/Project/Source/Gasa/AbilitySystem/GasaEffectActor.h +++ b/Project/Source/Gasa/AbilitySystem/GasaEffectActor.h @@ -13,7 +13,10 @@ class GASA_API AGasaEffectActor : public AGasaActor public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects") - TSoftClassPtr InstantEffectClass; + TSubclassOf InstantEffectClass; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects") + TSubclassOf DurationEffectClass; AGasaEffectActor(); diff --git a/Project/Source/Gasa/Game/GasaGameState.cpp b/Project/Source/Gasa/Game/GasaGameState.cpp index 2cfadd6..772b6be 100644 --- a/Project/Source/Gasa/Game/GasaGameState.cpp +++ b/Project/Source/Gasa/Game/GasaGameState.cpp @@ -96,14 +96,11 @@ void AGasaGameState::BeginPlay() GI->NotifyGameFrameworkClassReady(EGameFrameworkClassFlag::GameState); #if ENABLE_COG - for (local_persist int32 do_once = 0; do_once == 0; ++ do_once ) - { - CogWindowManager = NewObject(this); - CogWindowManagerRef = CogWindowManager; + CogWindowManager = NewObject(this); + CogWindowManagerRef = CogWindowManager; - // Add all the built-in windows - Cog::AddAllWindows(*CogWindowManager); - } + // Add all the built-in windows + Cog::AddAllWindows(*CogWindowManager); #endif //ENABLE_COG } diff --git a/Project/Source/Gasa/Game/GasaGameState.cpp~ b/Project/Source/Gasa/Game/GasaGameState.cpp~ new file mode 100644 index 0000000..772b6be --- /dev/null +++ b/Project/Source/Gasa/Game/GasaGameState.cpp~ @@ -0,0 +1,147 @@ +#include "GasaGameState.h" + +#include "CogAll.h" +#include "CogWindowManager.h" +#include "GasaPlayerState.h" +#include "GasaGameInstance.h" +#include "Net/UnrealNetwork.h" +#include "Networking/GasaNetLibrary_Inlines.h" +using namespace Gasa; + +AGasaGameState::AGasaGameState() +{ + // Enable ticking + PrimaryActorTick.bCanEverTick = true; + PrimaryActorTick.SetTickFunctionEnable(true); + PrimaryActorTick.bStartWithTickEnabled = true; + + // Replication + bReplicates = true; + bNetLoadOnClient = false; + NetDormancy = DORM_Awake; + NetCullDistanceSquared = NetCullDist_Default; + NetUpdateFrequency = 10.0f; + MinNetUpdateFrequency = 1.0f; + NetPriority = 5.0f; +} + +#pragma region GameFramework +void AGasaGameState::OnGameFrameworkInitialized() +{ + NetLog("Received gameplay framework initialization."); + if (IsServer()) + { + if (PlayerArray.Num() > 0) + { + ListenServerHost = Cast(PlayerArray[0]); + } + else + { + NetLog("Was not able to assign HostingPlayer!", ELogV::Error); + } + } + BP_OnGameFrameworkInitialized(); +} +#pragma endregion GameFramework + +#pragma region Networking +void AGasaGameState::Client_OnRep_OnlinePlayers() +{ +} +#pragma endregion Networking + +#pragma region Seamless Travel +void AGasaGameState::Multicast_R_NotifySeamlessTravelEnd_Implementation() +{ + NetLog("Multicast_R_NotifySeamlessTravelEnd_Implementation"); + BP_Event_OnSeamlessTravelEnd.Broadcast(); + Event_OnSeamlessTravelEnd.Broadcast(); +} +#pragma endregion Seamless Travel + +#pragma region GameStateBase +void AGasaGameState::HandleBeginPlay() +{ + Super::HandleBeginPlay(); + NetLog("HandleBeginPlay: Directly called from GM"); +} + +void AGasaGameState::SeamlessTravelTransitionCheckpoint(bool bToTransitionMap) +{ + Super::SeamlessTravelTransitionCheckpoint(bToTransitionMap); + NetLog("SeamlessTravelTransitionCheckpoint"); + NetLog(FString("ToTransitionMap: ") + FString(bToTransitionMap ? "true" : "false")); + + if (bToTransitionMap) + { + Event_OnSeamlessTravelStart.Broadcast(); + } + else + { + Multicast_R_NotifySeamlessTravelEnd(); + } +} +#pragma endregion GameStateBase + +#pragma region Actor +void AGasaGameState::BeginPlay() +{ + Super::BeginPlay(); + NetLog("BeginPlay"); + + // Notified as initialized here as any possible components should also be initialized by this point. + UGasaGameInstance* + GI = GetGameInstance(); + GI->Event_OnGameFrameworkInitialized.AddDynamic(this, & ThisClass::OnGameFrameworkInitialized); + GI->NotifyGameFrameworkClassReady(EGameFrameworkClassFlag::GameState); + +#if ENABLE_COG + CogWindowManager = NewObject(this); + CogWindowManagerRef = CogWindowManager; + + // Add all the built-in windows + Cog::AddAllWindows(*CogWindowManager); +#endif //ENABLE_COG +} + +void AGasaGameState::PostInitializeComponents() +{ + NetLog("PostInitializeComponents"); + Super::PostInitializeComponents(); + + if ( ! GetWorld()->IsEditorWorld() && IsServer()) + { + OnlinePlayers.Empty(); +#if 0 + const auto GI = Cast(GetGameInstance()); + if (GI != nullptr) + { + int32 NumConnections = GI->SessionSettings.bPublicGame + ? GI->SessionSettings.PublicConnections + : GI->SessionSettings.PrivateConnections; + OnlinePlayers.Init(nullptr, NumConnections); + } +#endif + } +} + +void AGasaGameState::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + +#if ENABLE_COG + if (CogWindowManager) + CogWindowManager->Tick(DeltaSeconds); +#endif //ENABLE_COG +} +#pragma endregion Actor + +#pragma region UObject +void AGasaGameState::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(AGasaGameState, ListenServerHost); + DOREPLIFETIME(AGasaGameState, OnlinePlayers); +} +#pragma endregion UObject