(Feat) Add footsteps

This commit is contained in:
2026-08-11 15:23:10 +02:00
parent e8e128457a
commit 176beab9fc
4776 changed files with 18806 additions and 121 deletions
@@ -17,8 +17,10 @@
#include "InputActionValue.h"
#include "CharacterAppearanceComponent.h"
#include "CraftingComponent.h"
#include "FootstepComponent.h"
#include "FpsPlayerController.h"
#include "HeadBobComponent.h"
#include "HeldItemComponent.h"
#include "InteractionComponent.h"
#include "InventoryComponent.h"
#include "ItemDataAsset.h"
@@ -111,6 +113,8 @@ AFpsPlayer::AFpsPlayer()
CraftingComponent = CreateDefaultSubobject<UCraftingComponent>(TEXT("CraftingComponent"));
SurvivalStats = CreateDefaultSubobject<USurvivalStatsComponent>(TEXT("SurvivalStats"));
AppearanceComponent = CreateDefaultSubobject<UCharacterAppearanceComponent>(TEXT("AppearanceComponent"));
HeldItemComponent = CreateDefaultSubobject<UHeldItemComponent>(TEXT("HeldItemComponent"));
FootstepComponent = CreateDefaultSubobject<UFootstepComponent>(TEXT("FootstepComponent"));
// En vue FPS on ne veut pas voir son propre corps (mesh 3e personne),
// mais on garde son ombre.
@@ -377,6 +381,31 @@ void AFpsPlayer::OnRep_PlayerState()
RefreshAppearanceFromPlayerState();
}
void AFpsPlayer::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
// Cote serveur uniquement : chez l'hote c'est ce chemin qui remplit sa
// propre main, IsLocallyControlled() ne devenant vrai qu'ici.
if (HeldItemComponent)
{
HeldItemComponent->RefreshFromInventory();
}
}
void AFpsPlayer::OnRep_Controller()
{
Super::OnRep_Controller();
// Le pendant client. Meme raison qu'OnRep_PlayerState juste au-dessus : rien
// ne dit lequel du pawn ou du controller arrive le premier, donc les deux
// bouts de la course appellent la meme fonction idempotente.
if (HeldItemComponent)
{
HeldItemComponent->RefreshFromInventory();
}
}
void AFpsPlayer::RefreshAppearanceFromPlayerState()
{
if (!AppearanceComponent)
@@ -470,6 +499,14 @@ void AFpsPlayer::Landed(const FHitResult& Hit)
FallSpeed, LandPunchMinFallSpeed);
}
// Le geste des bras suit le meme seuil bas que la camera : une marche
// d'escalier ne doit ni secouer la vue ni faire encaisser le personnage.
if (FallSpeed > LandPunchMinFallSpeed)
{
UAnimMontage* Montage = (FallSpeed >= HardLandingFallSpeed) ? HardLandMontage : LandMontage;
PlayArmsMontage(Montage);
}
LastFallSpeed = 0.f;
}
@@ -899,6 +936,11 @@ void AFpsPlayer::HandleDeath()
ClearTransientInputStates();
GetCharacterMovement()->DisableMovement();
// Un cadavre ne marche plus. Sans ca, la derniere foulee en cours produirait
// encore son pas final au moment ou la vitesse tombe a zero -- et HandleDeath
// tourne sur toutes les machines, donc les amis l'entendraient aussi.
FootstepComponent->SetFootstepsEnabled(false);
if (APlayerController* OwningController = Cast<APlayerController>(GetController()))
{
DisableInput(OwningController);