(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
@@ -10,6 +10,25 @@ class UMaterialInterface;
class UStaticMesh;
class UTexture2D;
/**
* Famille d'outil, pour l'appariement avec les ressources recoltables.
*
* C'est le TYPE qui decide de ce qu'on peut abattre, jamais le mesh ni le nom :
* un arbre acceptera { Axe }, un filon { Pickaxe }. None n'est pas un outil du
* tout -- c'est la valeur de tous les objets existants, qui ne changent donc pas
* de comportement.
*/
UENUM(BlueprintType)
enum class EToolType : uint8
{
None UMETA(DisplayName = "Not a tool"),
Axe,
Pickaxe,
/** Sentinelle de comptage, jamais assignee a un objet. */
Count UMETA(Hidden)
};
/**
* Definition d'un TYPE d'objet : "Bois", "Pomme", "Corde".
* Un asset par type, cree dans le Content Browser, edite a la main.
@@ -106,6 +125,100 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Backpack", meta = (ClampMin = "0"))
int32 BonusInventorySlots = 0;
// ------------------------------------------------------------------
// En main
//
// Ce qu'on voit quand l'objet occupe la case active de la barre rapide.
// C'est UHeldItemComponent qui lit ce bloc ; il ne concerne donc que le
// visuel, jamais ce que l'objet fait.
// ------------------------------------------------------------------
/**
* Cet objet apparait-il dans la main quand il est selectionne.
*
* Faux par defaut, et c'est delibere : les deux offsets ci-dessous se reglent
* a l'oeil, objet par objet, sur un socket donne. Un vrai par defaut ferait
* surgir toutes les ressources deja creees dans le poing du joueur, chacune
* de travers, sans que personne l'ait demande.
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held")
bool bShowInHand = false;
/**
* Mesh tenu en main. Vide = on reprend WorldMesh.
*
* A ne remplir que si l'objet au sol et l'objet en main different vraiment --
* une buche posee en tas contre une buche unique, typiquement. Une hache,
* elle, est la meme des deux cotes.
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held", meta = (EditCondition = "bShowInHand"))
TObjectPtr<UStaticMesh> HeldMesh;
/**
* Ajustement du mesh sur le socket des BRAS (vue premiere personne).
*
* Necessaire parce qu'on s'attache a un OS du rig et pas a un socket taille
* pour l'objet : le pivot d'un mesh d'outil tombe presque toujours sur son
* centre, jamais sur le manche. Se regle a l'oeil en PIE.
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held", meta = (EditCondition = "bShowInHand"))
FTransform FirstPersonHeldOffset;
/**
* Ajustement sur la main du CORPS (ce que les autres joueurs voient).
*
* Separe du precedent, et il le restera : les bras FPS et le mannequin UE5
* sont deux rigs distincts, avec deux echelles et deux orientations d'os. Une
* transform commune donnerait forcement une hache de travers d'un cote.
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held", meta = (EditCondition = "bShowInHand"))
FTransform ThirdPersonHeldOffset;
/**
* Geste joue sur les BRAS quand cet objet arrive en main (MTG_Axe_Equip...).
*
* Un montage et pas un etat de la machine a etats : sortir un outil est un
* geste PONCTUEL qui doit se superposer a ce que les bras faisaient deja --
* meme raison que LandMontage. Un etat imposerait de decider combien de temps
* y rester, et changer d'outil en pleine course y bloquerait la foulee.
*
* Vide = l'objet apparait sans geste, ce qui reste parfaitement jouable.
* Rien n'est replique : les bras ne sont vus que par leur proprietaire.
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Held")
TObjectPtr<class UAnimMontage> EquipMontage;
/** Le mesh a montrer en main, en appliquant le repli sur WorldMesh. */
UFUNCTION(BlueprintPure, Category = "Item|Held")
UStaticMesh* GetHeldMesh() const { return HeldMesh ? HeldMesh.Get() : WorldMesh.Get(); }
/**
* Pose le mesh tenu en main et son materiau sur un composant.
* Pendant exact d'ApplyWorldVisualsTo, dont c'est le second appelant annonce.
*/
UFUNCTION(BlueprintCallable, Category = "Item|Held")
void ApplyHeldVisualsTo(class UStaticMeshComponent* Component) const;
// ------------------------------------------------------------------
// Outil
//
// Volontairement reduit au TYPE pour l'instant : la puissance de recolte et
// le cout en durabilite d'un coup n'ont pas encore de lecteur, et inventer
// leur forme avant d'ecrire les ressources recoltables serait deviner.
//
// L'usure, elle, est deja tranchee : ce sera MaxUses / RemainingUses, comme
// une canette. Un outil neuf part donc a MaxUses charges, l'inventaire les
// suit deja au sol comme dans un coffre, et WBP_ItemDetails affiche deja la
// barre correspondante -- rien a ajouter le jour venu.
// ------------------------------------------------------------------
/** Ce que cet objet sait recolter. None = ce n'est pas un outil. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Tool")
EToolType ToolType = EToolType::None;
UFUNCTION(BlueprintPure, Category = "Item|Tool")
bool IsTool() const { return ToolType != EToolType::None; }
// ------------------------------------------------------------------
// Consommable
// ------------------------------------------------------------------