Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
dfcb3e2
[WIP] WaterElemental
kimmjiinn Aug 22, 2025
fe1be83
[Feat] Water Elemental Skill Ini
kimmjiinn Aug 25, 2025
daade23
[Feat] uasset: Water Elemental
kimmjiinn Aug 25, 2025
4e7344d
[Update] Projectile Base
kimmjiinn Aug 25, 2025
e0f0b5e
[WIP] Niagara Projectile
kimmjiinn Aug 25, 2025
ae6ec62
[doc] Class Description
kimmjiinn Aug 25, 2025
acaeca2
[Feat] uasset: WaterElemental Identity Skill
kimmjiinn Aug 25, 2025
34477ef
[Remove] Debug Sphere
kimmjiinn Aug 25, 2025
7745aba
[Feat] Projectile: If Projectile Overlap, Set NoCollision
kimmjiinn Aug 25, 2025
6c70e3a
[Update] AIPerceptionInfo ToolTip
kimmjiinn Aug 26, 2025
40d7538
[WIP] StateAbility Array
kimmjiinn Aug 26, 2025
0f87b16
[Refactor] StateAbility
kimmjiinn Aug 27, 2025
f5bfa0c
[Feat] WaterElemental Normal Attack
kimmjiinn Aug 27, 2025
8c2132c
[Refactor] AI Damage Ability
kimmjiinn Aug 28, 2025
5038616
[Chore] uasset: Golem BT
kimmjiinn Aug 28, 2025
21db9da
[Chore] Names change, Add Debugline
kimmjiinn Aug 28, 2025
a039e5b
[Chore] uasset
kimmjiinn Aug 29, 2025
a5a3567
[Update] Attack Task: FinishLatentTask
kimmjiinn Aug 29, 2025
3172d9a
[Update] Memory Projectile
kimmjiinn Aug 29, 2025
30c0cac
[WIP] CheckAttackRange
kimmjiinn Aug 29, 2025
f10771b
[WIP] CheckAttackRange
kimmjiinn Sep 2, 2025
e6165e0
[Fix] BT: Attack, Service
kimmjiinn Sep 2, 2025
b6d24d3
[Remove] CheckAttackRange: Function
kimmjiinn Sep 2, 2025
39f6872
[Fix] MonsgerCharacter: HasAnyMatchingGameplyTags
kimmjiinn Sep 2, 2025
161504f
[Update] BTService: bCallTickOnSearchStart = true
kimmjiinn Sep 2, 2025
fba259a
[Update] TryGiveMemory const
kimmjiinn Sep 3, 2025
f234680
[Fix] BT: If the skill cooldown is finished, activate the skill attack.
kimmjiinn Sep 3, 2025
ea07793
[Chore] Elemental Sight Radius, Refactor BT, Correct a Typo, Remove D…
kimmjiinn Sep 7, 2025
db8fa73
[Update] DamagePerception: Report Damage
kimmjiinn Sep 7, 2025
71575bb
[Refactor] Change Class name
kimmjiinn Sep 14, 2025
294331d
[Fix] Item, DropSkill SpawnLocation
kimmjiinn Sep 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Config/DefaultEngine.ini
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ net.AllowPIESeamlessTravel=1
+ClassRedirects=(OldName="/Script/ProjectMJ.MJGA_BaseProjectile",NewName="/Script/ProjectMJ.MJGA_SpawnProjectile")
+ClassRedirects=(OldName="/Script/ProjectMJ.MJGA_ActionAbility",NewName="/Script/ProjectMJ.MJGA_AIActionInstantAbility")
+ClassRedirects=(OldName="/Script/ProjectMJ.MJGA_ActionInstantAbility",NewName="/Script/ProjectMJ.MJGA_AIActionInstantAbility")
+ClassRedirects=(OldName="/Script/ProjectMJ.MJCollisionProjectile",NewName="/Script/ProjectMJ.MJNiagaraProjectile")

