Skip to content

Commit e427d8e

Browse files
reznokpetegilbPacketdancerBajaShortLongutf8decodeerror
authored
DW Improvements (#94)
* Minor Cleanup (#86) * Ensure Unbound attributes are replicated properly at startup. * Additional guards on unbinding filtered tag delegates for gameplay element mapping. * Ensure Unbound attributes are replicated properly at startup. * Ensure the garbage check on gameplay element maps works in 5.3 and earlier. * Add methods to add/remove starting effects (#84) * Fix heartbeats for locally controlled server pawns causing timeouts * Add WaitForGMCMontageChange * Effects:Add Application/Ongoing checks for Must(Not) Have Tags * Prevent effect from starting if tag requirements not met * Virtualize ability effect (#90) * Ensure Unbound attributes are replicated properly at startup. * virtualize lifecycle function so that AbilityEffect can be subclassed * remove extra whitespace --------- Co-authored-by: Rachel Blackman <packetdancer@gmail.com> Co-authored-by: utf8 <uft8decodeerror@gmail.com> * Rebased Deep Worlds fork (#93) * Add UPROPERTY Categories to allow compilation as engine plugin. * Adding Method CancelAbility, allowing ending an ability without triggering EndAbilityEvent. Internally, FinishEndAbility Method as also been added and ensure logics (see GAS termination of an ability) * Moving Activation tag requirement check before instantiation of the ability. * Added Activity Blocked by ActiveAbility * Fixing crash in HandleTaskHeartBeat. * Change behavior for attribute ChangeCallback - Callback OnAttributeChanged is now also called on SP/AP - Callback is now also called when the value is affected outside for whatever reason (like by SetAttributeValueByTag) - Support Replay - SetAttributeValueByTag now also re-caculate the value. Signed-off-by: Eric Rajot <aherys@deepworlds.studio> * BL-279 Clean before merge - Removed Log message - Removed irrelevant bounding Signed-off-by: Eric Rajot <aherys@deepworlds.studio> * BL-279 Bug fixing and improvement for rep notify * BL-279 Fixing Attribute notification * BL-279 Adding Byte data type to Set Target for DW GMC Ability * Improvement for tags, added duration * BL-232 Progress * BL-232 Initial work on External Effect/Ability Pending and Tag application * BL-232 Working state. * BL-232 Refactor and cleaning, handled now by Instanced Struct * BL-232 Progress of the day * Fixing a bug in remove effect. They are now removing by specifique ID when outer removed, to ensure the list rest coherent client <-> server * BL-232 Fixing removing effect * BL-232 bug fixing in effect * Bug fixing, adding accessor * BL-232 Fix effect remove itself even is another instance is running * Added getter * Stability - Fixed name space for SetTargetDataFloat, - Fixed EEffectType of GMCAbilityEffect sharing same name than playfab - Fixed wait for input key release with suggestion of Nas - GetAbilityMapData now return a const ref. For compability, you probably want to add to core redirect those lines : ``` +EnumRedirects=(OldName="/Script/GMCAbilitySystem.EEffectType",NewName="/Script/GMCAbilitySystem.EGMASEffectType") +EnumRedirects=(OldName="/Script/GMCAbilitySystem.EEffectState",NewName="/Script/GMCAbilitySystem.EGMASEffectState") ``` * Adding possibility for effect to end an active ability * Changing Ability Blocking way. They are now internally stored. An Ability store itself what ability it will block, instead of other ability who will block him. This allow to modify during execution this behavior. For example, you may be want to stop an ability activation only during X time in your ability execution. * Adding a nicer way to end ability * BL-225 Grenade 100% * Fix clang error * Adding Attribute Dynamic Condition to effect. * Fix crash when an active effect has been destroyed * Module upload * GMC Update * Addition of levitation actor * Crash fix * GMC Fix for starting abilities, Fix for stamina, Fix for crash, Adding speed for orb, Adding plugin for metahuman hairs. * Update for log * Fix for GetActiveEffect ? * Typo fix * couple of misc fixes from rebasing deep worlds fork --------- Signed-off-by: Eric Rajot <aherys@deepworlds.studio> Co-authored-by: Eric Rajot <aherys@deepworlds.studio> * Update SetTargetDataGameplayTag.cpp fix: Remove super call for SetTargetDataGameplayTag --------- Signed-off-by: Eric Rajot <aherys@deepworlds.studio> Co-authored-by: Peter Gilbert <33180578+petegilb@users.noreply.github.com> Co-authored-by: Rachel Blackman <packetdancer@gmail.com> Co-authored-by: Bean's Beans Studios <dylancharleston@gmail.com> Co-authored-by: utf8decodeerror <30543450+utf8decodeerror@users.noreply.github.com> Co-authored-by: utf8 <uft8decodeerror@gmail.com> Co-authored-by: Eric Rajot <aherys@deepworlds.studio>
1 parent 4066d2f commit e427d8e

24 files changed

+1036
-103
lines changed

Source/GMCAbilitySystem/Private/Ability/GMCAbility.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ void UGMCAbility::Tick(float DeltaTime)
4242
return;
4343
}
4444
}
45+
46+
if (bEndPending) {
47+
EndAbility();
48+
return;
49+
}
4550

