第一次提交

This commit is contained in:
不明不惑
2026-03-03 01:23:02 +08:00
commit 3e434877e8
1053 changed files with 102411 additions and 0 deletions

View File

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