[/Script/Engine.CollisionProfile]
-Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False)
Expand Down
1 change: 1 addition & 0 deletions Config/Tags/GameplayCue.ini
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ GameplayTagList=(Tag="GameplayCue.Skill.NormalMeleeAttack.Attack",DevComment="")
GameplayTagList=(Tag="GameplayCue.Skill.NormalMeleeAttack.Hit",DevComment="")
GameplayTagList=(Tag="GameplayCue.Skill.PoisonSlash.Hit",DevComment="")
GameplayTagList=(Tag="GameplayCue.Skill.PoisonSlash.Status",DevComment="")
GameplayTagList=(Tag="GameplayCue.Skill.WaterElementalIdentity",DevComment="")

4 changes: 4 additions & 0 deletions Config/Tags/Skill.ini
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ GameplayTagList=(Tag="Event.Character.Action.Normal.ForestCreature",DevComment="
GameplayTagList=(Tag="Event.Character.Action.Normal.IceGolem",DevComment="")
GameplayTagList=(Tag="Event.Character.Action.Normal.Spider",DevComment="")
GameplayTagList=(Tag="Event.Character.Action.Normal.Stone",DevComment="")
GameplayTagList=(Tag="Event.Character.Action.Normal.WaterElemental",DevComment="")
GameplayTagList=(Tag="Event.Character.Action.NormalMeleeAttack",DevComment="")
GameplayTagList=(Tag="Event.Character.Action.PoisonSlash",DevComment="")
GameplayTagList=(Tag="Event.Character.Action.StoneElementMeleeAttack",DevComment="")
GameplayTagList=(Tag="Event.Character.Action.WaterElementalIdentity",DevComment="")
GameplayTagList=(Tag="Event.Character.Appear",DevComment="")
GameplayTagList=(Tag="Event.Character.Dead",DevComment="")
GameplayTagList=(Tag="Event.Character.Hurt",DevComment="")
Expand All @@ -40,6 +42,7 @@ GameplayTagList=(Tag="Skill.Instant.IceGolemIdentity",DevComment="")
GameplayTagList=(Tag="Skill.Instant.MysticShot",DevComment="")
GameplayTagList=(Tag="Skill.Instant.PoisonSlash",DevComment="")
GameplayTagList=(Tag="Skill.Instant.StoneElementalMeleeAttack",DevComment="")
GameplayTagList=(Tag="Skill.Instant.WaterElementalIdentity",DevComment="")
GameplayTagList=(Tag="Skill.Normal.Cooldown",DevComment="")
GameplayTagList=(Tag="Skill.Normal.EarthGolem",DevComment="")
GameplayTagList=(Tag="Skill.Normal.Fire",DevComment="")
Expand All @@ -49,6 +52,7 @@ GameplayTagList=(Tag="Skill.Normal.IceGolem",DevComment="")
GameplayTagList=(Tag="Skill.Normal.MeleeAttack",DevComment="")
GameplayTagList=(Tag="Skill.Normal.Spider",DevComment="")
GameplayTagList=(Tag="Skill.Normal.Stone",DevComment="")
GameplayTagList=(Tag="Skill.Normal.WaterElemental",DevComment="")
GameplayTagList=(Tag="Skill.Passive",DevComment="")
GameplayTagList=(Tag="Skill.Passive.DamageUp",DevComment="")
GameplayTagList=(Tag="Skill.Passive.Test",DevComment="")
Expand Down
Binary file modified Content/AI/Elemental/AM_ElementalDead.uasset
Binary file not shown.
Binary file modified Content/AI/Elemental/AM_ElementalInActivated.uasset
Binary file not shown.
Binary file modified Content/AI/Elemental/Anim_ElementalInActivated.uasset
Binary file not shown.
Binary file not shown.
Binary file modified Content/AI/Elemental/GA_ElementalStateAbility.uasset
Binary file not shown.
Binary file modified Content/AI/Elemental/MJGA_ActionDamageElemental.uasset
Binary file not shown.
Binary file modified Content/AI/Elemental/MJGA_ActionDeadElemental.uasset
Binary file not shown.
Binary file modified Content/AI/Elemental/NS_ElementalInActivated.uasset
Binary file not shown.
Binary file added Content/AI/Elemental/NS_ElementalStep.uasset
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified Content/AI/ForestCreture/BPGA_ActionDamage_Forest.uasset
Binary file not shown.
Binary file modified Content/AI/ForestCreture/DT_ForestCreatureStateAbility.uasset
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified Content/AI/Golem/GA_GolemStateAbility.uasset
Binary file not shown.
Binary file modified Content/AI/Golem/MJGA_ActionDamageGolem.uasset
Binary file not shown.
Binary file modified Content/AI/SpiderMinion/BPGA_ActionDamage_SpiderMinion.uasset
Binary file not shown.
Binary file modified Content/AI/SpiderMinion/DT_SpiderMinionStateAbility.uasset
Binary file not shown.
Binary file modified Content/AI/StoneElemental/GA_StoneStateAbility.uasset
Binary file not shown.
Binary file modified Content/AI/StoneElemental/MJGA_ActionDamageStone.uasset
Binary file not shown.
Binary file modified Content/DataTable/Enemy/DT_EnemyDataTable.uasset
Binary file not shown.
Binary file modified Content/DataTable/Skill/DT_EnemySkillDataTable.uasset
Binary file not shown.
Binary file modified Content/MJ/AIC/BPAIC_Elemental.uasset
Binary file not shown.
Binary file added Content/MJ/BT/BT_MJElemental.uasset
Binary file not shown.
Binary file modified Content/MJ/BT/BT_MJGolem.uasset
Binary file not shown.
Binary file modified Content/MJ/DropSkill/NS_GiveSkillHit.uasset
Binary file not shown.
Binary file modified Content/MJ/DropSkill/NS_GiveSkillProjectile.uasset
Binary file not shown.
Binary file modified Content/Maps/MJ_AITest.umap
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,19 @@ void UMJGA_AIActionAppearAbility::ActivateAbility(const FGameplayAbilitySpecHand

AMJCharacter->GetCharacterMovement()->SetMovementMode(MOVE_None);

// IsInactivated 태그 제거 - 활성화
// Minjin: IsInactivated 태그 제거 - 활성화
const FGameplayTag InActivatedTag = FGameplayTag::RequestGameplayTag(TEXT("Character.State.IsInactivated"));
AMJCharacter->ASC->RemoveLooseGameplayTag(InActivatedTag);

UAbilityTask_PlayMontageAndWait* PlayDeathMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, TEXT("PlayAppear"), AppearanceActionAnimMontage, 1.0f);
UAbilityTask_PlayMontageAndWait* PlayAppearMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy
(this, TEXT("PlayAppear"), AppearanceActionAnimMontage, 1.0f);

PlayDeathMontage->OnCompleted.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnCompleteCallback);
PlayDeathMontage->OnInterrupted.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnInterruptedCallback);
PlayDeathMontage->OnCancelled.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnInterruptedCallback);
PlayDeathMontage->OnBlendOut.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnBlendOutCallback);
PlayAppearMontage->OnCompleted.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnCompleteCallback);
PlayAppearMontage->OnInterrupted.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnInterruptedCallback);
PlayAppearMontage->OnCancelled.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnInterruptedCallback);
PlayAppearMontage->OnBlendOut.AddDynamic(this, &UMJGA_AIActionAppearAbility::OnBlendOutCallback);

