78 lines
3.1 KiB
C++
78 lines
3.1 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "UObject/Interface.h"
|
|
#include "Interactable.generated.h"
|
|
|
|
/**
|
|
* Classe technique requise par Unreal. On ne la manipule jamais directement,
|
|
* elle sert uniquement au systeme de reflection : c'est elle qu'on passe a
|
|
* Implements<UInteractable>() et a Execute_XXX().
|
|
*/
|
|
UINTERFACE(MinimalAPI, BlueprintType)
|
|
class UInteractable : public UInterface
|
|
{
|
|
GENERATED_BODY()
|
|
};
|
|
|
|
/**
|
|
* A implementer par tout ce avec quoi le joueur peut interagir : objets a
|
|
* ramasser, portes, coffres, etablis, plantes a recolter.
|
|
*
|
|
* Les fonctions sont des BlueprintNativeEvent : une classe C++ surcharge
|
|
* XXX_Implementation(), un Blueprint surcharge l'evenement du meme nom.
|
|
* Les deux fonctionnent, et l'appelant n'a pas a savoir lequel des deux
|
|
* il a en face -- c'est tout l'interet de passer par une interface.
|
|
*
|
|
* IMPORTANT : pour appeler ces fonctions depuis l'exterieur, utilise
|
|
* IInteractable::Execute_Interact(Actor, Interactor) et jamais
|
|
* Actor->Interact() directement. Seul le wrapper Execute_ sait router
|
|
* l'appel vers une implementation Blueprint.
|
|
*/
|
|
class SURVIVAL_PROJET_API IInteractable
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
/**
|
|
* Texte affiche au joueur quand il vise l'objet ("Ramasser", "Ouvrir"...).
|
|
* Renvoie du FText et non du FString : c'est le type localisable d'Unreal,
|
|
* indispensable si tu traduis le jeu un jour.
|
|
*
|
|
* Interactor est fourni parce que le texte depend souvent de CELUI qui vise
|
|
* et d'ou il vise : un feu de camp nomme l'emplacement precis qu'on regarde,
|
|
* un coffre verrouille annonce quelle cle il attend. Sans lui, l'objet
|
|
* devrait aller chercher le joueur local par un chemin detourne -- ce qui
|
|
* marche exactement jusqu'au jour ou il y a deux joueurs.
|
|
*/
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
FText GetInteractionPrompt(AActor* Interactor) const;
|
|
virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const { return FText::GetEmpty(); }
|
|
|
|
/**
|
|
* Permet de refuser l'interaction selon le contexte : porte verrouillee,
|
|
* inventaire plein, competence manquante. Renvoyer false empeche l'objet
|
|
* d'etre meme selectionne par le composant d'interaction.
|
|
*/
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
bool CanInteract(AActor* Interactor) const;
|
|
virtual bool CanInteract_Implementation(AActor* Interactor) const { return true; }
|
|
|
|
/** L'interaction elle-meme. Interactor est le pawn du joueur. */
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
void Interact(AActor* Interactor);
|
|
virtual void Interact_Implementation(AActor* Interactor) {}
|
|
|
|
/** Le joueur commence a viser l'objet : surbrillance, son, animation. */
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
void OnBeginFocus();
|
|
virtual void OnBeginFocus_Implementation() {}
|
|
|
|
/** Le joueur ne vise plus l'objet. */
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
void OnEndFocus();
|
|
virtual void OnEndFocus_Implementation() {}
|
|
};
|