C++ code spawns actor twice

Is this what you want?

PuzzleCrystal.h

#pragma once

#include "GameFramework/Actor.h"
#include "PuzzleCrystal.generated.h"

UCLASS()
class APuzzleCrystal : public AActor
{
	GENERATED_BODY()

public:
	APuzzleCrystal();

	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

	// Called every frame
	virtual void Tick(float DeltaSeconds) override;

	UPROPERTY(EditAnywhere, Category = General)
	TSubclassOf<AActor> WhatToSpawn;

	UPROPERTY(Category = Block, VisibleDefaultsOnly, BLueprintReadOnly, meta = (AllowPrivateAccess = "true"))
	TWeakObjectPtr<AActor> Crystal;

private:
	UPROPERTY()
	class USceneComponent *Root;

	UPROPERTY()
	class UBillboardComponent *Billboard;
};

PuzzleCrystal.cpp

#include "PuzzleFromZiro.h"
#include "PuzzleCrystal.h"

#include "Components/BillboardComponent.h"

// Sets default values
APuzzleCrystal::APuzzleCrystal()
{
	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	struct FConstructorStatics
	{
		ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalRed;
		ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalBlue;
		ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalGreen;
		ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalYellow;
		FConstructorStatics()
			:CrystalRed(TEXT("/Game/Objects/Crystal/Blueprint/Red.Red"))
			, CrystalBlue(TEXT("/Game/Objects/Crystal/Blueprint/Blue.Blue"))
			, CrystalGreen(TEXT("/Game/Objects/Crystal/Blueprint/Green.Green"))
			, CrystalYellow(TEXT("/Game/Objects/Crystal/Blueprint/Yellow.Yellow"))
		{
		}
	};


	static FConstructorStatics ConstructorStatics;

	Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
	RootComponent = Root;

	Billboard = CreateDefaultSubobject<UBillboardComponent>(TEXT("Billboard"));
	Billboard->AttachTo(RootComponent);

	UBlueprint *CrystalType = nullptr;
	switch (rand() % 4)
	{
	case 0:CrystalType = ConstructorStatics.CrystalRed.Get();
		break;
	case 1:CrystalType = ConstructorStatics.CrystalBlue.Get();
		break;
	case 2:CrystalType = ConstructorStatics.CrystalGreen.Get();
		break;
	case 3:CrystalType = ConstructorStatics.CrystalYellow.Get();
		break;
	}

	if (CrystalType)
		WhatToSpawn = (UClass*)CrystalType->GeneratedClass;
}

// Called when the game starts or when spawned
void APuzzleCrystal::BeginPlay()
{
	Super::BeginPlay();

	if (WhatToSpawn != NULL)
	{
		FActorSpawnParameters SpawnParametrs;
		SpawnParametrs.Owner = this;
		SpawnParametrs.bNoFail = true;
		UWorld* const World = GetWorld();
		if (World)
		{
			Crystal = World->SpawnActor<AActor>(WhatToSpawn, GetActorLocation(), 
				{ 90.0, 0.0, -90.0 }, SpawnParametrs);
		}
	}
}

// Called every frame
void APuzzleCrystal::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}