// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimNotifies/AnimNotify.h"
#include "AnimNotify_ItemAction.generated.h"

/**
 * Declenche l'effet de l'objet en main a l'instant precis ou le geste frappe.
 *
 * ------------------------------------------------------------------
 * Pourquoi un notify plutot que le clic
 * ------------------------------------------------------------------
 *
 * Le clic gauche et le COUP sont deux choses distinctes, separees par le temps
 * que met le bras a descendre. Faire partir le trace de recolte sur l'appui
 * donne une hache qui abat l'arbre avant de l'avoir touche : le joueur voit le
 * resultat, puis l'animation qui aurait du le produire. C'est le meme
 * decalage qu'un bruit de pas joue au debut de la foulee.
 *
 * L'instant de l'impact n'est pas une valeur qu'on puisse ecrire en C++ : il
 * appartient a l'ANIMATION, il change d'un montage a l'autre, et il rebouge a
 * chaque fois qu'on retouche la courbe. Un delai en secondes sur le DataAsset
 * serait a re-regler a la main a chaque nouvelle animation livree -- et faux
 * des qu'on toucherait au Play Rate. Le marqueur, lui, suit le montage.
 *
 * ------------------------------------------------------------------
 * Reseau : ce notify ne tombe QUE chez le joueur local
 * ------------------------------------------------------------------
 *
 * Le montage d'usage est joue sur les BRAS, qui sont en OnlyOwnerSee et
 * n'existent visuellement que chez le proprietaire du pawn
 * (UHeldItemComponent::PlayLocalArmsMontage). Le notify part donc sur une
 * seule machine, exactement comme le clic qu'il remplace, et le routage vers
 * le serveur reste celui d'avant : AFpsPlayer::TriggerHeldItemAction envoie la
 * RPC, le serveur fait autorite.
 *
 * Corollaire a ne pas oublier le jour ou un montage d'usage sera joue aussi sur
 * le CORPS (visible des autres joueurs) : ce montage-la tournerait sur les
 * quatre machines, et sans la garde IsLocallyControlled() de
 * TriggerHeldItemAction chaque coup de hache partirait en quatre exemplaires.
 */
UCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = "Item Action"))
class EMBERWILD_API UAnimNotify_ItemAction : public UAnimNotify
{
	GENERATED_BODY()

public:
	virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation,
		const FAnimNotifyEventReference& EventReference) override;

	virtual FString GetNotifyName_Implementation() const override;
};
