// 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(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()) { if (ZipliningInputTag.IsValid() && AbilityInputs->Tags.HasTagExact(ZipliningInputTag)) { TArray 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()) { 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 }