PlayDeathMontage->ReadyForActivation();
PlayAppearMontage->ReadyForActivation();
}

void UMJGA_AIActionAppearAbility::CancelAbility(const FGameplayAbilitySpecHandle Handle,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// ThenOneDayStudio


#include "AbilitySystem/Abilities/MJGA_AIActionDamageAbility.h"

#include "Abilities/Tasks/AbilityTask_PlayMontageAndWait.h"
#include "Character/MJCharacterBase.h"
#include "GameFramework/CharacterMovementComponent.h"

UMJGA_AIActionDamageAbility::UMJGA_AIActionDamageAbility()
{
}

void UMJGA_AIActionDamageAbility::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);

if (HurtActionAnimMontage == nullptr)
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
return;
}

AMJCharacterBase* AMJCharacter = Cast<AMJCharacterBase>(ActorInfo->AvatarActor.Get());
if (!AMJCharacter)
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
return;
}

AMJCharacter->GetCharacterMovement()->SetMovementMode(MOVE_None);

UAbilityTask_PlayMontageAndWait* PlayHurtMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, TEXT("PlayHurt"), HurtActionAnimMontage, 1.0f);

PlayHurtMontage->OnCompleted.AddDynamic(this, &UMJGA_AIActionDamageAbility::OnCompleteCallback);
PlayHurtMontage->OnInterrupted.AddDynamic(this, &UMJGA_AIActionDamageAbility::OnInterruptedCallback);
PlayHurtMontage->OnCancelled.AddDynamic(this, &UMJGA_AIActionDamageAbility::OnInterruptedCallback);

