Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Spawner.h"
- #include "Enemy.h"
- #include "EnemyAIController.h"
- #include "Tower.h"
- #include "Blueprint/AIAsyncTaskBlueprintProxy.h"
- #include "Blueprint/AIBlueprintHelperLibrary.h"
- #include "Components/AudioComponent.h"
- #include "GameFramework/CharacterMovementComponent.h"
- #include "Kismet/GameplayStatics.h"
- #include "Kismet/KismetMathLibrary.h"
- #include "Blueprint/AIBlueprintHelperLibrary.h"
- ASpawner::ASpawner()
- {
- srand(time(nullptr));
- SpawnRate = 2.0f;
- EnemiesSpawned = 0;
- GoalActor = nullptr;
- CurrentWave = 0;
- EnemiesLeft = 0;
- bIsPaused = false;
- PauseTime = 10.0f;
- Countdown = 0.0f;
- bIsPlayingCountdown = false;
- PrimaryActorTick.bCanEverTick = true;
- RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("SpawnerSceneComponent"));
- // BoxComponent setup
- BoxComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("Sphere"));
- BoxComponent->SetBoxExtent(FVector(200.0f, 200.0f, 50.0f));
- BoxComponent->SetHiddenInGame(false);
- BoxComponent->SetupAttachment(RootComponent);
- //Find Countdown sound cue
- const ConstructorHelpers::FObjectFinder<USoundCue> Sound(TEXT("/Game/Sounds/General/Countdown"));
- if (Sound.Succeeded())
- CountdownSound = Sound.Object;
- const ConstructorHelpers::FObjectFinder<USoundCue> WaveFinished(TEXT("/Game/Sounds/General/SQ_Wave_finished"));
- if (WaveFinished.Succeeded())
- WaveFinishedSound = WaveFinished.Object;
- // AudioComponent Setup
- AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("AudioComponent"));
- AudioComponent->SetupAttachment(RootComponent);
- AudioComponent->VolumeMultiplier = 0.4f;
- AudioComponent->Activate(true);
- }
- void ASpawner::CreateWave()
- {
- ++CurrentWave;
- CurrentWaveEnemies = EnemyCountPerWave->GetFloatValue(static_cast<float>(CurrentWave));
- EnemiesLeft = CurrentWaveEnemies;
- EnemiesLeftToKill = EnemiesLeft;
- EnemiesToSpawn = FMath::FloorToInt(rand() % EnemiesLeft);
- CheckEnemiesLeftToSpawn();
- GetWorld()->GetTimerManager().SetTimer(SpawnTimer, this, &ASpawner::CheckEnemiesLeftToSpawn, 3.0f, true);
- bIsPaused = false;
- }
- void ASpawner::SpawnEnemies()
- {
- for (int32 i = 0; i < EnemiesToSpawn; ++i)
- {
- FActorSpawnParameters SpawnInfo;
- SpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
- const auto Point = UKismetMathLibrary::RandomPointInBoundingBox(
- GetActorLocation(), BoxComponent->GetScaledBoxExtent());
- const auto Enemy = GetWorld()->SpawnActor<AEnemy>(Point, FRotator(0.0f, FMath::RandRange(0.0f, 360.0f), 0.0f),
- SpawnInfo);
- Enemy->Spawner = this;
- Enemy->SpawnDefaultController();
- ++EnemiesSpawned;
- }
- EnemiesLeft -= EnemiesToSpawn;
- }
- void ASpawner::CheckEnemiesLeftToSpawn()
- {
- if (EnemiesLeft > 0)
- {
- EnemiesToSpawn = FMath::RandRange(1, EnemiesLeft);
- SpawnEnemies();
- }
- if (EnemiesLeft < 0)
- {
- EnemiesLeft = 0;
- }
- }
- void ASpawner::BeginPlay()
- {
- Super::BeginPlay();
- CreateWave();
- }
- void ASpawner::Tick(float DeltaTime)
- {
- Super::Tick(DeltaTime);
- if (EnemiesLeftToKill == 0 && !bIsPaused)
- {
- GetWorld()->GetTimerManager().ClearTimer(SpawnTimer);
- FTimerHandle WavePause;
- Countdown = PauseTime;
- bIsPaused = true;
- bIsPlayingCountdown = false;
- UGameplayStatics::PlaySound2D(GetWorld(), WaveFinishedSound, 1.0f);
- GetWorld()->GetTimerManager().SetTimer(WavePause, [this]()
- {
- CreateWave();
- }, PauseTime, false);
- }
- if (bIsPaused)
- {
- Countdown -= DeltaTime;
- if (FMath::RoundToInt(Countdown) == 3 && !bIsPlayingCountdown)
- {
- UGameplayStatics::PlaySound2D(GetWorld(), CountdownSound, 1.0f);
- bIsPlayingCountdown = true;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement