94 lines
2.8 KiB
C#
94 lines
2.8 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using PixelCrushers;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
namespace Beyond
|
|
{
|
|
public class KillTrigger : Saver
|
|
{
|
|
[SerializeField] EnemySpawner[] m_spawners;
|
|
|
|
public UnityEvent<KillTrigger> OnTrigger;
|
|
|
|
[Serializable]
|
|
public class SaveData
|
|
{
|
|
public bool wasTriggered = false;
|
|
}
|
|
|
|
private SaveData m_data = new SaveData();
|
|
void Start()
|
|
{
|
|
if (m_spawners == null) return; // Guard clause
|
|
foreach (var s in m_spawners)
|
|
{
|
|
if (s != null) // Good practice to check for null spawners in array
|
|
{
|
|
s.m_OnDead.AddListener(OnEnemyKilled);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void CheckSpawners()
|
|
{
|
|
if (m_data.wasTriggered)
|
|
return;
|
|
|
|
if (m_spawners == null) return; // Guard clause
|
|
|
|
foreach (var spawner in m_spawners)
|
|
{
|
|
if (spawner == null) continue; // Skip if a spawner in the array is null
|
|
|
|
bool hasSpawnedAWave = spawner.GetWavesSpawnedCount() > 0; // We'll need to add this getter to EnemySpawner
|
|
bool noEnemiesCurrentlyAlive = !spawner.IsAnyEnemyAlive();
|
|
|
|
if (hasSpawnedAWave && noEnemiesCurrentlyAlive)
|
|
{
|
|
// This spawner has done its part for *this current engagement*
|
|
}
|
|
else
|
|
{
|
|
return; // If ANY spawner doesn't meet this, the trigger condition isn't met
|
|
}
|
|
}
|
|
OnTrigger?.Invoke(this);
|
|
m_data.wasTriggered = true;
|
|
}
|
|
private void OnEnemyKilled(EnemySpawner arg0)
|
|
{
|
|
// arg0 is the spawner from which an enemy died.
|
|
// We need to check all spawners associated with this trigger.
|
|
CheckSpawners();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (m_spawners == null) return; // Guard clause
|
|
foreach (var s in m_spawners)
|
|
{
|
|
if (s != null) // Good practice
|
|
{
|
|
s.m_OnDead.RemoveListener(OnEnemyKilled);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override string RecordData()
|
|
{
|
|
return SaveSystem.Serialize(m_data);
|
|
}
|
|
|
|
public override void ApplyData(string s)
|
|
{
|
|
var data = SaveSystem.Deserialize<SaveData>(s);
|
|
if (data != null)
|
|
m_data = data;
|
|
// Optional: if not triggered, re-check on load in case state was met while inactive
|
|
// if (!m_data.wasTriggered) { CheckSpawners(); }
|
|
}
|
|
}
|
|
} |