PlayHurtMontage->ReadyForActivation();
}

void UMJGA_AIActionDamageAbility::CancelAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateCancelAbility)
{
Super::CancelAbility(Handle, ActorInfo, ActivationInfo, bReplicateCancelAbility);
}

void UMJGA_AIActionDamageAbility::EndAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateEndAbility, bool bWasCancelled)
{
AMJCharacterBase* AMJCharacter = Cast<AMJCharacterBase>(ActorInfo->AvatarActor.Get());
if (!AMJCharacter)
{
return;
}

// Minjin: Nav_Walking 이란 것이 있음
AMJCharacter->GetCharacterMovement()->SetMovementMode(MOVE_Walking);

Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
}

void UMJGA_AIActionDamageAbility::OnCompleteCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = false;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}

void UMJGA_AIActionDamageAbility::OnInterruptedCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = true;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}

void UMJGA_AIActionDamageAbility::OnBlendOutCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = true;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// ThenOneDayStudio

#pragma once

#include "CoreMinimal.h"
#include "AbilitySystem/Abilities/MJGA_ActionDamageAbility.h"
#include "MJGA_AIActionDamageAbility.generated.h"

/**
* Class Description: 적 데미지 입음
* Author: Kim Minjin
* Created Date: 2025.08.28.
* Description of Change:
* Modified By:
* Modified Date:
*/
UCLASS()
class PROJECTMJ_API UMJGA_AIActionDamageAbility : public UMJGA_ActionDamageAbility
{
GENERATED_BODY()

public:
UMJGA_AIActionDamageAbility();

virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
virtual void CancelAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateCancelAbility) override;
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override;

protected:

UFUNCTION()
void OnCompleteCallback();

UFUNCTION()
void OnInterruptedCallback();

UFUNCTION()
void OnBlendOutCallback();
};
Original file line number Diff line number Diff line change
Expand Up @@ -25,65 +25,11 @@ void UMJGA_ActionDamageAbility::ActivateAbility(const FGameplayAbilitySpecHandle
constexpr bool bWasCancelled = true;
EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
}
/////

if (HurtActionAnimMontage == nullptr)
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
return;
}

AMJCharacterBase* AMJCharacter = Cast<AMJCharacterBase>(ActorInfo->AvatarActor.Get());
if (!AMJCharacter)
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
return;
}

AMJCharacter->GetCharacterMovement()->SetMovementMode(MOVE_None);

UAbilityTask_PlayMontageAndWait* PlayHurtMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, TEXT("PlayHurt"), HurtActionAnimMontage, 1.0f);

PlayHurtMontage->OnCompleted.AddDynamic(this, &UMJGA_ActionDamageAbility::OnCompleteCallback);
PlayHurtMontage->OnInterrupted.AddDynamic(this, &UMJGA_ActionDamageAbility::OnInterruptedCallback);
PlayHurtMontage->OnCancelled.AddDynamic(this, &UMJGA_ActionDamageAbility::OnInterruptedCallback);

