Files
PHY/Plugins/GCS/Source/GenericCombatSystem/Private/Collision/DEPRECATED_GCS_CollisionTraceInstance.cpp
2026-03-03 01:23:02 +08:00

94 lines
2.7 KiB
C++

// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#include "Collision/DEPRECATED_GCS_CollisionTraceInstance.h"
#include "GCS_LogChannels.h"
#include "Collision/GCS_TraceSystemComponent.h"
#include "Components/PrimitiveComponent.h"
void UDEPRECATED_GCS_CollisionTraceInstance::OnTraceBeginPlay_Implementation()
{
ActiveTime = 0.0f;
HitActors.Empty();
}
void UDEPRECATED_GCS_CollisionTraceInstance::OnTraceEndPlay_Implementation()
{
ActiveTime = 0.0f;
bTraceActive = false;
TracePrimitiveComponent = nullptr;
TracePrimitiveComponentSocketNames.Empty();
HitActors.Empty();
}
void UDEPRECATED_GCS_CollisionTraceInstance::BroadcastHit(const FHitResult& HitResult)
{
if (!bTraceActive)
{
UE_LOG(LogGCS_Collision, Warning, TEXT("Hit while inactive,%s"), *TraceOwner->GetName());
}
}
void UDEPRECATED_GCS_CollisionTraceInstance::BroadcastStateChanged(bool bNewState)
{
OnTraceStateChanged(bNewState);
}
void UDEPRECATED_GCS_CollisionTraceInstance::OnTraceTick_Implementation(float DeltaSeconds)
{
ActiveTime += DeltaSeconds;
}
void UDEPRECATED_GCS_CollisionTraceInstance::OnTraceStateChanged_Implementation(bool bNewState)
{
bTraceActive = bNewState;
HitActors.Empty();
}
void UDEPRECATED_GCS_CollisionTraceInstance::SetTraceMeshInfo(UPrimitiveComponent* NewPrimitiveComponent, TArray<FName> PrimitiveComponentSocketNames)
{
TracePrimitiveComponent = NewPrimitiveComponent;
TracePrimitiveComponentSocketNames = PrimitiveComponentSocketNames;
}
bool UDEPRECATED_GCS_CollisionTraceInstance::CanHitActor_Implementation(const AActor* ActorToCheck) const
{
//in active trace can not hit anything. TODO make it checkf?
if (!bTraceActive)
{
return false;
}
return ActorToCheck != GetTraceSourceActor() && ActorToCheck != TraceOwner && !HitActors.Contains(ActorToCheck);
}
AActor* UDEPRECATED_GCS_CollisionTraceInstance::GetTraceSourceActor() const
{
return TracePrimitiveComponent->GetOwner();
}
void UDEPRECATED_GCS_CollisionTraceInstance::ToggleTraceState(bool bNewState)
{
if (TraceOwner && bTraceActive != bNewState)
{
BroadcastStateChanged(bNewState);
}
}
void UDEPRECATED_GCS_CollisionTraceInstance::OnTraceHit_Implementation(const FHitResult& HitResult)
{
if (HitResult.GetHitObjectHandle().IsValid())
{
if (CanHitActor(HitResult.GetActor()))
{
UE_LOG(LogGCS_Collision, VeryVerbose, TEXT("%s's Trace(%s, SourceActor:%s) hit actor(%s,Comp:%s)"), *TraceOwner->GetName(),
*(TraceGameplayTag.IsValid()?TraceGameplayTag.ToString():GetClass()->GetName()),
*GetTraceSourceActor()->GetName(),
*HitResult.GetActor()->GetName(), *(HitResult.Component.IsValid()?HitResult.GetComponent()->GetName():TEXT("Null")));
HitActors.Add(HitResult.GetActor());
BroadcastHit(HitResult);
}
}
}