151 lines
5.5 KiB
C++
151 lines
5.5 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "Actor/BaseWeapon.h"
|
|
#include "Components/CombatComponent.h"
|
|
#include "GameFramework/Character.h"
|
|
#include "Components/CollisionComponent.h"
|
|
#include "DamageType/AttackDamageType.h"
|
|
#include "Interface/CombatInterface.h"
|
|
#include "Definitions/CombatGameplayTags.h"
|
|
#include "Kismet/GameplayStatics.h"
|
|
|
|
ABaseWeapon::ABaseWeapon()
|
|
{
|
|
CollisionComponent = CreateDefaultSubobject<UCollisionComponent>(TEXT("CollisionComponent"));
|
|
CollisionComponent->OnHitDelegate.BindUObject(this, &ABaseWeapon::OnHit);
|
|
CollisionComponent->SetTraceRaius(20.f);
|
|
CollisionComponent->SetStartSocketName(TEXT("WeaponStart"));
|
|
CollisionComponent->SetEndSocketName(TEXT("WeaponEnd"));
|
|
|
|
TArray<TEnumAsByte<EObjectTypeQuery>> InputCollisionObjectTypes;
|
|
InputCollisionObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
|
|
CollisionComponent->SetCollisionObjectTypes(InputCollisionObjectTypes);
|
|
CollisionComponent->SetDrawDebugType(EDrawDebugTrace::None);
|
|
|
|
DamageTypeClass = UAttackDamageType::StaticClass();
|
|
|
|
//Stats
|
|
Damage = 20.f;
|
|
if(!FCombatGameplayTags::Get().Character_Action_Attack_LightAttack.IsValid())
|
|
FCombatGameplayTags::InitializeNativeGameplayTags();
|
|
|
|
ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_LightAttack, 10.f);
|
|
ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack, 15.f);
|
|
ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack, 20.f);
|
|
ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack, 10.f);
|
|
ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack, 10.f);
|
|
ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Dodge, 20.f);
|
|
|
|
ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_LightAttack, 1.f);
|
|
ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack, 1.4f);
|
|
ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack, 1.5f);
|
|
ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack, 1.2f);
|
|
ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack, 1.2f);
|
|
}
|
|
|
|
void ABaseWeapon::OnEquipped()
|
|
{
|
|
SetIsEquipped(true);
|
|
AActor* owner = GetOwner();
|
|
if (!owner)
|
|
return;
|
|
CombatComponent = owner->GetComponentByClass<UCombatComponent>();
|
|
CombatComponent->OnCombatToggled.AddUObject(this, &ABaseWeapon::ToggleWeaponCombat);
|
|
|
|
OwnerStateManager = owner->GetComponentByClass<UStateManagerComponent>();
|
|
|
|
if (CombatComponent->GetCombatEnabled())
|
|
AttachActor(HandSocketName);
|
|
else
|
|
AttachActor(AttachSocketName);
|
|
|
|
CombatComponent->SetMainWeapon(this);
|
|
|
|
ACharacter* character = Cast<ACharacter>(owner);
|
|
if (character)
|
|
{
|
|
UCombatAnimInstance* animInstance = Cast<UCombatAnimInstance>(character->GetMesh()->GetAnimInstance());
|
|
animInstance->UpdateCombatType(CombatType);
|
|
}
|
|
|
|
CollisionComponent->SetCollisionMeshComponent(GetItemMesh());
|
|
CollisionComponent->AddActorToIgnore(GetOwner());
|
|
}
|
|
|
|
void ABaseWeapon::OnHit(FHitResult hitResult)
|
|
{
|
|
ICombatInterface* pActor = Cast<ICombatInterface>(hitResult.GetActor());
|
|
if (pActor)
|
|
{
|
|
if (pActor->Execute_CanReceiveDamage(hitResult.GetActor()))
|
|
UGameplayStatics::ApplyPointDamage(hitResult.GetActor(), GetDamage(), GetOwner()->GetActorForwardVector(), hitResult, GetInstigatorController(), this, DamageTypeClass);
|
|
}
|
|
}
|
|
|
|
void ABaseWeapon::SimulateWeaponPhysics()
|
|
{
|
|
GetItemMesh()->SetCollisionProfileName(TEXT("PhysicsActor"), true);
|
|
GetItemMesh()->SetSimulatePhysics(true);
|
|
}
|
|
|
|
float ABaseWeapon::GetStatCostForAction()
|
|
{
|
|
if (!IsValid(OwnerStateManager))
|
|
return 0.f;
|
|
|
|
return *ActionStatCost.Find(OwnerStateManager->GetCurrentAction());
|
|
}
|
|
|
|
float ABaseWeapon::GetDamage()
|
|
{
|
|
if (!IsValid(OwnerStateManager))
|
|
return Damage;
|
|
float outDamage = *ActionDamageMultiplier.Find(OwnerStateManager->GetCurrentAction());
|
|
outDamage = FMath::Clamp(outDamage, 1.f, outDamage) * Damage;
|
|
|
|
return outDamage;
|
|
}
|
|
|
|
void ABaseWeapon::ActivateCollision(ECollisionPart CollisionPart)
|
|
{
|
|
CollisionComponent->ActivateCollision();
|
|
}
|
|
|
|
void ABaseWeapon::DeactivateCollision(ECollisionPart CollsionPart)
|
|
{
|
|
CollisionComponent->DeactivateCollision();
|
|
}
|
|
|
|
void ABaseWeapon::ToggleWeaponCombat(bool EnableCombat)
|
|
{
|
|
if(EnableCombat)
|
|
AttachActor(HandSocketName);
|
|
else
|
|
AttachActor(AttachSocketName);
|
|
}
|
|
|
|
TArray<UAnimMontage*> ABaseWeapon::GetActionMontage(FGameplayTag characterAction)
|
|
{
|
|
TArray<UAnimMontage*> outputArr;
|
|
|
|
if (FCombatGameplayTags::Get().Character_Action_Attack_LightAttack == characterAction)
|
|
outputArr = LightAttackMontage;
|
|
else if (FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack == characterAction)
|
|
outputArr = HeavyAttackMontage;
|
|
else if (FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack == characterAction)
|
|
outputArr = ChargedAttackMontage;
|
|
else if (FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack == characterAction)
|
|
outputArr = FallingAttackMontage;
|
|
else if (FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack == characterAction)
|
|
outputArr = SprintAttackMontage;
|
|
else if (FCombatGameplayTags::Get().Character_Action_Dodge == characterAction)
|
|
outputArr = DodgeMontage;
|
|
else if (FCombatGameplayTags::Get().Character_Action_EnterCombat == characterAction)
|
|
outputArr.Add(EnterCombat);
|
|
else if (FCombatGameplayTags::Get().Character_Action_ExitCombat == characterAction)
|
|
outputArr.Add(ExitCombat);
|
|
|
|
return outputArr;
|
|
}
|