Files

91 lines
3.2 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Interactable.h"
#include "PickupItem.generated.h"
class UItemDataAsset;
class USphereComponent;
class UStaticMeshComponent;
/**
* Un objet pose dans le monde. Il ne DECRIT pas l'objet, il ne fait que
* pointer vers son UItemDataAsset et porter une quantite.
*
* Consequence pratique : pour creer un nouveau type de ramassable, tu n'as
* plus besoin d'un Blueprint par objet. Un seul BP_Pickup suffit, tu changes
* juste l'ItemData sur chaque instance posee dans le niveau.
*/
UCLASS()
class SURVIVAL_PROJET_API APickupItem : public AActor, public IInteractable
{
GENERATED_BODY()
public:
APickupItem();
/**
* Configure un pickup engendre a l'execution (objet jete au sol).
* A appeler entre SpawnActorDeferred() et FinishSpawning() pour que
* OnConstruction ait deja les bonnes donnees et pose le bon mesh.
*/
UFUNCTION(BlueprintCallable, Category = "Item")
void InitPickup(UItemDataAsset* InItemData, int32 InQuantity, int32 InRemainingUses = -1);
// --- IInteractable ---
virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const override;
virtual bool CanInteract_Implementation(AActor* Interactor) const override;
virtual void Interact_Implementation(AActor* Interactor) override;
virtual void OnBeginFocus_Implementation() override;
virtual void OnEndFocus_Implementation() override;
protected:
/**
* Sans garde WITH_EDITOR : on veut aussi que le mesh se pose correctement
* sur les pickups engendres a l'execution quand on jette un objet.
*/
virtual void OnConstruction(const FTransform& Transform) override;
/** Visuel uniquement, sans collision. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item")
TObjectPtr<UStaticMeshComponent> Mesh;
/**
* Volume que le trace d'interaction vient toucher.
* Volontairement separe du mesh : beaucoup de meshes d'asset packs,
* en particulier la vegetation, n'ont aucune geometrie de collision.
* Avec une sphere dediee, le pickup fonctionne quel que soit le visuel.
*/
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item")
TObjectPtr<USphereComponent> InteractionSphere;
/** Quel objet ce pickup represente. A assigner sur chaque instance. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
TObjectPtr<UItemDataAsset> ItemData;
/** Combien d'exemplaires ce tas contient. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item", meta = (ClampMin = "1"))
int32 Quantity = 1;
/**
* Charges restantes pour un objet a usages multiples.
* -1 = plein, ce qui est le cas de tout objet pose a la main dans le niveau.
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
int32 RemainingUses = -1;
/**
* Reprend automatiquement le WorldMesh de l'ItemData dans l'editeur.
* Decoche pour imposer un mesh different sur une instance precise.
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
bool bUseMeshFromItemData = true;
/** Active le Custom Depth quand l'objet est vise. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
bool bHighlightOnFocus = true;
};