using System.Collections;
using System.Collections.Generic;
using System.IO;
using Photon.Pun;
using System;
using UnityEngine;
public class EnemySpawner : MonoBehaviourPunCallbacks
{
public static EnemySpawner Instance;
public enum SpawnState { SPAWNING, WAITING, COUNTING, COMPLETED};
//VARIABLES
[SerializeField] private Wave[] waves;
[SerializeField] private float timeBetweenWaves = 3f;
[SerializeField] public float waveCountDown = 0;
public SpawnState state = SpawnState.COUNTING;
public int currentWave;
//[SerializeField] TMP_Text waveText;
PhotonView PV;
//REFERENCES
[SerializeField] private Transform[] spawners;
[SerializeField] private List<Enemy> enemyList;
void Awake()
{
Instance = this;
PV = GetComponent<PhotonView>();
}
void Start()
{
waveCountDown = timeBetweenWaves;
currentWave = 0;
}
public string GetState()
{
return state.ToString();
}
public string GetWave()
{
return (currentWave + 1).ToString();
}
public string GetCountdown()
{
return (Math.Ceiling(waveCountDown)).ToString();
}
void Update()
{
if (state == SpawnState.COMPLETED) return;
if (state == SpawnState.WAITING)
{
//waveText.text = "WAVE " + currentWaveString;
//CHECK IF ALL ENEMIES DEAD
if (!EnemiesAreDead())
return;
else
CompleteWave();
}
if (waveCountDown <= 0)
{
//Spawn Enemies
if (state != SpawnState.SPAWNING)
{
//SPAWN ENEMIES
PV.RPC("SpawnWaveRPC", RpcTarget.All);
}
}
else
{
//waveText.text = waveCountDown.ToString();
waveCountDown -= Time.deltaTime;
}
//if(Input.GetKeyDown(KeyCode.P))
//{
//SpawnZombie();
//}
}
[PunRPC]
public void SpawnWaveRPC()
{
StartCoroutine(SpawnWave(waves[currentWave]));
}
IEnumerator SpawnWave(Wave wave)
{
state = SpawnState.SPAWNING;
enemyList.Clear();
for (int i = 0; i < wave.enemiesAmount; i++)
{
SpawnZombie();
yield return new WaitForSeconds(wave.delay);
}
state = SpawnState.WAITING;
yield break;
}
public void SpawnZombie()
{
if (PV.IsMine)
{
int randomInt = UnityEngine.Random.Range(1, spawners.Length);
PV.RPC("SpawnZombieRPC", RpcTarget.MasterClient, randomInt);
}
}
[PunRPC]
public void SpawnZombieRPC(int randomInt)
{
Transform randomSpawner = spawners[randomInt];
GameObject newEnemy = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Zombie"), randomSpawner.position, randomSpawner.rotation);
Enemy newEnemyStats = newEnemy.GetComponent<Enemy>();
enemyList.Add(newEnemyStats);
}
bool EnemiesAreDead()
{
foreach (Enemy enemy in enemyList)
{
if (!enemy.isDead)
return false;
}
return true;
}
[PunRPC]
public void CompleteWaveRPC()
{
state = SpawnState.COUNTING;
waveCountDown = timeBetweenWaves;
if (currentWave + 1 > waves.Length - 1)
{
state = SpawnState.COMPLETED;
//waveText.text = "ALL WAVES COMPLETED";
//END GAME
}
else
{
currentWave++;
}
}
void CompleteWave()
{
PV.RPC("CompleteWaveRPC", RpcTarget.All);
}
}