// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/PlayerController.h" #include "FpsPlayerController.generated.h" class UHotbarWidget; class UInputAction; class UInventoryComponent; class UInteractionPromptWidget; class UInventoryWidget; class UScreenFadeComponent; class USurvivalStatsWidget; class UUserWidget; struct FInputActionValue; /** * Controller du joueur. C'est ici que vit l'UI, et pas dans le personnage : * le controller survit a la mort du pawn, alors que le personnage non. * Si tu creais le HUD dans AFpsPlayer, il disparaitrait a chaque respawn. */ UCLASS() class SURVIVAL_PROJET_API AFpsPlayerController : public APlayerController { GENERATED_BODY() public: AFpsPlayerController(); /** Ouvre ou ferme l'inventaire. */ UFUNCTION(BlueprintCallable, Category = "UI") void ToggleInventory(); UFUNCTION(BlueprintPure, Category = "UI") bool IsInventoryOpen() const { return bInventoryOpen; } protected: virtual void BeginPlay() override; virtual void OnPossess(APawn* InPawn) override; virtual void SetupInputComponent() override; virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; // ------------------------------------------------------------------ // Fondus // // La mécanique elle-même vit dans UScreenFadeComponent, partagé avec le // menu principal. Ici on ne garde que les durées propres au jeu. // La couleur et le WBP_Fade se règlent sur le composant. // ------------------------------------------------------------------ /** Le voile. Assigne-lui ton WBP_Fade dans BP_FpsPlayerController. */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "UI|Fondu") TObjectPtr ScreenFade; /** Décoche pour démarrer sans fondu, pratique pendant les tests. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI|Fondu") bool bFadeInOnStart = true; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI|Fondu", meta = (ClampMin = "0.1")) float StartupFadeDuration = 1.5f; /** Durée du fondu au noir quand le joueur meurt. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI|Fondu", meta = (ClampMin = "0.1")) float DeathFadeDuration = 1.f; /** * Temps total entre la mort et la réapparition. * Doit rester supérieur à DeathFadeDuration, sinon le joueur réapparaît * avant que l'écran soit entièrement noir. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI|Fondu", meta = (ClampMin = "0.1")) float RespawnDelay = 3.f; /** * Ouverture de l'inventaire, valeur Digital (bool). * L'input d'interface vit sur le controller et non sur le pawn : ouvrir * son sac doit rester possible meme sans corps a piloter. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input") TObjectPtr ToggleInventoryAction; /** * Jette l'objet survole, valeur Digital (bool). Ctrl enfonce = un seul * exemplaire au lieu de la pile entiere. * Sur le controller aussi : le pawn a ses inputs coupes quand l'inventaire * est ouvert, donc un binding sur le pawn ne repondrait jamais. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input") TObjectPtr DropItemAction; /** * Selection directe d'un slot de la barre rapide, valeur Axis1D. * * Une seule action pour toutes les touches : dans IMC_Default, mappe les * touches 1 a 6 sur cette action et donne a chacune un modificateur * Scalar different (1, 2, 3...). Le handler lit la valeur et en deduit * le slot. Six actions separees seraient six assets a maintenir. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input") TObjectPtr HotbarSelectAction; /** Molette de souris pour defiler dans la barre, valeur Axis1D. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input") TObjectPtr HotbarScrollAction; /** * Viseur, affiche en permanence. Widget separe du prompt : ce dernier se * met en Collapsed des qu'on ne vise plus rien, et emporterait le viseur * avec lui s'ils partageaient le meme widget. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") TSubclassOf CrosshairClass; /** A assigner dans BP_FpsPlayerController : ton WBP_InteractionPrompt. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") TSubclassOf InteractionPromptClass; /** Ton WBP_Inventory. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") TSubclassOf InventoryClass; /** Ton WBP_Hotbar, affiche en permanence. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") TSubclassOf HotbarClass; /** Ton WBP_SurvivalStats : les trois jauges. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI") TSubclassOf SurvivalStatsClass; UPROPERTY(Transient, BlueprintReadOnly, Category = "UI") TObjectPtr Crosshair; UPROPERTY(Transient, BlueprintReadOnly, Category = "UI") TObjectPtr InteractionPrompt; UPROPERTY(Transient, BlueprintReadOnly, Category = "UI") TObjectPtr InventoryWidget; UPROPERTY(Transient, BlueprintReadOnly, Category = "UI") TObjectPtr Hotbar; UPROPERTY(Transient, BlueprintReadOnly, Category = "UI") TObjectPtr SurvivalStatsWidget; private: void CreateHudWidgets(); /** Jette la pile survolee dans la grille, si l'inventaire est ouvert. */ void DropHoveredItem(); void HandleHotbarSelect(const FInputActionValue& Value); void HandleHotbarScroll(const FInputActionValue& Value); /** Raccourci vers l'inventaire du pawn possede. */ UInventoryComponent* GetPawnInventory() const; /** Branche sur OnDied du pawn possede. */ UFUNCTION() void HandlePawnDied(); /** Detruit le cadavre et demande un nouveau pawn au GameMode. */ void RespawnPlayer(); FTimerHandle RespawnTimerHandle; bool bInventoryOpen = false; };