Files
Unreal_EmberWild/Source/Survival_projet/Public/CraftingStation.h
T

66 lines
2.4 KiB
C++

// 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 SURVIVAL_PROJET_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<UStaticMeshComponent> 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;
};