(Feat) Add Storage Chests + Item Details Panel
Coffres : AStorageContainer, un UInventoryComponent configure en conteneur, affiche comme panneau de WBP_InventoryScreen plutot que dans un ecran a lui. Deplacement unifie par UInventoryComponent::TransferSlot / TransferAllTo. Panneau de detail : UItemDetailsWidget, pose DANS WBP_Inventory a droite de la grille. Icone, nom, separation, description, barre d'usure. Il recoit un couple (inventaire, index) et s'abonne a OnInventoryChanged, donc une charge consommee sous le curseur se voit. Une case ne connait plus sa grille : elle diffuse OnHoverChanged. La barre rapide s'y abonne aussi et relaie par le PlayerController, seul a posseder a la fois le HUD et l'ecran. Le panneau efface la case qu'on QUITTE et non lui-meme, sinon passer de la barre a la grille viderait ce qui vient d'etre affiche. L'ecran allume et eteint le panneau (SetItemDetailsEnabled) : WBP_Inventory etant instancie deux fois en mode coffre, une case a cocher par instance serait un bug qui attend qu'on oublie de la decocher. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,9 +6,12 @@
|
||||
#include "Blueprint/UserWidget.h"
|
||||
#include "InventoryScreenWidget.generated.h"
|
||||
|
||||
class AStorageContainer;
|
||||
class UButton;
|
||||
class UCraftingWidget;
|
||||
class UInventoryComponent;
|
||||
class UInventoryWidget;
|
||||
class UTextBlock;
|
||||
class UWidgetSwitcher;
|
||||
|
||||
/**
|
||||
@@ -51,6 +54,19 @@ public:
|
||||
*/
|
||||
int32 GetHoveredSlotIndex() const;
|
||||
|
||||
/**
|
||||
* Meme chose, avec l'inventaire auquel la case appartient. Depuis les
|
||||
* coffres, l'index seul ne designe plus rien de facon unique.
|
||||
*/
|
||||
bool GetHoveredSlot(UInventoryComponent*& OutInventory, int32& OutIndex) const;
|
||||
|
||||
/**
|
||||
* Survol d'une case exterieure a l'ecran -- la barre rapide, qui reste
|
||||
* affichee par-dessus lui. Alimente le panneau de detail de la page
|
||||
* d'inventaire, seul panneau existant.
|
||||
*/
|
||||
void NotifyExternalSlotHovered(UInventoryComponent* Inventory, int32 SlotIndex, bool bHovered);
|
||||
|
||||
/** Revient sur l'onglet Inventaire. Appele a chaque ouverture par Tab. */
|
||||
UFUNCTION(BlueprintCallable, Category = "UI")
|
||||
void ShowInventoryTab();
|
||||
@@ -62,6 +78,29 @@ public:
|
||||
UPROPERTY(BlueprintAssignable, Category = "UI")
|
||||
FOnInventoryScreenTabChanged OnTabChanged;
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// Panneau de coffre
|
||||
//
|
||||
// Le contenu d'un coffre s'affiche A COTE de la grille du joueur, dans ce
|
||||
// meme ecran, et non dans un ecran a part. La raison est du ressenti pur :
|
||||
// le sac ne bouge pas d'un pixel entre "j'ouvre mon sac" et "j'ouvre un
|
||||
// coffre". Deux ecrans distincts le feraient sauter a chaque fois.
|
||||
//
|
||||
// Techniquement c'est une deuxieme instance du MEME WBP_Inventory que
|
||||
// InventoryPage. Elle ne peut pas vivre a l'interieur de WBP_Inventory :
|
||||
// un Widget Blueprint qui se contient lui-meme est une reference
|
||||
// circulaire, et UMG refuse de le compiler.
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
/** Branche et affiche le panneau de droite. Force l'onglet Inventaire. */
|
||||
void ShowStorage(AStorageContainer* Container);
|
||||
|
||||
/** Masque et debranche le panneau. Sans effet s'il est deja cache. */
|
||||
void HideStorage();
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "UI|Storage")
|
||||
bool IsStorageVisible() const { return bStorageVisible; }
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Absorbe ou traite les depots qui ne visent aucune page.
|
||||
@@ -91,7 +130,45 @@ protected:
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
TObjectPtr<UCraftingWidget> CraftingPage;
|
||||
|
||||
/**
|
||||
* Tout le bloc de droite -- cadre, titre, grille, boutons -- qu'on montre et
|
||||
* qu'on cache d'un bloc.
|
||||
*
|
||||
* BindWidgetOptional et non BindWidget, comme tous les elements de coffre
|
||||
* qui suivent : l'ecran doit rester valide dans un projet ou personne n'a
|
||||
* encore construit ce panneau. Sans ca, ajouter les coffres casserait la
|
||||
* compilation de WBP_InventoryScreen tant que la mise en page n'est pas
|
||||
* faite -- et donc l'inventaire entier.
|
||||
*/
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
TObjectPtr<UWidget> StoragePanel;
|
||||
|
||||
/** Un deuxieme WBP_Inventory, renomme "StorageGrid". DECOCHE-lui Auto Bind To Pawn. */
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
TObjectPtr<UInventoryWidget> StorageGrid;
|
||||
|
||||
/** Nom du coffre ouvert. */
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
TObjectPtr<UTextBlock> StorageTitle;
|
||||
|
||||
/** Deverse la grille du sac dans le coffre. La barre rapide n'y passe pas. */
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
TObjectPtr<UButton> StoreAllButton;
|
||||
|
||||
/** Vide le coffre dans le sac, dans la limite de la place disponible. */
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
TObjectPtr<UButton> TakeAllButton;
|
||||
|
||||
private:
|
||||
UFUNCTION()
|
||||
void HandleStoreAllClicked();
|
||||
|
||||
UFUNCTION()
|
||||
void HandleTakeAllClicked();
|
||||
|
||||
/** Inventaire du pawn possede, ou nullptr. */
|
||||
UInventoryComponent* GetPlayerInventory() const;
|
||||
|
||||
UFUNCTION()
|
||||
void HandleInventoryTabClicked();
|
||||
|
||||
@@ -108,4 +185,16 @@ private:
|
||||
void ShowPage(UWidget* Page);
|
||||
|
||||
bool IsInventoryTabActive() const;
|
||||
|
||||
/**
|
||||
* Le panneau de coffre est affiche.
|
||||
*
|
||||
* Tant qu'il l'est, l'onglet Fabrication est grise : fabriquer avec un
|
||||
* coffre ouvert a cote n'a pas de sens tant que ses ressources ne comptent
|
||||
* pas dans les recettes, et laisser le bouton actif inviterait a un clic
|
||||
* dont le resultat serait incomprehensible.
|
||||
*/
|
||||
bool bStorageVisible = false;
|
||||
|
||||
TWeakObjectPtr<UInventoryComponent> BoundStorage;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user