// 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(TEXT("CollisionComponent")); CollisionComponent->OnHitDelegate.BindUObject(this, &ABaseWeapon::OnHit); CollisionComponent->SetTraceRaius(20.f); CollisionComponent->SetStartSocketName(TEXT("WeaponStart")); CollisionComponent->SetEndSocketName(TEXT("WeaponEnd")); TArray> 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(); CombatComponent->OnCombatToggled.AddUObject(this, &ABaseWeapon::ToggleWeaponCombat); OwnerStateManager = owner->GetComponentByClass(); if (CombatComponent->GetCombatEnabled()) AttachActor(HandSocketName); else AttachActor(AttachSocketName); CombatComponent->SetMainWeapon(this); ACharacter* character = Cast(owner); if (character) { UCombatAnimInstance* animInstance = Cast(character->GetMesh()->GetAnimInstance()); animInstance->UpdateCombatType(CombatType); } CollisionComponent->SetCollisionMeshComponent(GetItemMesh()); CollisionComponent->AddActorToIgnore(GetOwner()); } void ABaseWeapon::OnHit(FHitResult hitResult) { ICombatInterface* pActor = Cast(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 ABaseWeapon::GetActionMontage(FGameplayTag characterAction) { TArray 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; }