Initial commit
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "AbilitySystem/AuraAbilitySystemComponent.h"
|
||||
|
||||
void UAuraAbilitySystemComponent::AbilityActorInfoSet()
|
||||
{
|
||||
OnGameplayEffectAppliedDelegateToSelf.AddUObject( this, &UAuraAbilitySystemComponent::EffectApplied);
|
||||
}
|
||||
|
||||
void UAuraAbilitySystemComponent::EffectApplied(UAbilitySystemComponent* AbilitySystemComponent,
|
||||
const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle)
|
||||
{
|
||||
//GEngine->AddOnScreenDebugMessage(1,8.f, FColor::Blue,FString("Effect Applied!"));
|
||||
|
||||
FGameplayTagContainer TagContainer;
|
||||
EffectSpec.GetAllAssetTags(TagContainer);
|
||||
|
||||
EffectAssetTags.Broadcast(TagContainer);
|
||||
|
||||
for (const FGameplayTag& Tag : TagContainer)
|
||||
{
|
||||
//TODO: Broadcast the tag to the widget controller
|
||||
//Message for Debugging tags being applied
|
||||
//const FString msg = FString::Printf(TEXT("GE Tag: %s"), *Tag.ToString());
|
||||
//GEngine->AddOnScreenDebugMessage(-1,8.f, FColor::Blue,msg);
|
||||
}
|
||||
}
|
||||
206
Source/Aura/Private/AbilitySystem/AuraAttributeSet.cpp
Normal file
206
Source/Aura/Private/AbilitySystem/AuraAttributeSet.cpp
Normal file
@@ -0,0 +1,206 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "AbilitySystem/AuraAttributeSet.h"
|
||||
|
||||
#include "AbilitySystemBlueprintLibrary.h"
|
||||
#include "AudioMixerBlueprintLibrary.h"
|
||||
#include "GameplayEffectExtension.h"
|
||||
#include "GameFramework/Character.h"
|
||||
#include "GeometryCollection/GeometryCollectionParticlesData.h"
|
||||
#include "Net/UnrealNetwork.h"
|
||||
|
||||
UAuraAttributeSet::UAuraAttributeSet()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
|
||||
{
|
||||
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
|
||||
//Replicate Lifetime of each attribute
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Health, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxHealth, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Mana, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxMana, COND_None, REPNOTIFY_Always);
|
||||
|
||||
/*Primary Stats
|
||||
*Strength, Intelligence, Resilience, Vigor
|
||||
*/
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Strength, COND_None, REPNOTIFY_Always); //Effects Physical Damage
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Intelligence, COND_None, REPNOTIFY_Always); //Effects Max Mana, Mana Regen, Magical Damage
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Resilience, COND_None, REPNOTIFY_Always); //Increases Armor
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Vigor, COND_None, REPNOTIFY_Always); //Increases Max Health, Armor, Health Regenerated
|
||||
|
||||
/*Secondary Stats
|
||||
*Armor, Armor Penetration, Block Chance, Critical Hit Chance, Critical Hit Damage, Critical Hit Resistance, Health Regeneration, Mana Regeneration
|
||||
*/
|
||||
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Armor, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, ArmorPenetration, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, BlockChance, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, CriticalHitChance, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, CriticalHitDamage, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, CriticalHitResistance, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, HealthRegeneration, COND_None, REPNOTIFY_Always);
|
||||
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, ManaRegeneration, COND_None, REPNOTIFY_Always);
|
||||
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
|
||||
{
|
||||
Super::PreAttributeChange(Attribute, NewValue);
|
||||
|
||||
if (Attribute == GetHealthAttribute())
|
||||
{
|
||||
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxHealth());
|
||||
}
|
||||
if (Attribute == GetManaAttribute())
|
||||
{
|
||||
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxMana());
|
||||
}
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::SetEffectProperties(const FGameplayEffectModCallbackData& Data, FEffectProperties& Props) const
|
||||
{
|
||||
if (Data.EvaluatedData.Attribute == GetHealthAttribute())
|
||||
{
|
||||
// Source = Causer of the effect, Target = target of the effect (Owner of this Attribute Set)
|
||||
Props.EffectContextHandle = Data.EffectSpec.GetContext();
|
||||
Props.SourceASC = Props.EffectContextHandle.GetOriginalInstigatorAbilitySystemComponent();
|
||||
|
||||
if (IsValid(Props.SourceASC) && Props.SourceASC->AbilityActorInfo.IsValid() && Props.SourceASC->AbilityActorInfo.IsValid())
|
||||
{
|
||||
Props.SourceAvatarActor = Props.SourceASC->AbilityActorInfo->AvatarActor.Get();
|
||||
Props.SourceController = Props.SourceASC->AbilityActorInfo->PlayerController.Get();
|
||||
if (Props.SourceController == nullptr && Props.SourceAvatarActor != nullptr)
|
||||
{
|
||||
if (APawn* Pawn = Cast<APawn>(Props.SourceAvatarActor))
|
||||
{
|
||||
Props.SourceController = Pawn->GetController();
|
||||
}
|
||||
}
|
||||
if (Props.SourceController)
|
||||
{
|
||||
Props.SourceCharacter = Cast<ACharacter>(Props.SourceController->GetPawn());
|
||||
}
|
||||
}
|
||||
}
|
||||
//Get all the target actor
|
||||
if (Data.Target.AbilityActorInfo.IsValid() && Data.Target.AbilityActorInfo->AvatarActor.IsValid())
|
||||
{
|
||||
Props.TargetAvatarActor = Data.Target.AbilityActorInfo->AvatarActor.Get();
|
||||
Props.TargetController = Data.Target.AbilityActorInfo->PlayerController.Get();
|
||||
Props.TargetCharacter = Cast<ACharacter>(Props.TargetAvatarActor);
|
||||
Props.TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(Props.TargetAvatarActor);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data)
|
||||
{
|
||||
Super::PostGameplayEffectExecute(Data);
|
||||
|
||||
FEffectProperties Props;
|
||||
SetEffectProperties(Data, Props);
|
||||
|
||||
if (Data.EvaluatedData.Attribute == GetHealthAttribute())
|
||||
{
|
||||
//if the value being modified is Health
|
||||
SetHealth(FMath::Clamp(GetHealth(), 0.f, GetMaxHealth()));
|
||||
|
||||
}
|
||||
if (Data.EvaluatedData.Attribute == GetManaAttribute())
|
||||
{
|
||||
//If the value being modified is Mana
|
||||
SetMana(FMath::Clamp(GetMana(), 0.f, GetMaxMana()));
|
||||
}
|
||||
}
|
||||
|
||||
/*On_Rep for each stat
|
||||
*Vital Stats
|
||||
*Health, MaxHealth, Mana, MaxMana*/
|
||||
void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Health,OldHealth);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,MaxHealth,OldMaxHealth);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_Mana(const FGameplayAttributeData& OldMana) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Mana,OldMana);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,MaxMana,OldMaxMana);
|
||||
}
|
||||
|
||||
/*Primary Stats
|
||||
*Strength, Intelligence, Resilience, Vigor*/
|
||||
void UAuraAttributeSet::OnRep_Strength(const FGameplayAttributeData& OldStrength) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Strength,OldStrength);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_Intelligence(const FGameplayAttributeData& OldIntelligence) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Intelligence,OldIntelligence);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_Resilience(const FGameplayAttributeData& OldResilience) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Resilience,OldResilience);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_Vigor(const FGameplayAttributeData& OldVigor) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Vigor,OldVigor);
|
||||
}
|
||||
|
||||
/*Secondary Stats
|
||||
*Armor, Armor Penetration, Block Chance, Critical Hit Chance, Critical Hit Damage, Critical Hit Resistance, Health Regeneration, Mana Regeneration
|
||||
*/
|
||||
void UAuraAttributeSet::OnRep_Armor(const FGameplayAttributeData& OldArmor) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,Armor,OldArmor);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_ArmorPenetration(const FGameplayAttributeData& OldArmorPenetration) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,ArmorPenetration,OldArmorPenetration);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_BlockChance(const FGameplayAttributeData& OldBlockChance) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,BlockChance,OldBlockChance);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_CriticalHitChance(const FGameplayAttributeData& OldCriticalHitChance) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,CriticalHitChance,OldCriticalHitChance);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_CriticalHitDamage(const FGameplayAttributeData& OldCriticalHitDamage) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,CriticalHitDamage,OldCriticalHitDamage);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_CriticalHitResistance(const FGameplayAttributeData& OldCriticalHitResistance) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,CriticalHitResistance,OldCriticalHitResistance);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_HealthRegeneration(const FGameplayAttributeData& OldHealthRegeneration) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,HealthRegeneration,OldHealthRegeneration);
|
||||
}
|
||||
|
||||
void UAuraAttributeSet::OnRep_ManaRegeneration(const FGameplayAttributeData& OldManaRegeneration) const
|
||||
{
|
||||
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet,ManaRegeneration,OldManaRegeneration);
|
||||
}
|
||||
88
Source/Aura/Private/Actor/AuraEffectActor.cpp
Normal file
88
Source/Aura/Private/Actor/AuraEffectActor.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Actor/AuraEffectActor.h"
|
||||
|
||||
#include "AbilitySystemBlueprintLibrary.h"
|
||||
#include "AbilitySystemComponent.h"
|
||||
|
||||
AAuraEffectActor::AAuraEffectActor()
|
||||
{
|
||||
PrimaryActorTick.bCanEverTick = false;
|
||||
|
||||
SetRootComponent(CreateDefaultSubobject<USceneComponent>("SceneRoot"));
|
||||
}
|
||||
|
||||
void AAuraEffectActor::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
}
|
||||
|
||||
void AAuraEffectActor::OnOverlap(AActor* TargetActor)
|
||||
{
|
||||
if (InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
|
||||
{
|
||||
ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);
|
||||
}
|
||||
if (DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
|
||||
{
|
||||
ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);
|
||||
}
|
||||
if (InfiniteEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
|
||||
{
|
||||
ApplyEffectToTarget(TargetActor, InfiniteGameplayEffectClass);
|
||||
}
|
||||
}
|
||||
|
||||
void AAuraEffectActor::OnEndOverlap(AActor* TargetActor)
|
||||
{
|
||||
if (InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap)
|
||||
{
|
||||
ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);
|
||||
}
|
||||
if (DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap)
|
||||
{
|
||||
ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);
|
||||
}
|
||||
if (InfiniteEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap)
|
||||
{
|
||||
ApplyEffectToTarget(TargetActor, InfiniteGameplayEffectClass);
|
||||
}
|
||||
if (InfiniteEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap)
|
||||
{
|
||||
UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);
|
||||
if (!IsValid(TargetASC)) return;
|
||||
|
||||
TArray<FActiveGameplayEffectHandle> HandlesToRemove;
|
||||
for (auto HandlePair : ActiveEffectHandles)
|
||||
{
|
||||
if (TargetASC == HandlePair.Value)
|
||||
{
|
||||
TargetASC->RemoveActiveGameplayEffect(HandlePair.Key, 1);
|
||||
HandlesToRemove.Add(HandlePair.Key);
|
||||
}
|
||||
}
|
||||
for (FActiveGameplayEffectHandle& Handle : HandlesToRemove)
|
||||
{
|
||||
ActiveEffectHandles.FindAndRemoveChecked(Handle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AAuraEffectActor::ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass)
|
||||
{
|
||||
UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);
|
||||
if (TargetASC == nullptr) return;
|
||||
|
||||
check(GameplayEffectClass);
|
||||
FGameplayEffectContextHandle EffectGameplayContextHandle = TargetASC->MakeEffectContext();
|
||||
EffectGameplayContextHandle.AddSourceObject(this);
|
||||
FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, ActorLevel, EffectGameplayContextHandle);
|
||||
FActiveGameplayEffectHandle ActiveEffectHandle = TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());
|
||||
|
||||
const bool bIsInfinite = EffectSpecHandle.Data.Get()->Def.Get()->DurationPolicy == EGameplayEffectDurationType::Infinite;
|
||||
if (bIsInfinite && InfiniteEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap)
|
||||
{
|
||||
ActiveEffectHandles.Add(ActiveEffectHandle, TargetASC);
|
||||
}
|
||||
}
|
||||
70
Source/Aura/Private/Character/AuraCharacter.cpp
Normal file
70
Source/Aura/Private/Character/AuraCharacter.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Character/AuraCharacter.h"
|
||||
|
||||
#include "AbilitySystem/AuraAbilitySystemComponent.h"
|
||||
#include "GameFramework/CharacterMovementComponent.h"
|
||||
#include "Player/AuraPlayerController.h"
|
||||
#include "Player/AuraPlayerState.h"
|
||||
#include "UI/HUD/AuraHUD.h"
|
||||
|
||||
AAuraCharacter::AAuraCharacter()
|
||||
{
|
||||
GetCharacterMovement()->bOrientRotationToMovement = true;
|
||||
GetCharacterMovement()->RotationRate = FRotator(0.f, 400.f, 0.f);
|
||||
GetCharacterMovement()->bConstrainToPlane = true;
|
||||
GetCharacterMovement()->bSnapToPlaneAtStart = true;
|
||||
|
||||
//Don't use controller rotation
|
||||
bUseControllerRotationPitch = false;
|
||||
bUseControllerRotationYaw = false;
|
||||
bUseControllerRotationRoll = false;
|
||||
}
|
||||
|
||||
void AAuraCharacter::PossessedBy(AController* NewController)
|
||||
{
|
||||
Super::PossessedBy(NewController);
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraCharacter.cpp - PossessedBy"));
|
||||
InitAbilityActorInfo(); //Init Ability Actor Info for the Server
|
||||
}
|
||||
|
||||
void AAuraCharacter::OnRep_PlayerState()
|
||||
{
|
||||
Super::OnRep_PlayerState();
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraCharacter.cpp - OnRep_PlayerState"));
|
||||
InitAbilityActorInfo(); //Init Ability Actor Info for the Client
|
||||
}
|
||||
|
||||
int32 AAuraCharacter::GetPlayerLevel()
|
||||
{
|
||||
const AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
|
||||
check(AuraPlayerState)
|
||||
{
|
||||
return AuraPlayerState->GetPlayerLevel();
|
||||
}
|
||||
}
|
||||
|
||||
void AAuraCharacter::InitAbilityActorInfo() //Function to Init Ability Actor Info for the server
|
||||
{
|
||||
AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
|
||||
check(AuraPlayerState);
|
||||
AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState,this);
|
||||
Cast<UAuraAbilitySystemComponent>(AuraPlayerState->GetAbilitySystemComponent())->AbilityActorInfoSet();
|
||||
AbilitySystemComponent = AuraPlayerState->GetAbilitySystemComponent();
|
||||
AttributeSet = AuraPlayerState->GetAttributeSet();
|
||||
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraCharacter.cpp - InitAbilityActorInfo - AttributeSet"));
|
||||
if (AAuraPlayerController* AuraPlayerController = Cast<AAuraPlayerController>(GetController()))
|
||||
{
|
||||
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraCharacter.cpp - InitAbilityActorInfo - Cast "));
|
||||
if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(AuraPlayerController->GetHUD()))
|
||||
{
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraCharacter.cpp - InitAbilityActorInfo - InitOverlay"));
|
||||
AuraHUD->InitOverlay(AuraPlayerController, AuraPlayerState, AbilitySystemComponent, AttributeSet);
|
||||
}
|
||||
}
|
||||
InitializeDefaultAttributes();
|
||||
|
||||
}
|
||||
48
Source/Aura/Private/Character/AuraCharacterBase.cpp
Normal file
48
Source/Aura/Private/Character/AuraCharacterBase.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Character/AuraCharacterBase.h"
|
||||
#include "AbilitySystemComponent.h"
|
||||
|
||||
AAuraCharacterBase::AAuraCharacterBase()
|
||||
{
|
||||
PrimaryActorTick.bCanEverTick = false;
|
||||
|
||||
Weapon = CreateDefaultSubobject<USkeletalMeshComponent>("Weapon");
|
||||
Weapon->SetupAttachment(GetMesh(), FName("WeaponHandSocket"));
|
||||
Weapon->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||
}
|
||||
|
||||
UAbilitySystemComponent* AAuraCharacterBase::GetAbilitySystemComponent() const
|
||||
{
|
||||
return AbilitySystemComponent;
|
||||
}
|
||||
|
||||
void AAuraCharacterBase::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
}
|
||||
|
||||
void AAuraCharacterBase::InitAbilityActorInfo()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void AAuraCharacterBase::ApplyEffectToSelf(TSubclassOf<UGameplayEffect> GameplayEffectClass, float Level) const
|
||||
{
|
||||
check(IsValid(GetAbilitySystemComponent()));
|
||||
check(GameplayEffectClass);
|
||||
const FGameplayEffectContextHandle ContextHandle = GetAbilitySystemComponent()->MakeEffectContext();
|
||||
const FGameplayEffectSpecHandle SpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(GameplayEffectClass,Level, ContextHandle);
|
||||
GetAbilitySystemComponent()->ApplyGameplayEffectSpecToTarget(*SpecHandle.Data.Get(), GetAbilitySystemComponent());
|
||||
|
||||
}
|
||||
|
||||
void AAuraCharacterBase::InitializeDefaultAttributes() const
|
||||
{
|
||||
ApplyEffectToSelf(DefaultPrimaryAttributes,1.f);
|
||||
ApplyEffectToSelf(DefaultSecondaryAttributes, 1.f);
|
||||
}
|
||||
|
||||
|
||||
50
Source/Aura/Private/Character/AuraEnemy.cpp
Normal file
50
Source/Aura/Private/Character/AuraEnemy.cpp
Normal file
@@ -0,0 +1,50 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Character/AuraEnemy.h"
|
||||
|
||||
#include "AbilitySystem/AuraAbilitySystemComponent.h"
|
||||
#include "AbilitySystem/AuraAttributeSet.h"
|
||||
#include "Aura/Aura.h"
|
||||
|
||||
AAuraEnemy::AAuraEnemy()
|
||||
{
|
||||
GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
|
||||
|
||||
AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
|
||||
AbilitySystemComponent->SetIsReplicated(true);
|
||||
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Minimal);
|
||||
|
||||
AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");
|
||||
}
|
||||
|
||||
void AAuraEnemy::HighlightActor()
|
||||
{
|
||||
GetMesh()->SetRenderCustomDepth(true);
|
||||
GetMesh()->SetCustomDepthStencilValue(250.f);
|
||||
Weapon->SetRenderCustomDepth(true);
|
||||
Weapon->SetCustomDepthStencilValue(250.f);
|
||||
}
|
||||
|
||||
void AAuraEnemy::UnHighlightActor()
|
||||
{
|
||||
GetMesh()->SetRenderCustomDepth(false);
|
||||
Weapon->SetRenderCustomDepth(false);
|
||||
}
|
||||
|
||||
int32 AAuraEnemy::GetPlayerLevel()
|
||||
{
|
||||
return Level;
|
||||
}
|
||||
|
||||
void AAuraEnemy::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
InitAbilityActorInfo();
|
||||
}
|
||||
|
||||
void AAuraEnemy::InitAbilityActorInfo()
|
||||
{
|
||||
AbilitySystemComponent->InitAbilityActorInfo(this,this);
|
||||
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->AbilityActorInfoSet();
|
||||
}
|
||||
5
Source/Aura/Private/Game/AuraGameMode.cpp
Normal file
5
Source/Aura/Private/Game/AuraGameMode.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Game/AuraGameMode.h"
|
||||
|
||||
13
Source/Aura/Private/Interact/CombatInterface.cpp
Normal file
13
Source/Aura/Private/Interact/CombatInterface.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Interact/CombatInterface.h"
|
||||
|
||||
#include "GeometryCollection/GeometryCollectionComponent.h"
|
||||
|
||||
// Add default functionality here for any ICombatInterface functions that are not pure virtual.
|
||||
|
||||
int32 ICombatInterface::GetPlayerLevel()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
6
Source/Aura/Private/Interact/EnemyInterface.cpp
Normal file
6
Source/Aura/Private/Interact/EnemyInterface.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Interact/EnemyInterface.h"
|
||||
|
||||
// Add default functionality here for any IEnemyInterface functions that are not pure virtual.
|
||||
118
Source/Aura/Private/Player/AuraPlayerController.cpp
Normal file
118
Source/Aura/Private/Player/AuraPlayerController.cpp
Normal file
@@ -0,0 +1,118 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Player/AuraPlayerController.h"
|
||||
#include "EnhancedInputSubsystems.h"
|
||||
#include "EnhancedInputComponent.h"
|
||||
#include "Interact/EnemyInterface.h"
|
||||
|
||||
AAuraPlayerController::AAuraPlayerController()
|
||||
{
|
||||
bReplicates = true;
|
||||
}
|
||||
|
||||
void AAuraPlayerController::PlayerTick(float DeltaTime)
|
||||
{
|
||||
Super::PlayerTick(DeltaTime);
|
||||
|
||||
CursorTrace();
|
||||
}
|
||||
|
||||
void AAuraPlayerController::CursorTrace()
|
||||
{
|
||||
FHitResult CursorHit;
|
||||
GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
|
||||
if (!CursorHit.bBlockingHit) return;
|
||||
|
||||
LastActor = ThisActor;
|
||||
ThisActor = CursorHit.GetActor();
|
||||
|
||||
/**
|
||||
*Line trace from curso. There are several scenarios
|
||||
* A. LastActor is null && ThisActor is null
|
||||
* - Do nothing
|
||||
* B. LastActor is null && ThisActor is valid
|
||||
* - Highlight ThisActor
|
||||
* C. LastActor is valid && ThisActor is null
|
||||
* - UnHighlight LastActor
|
||||
* D. LastAcrot is valid && ThisActor is valid but not equal
|
||||
* - UnHighligh LastActor
|
||||
* - Highlight ThisActor
|
||||
* E. LastActor is same as ThisActor
|
||||
* - Do Nothing
|
||||
*/
|
||||
|
||||
if (LastActor == nullptr)
|
||||
{
|
||||
if (ThisActor != nullptr)
|
||||
{
|
||||
//Case B
|
||||
ThisActor->HighlightActor();
|
||||
//UE_LOG(LogTemp, Warning, TEXT("Case B"));
|
||||
}
|
||||
}
|
||||
else //LastActor is Valid
|
||||
{
|
||||
if (ThisActor == nullptr)
|
||||
{
|
||||
LastActor->UnHighlightActor();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LastActor != ThisActor) // Case D
|
||||
{
|
||||
LastActor->UnHighlightActor();
|
||||
ThisActor->HighlightActor();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void AAuraPlayerController::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
check(AuraContext);
|
||||
|
||||
UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());
|
||||
if (Subsystem)
|
||||
{
|
||||
Subsystem->AddMappingContext(AuraContext,0);
|
||||
}
|
||||
|
||||
bShowMouseCursor = true;
|
||||
DefaultMouseCursor = EMouseCursor::Default;
|
||||
|
||||
FInputModeGameAndUI InputModeData;
|
||||
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
|
||||
InputModeData.SetHideCursorDuringCapture(false);
|
||||
SetInputMode(InputModeData);
|
||||
|
||||
}
|
||||
|
||||
void AAuraPlayerController::SetupInputComponent()
|
||||
{
|
||||
Super::SetupInputComponent();
|
||||
|
||||
UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent);
|
||||
|
||||
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
|
||||
|
||||
}
|
||||
|
||||
void AAuraPlayerController::Move(const FInputActionValue& InputActionValue)
|
||||
{
|
||||
const FVector2D InputAxisVector = InputActionValue.Get<FVector2D>();
|
||||
const FRotator Rotation = GetControlRotation();
|
||||
const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);
|
||||
|
||||
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
|
||||
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
|
||||
|
||||
if (APawn* ControlledPawn = GetPawn<APawn>())
|
||||
{
|
||||
ControlledPawn->AddMovementInput(ForwardDirection, InputAxisVector.Y);
|
||||
ControlledPawn->AddMovementInput(RightDirection, InputAxisVector.X);
|
||||
}
|
||||
}
|
||||
35
Source/Aura/Private/Player/AuraPlayerState.cpp
Normal file
35
Source/Aura/Private/Player/AuraPlayerState.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "Player/AuraPlayerState.h"
|
||||
|
||||
#include "AbilitySystem/AuraAbilitySystemComponent.h"
|
||||
#include "AbilitySystem/AuraAttributeSet.h"
|
||||
#include "Net/UnrealNetwork.h"
|
||||
|
||||
AAuraPlayerState::AAuraPlayerState()
|
||||
{
|
||||
AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
|
||||
AbilitySystemComponent->SetIsReplicated(true);
|
||||
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);
|
||||
|
||||
AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");
|
||||
NetUpdateFrequency = 100.f;
|
||||
|
||||
}
|
||||
|
||||
void AAuraPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
|
||||
{
|
||||
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
|
||||
DOREPLIFETIME(AAuraPlayerState, Level);
|
||||
}
|
||||
|
||||
UAbilitySystemComponent* AAuraPlayerState::GetAbilitySystemComponent() const
|
||||
{
|
||||
return AbilitySystemComponent;
|
||||
}
|
||||
|
||||
void AAuraPlayerState::OnRep_Level(int32 OldLevel)
|
||||
{
|
||||
|
||||
}
|
||||
41
Source/Aura/Private/UI/HUD/AuraHUD.cpp
Normal file
41
Source/Aura/Private/UI/HUD/AuraHUD.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "UI/HUD/AuraHUD.h"
|
||||
|
||||
#include "Blueprint/UserWidget.h"
|
||||
#include "UI/Widget/AuraUserWidget.h"
|
||||
#include "UI/WidgetController/OverlayWidgetController.h"
|
||||
|
||||
UOverlayWidgetController* AAuraHUD::GetOverlayWidgetController(const FWidgetControllerParams& WCParams)
|
||||
{
|
||||
if (OverlayWidgetController == nullptr)
|
||||
{
|
||||
OverlayWidgetController = NewObject<UOverlayWidgetController>(this, OverlayWidgetControllerClass);
|
||||
OverlayWidgetController->SetWidgetControllerParams(WCParams);
|
||||
OverlayWidgetController->BindCallbacksToDependencies();
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraHUD - GetOverlayWidgetController - Return new Controller"));
|
||||
}
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraHUD - GetOverlayWidgetController - Controller already exists"));
|
||||
//If it exists, return existing OverlayWidgetController
|
||||
return OverlayWidgetController;
|
||||
}
|
||||
|
||||
void AAuraHUD::InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
|
||||
{
|
||||
checkf(OverlayWidgetClass, TEXT("Overlay Widget Class initialized, please fill out BP_AuraHUD"));
|
||||
checkf(OverlayWidgetControllerClass, TEXT("Overlay Widget Controller Class initialized, Please fill out BP_AuraHUD"));
|
||||
|
||||
UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(),OverlayWidgetClass);
|
||||
OverlayWidget = Cast<UAuraUserWidget>(Widget);
|
||||
|
||||
const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);
|
||||
UOverlayWidgetController* WidgetController = GetOverlayWidgetController(WidgetControllerParams);
|
||||
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraHUD - WidgetController"));
|
||||
|
||||
OverlayWidget->SetWidgetController(WidgetController);
|
||||
WidgetController->BroadcastInitialValues();
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraHUD - Add to Viewport"));
|
||||
Widget->AddToViewport();
|
||||
}
|
||||
11
Source/Aura/Private/UI/Widget/AuraUserWidget.cpp
Normal file
11
Source/Aura/Private/UI/Widget/AuraUserWidget.cpp
Normal file
@@ -0,0 +1,11 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "UI/Widget/AuraUserWidget.h"
|
||||
|
||||
void UAuraUserWidget::SetWidgetController(UObject* InWidgetController)
|
||||
{
|
||||
WidgetController = InWidgetController;
|
||||
//UE_LOG(LogTemp, Warning, TEXT("AuraUserWidget.cpp - SetWidgetController"));
|
||||
WidgetControllerSet();
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "UI/WidgetController/AuraWidgetController.h"
|
||||
|
||||
void UAuraWidgetController::SetWidgetControllerParams(FWidgetControllerParams WCParams)
|
||||
{
|
||||
PlayerController = WCParams.PlayerController;
|
||||
PlayerState = WCParams.PlayerState;
|
||||
AbilitySystemComponent = WCParams.AbilitySystemComponent;
|
||||
AttributeSet = WCParams.AttributeSet;
|
||||
|
||||
}
|
||||
|
||||
void UAuraWidgetController::BroadcastInitialValues()
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("AuraWidgetController - BroadcastInitialValues"));
|
||||
}
|
||||
|
||||
void UAuraWidgetController::BindCallbacksToDependencies()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
// Copyright Echo Devgroup
|
||||
|
||||
|
||||
#include "UI/WidgetController/OverlayWidgetController.h"
|
||||
|
||||
#include "AbilitySystem/AuraAbilitySystemComponent.h"
|
||||
#include "AbilitySystem/AuraAttributeSet.h"
|
||||
|
||||
void UOverlayWidgetController::BroadcastInitialValues()
|
||||
{
|
||||
//UE_LOG(LogTemp, Warning, TEXT("OverlayWidgetController - BroadcastInitialValues"));
|
||||
UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);
|
||||
OnHealthChanged.Broadcast(AuraAttributeSet->GetHealth());
|
||||
OnMaxHealthChanged.Broadcast(AuraAttributeSet->GetMaxHealth());
|
||||
OnManaChanged.Broadcast(AuraAttributeSet->GetMana());
|
||||
OnMaxManaChanged.Broadcast(AuraAttributeSet->GetMaxMana());
|
||||
}
|
||||
|
||||
void UOverlayWidgetController::BindCallbacksToDependencies()
|
||||
{
|
||||
UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);
|
||||
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetHealthAttribute()).AddLambda(
|
||||
[this](const FOnAttributeChangeData& Data)
|
||||
{
|
||||
OnHealthChanged.Broadcast(Data.NewValue);
|
||||
}
|
||||
);
|
||||
|
||||
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetMaxHealthAttribute()).AddLambda(
|
||||
[this](const FOnAttributeChangeData& Data)
|
||||
{
|
||||
OnMaxHealthChanged.Broadcast(Data.NewValue);
|
||||
}
|
||||
);
|
||||
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetManaAttribute()).AddLambda(
|
||||
[this](const FOnAttributeChangeData& Data)
|
||||
{
|
||||
OnManaChanged.Broadcast(Data.NewValue);
|
||||
}
|
||||
);
|
||||
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetMaxManaAttribute()).AddLambda(
|
||||
[this](const FOnAttributeChangeData& Data)
|
||||
{
|
||||
OnMaxManaChanged.Broadcast(Data.NewValue);
|
||||
}
|
||||
);
|
||||
|
||||
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->EffectAssetTags.AddLambda(
|
||||
[this](const FGameplayTagContainer& AssetTags)
|
||||
{
|
||||
for (const FGameplayTag& Tag : AssetTags)
|
||||
{
|
||||
|
||||
|
||||
//* "A.1".MatchesTag("A") will return True, "A".MatchesTag("A.1") will return False
|
||||
FGameplayTag MessageTag = FGameplayTag::RequestGameplayTag(FName("Message"));
|
||||
if (Tag.MatchesTag(MessageTag))
|
||||
{
|
||||
const FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
|
||||
MessageWidgetRowDelegate.Broadcast(*Row);
|
||||
}
|
||||
//Debug Message code incase stops working
|
||||
//const FString msg = FString::Printf(TEXT("GE Tag: %s"), *Tag.ToString());
|
||||
//GEngine->AddOnScreenDebugMessage(-1,8.f, FColor::Blue,msg);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user