EBTNodeResult::Type UBTTask_CloseDialogue::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
	EBTNodeResult::Type NodeResult = EBTNodeResult::Failed;

	if (!DialogueWidget.IsNone())
	{
		FName KeyName = DialogueWidget.SelectedKeyName;
		UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent();
		UUserWidget* Widget = Cast<UUserWidget>(BlackboardComp->GetValueAsObject(KeyName));
		UWidgetComponent* WidgetComp = Cast<UWidgetComponent>(BlackboardComp->GetValueAsObject(KeyName));

		if (!Widget && !WidgetComp)
		{
#if WITH_EDITOR
			FMessageLog("PIE").Error()
				->AddToken(FTextToken::Create(LOCTEXT("InvalidWidgetKey", "Invalid key for Dialogue Widget in ")))
				->AddToken(FUObjectToken::Create((UObject*)OwnerComp.GetCurrentTree()));
#endif
			return EBTNodeResult::Failed;
		}

		if (!Widget && WidgetComp)
		{
			Widget = CreateWidget<UUserWidget>(GetWorld(), WidgetComp->GetWidgetClass());
		}

		APlayerController* PlayerController = Widget->GetOwningPlayer();
		FInputModeGameOnly InputMode;
		PlayerController->SetInputMode(InputMode);

		if (Widget && Widget->IsInViewport())
		{
			Widget->RemoveFromParent();
		}

		switch (MouseOptions)
		{
		case ECloseDialogueCursorOptions::Show:
			PlayerController->bShowMouseCursor = true;
			break;
		default:
			PlayerController->bShowMouseCursor = false;
			break;
		}
	}
	// set camera default values
	if (!PlayerCamera.IsNone())
	{
		FName PlayerCameraKeyName = PlayerCamera.SelectedKeyName;
		UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent();
		UCameraComponent* PlayerCameraComp = Cast<UCameraComponent>(BlackboardComp->GetValueAsObject(PlayerCameraKeyName));

		if (PlayerCameraComp)
		{
			PlayerCameraComp->SetWorldLocationAndRotation(DefaultCameraLocation, DefaultCameraRotation);
			UBTTask_ShowPhrases* ShowPhrases = Cast<UBTTask_ShowPhrases>(FirstTaskNode);
			UBTTask_WaitAnswer* WaitAnswer = Cast<UBTTask_WaitAnswer>(FirstTaskNode);
			if (ShowPhrases)
			{
				ShowPhrases->DefaultCameraLocation = FVector(0.f, 0.f, 0.f);
			}
			if (WaitAnswer)
			{
				WaitAnswer->DefaultCameraLocation = FVector(0.f, 0.f, 0.f);
			}
		}
	}

	return NodeResult;
}