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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "NakatomiCMC.generated.h"

/**
 * 
 */
UCLASS()
class NAKATOMI_API UNakatomiCMC : public UCharacterMovementComponent
{
	GENERATED_BODY()

	class FSavedMove_Nakatomi : public FSavedMove_Character
	{
		typedef FSavedMove_Character Super;

		uint8 Saved_bWantsToSprint:1;

		virtual bool CanCombineWith(const FSavedMovePtr& NewMove, ACharacter* InCharacter, float MaxDelta) const override;
		virtual void Clear() override;
		virtual uint8 GetCompressedFlags() const override;
		virtual void SetMoveFor(ACharacter* C, float InDeltaTime, FVector const& NewAccel, FNetworkPredictionData_Client_Character& ClientData) override;
		virtual void PrepMoveFor(ACharacter* C) override;
	};

	class FNetworkPredictionData_Client_Nakatomi : public FNetworkPredictionData_Client_Character
	{
	public:
		FNetworkPredictionData_Client_Nakatomi(const UCharacterMovementComponent& ClientMovement);

		typedef FNetworkPredictionData_Client_Character Super;

		virtual FSavedMovePtr AllocateNewMove() override;
	};

	UPROPERTY(EditDefaultsOnly) float Sprint_MaxWalkSpeed;
	UPROPERTY(EditDefaultsOnly) float Walk_MaxWalkSpeed;
	
	bool Safe_bWantsToSprint;
	
public:
	UNakatomiCMC();

	FNetworkPredictionData_Client* GetPredictionData_Client() const override;
protected:
	virtual void UpdateFromCompressedFlags(uint8 Flags) override;

	virtual void OnMovementUpdated(float DeltaSeconds, const FVector& OldLocation, const FVector& OldVelocity) override;
	
public:
	UFUNCTION(BlueprintCallable)
	void EnableSprint();

	UFUNCTION(BlueprintCallable)
	void DisableSprint();

	UFUNCTION(BlueprintCallable)
	void EnableCrouch();

	UFUNCTION(BlueprintCallable)
	void DisableCrouch();
};