第一次提交
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
||||
|
||||
|
||||
#include "GenericCombatSystem/Public/AbilitySystem/Tasks/GCS_AbilityTask_CollisionTrace.h"
|
||||
#include "GCS_LogChannels.h"
|
||||
#include "Collision/GCS_TraceSystemComponent.h"
|
||||
#include "Collision/DEPRECATED_GCS_CollisionTraceInstance.h"
|
||||
#include "CombatFlow/GCS_AttackRequest.h"
|
||||
#include "Utility/GCS_CombatFunctionLibrary.h"
|
||||
|
||||
|
||||
UGCS_AbilityTask_CollisionTrace::UGCS_AbilityTask_CollisionTrace()
|
||||
{
|
||||
// make sure this task runs on simulated proxy.
|
||||
bSimulatedTask = true;
|
||||
}
|
||||
|
||||
UGCS_AbilityTask_CollisionTrace* UGCS_AbilityTask_CollisionTrace::HandleCollisionTraces(UGameplayAbility* OwningAbility, FName TaskInstanceName, bool bAdjustVisibilityBasedAnimTickOption)
|
||||
{
|
||||
UGCS_AbilityTask_CollisionTrace* MyTask = NewAbilityTask<UGCS_AbilityTask_CollisionTrace>(OwningAbility, TaskInstanceName);
|
||||
MyTask->bAdjustAnimTickOption = bAdjustVisibilityBasedAnimTickOption;
|
||||
return MyTask;
|
||||
}
|
||||
|
||||
void UGCS_AbilityTask_CollisionTrace::Activate()
|
||||
{
|
||||
Super::Activate();
|
||||
|
||||
if (bAdjustAnimTickOption && GetAvatarActor()->GetNetMode() == NM_DedicatedServer)
|
||||
{
|
||||
if (USkeletalMeshComponent* SkeletalMeshComponent = UGCS_CombatFunctionLibrary::GetMainCharacterMeshComponent(GetAvatarActor()))
|
||||
{
|
||||
if (SkeletalMeshComponent->VisibilityBasedAnimTickOption != EVisibilityBasedAnimTickOption::AlwaysTickPoseAndRefreshBones)
|
||||
{
|
||||
PrevAnimTickOption = SkeletalMeshComponent->VisibilityBasedAnimTickOption;
|
||||
SkeletalMeshComponent->VisibilityBasedAnimTickOption = EVisibilityBasedAnimTickOption::AlwaysTickPoseAndRefreshBones;
|
||||
bAdjustAnimTickOption = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (UGCS_TraceSystemComponent* TSC = UGCS_TraceSystemComponent::GetTraceSystemComponent(GetAvatarActor()))
|
||||
{
|
||||
TSC->OnTraceHitEvent.AddDynamic(this, &ThisClass::TraceHitCallback);
|
||||
}
|
||||
}
|
||||
|
||||
void UGCS_AbilityTask_CollisionTrace::OnDestroy(bool bInOwnerFinished)
|
||||
{
|
||||
if (bAdjustAnimTickOption && bAdjustedAnimTickOption)
|
||||
{
|
||||
if (USkeletalMeshComponent* SkeletalMeshComponent = UGCS_CombatFunctionLibrary::GetMainCharacterMeshComponent(GetAvatarActor()))
|
||||
{
|
||||
SkeletalMeshComponent->VisibilityBasedAnimTickOption = PrevAnimTickOption;
|
||||
}
|
||||
}
|
||||
if (UGCS_TraceSystemComponent* TSC = UGCS_TraceSystemComponent::GetTraceSystemComponent(GetAvatarActor()))
|
||||
{
|
||||
TSC->OnTraceHitEvent.RemoveDynamic(this, &ThisClass::TraceHitCallback);
|
||||
for (auto& MeleeRequest : MeleeRequests)
|
||||
{
|
||||
TSC->StopTraces(MeleeRequest.Value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MeleeRequests.Empty();
|
||||
|
||||
Super::OnDestroy(bInOwnerFinished);
|
||||
}
|
||||
|
||||
void UGCS_AbilityTask_CollisionTrace::TraceHitCallback(const FGCS_TraceHandle& TraceHandle, const FHitResult& HitResult)
|
||||
{
|
||||
if (ShouldBroadcastAbilityTaskDelegates() && !MeleeRequests.IsEmpty() && TraceHandle.IsValidHandle())
|
||||
{
|
||||
TObjectPtr<const UGCS_AttackRequest_Melee> Req = nullptr;
|
||||
bool bFound = false;
|
||||
for (auto& MeleeRequest : MeleeRequests)
|
||||
{
|
||||
if (!MeleeRequest.Value.Contains(TraceHandle))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Req = MeleeRequest.Key;
|
||||
bFound = true;
|
||||
break;
|
||||
}
|
||||
if (bFound)
|
||||
{
|
||||
OnTargetsFound.Broadcast(Req, TraceHandle, HitResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UGCS_AbilityTask_CollisionTrace::AddMeleeRequest(const UGCS_AttackRequest_Melee* Request, UObject* SourceObject)
|
||||
{
|
||||
if (IsValid(Request) && !MeleeRequests.Contains(Request))
|
||||
{
|
||||
const FGameplayTagContainer& TracesToControl = Request->TracesToControl;
|
||||
if (UGCS_TraceSystemComponent* TSC = UGCS_TraceSystemComponent::GetTraceSystemComponent(GetAvatarActor()))
|
||||
{
|
||||
TArray<FGCS_TraceHandle> Handles = TSC->StartTraces(TracesToControl, SourceObject);
|
||||
if (Handles.IsEmpty())
|
||||
{
|
||||
GCS_LOG(Warning, "Ability:(%s), No any trace started by melee request(%s) with source object(%s)", *GetNameSafe(Ability.Get()), *Request->GetPathName(), *GetNameSafe(SourceObject));
|
||||
}
|
||||
MeleeRequests.Emplace(Request, Handles);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UGCS_AbilityTask_CollisionTrace::RemoveMeleeRequest(const UGCS_AttackRequest_Melee* Request)
|
||||
{
|
||||
if (IsValid(Request) && MeleeRequests.Contains(Request))
|
||||
{
|
||||
if (UGCS_TraceSystemComponent* TSC = UGCS_TraceSystemComponent::GetTraceSystemComponent(GetAvatarActor()))
|
||||
{
|
||||
TSC->StopTraces(MeleeRequests[Request]);
|
||||
}
|
||||
MeleeRequests.Remove(Request);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user