diff --git a/Content/Legumix/Player/BP_Play.uasset b/Content/Legumix/Player/BP_Play.uasset index 7279fab..64d4ecf 100644 --- a/Content/Legumix/Player/BP_Play.uasset +++ b/Content/Legumix/Player/BP_Play.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8ff5ba2e6aec9103e8f4ac9870ea0be05c2276bab8e514f6f31b35ec3831860 -size 489617 +oid sha256:39d35cd312000f729118b6fc2cd46fb9071e8af44614f8a177d1319b5ff64bf0 +size 514891 diff --git a/Source/LegumeMix/Private/Player/LMPlayer.cpp b/Source/LegumeMix/Private/Player/LMPlayer.cpp index dd53538..3ccc805 100644 --- a/Source/LegumeMix/Private/Player/LMPlayer.cpp +++ b/Source/LegumeMix/Private/Player/LMPlayer.cpp @@ -19,6 +19,8 @@ ALMPlayer::ALMPlayer(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer.SetDefaultSubobjectClass(CharacterMovementComponentName)) { LegumixMovementComponent = Cast(GetCharacterMovement()); + LedgeGrabOrigin = CreateDefaultSubobject("LedgeGrabOrigin"); + LedgeGrabOrigin->SetupAttachment(RootComponent); PrimaryActorTick.bCanEverTick = true; @@ -45,6 +47,8 @@ void ALMPlayer::BeginPlay() GetCamera()->SetFieldOfView(ULMUserSettings::GetLegumixUserSettings()->FieldOfView); HealthComponent->OnHealthChanged.AddDynamic(this, &ALMPlayer::SetDisplayDamageParameters); + + MovementModeChangedDelegate.AddUniqueDynamic(this, &ALMPlayer::MovementChanged); } void ALMPlayer::Tick(float DeltaTime) @@ -228,6 +232,34 @@ void ALMPlayer::SetPlayerViewOcclusionPercent() NextPlayerViewOcclusionPercent = CumulatedDamagesOnCurrentHitPeriod / HealthAtTheCurrentHitPeriodBeginning; } +void ALMPlayer::MovementChanged(ACharacter* Character, EMovementMode PrevMovementMode, uint8 PreviousCustomMode) +{ + if (GetCharacterMovement()->MovementMode == MOVE_Falling) + { + GetWorldTimerManager().SetTimer(LedgeGrabCheckTimer, this, &ALMPlayer::DoLedgeGrabCheck, LedgeGrabPollTime, true); + } + else if (PrevMovementMode == MOVE_Falling) + { + GetWorldTimerManager().ClearTimer(LedgeGrabCheckTimer); + } +} + +void ALMPlayer::DoLedgeGrabCheck() +{ + FVector Origin = LedgeGrabOrigin->GetComponentLocation(); + FVector Dir = LedgeGrabOrigin->GetUpVector() * FVector(0, 0, -LedgeGrabTraceLength); + FVector Ray = Origin + Dir; + + FHitResult Hit; + const bool Results = UKismetSystemLibrary::LineTraceSingleByProfile(GetWorld(), Origin, Ray, TEXT("BlockAll"), false + , {}, EDrawDebugTrace::None, Hit, true, FLinearColor::Red, FLinearColor::Green, 0.2f); + if (Results) + { + FVector TeleportLocation = FVector(Hit.Location.X, Hit.Location.Y, Hit.Location.Z + GetCapsuleComponent()->GetScaledCapsuleHalfHeight()); + SetActorLocation(TeleportLocation, false, nullptr, ETeleportType::ResetPhysics); + } +} + FCollisionQueryParams ALMPlayer::GetIgnoreCharacterParams() { FCollisionQueryParams Params; diff --git a/Source/LegumeMix/Public/Player/LMPlayer.h b/Source/LegumeMix/Public/Player/LMPlayer.h index 32d5236..62987ed 100644 --- a/Source/LegumeMix/Public/Player/LMPlayer.h +++ b/Source/LegumeMix/Public/Player/LMPlayer.h @@ -101,6 +101,12 @@ public: UFUNCTION(BlueprintNativeEvent, BlueprintCallable) void OnPause(bool Paused); + + UFUNCTION() + void MovementChanged(ACharacter* Character, EMovementMode PrevMovementMode, uint8 PreviousCustomMode); + + UFUNCTION(BlueprintCallable) + void DoLedgeGrabCheck(); FCollisionQueryParams GetIgnoreCharacterParams(); @@ -128,6 +134,9 @@ private: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) TObjectPtr HealthComponent; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Legumix|LedgeGrab", meta = (AllowPrivateAccess = true)) + TObjectPtr LedgeGrabOrigin; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) TObjectPtr DamageDynamicMaterialInstance; @@ -188,6 +197,12 @@ private: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) ETeam Team = ETeam::ET_Player; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Legumix|LedgeGrab", meta = (AllowPrivateAccess = true, ClampMin = 0.f)) + float LedgeGrabPollTime = 0.2f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Legumix|LedgeGrab", meta = (AllowPrivateAccess = true, ClampMin = 0.f)) + float LedgeGrabTraceLength = 44.f; + /** * Actualize all parameters needed to calculate PlayerViewOcclusionPercent */ @@ -209,4 +224,5 @@ private: private: FRandomStream SpreadStream; + FTimerHandle LedgeGrabCheckTimer; };