// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CraftingRecipeDataAsset.h" #include "Interactable.h" #include "CraftingStation.generated.h" class UStaticMeshComponent; /** * Un poste de travail pose dans le monde : etabli, et ce qui suivra. * * Il ne fabrique rien lui-meme et ne contient aucune recette. Tout ce qu'il * fait, c'est ouvrir l'ecran de fabrication en annoncant SON type de poste -- * le reste appartient au UCraftingComponent du joueur, qui filtrera les * recettes en consequence. * * L'acces au poste ne dure que le temps de l'ecran : c'est le controller qui * l'accorde a l'ouverture et le reprend a la fermeture. Un etabli qui donnerait * son acces "par proximite" obligerait a surveiller la distance en permanence, * pour un resultat que le joueur comprendrait moins bien -- ici on fabrique a * l'etabli parce qu'on est en train de s'en servir. * * Un seul BP_CraftingStation suffit pour tous les postes : c'est StationType * qui change par instance, comme ItemData sur BP_Pickup. */ UCLASS() class EMBERWILD_API ACraftingStation : public AActor, public IInteractable { GENERATED_BODY() public: ACraftingStation(); // --- IInteractable --- virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const override; virtual void Interact_Implementation(AActor* Interactor) override; protected: /** * Le visuel ET la surface d'interaction. * * Pas de sphere dediee ici, contrairement a APickupItem : un poste est un * meuble construit, dont le mesh a une vraie collision simple. Une sphere * autour d'un volume pareil serait touchee AVANT lui -- le trace s'arrete au * premier bloqueur -- et le prompt apparaitrait en visant le vide autour, ou * masquerait un objet pose au pied du meuble. * * Corollaire : le mesh assigne doit avoir une collision simple. Sans elle, * le trace le traverse, puisqu'il est lance en bTraceComplex = false. */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Crafting") TObjectPtr Mesh; /** Le poste que cet acteur rend accessible pendant qu'on s'en sert. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Crafting") ECraftingStation StationType = ECraftingStation::Workbench; /** Texte affiche quand le joueur vise le poste. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Crafting") FText InteractionPrompt; };