From 1b78a027c49273e1f1606763036a354bc3abc1d5 Mon Sep 17 00:00:00 2001 From: sSebster Date: Fri, 14 Mar 2025 18:25:10 +0100 Subject: [PATCH] Fix : Wave manager not starting new wave --- Content/Legumix/Spawner/DT_WavePreset.uasset | 4 +- Content/Legumix/Spawner/LVL_TestSpawn.umap | 4 +- Source/LegumeMix/Private/LMSpawnPosition.cpp | 6 +- Source/LegumeMix/Private/LMWaveManager.cpp | 67 ++++++++++++-------- Source/LegumeMix/Public/LMSpawnPosition.h | 2 +- Source/LegumeMix/Public/LMWaveManager.h | 6 +- 6 files changed, 54 insertions(+), 35 deletions(-) diff --git a/Content/Legumix/Spawner/DT_WavePreset.uasset b/Content/Legumix/Spawner/DT_WavePreset.uasset index 69cfca0..98efd95 100644 --- a/Content/Legumix/Spawner/DT_WavePreset.uasset +++ b/Content/Legumix/Spawner/DT_WavePreset.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4dc980d10370e54247d6d2b0bd1cd609110484abbbff020f22414b7261c5777 -size 2889 +oid sha256:0a8c14f41d1b2e5c1655d90dbbf4bf5ad091136fc028d831c2791b67dade66f5 +size 3973 diff --git a/Content/Legumix/Spawner/LVL_TestSpawn.umap b/Content/Legumix/Spawner/LVL_TestSpawn.umap index babf3e9..9b6ae55 100644 --- a/Content/Legumix/Spawner/LVL_TestSpawn.umap +++ b/Content/Legumix/Spawner/LVL_TestSpawn.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bcb5b01b681fff1a03e31833c07c4f3f7d7201fc37d0f0216cbc4714a96d1526 -size 81157 +oid sha256:36cb7d68cdfa4a650a8d7b5eda3ede2b57ebcd8d308d6b3e6a27ecd35fe5b7fc +size 81266 diff --git a/Source/LegumeMix/Private/LMSpawnPosition.cpp b/Source/LegumeMix/Private/LMSpawnPosition.cpp index 6aaa7ec..c8a727d 100644 --- a/Source/LegumeMix/Private/LMSpawnPosition.cpp +++ b/Source/LegumeMix/Private/LMSpawnPosition.cpp @@ -14,7 +14,7 @@ ALMSpawnPosition::ALMSpawnPosition() } -bool ALMSpawnPosition::CanSpawn() const +bool ALMSpawnPosition::CanSpawn() { return !IsPlayerVisible() && !IsOnCooldow; } @@ -59,7 +59,7 @@ bool ALMSpawnPosition::IsPlayerVisible() const if (bHit) { //UE_LOG(LogTemp, Warning, TEXT("LineTrace Hit: %s"), *HitResult.GetActor()->GetName()); - return HitResult.GetActor() == Player; // Retourne true uniquement si l'acteur touché est le joueur + return (HitResult.GetActor() == Player && !IsOnCooldow); // Retourne true uniquement si l'acteur touché est le joueur } //UE_LOG(LogTemp, Warning, TEXT("LineTrace: No Hit")); @@ -69,12 +69,14 @@ bool ALMSpawnPosition::IsPlayerVisible() const void ALMSpawnPosition::StarCooldown() { IsOnCooldow = true; + UE_LOG(LogTemp, Warning, TEXT("Spawner Cooldown")); GetWorld()->GetTimerManager().SetTimer(ProcessCooldown, this, &ALMSpawnPosition::EndCooldown, TimerCooldown, false); } void ALMSpawnPosition::EndCooldown() { IsOnCooldow = false; + UE_LOG(LogTemp, Warning, TEXT("Spawner End Cooldown")); } diff --git a/Source/LegumeMix/Private/LMWaveManager.cpp b/Source/LegumeMix/Private/LMWaveManager.cpp index 2e4427c..d19dc78 100644 --- a/Source/LegumeMix/Private/LMWaveManager.cpp +++ b/Source/LegumeMix/Private/LMWaveManager.cpp @@ -37,7 +37,7 @@ void ALMWaveManager::SpawnEnemy(ALMSpawnPosition* spawnPosition) if (!tempEnemy) { - UE_LOG(LogTemp, Error, TEXT("Failed to spawn enemy!")); + //UE_LOG(LogTemp, Error, TEXT("Failed to spawn enemy!")); return; } spawnPosition->StarCooldown(); @@ -50,7 +50,7 @@ void ALMWaveManager::SpawnEnemy(ALMSpawnPosition* spawnPosition) //bind la method ennemydead à la death de l'ennemis tempEnemy->OnEnemyDeath.AddDynamic(this, &ALMWaveManager::EnemyDead); - UE_LOG(LogTemp, Error, TEXT("Succes to spawn and bind on death method")); + //UE_LOG(LogTemp, Error, TEXT("Succes to spawn and bind on death method")); EnemySpawned++; EnemiesPerType[RandomIndex]--; @@ -65,15 +65,9 @@ void ALMWaveManager::EnemyDead(ALMEnemy* enemyToRemoveFromLife) bool ALMWaveManager::RemainsEnemyToSpawn() { - int TotalEnemies = 0; - - for (int EnemyCount : EnemiesPerType) - { - TotalEnemies += EnemyCount; - } - bool stillToSpawn = TotalEnemies !=0; - bool no = EnemyAliveList.Num() < MaxEnemyInstantiate; - return EnemyNumberInWave != EnemySpawned && no && stillToSpawn; + bool StillToSpawn = TotalOfEnemyToStillSpawn() !=0; + bool NoEnemyLeftToSpawn = EnemyAliveList.Num() < MaxEnemyInstantiate; + return EnemyNumberInWave != EnemySpawned && NoEnemyLeftToSpawn && StillToSpawn; } void ALMWaveManager::CheckForSpawnerOK() @@ -88,6 +82,17 @@ void ALMWaveManager::CheckForSpawnerOK() } } +int ALMWaveManager::TotalOfEnemyToStillSpawn() +{ + int TotalEnemies = 0; + + for (int EnemyCount : EnemiesPerType) + { + TotalEnemies += EnemyCount; + } + return TotalEnemies; +} + void ALMWaveManager::GetRandomDataWaveRow() { TArray RowNames = WaveDatePreset->GetRowNames(); @@ -97,17 +102,18 @@ void ALMWaveManager::GetRandomDataWaveRow() CurrentWaveName = WaveName.ToString(); FLMWaveStructure* InfoWaveRow = WaveDatePreset->FindRow(WaveName, ""); - - //InternalEnemyRatio = InfoWaveRow->WaveComposition; + EnemyNumberInWave = InfoWaveRow->EnemyCount; MaxEnemyInstantiate = InfoWaveRow->MaxEnemyCount; - + + AllEnemyType.Empty(); for (const FLMEnemyRatio& EnemyRatio : InfoWaveRow->WaveComposition) { // Ajoute chaque EnemyType à la liste AllEnemyType.Add(EnemyRatio.EnemyType); } + EnemiesPerType.Empty(); // Récupère les ratios (NbEnemy) et calcule leur somme int32 TotalRatio = 0; for (const FLMEnemyRatio& EnemyRatio : InfoWaveRow->WaveComposition) @@ -140,23 +146,29 @@ void ALMWaveManager::GetRandomDataWaveRow() void ALMWaveManager::Tick(float DeltaTime) { Super::Tick(DeltaTime); - if(RemainsEnemyToSpawn()) + if(!OnCooldown) { - CheckForSpawnerOK(); - if(SpawnPositionsOK.Num() > 0) + if(RemainsEnemyToSpawn()) { - //Choose spawnpoint to spawn - int32 RandomIndex = FMath::RandRange(0, SpawnPositionsOK.Num() - 1); - SpawnEnemy(SpawnPositionsOK[RandomIndex]); - EnemySpawned++; + CheckForSpawnerOK(); + if(SpawnPositionsOK.Num() > 0) + { + //Choose spawnpoint to spawn + int32 RandomIndex = FMath::RandRange(0, SpawnPositionsOK.Num() - 1); + SpawnEnemy(SpawnPositionsOK[RandomIndex]); + } + return; + } + if(TotalOfEnemyToStillSpawn() == 0 && EnemyAliveList.Num() == 0) + { + //lauch break time + // Lance un breaktime avant de relancer une wave + UE_LOG(LogTemp, Warning, TEXT("Start a new wave")); + OnCooldown = true; + GetWorld()->GetTimerManager().SetTimer(BreakTimer, this, &ALMWaveManager::StartWave, BreakTime, false); } } - else - { - //lauch break time - // Lance un timer de 3 secondes avant d'appeler StartWave() - GetWorld()->GetTimerManager().SetTimer(BreakTimer, this, &ALMWaveManager::StartWave, BreakTime, false); - } + } @@ -164,4 +176,5 @@ void ALMWaveManager::StartWave() { GetRandomDataWaveRow(); EnemySpawned = 0; + OnCooldown = false; } diff --git a/Source/LegumeMix/Public/LMSpawnPosition.h b/Source/LegumeMix/Public/LMSpawnPosition.h index 3a118c3..8542849 100644 --- a/Source/LegumeMix/Public/LMSpawnPosition.h +++ b/Source/LegumeMix/Public/LMSpawnPosition.h @@ -16,7 +16,7 @@ public: ALMSpawnPosition(); // Méthode pour vérifier si le spawn est possible - bool CanSpawn() const; + virtual bool CanSpawn(); UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = "Legumix") float TimerCooldown = 1.5; void StarCooldown(); diff --git a/Source/LegumeMix/Public/LMWaveManager.h b/Source/LegumeMix/Public/LMWaveManager.h index 83ec789..bea087d 100644 --- a/Source/LegumeMix/Public/LMWaveManager.h +++ b/Source/LegumeMix/Public/LMWaveManager.h @@ -43,6 +43,9 @@ public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Legumix") TArray> AllEnemyType; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Legumix") + int EnemySpawned = 0; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Legumix") TArray EnemiesPerType; @@ -55,6 +58,7 @@ protected: virtual void EnemyDead(ALMEnemy* enemyToRemoveFromLife); virtual bool RemainsEnemyToSpawn(); virtual void CheckForSpawnerOK(); + virtual int TotalOfEnemyToStillSpawn(); virtual void GetRandomDataWaveRow(); @@ -64,7 +68,7 @@ public: private: TArray SpawnPositionsOK; - int EnemySpawned = 0; FTimerHandle BreakTimer; + bool OnCooldown; };