/
GSAT_WaitTargetDataUsingActor.h
84 lines (62 loc) · 3.36 KB
/
GSAT_WaitTargetDataUsingActor.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2020 Dan Kestranek.
#pragma once
#include "CoreMinimal.h"
#include "Abilities/Tasks/AbilityTask_WaitTargetData.h"
#include "Abilities/GameplayAbilityTargetActor.h"
#include "GameplayTagContainer.h"
#include "GSAT_WaitTargetDataUsingActor.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FWaitTargetDataUsingActorDelegate, const FGameplayAbilityTargetDataHandle&, Data);
/**
* Waits for TargetData from an already spawned TargetActor and does *NOT* destroy it when it receives data.
*
* The original WaitTargetData's comments expects us to subclass it heavily, but the majority of its functions
* are not virtual. Therefore this is a total rewrite of it to add bCreateKeyIfNotValidForMorePredicting functionality.
*/
UCLASS()
class GASSHOOTER_API UGSAT_WaitTargetDataUsingActor : public UAbilityTask
{
GENERATED_UCLASS_BODY()
UPROPERTY(BlueprintAssignable)
FWaitTargetDataUsingActorDelegate ValidData;
UPROPERTY(BlueprintAssignable)
FWaitTargetDataUsingActorDelegate Cancelled;
/**
* Uses specified spawned TargetActor and waits for it to return valid data or to be canceled. The TargetActor is *NOT* destroyed.
*
* @param bCreateKeyIfNotValidForMorePredicting Will create a new scoped prediction key if the current scoped prediction key is not valid for more predicting.
* If false, it will always create a new scoped prediction key. We would want to set this to true if we want to use a potentially existing valid scoped prediction
* key like the ability's activation key in a batched ability.
*/
UFUNCTION(BlueprintCallable, meta = (HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "true", HideSpawnParms = "Instigator"), Category = "Ability|Tasks")
static UGSAT_WaitTargetDataUsingActor* WaitTargetDataWithReusableActor(
UGameplayAbility* OwningAbility,
FName TaskInstanceName,
TEnumAsByte<EGameplayTargetingConfirmation::Type> ConfirmationType,
AGameplayAbilityTargetActor* InTargetActor,
bool bCreateKeyIfNotValidForMorePredicting = false
);
virtual void Activate() override;
UFUNCTION()
virtual void OnTargetDataReplicatedCallback(const FGameplayAbilityTargetDataHandle& Data, FGameplayTag ActivationTag);
UFUNCTION()
virtual void OnTargetDataReplicatedCancelledCallback();
UFUNCTION()
virtual void OnTargetDataReadyCallback(const FGameplayAbilityTargetDataHandle& Data);
UFUNCTION()
virtual void OnTargetDataCancelledCallback(const FGameplayAbilityTargetDataHandle& Data);
// Called when the ability is asked to confirm from an outside node. What this means depends on the individual task. By default, this does nothing other than ending if bEndTask is true.
virtual void ExternalConfirm(bool bEndTask) override;
// Called when the ability is asked to cancel from an outside node. What this means depends on the individual task. By default, this does nothing other than ending the task.
virtual void ExternalCancel() override;
protected:
UPROPERTY()
AGameplayAbilityTargetActor* TargetActor;
bool bCreateKeyIfNotValidForMorePredicting;
TEnumAsByte<EGameplayTargetingConfirmation::Type> ConfirmationType;
FDelegateHandle OnTargetDataReplicatedCallbackDelegateHandle;
virtual void InitializeTargetActor() const;
virtual void FinalizeTargetActor() const;
virtual void RegisterTargetDataCallbacks();
virtual void OnDestroy(bool AbilityEnded) override;
virtual bool ShouldReplicateDataToServer() const;
};