PlayHurtMontage->ReadyForActivation();
}

void UMJGA_ActionDamageAbility::CancelAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateCancelAbility)
{
Super::CancelAbility(Handle, ActorInfo, ActivationInfo, bReplicateCancelAbility);
}

void UMJGA_ActionDamageAbility::EndAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateEndAbility, bool bWasCancelled)
{
Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);

AMJCharacterBase* AMJCharacter = Cast<AMJCharacterBase>(ActorInfo->AvatarActor.Get());
if (!AMJCharacter)
{
return;
}

// Minjin: Nav_Walking 이란 것이 있음
AMJCharacter->GetCharacterMovement()->SetMovementMode(MOVE_Walking);
}

void UMJGA_ActionDamageAbility::OnCompleteCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = false;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}

void UMJGA_ActionDamageAbility::OnInterruptedCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = true;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
* Class Description: 데미지를 입었을 때. 몽타주 재생동안 IsHurt 태그 부여
* Author: Kim Minjin
* Created Date: 2025.08.08.
* Description of Change:
* Modified By:
* Modified Date:
* Description of Change: 플레이어와 적 구분
* Modified By: Kim Minjin
* Modified Date: 2025.08.28.
*/
UCLASS()
class PROJECTMJ_API UMJGA_ActionDamageAbility : public UMJGA_GameplayAbility
Expand All @@ -23,16 +23,9 @@ class PROJECTMJ_API UMJGA_ActionDamageAbility : public UMJGA_GameplayAbility
UMJGA_ActionDamageAbility();

virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
virtual void CancelAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateCancelAbility) override;
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override;

protected:
UFUNCTION()
void OnCompleteCallback();

UFUNCTION()
void OnInterruptedCallback();

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation")
TObjectPtr<UAnimMontage> HurtActionAnimMontage;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// ThenOneDayStudio


#include "AbilitySystem/Abilities/MJGA_PlayerActionDamageAbility.h"

#include "Abilities/Tasks/AbilityTask_PlayMontageAndWait.h"
#include "Character/MJCharacterBase.h"
#include "GameFramework/CharacterMovementComponent.h"

UMJGA_PlayerActionDamageAbility::UMJGA_PlayerActionDamageAbility()
{
}

void UMJGA_PlayerActionDamageAbility::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);

if (HurtActionAnimMontage == nullptr)
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
return;
}

AMJCharacterBase* AMJCharacter = Cast<AMJCharacterBase>(ActorInfo->AvatarActor.Get());
if (!AMJCharacter)
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
return;
}

UAbilityTask_PlayMontageAndWait* PlayHurtMontage = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, TEXT("PlayHurt"), HurtActionAnimMontage, 1.0f);

PlayHurtMontage->OnCompleted.AddDynamic(this, &UMJGA_PlayerActionDamageAbility::OnCompleteCallback);
PlayHurtMontage->OnInterrupted.AddDynamic(this, &UMJGA_PlayerActionDamageAbility::OnInterruptedCallback);
PlayHurtMontage->OnCancelled.AddDynamic(this, &UMJGA_PlayerActionDamageAbility::OnInterruptedCallback);

PlayHurtMontage->ReadyForActivation();
}

void UMJGA_PlayerActionDamageAbility::CancelAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateCancelAbility)
{
Super::CancelAbility(Handle, ActorInfo, ActivationInfo, bReplicateCancelAbility);
}

void UMJGA_PlayerActionDamageAbility::EndAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateEndAbility, bool bWasCancelled)
{
Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
}

void UMJGA_PlayerActionDamageAbility::OnCompleteCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = false;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}

void UMJGA_PlayerActionDamageAbility::OnInterruptedCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = true;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}

void UMJGA_PlayerActionDamageAbility::OnBlendOutCallback()
{
bool bReplicatedEndAbility = true;
bool bWasCancelled = true;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}
Loading