D1/Source/D1/Actor/BaseWeapon.cpp

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;
}