4651
TickTasks(DeltaTime);
4752
TickEvent(DeltaTime);
@@ -125,6 +130,23 @@ void UGMCAbility::RemoveAbilityCost(){
125130
}
126131
}
127132

133+
134+
void UGMCAbility::ModifyBlockOtherAbility(FGameplayTagContainer TagToAdd, FGameplayTagContainer TagToRemove) {
135+
for (auto Tag : TagToAdd) {
136+
BlockOtherAbility.AddTag(Tag);
137+
}
138+
139+
for (auto Tag : TagToRemove) {
140+
BlockOtherAbility.RemoveTag(Tag);
141+
}
142+
}
143+
144+
145+
void UGMCAbility::ResetBlockOtherAbility() {
146+
BlockOtherAbility = GetClass()->GetDefaultObject<UGMCAbility>()->BlockOtherAbility;
147+
}
148+
149+
128150
void UGMCAbility::HandleTaskData(int TaskID, FInstancedStruct TaskData)
129151
{
130152
const FGMCAbilityTaskData TaskDataFromInstance = TaskData.Get<FGMCAbilityTaskData>();
@@ -139,7 +161,7 @@ void UGMCAbility::HandleTaskData(int TaskID, FInstancedStruct TaskData)
139161

140162
void UGMCAbility::HandleTaskHeartbeat(int TaskID)
141163
{
142-
if (RunningTasks.Contains(TaskID))
164+
if (RunningTasks.Contains(TaskID) && RunningTasks[TaskID] != nullptr) // Do we ever remove orphans tasks ?
143165
{
144166
RunningTasks[TaskID]->Heartbeat();
145167
}
@@ -150,6 +172,12 @@ void UGMCAbility::ServerConfirm()
150172
bServerConfirmed = true;
151173
}
152174

175+
176+
void UGMCAbility::SetPendingEnd() {
177+
bEndPending = true;
178+
}
179+
180+
153181
UGameplayTasksComponent* UGMCAbility::GetGameplayTasksComponent(const UGameplayTask& Task) const
154182
{
155183
if (OwnerAbilityComponent != nullptr) { return OwnerAbilityComponent; }
@@ -210,7 +238,6 @@ bool UGMCAbility::IsOnCooldown() const
210238
}
211239

212240

213-
214241
bool UGMCAbility::PreExecuteCheckEvent_Implementation() {
215242
return true;
216243
}
@@ -241,6 +268,12 @@ bool UGMCAbility::PreBeginAbility() {
241268
void UGMCAbility::BeginAbility()
242269
{
243270

271+
if (OwnerAbilityComponent->IsAbilityTagBlocked(AbilityTag)) {
272+
CancelAbility();
273+
return;
274+
}
275+
276+
244277
if (bApplyCooldownAtAbilityBegin)
245278
{
246279
CommitAbilityCooldown();

Source/GMCAbilitySystem/Private/Ability/Tasks/GMCAbilityTaskBase.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ void UGMCAbilityTaskBase::RegisterTask(UGMCAbilityTaskBase* Task)
3030

3131
void UGMCAbilityTaskBase::Tick(float DeltaTime)
3232
{
33+
// Locally controlled server pawns don't need to send heartbeats
34+
if (AbilitySystemComponent->GMCMovementComponent->IsLocallyControlledServerPawn()) return;
35+
36+
// If not the server version of the component, send heartbeats
3337
if (AbilitySystemComponent->GetNetMode() != NM_DedicatedServer)
3438
{
3539
if (ClientLastHeartbeatSentTime + HeartbeatInterval < AbilitySystemComponent->ActionTimer)
@@ -42,6 +46,7 @@ void UGMCAbilityTaskBase::Tick(float DeltaTime)
4246
{
4347
UE_LOG(LogGMCReplication, Error, TEXT("Server Task Heartbeat Timeout, Cancelling Ability: %s"), *Ability->GetName());
4448
Ability->EndAbility();
49+
EndTask();
4550
}
4651

4752
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "Ability/Tasks/SetTargetDataByte.h"
2+
3+
#include "GMCAbilityComponent.h"
4+
5+
6+
UGMCAbilityTask_SetTargetDataByte* UGMCAbilityTask_SetTargetDataByte::SetTargetDataByte(UGMCAbility* OwningAbility,
7+
uint8 Byte)
8+
{
9+
UGMCAbilityTask_SetTargetDataByte* Task = NewAbilityTask<UGMCAbilityTask_SetTargetDataByte>(OwningAbility);
10+
Task->Ability = OwningAbility;
11+
Task->Target = Byte;
12+
return Task;
13+
}
14+
15+
void UGMCAbilityTask_SetTargetDataByte::Activate()
16+
{
17+
Super::Activate();
18+
19+
if (AbilitySystemComponent->GetNetMode() != NM_DedicatedServer)
20+
{
21+
ClientProgressTask();
22+
}
23+
}
24+
25+
void UGMCAbilityTask_SetTargetDataByte::ProgressTask(FInstancedStruct& TaskData)
26+
{
27+
Super::ProgressTask(TaskData);
28+
const FGMCAbilityTaskTargetDataByte Data = TaskData.Get<FGMCAbilityTaskTargetDataByte>();
29+
30+
Completed.Broadcast(Data.Target);
31+
EndTask();
32+
}
33+
34+
void UGMCAbilityTask_SetTargetDataByte::ClientProgressTask()
35+
{
36+
FGMCAbilityTaskTargetDataByte TaskData;
37+
TaskData.TaskType = EGMCAbilityTaskDataType::Progress;
38+
TaskData.AbilityID = Ability->GetAbilityID();
39+
TaskData.TaskID = TaskID;
40+
TaskData.Target = Target;
41+
const FInstancedStruct TaskDataInstance = FInstancedStruct::Make(TaskData);
42+
43+
Ability->OwnerAbilityComponent->QueueTaskData(TaskDataInstance);
44+
}

Source/GMCAbilitySystem/Private/Ability/Tasks/SetTargetDataGameplayTag.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ void UGMCAbilityTask_SetTargetDataGameplayTag::ProgressTask(FInstancedStruct& Ta
2626
}
2727

2828
void UGMCAbilityTask_SetTargetDataGameplayTag::ClientProgressTask(){
29-
Super::ClientProgressTask();
30-
3129
FGMCAbilityTaskTargetDataGameplayTag TaskData;
3230
TaskData.TaskType = EGMCAbilityTaskDataType::Progress;
3331
TaskData.AbilityID = Ability->GetAbilityID();

Source/GMCAbilitySystem/Private/Ability/Tasks/WaitDelay.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ void UGMCAbilityTask_WaitDelay::Tick(float DeltaTime)
3636

3737
void UGMCAbilityTask_WaitDelay::OnTimeFinish()
3838
{
39-
Completed.Broadcast();
40-
EndTask();
39+
if (GetState() != EGameplayTaskState::Finished)
40+
{
41+
Completed.Broadcast();
42+
EndTask();
43+
}
4144
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "Ability/Tasks/WaitForGMCMontageChange.h"
2+
3+
#include "GMCOrganicMovementComponent.h"
4+
#include "Components/GMCAbilityComponent.h"
5+
6+
7+
8+
UGMCAbilityTask_WaitForGMCMontageChange::UGMCAbilityTask_WaitForGMCMontageChange(const FObjectInitializer& ObjectInitializer)
9+
: Super(ObjectInitializer)
10+
{
11+
12+
}
13+
14+
UGMCAbilityTask_WaitForGMCMontageChange* UGMCAbilityTask_WaitForGMCMontageChange::WaitForGMCMontageChange(UGMCAbility* OwningAbility)
15+
{
16+
UGMCAbilityTask_WaitForGMCMontageChange* Task = NewAbilityTask<UGMCAbilityTask_WaitForGMCMontageChange>(OwningAbility);
17+
return Task;
18+
}
19+
20+
void UGMCAbilityTask_WaitForGMCMontageChange::Activate()
21+
{
22+
Super::Activate();
23+
bTickingTask = true;
24+
25+
OrganicMovementCmp = Cast<UGMC_OrganicMovementCmp>(AbilitySystemComponent->GMCMovementComponent);
26+
27+
if (OrganicMovementCmp == nullptr)
28+
{
29+
UE_LOG(LogGMCAbilitySystem, Error, TEXT("WaitForGMCMontageChange called without an Organic Movement Component"));
30+
OnFinish();
31+
return;
32+
}
33+
34+
StartingMontage = OrganicMovementCmp->GetActiveMontage(OrganicMovementCmp->MontageTracker);
35+
if (StartingMontage == nullptr)
36+
{
37+
UE_LOG(LogGMCAbilitySystem, Error, TEXT("WaitForGMCMontageChange called without a running montage"));
38+
OnFinish();
39+
}
40+
}
41+
42+
void UGMCAbilityTask_WaitForGMCMontageChange::Tick(float DeltaTime)
43+
{
44+
Super::Tick(DeltaTime);
45+
46+
const UAnimMontage* RunningMontage = OrganicMovementCmp->GetActiveMontage(OrganicMovementCmp->MontageTracker);
47+
48+
// If the montage has changed, finish the task
49+
if (StartingMontage != RunningMontage)
50+
{
51+
OnFinish();
52+
}
53+
}
54+
55+
void UGMCAbilityTask_WaitForGMCMontageChange::OnFinish()
56+
{
57+
if (GetState() != EGameplayTaskState::Finished)
58+
{
59+
Completed.Broadcast();
60+
EndTask();
61+
}
62+
}

Source/GMCAbilitySystem/Private/Ability/Tasks/WaitForInputKeyRelease.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "Ability/Tasks/WaitForInputKeyRelease.h"
22

33
#include "EnhancedInputComponent.h"
4+
#include "EnhancedInputSubsystems.h"
45
#include "Components/GMCAbilityComponent.h"
56
#include "Kismet/KismetSystemLibrary.h"
67

@@ -29,9 +30,15 @@ void UGMCAbilityTask_WaitForInputKeyRelease::Activate()
2930
// Check that the value isn't currently false.
3031
if (bShouldCheckForReleaseDuringActivation)
3132
{
32-
const FInputActionValue ActionValue = InputComponent->GetBoundActionValue(Ability->AbilityInputAction);
33-
if (!ActionValue.Get<bool>())
33+
FInputActionValue ActionValue = FInputActionValue();
34+
APlayerController* PC = AbilitySystemComponent->GetOwner()->GetInstigatorController<APlayerController>();
35+
if (UEnhancedInputLocalPlayerSubsystem* InputSubSystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer())) {
36+
ActionValue = InputSubSystem->GetPlayerInput() ? InputSubSystem->GetPlayerInput()->GetActionValue(Ability->AbilityInputAction) : FInputActionValue();
37+
}
38+
39+
if (ActionValue.GetMagnitude() == 0)
3440
{
41+
UE_LOG(LogGMCAbilitySystem, Error, TEXT("UGMCAbilityTask_WaitForInputKeyRelease::Activate: EndOnStart!"));
3542
// We'll want to immediately unbind the binding.
3643
InputComponent->RemoveActionBindingForHandle(Binding.GetHandle());
3744
InputBindingHandle = -1;

Source/GMCAbilitySystem/Private/Animation/GMCAbilityAnimInstance.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ UGMCAbilityAnimInstance::UGMCAbilityAnimInstance(const FObjectInitializer& Objec
1111
#endif
1212
}
1313

14+
UGMCAbilityAnimInstance::~UGMCAbilityAnimInstance()
15+
{
16+
TagPropertyMap.Reset();
17+
}
18+
1419
void UGMCAbilityAnimInstance::NativeInitializeAnimation()
1520
{
1621
Super::NativeInitializeAnimation();

0 commit comments

Comments
 (0)