Hello,
I am fairly new with programming and am working on trying to get my weapon to return an enemies attached component. I am using a bounding box for the collision, which is definitely returning a hit result, however, I am unable to get the component that I have made that sets the character’s stats such as HP and Combat. I would appreciate any help on fixing this, as I mentioned, I am quite new to programming. I would prefer not to use BP to solve this. I have two functions handling this, the trace, and then the function that breaks the hit result to get the component and deal damage to the component. I am also using an Enum to set the type of weapon as well as a struct to set the weapon stats. My trace is as follows:
*// The trace:*
// FArmoryStats is a struct set in UWeaponComponent that sets weapon type, damage, mesh, ID, etc.
**void UWeaponComponent::OnAttack(FArmoryStats WeaponType, UWeaponComponent* AttackingCharacter)**
{
AFirst_RPGCharacter* Character = Cast<AFirst_RPGCharacter>(AttackingCharacter->GetOwner());
if (bIsAttacking && (Character != nullptr)) // if the Character is attacking with this weapon component
{
switch (WeaponType.Type)
{
case EArmoryType::AT_Melee: // Weapon is a melee weapon
{
// MeleeHitBox is a UBoxComponent to give me the dimensions for collision that I want
FVector MeleeTraceStart = MeleeHitBox->GetComponentLocation();
FVector MeleeTraceEnd = (MeleeTraceStart * MeleeHitBox->GetScaledBoxExtent());
FCollisionShape MeleeBox = FCollisionShape::MakeBox(MeleeHitBox->GetScaledBoxExtent());
ECollisionChannel MeleeTrace = ECC_GameTraceChannel1;
FCollisionQueryParams Params;
Params.AddIgnoredActor(GetOwner());
bIsHitMelee = GetWorld()->SweepMultiByChannel(MeleeHits, MeleeTraceStart, MeleeTraceEnd, FQuat::Identity, MeleeTrace, MeleeBox, Params);
}
*// The break hit result and deal damage:*
**void UWeaponComponent::GetHitMeleeTarget()**
{
if (bIsHitMelee) // If there is a hit from the trace, this currently will return a hit, can even get the name of the actor
{
for (auto & Hit : MeleeHits)
{
UE_LOG(LogTemp, Warning, TEXT("Hit Found"))
UCombat_Component* TargetCombatComp = Cast<UCombat_Component>(Hit.GetActor()->GetComponentByClass(TSubclassOf<UActorComponent>()));
// Have also used in cast (Hit.GetComponent()) as well as (Hit.Component.Get())
if (TargetCombatComp != nullptr) // If there is a hit to the Combat_Component
{
TargetCombatComp->TakeDamage(Stats.Damage); //Deal Damage
float DamagedHealth = TargetCombatComp->GetCurrentHealth(); // Get Target's Health
UE_LOG(LogTemp, Warning, TEXT("Target Health: %s"), &DamagedHealth); // Log Target's Health
return;
}
else if (TargetCombatComp == nullptr)
{
UE_LOG(LogTemp, Warning, TEXT("No Combat Component"));
return;
}
}
}
else if (!bIsHitMelee) { return; } // If there was no hit return
}
Currently, I am getting the log that there is no combat component and can return the name of the target hit so I know that I am definitely getting a hit. If anyone could please help with this, or has any tips on my coding in general, I would be most grateful.
Thanks,