using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using Networking.Server;
|
|
|
|
public class blockSpawn : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
public Inventory.Data[] StrongLogicList;
|
|
public Inventory.Data[] NormalLogicList;
|
|
public Inventory.Data[] WeakLogicList;
|
|
Inventory.Data[] listtoUse;
|
|
|
|
List<ClientData> ConnectedClients;
|
|
public ClientList clientDataList;
|
|
public List<Block> SpawnBlocks;
|
|
List<Vector3> spawnedLocations;
|
|
public List<Block> possibleSpawnLocations;
|
|
int spawnNumber = 2;
|
|
public int min_x, max_x;
|
|
|
|
void Awake()
|
|
{
|
|
ConnectedClients = clientDataList.ConnectedClients;
|
|
spawnedLocations = new List<Vector3>();
|
|
possibleSpawnLocations = new List<Block>();
|
|
}
|
|
public void wakeup()
|
|
{
|
|
SpawnBlocks.Clear();
|
|
SpawnBlocks = FindObjectsOfType<Block>().Where(p => p.isCollectableSpawnable).ToList();
|
|
Debug.Log("Count after wakeup function " + SpawnBlocks.Count);
|
|
}
|
|
|
|
public void Spawn()
|
|
{
|
|
wakeup();
|
|
//Sort play locations so leader is first
|
|
if (ConnectedClients.Count > 1)
|
|
{
|
|
ConnectedClients.Sort((b, a) => a.playerCharacter.transform.position.x.CompareTo(b.playerCharacter.transform.position.x));
|
|
}
|
|
|
|
min_x = (int)ConnectedClients[ConnectedClients.Count - 1].playerCharacter.transform.position.x;
|
|
max_x = (int)ConnectedClients[0].playerCharacter.transform.position.x + 4;
|
|
|
|
Debug.Log("count before update " + SpawnBlocks.Count);
|
|
updatePlayerPositions();
|
|
Debug.Log("count mid update " + SpawnBlocks.Count);
|
|
updatePositions(min_x - 1);
|
|
Debug.Log("count after update " + SpawnBlocks.Count);
|
|
|
|
//Check points within the bounds of players
|
|
possibleSpawnLocations.Clear();
|
|
foreach (Block point in SpawnBlocks)
|
|
{
|
|
//Debug.Log("Position: " + point.transform.position.x + " and " + point.transform.position.z);
|
|
if(point.transform.position.x >= min_x && point.transform.position.x <= max_x)
|
|
{
|
|
possibleSpawnLocations.Add(point);
|
|
}
|
|
}
|
|
|
|
//pick a random value from those available, checks the location
|
|
//then removes it to remove the possibility of duplicates
|
|
Debug.Log("possibleSpawnLocations count " + possibleSpawnLocations.Count);
|
|
|
|
int triesCount = 0;
|
|
|
|
if(possibleSpawnLocations.Count > 0)
|
|
{
|
|
while (spawnNumber > 0 && triesCount < 25)
|
|
{
|
|
if(possibleSpawnLocations.Count > 0){
|
|
int choice = Random.Range(0, possibleSpawnLocations.Count - 1);
|
|
bool spawned = checkLocation(possibleSpawnLocations[choice].transform.position);
|
|
if (spawned == true)
|
|
{
|
|
possibleSpawnLocations.RemoveAt(choice);
|
|
triesCount = 0;
|
|
spawnNumber--;
|
|
}else{
|
|
triesCount++;
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
goto escape;
|
|
}
|
|
//Debug.Log("spawnNumber " + spawnNumber);
|
|
}
|
|
//Debug.Log("SpawnTries: " + triesCount);
|
|
}
|
|
escape:
|
|
spawnNumber = 2;
|
|
}
|
|
|
|
private bool checkLocation(Vector3 spawnposition)
|
|
{
|
|
bool duplicate = checkDuplicatePosition(spawnposition);
|
|
if (duplicate == false)
|
|
{
|
|
spawnBlock(spawnposition);
|
|
//Debug.Log("spawned at" + spawnposition);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
//Debug.Log("Fail to spawn at " + spawnposition);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private bool checkDuplicatePosition(Vector3 spawnposition)
|
|
{
|
|
if (spawnedLocations.Count > 0)
|
|
{
|
|
for (int k = 0; k < spawnedLocations.Count; k++)
|
|
{
|
|
if (spawnedLocations[k].x == spawnposition.x && spawnedLocations[k].z == spawnposition.z)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void spawnBlock(Vector3 spawnposition)
|
|
{
|
|
GameObject prefab = Resources.Load("Logic Block") as GameObject;
|
|
GameObject block = Instantiate(prefab);
|
|
spawnposition.y = 1.0f;
|
|
block.transform.position = spawnposition;
|
|
spawnedLocations.Add(spawnposition);
|
|
}
|
|
|
|
public void assignLogicBlock(GameObject block, float value)
|
|
{
|
|
if(value > 1)
|
|
{
|
|
listtoUse = WeakLogicList;
|
|
}
|
|
else if (value <= 1 && value > (-4))
|
|
{
|
|
listtoUse = NormalLogicList;
|
|
}
|
|
else if (value <= (-5))
|
|
{
|
|
listtoUse = StrongLogicList;
|
|
}
|
|
//max behind camera is -6/-7
|
|
//max lives = 3
|
|
// ~ anyone ahead of the average will have a minimum of 4(full lives) or 2(with 1 life left)
|
|
// ~ anyone behind the average will have a minimum of -3-4(full lives) or -5/-6 (with one life left)
|
|
|
|
int number = Random.Range(0, listtoUse.Length-1);
|
|
block.GetComponent<LogicCollectable_Multiplayer>().Collectable.element = listtoUse[number].element;
|
|
block.GetComponent<LogicCollectable_Multiplayer>().Collectable.Count = 1;
|
|
}
|
|
|
|
public void updatePositions(int min)
|
|
{
|
|
for(int i = SpawnBlocks.Count -1; i>=0; i--)
|
|
{
|
|
//Debug.Log(SpawnBlocks[i].transform.position.x);
|
|
if(SpawnBlocks[i].transform.position.x < min)
|
|
{
|
|
SpawnBlocks.Remove(SpawnBlocks[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void updatePlayerPositions()
|
|
{
|
|
for (int i = SpawnBlocks.Count - 1; i >= 0; i--)
|
|
{
|
|
if (SpawnBlocks[i].CurrentPlayer != null)
|
|
{
|
|
SpawnBlocks.Remove(SpawnBlocks[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|