void UGameplayTask::ExternalCancel()
{
	UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
		, TEXT("%s ExternalCancel called, current State: %s")
		, *GetName(), *GetTaskStateName());

	EndTask();
}
void UGameplayTask::Resume()
{
    UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
            , TEXT("%s Resume called, current State: %s")
            , *GetName(), *GetTaskStateName());

    TaskState = EGameplayTaskState::Active;

    TasksComponent->OnGameplayTaskActivated(*this);
}
void UGameplayTask::Pause()
{
    UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
            , TEXT("%s Pause called, current State: %s")
            , *GetName(), *GetTaskStateName());

    TaskState = EGameplayTaskState::Paused;

    TasksComponent->OnGameplayTaskDeactivated(*this);
}
void UGameplayTask::ExternalConfirm(bool bEndTask)
{
	UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
		, TEXT("%s ExternalConfirm called, bEndTask = %s, State : %s")
		, *GetName(), bEndTask ? TEXT("TRUE") : TEXT("FALSE"), *GetTaskStateName());

	if (bEndTask)
	{
		EndTask();
	}
}
void UGameplayTask::EndTask()
{
	UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
		, TEXT("%s EndTask called, current State: %s")
		, *GetName(), *GetTaskStateName());

	if (TaskState != EGameplayTaskState::Finished && !IsPendingKill())
	{
		OnDestroy(false);
	}
}
void UGameplayTask::TaskOwnerEnded()
{
    UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
            , TEXT("%s TaskOwnerEnded called, current State: %s")
            , *GetName(), *GetTaskStateName());

    if (TaskState != EGameplayTaskState::Finished && !IsPendingKill())
    {
        bOwnerFinished = true;
        OnDestroy(true);
    }
}
void UGameplayTask::Resume()
{
	UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
		, TEXT("%s Resume called, current State: %s")
		, *GetName(), *GetTaskStateName());

	TaskState = EGameplayTaskState::Active;

	TasksComponent->OnTaskActivated(*this);

	if (bOwnedByTasksComponent == false && TaskOwner.IsValid())
	{
		TaskOwner->OnTaskActivated(*this);
	}
}
FString UGameplayTasksComponent::GetTasksPriorityQueueDescription() const
{
	FString TasksDescription;
	for (auto Task : TaskPriorityQueue)
	{
		if (Task != nullptr)
		{
			TasksDescription += FString::Printf(TEXT("\n%s %s"), *GetTaskStateName(Task->GetState()), *Task->GetDebugDescription());
		}
		else
		{
			TasksDescription += TEXT("\nNULL");
		}
	}
	return TasksDescription;
}
FString UGameplayTasksComponent::GetTickingTasksDescription() const
{
	FString TasksDescription;
	for (auto& Task : TickingTasks)
	{
		if (Task)
		{
			TasksDescription += FString::Printf(TEXT("\n%s %s"), *GetTaskStateName(Task->GetState()), *Task->GetDebugDescription());
		}
		else
		{
			TasksDescription += TEXT("\nNULL");
		}
	}
	return TasksDescription;
}
void UGameplayTask::Activate()
{
	UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose
		, TEXT("%s Activate called, current State: %s")
		, *GetName(), *GetTaskStateName());
}