94 lines
2.9 KiB
C++
94 lines
2.9 KiB
C++
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
|
|
|
|
|
#include "Mover/Zipline/GMS_ZiplineModeTransition.h"
|
|
#include "GameFramework/Actor.h"
|
|
#include "DefaultMovementSet/CharacterMoverComponent.h"
|
|
#include "Kismet/KismetSystemLibrary.h"
|
|
#include "Mover/GMS_MoverStructLibrary.h"
|
|
#include "Mover/Zipline/GMS_ZiplineInterface.h"
|
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(GMS_ZiplineModeTransition)
|
|
|
|
// UGMS_ZiplineStartTransition //////////////////////////////
|
|
|
|
UGMS_ZiplineStartTransition::UGMS_ZiplineStartTransition(const FObjectInitializer& ObjectInitializer)
|
|
: Super(ObjectInitializer)
|
|
{
|
|
}
|
|
|
|
#if ENGINE_MINOR_VERSION >=6
|
|
FTransitionEvalResult UGMS_ZiplineStartTransition::Evaluate_Implementation(const FSimulationTickParams& Params) const
|
|
#else
|
|
FTransitionEvalResult UGMS_ZiplineStartTransition::OnEvaluate(const FSimulationTickParams& Params) const
|
|
#endif
|
|
{
|
|
FTransitionEvalResult EvalResult = FTransitionEvalResult::NoTransition;
|
|
|
|
UCharacterMoverComponent* MoverComp = Cast<UCharacterMoverComponent>(Params.MovingComps.MoverComponent.Get());
|
|
|
|
const FMoverSyncState& SyncState = Params.StartState.SyncState;
|
|
|
|
if (MoverComp && MoverComp->IsAirborne() && SyncState.MovementMode != ZipliningModeName)
|
|
{
|
|
if (const FGMS_MoverTagInputs* AbilityInputs = Params.StartState.InputCmd.InputCollection.FindDataByType<FGMS_MoverTagInputs>())
|
|
{
|
|
if (ZipliningInputTag.IsValid() && AbilityInputs->Tags.HasTagExact(ZipliningInputTag))
|
|
{
|
|
TArray<AActor*> OverlappingActors;
|
|
MoverComp->GetOwner()->GetOverlappingActors(OUT OverlappingActors);
|
|
|
|
for (AActor* CandidateActor : OverlappingActors)
|
|
{
|
|
bool bIsZipline = UKismetSystemLibrary::DoesImplementInterface(CandidateActor, UGMS_ZiplineInterface::StaticClass());
|
|
|
|
if (bIsZipline)
|
|
{
|
|
EvalResult.NextMode = ZipliningModeName;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return EvalResult;
|
|
}
|
|
|
|
|
|
// UGMS_ZiplineEndTransition //////////////////////////////
|
|
|
|
UGMS_ZiplineEndTransition::UGMS_ZiplineEndTransition(const FObjectInitializer& ObjectInitializer)
|
|
: Super(ObjectInitializer)
|
|
{
|
|
}
|
|
|
|
|
|
#if ENGINE_MINOR_VERSION >=6
|
|
FTransitionEvalResult UGMS_ZiplineEndTransition::Evaluate_Implementation(const FSimulationTickParams& Params) const
|
|
#else
|
|
FTransitionEvalResult UGMS_ZiplineEndTransition::OnEvaluate(const FSimulationTickParams& Params) const
|
|
#endif
|
|
{
|
|
FTransitionEvalResult EvalResult = FTransitionEvalResult::NoTransition;
|
|
|
|
if (const FCharacterDefaultInputs* DefaultInputs = Params.StartState.InputCmd.InputCollection.FindDataByType<FCharacterDefaultInputs>())
|
|
{
|
|
if (DefaultInputs->bIsJumpJustPressed)
|
|
{
|
|
EvalResult.NextMode = AutoExitToMode;
|
|
}
|
|
}
|
|
|
|
return EvalResult;
|
|
}
|
|
|
|
#if ENGINE_MINOR_VERSION >=6
|
|
void UGMS_ZiplineEndTransition::Trigger_Implementation(const FSimulationTickParams& Params)
|
|
#else
|
|
void UGMS_ZiplineEndTransition::OnTrigger(const FSimulationTickParams& Params)
|
|
#endif
|
|
{
|
|
//TODO: create a small jump, using current directionality
|
|
}
|