using System.Collections.Generic; using System.Linq; using UnityEngine; using Networking.Server; public class blockSpawn : MonoBehaviour { [SerializeField] public Inventory.Data[] spawnLogicList; List ConnectedClients; public ClientList clientDataList; public Block[] SpawnBlocks; List spawnedLocations; int min_z = -2, max_z = 2; Vector3 spawnposition = new Vector3(0, 0, 0); void Awake() { ConnectedClients = clientDataList.ConnectedClients; spawnedLocations = new List(); } public void wakeup() { SpawnBlocks = FindObjectsOfType().Where(p => p.is_Walkable).ToArray(); } public void Spawn() { /* Get all player locations, get leader(biggest x position value) and min value +2 to each value, set as min and man in random.range() add locations to a list to ensure no duplicates check not over pit or hole */ ConnectedClients.Sort((b, a) => a.playerCharacter.transform.position.x.CompareTo(b.playerCharacter.transform.position.x)); int min_x = (int)ConnectedClients[ConnectedClients.Count - 1].playerCharacter.transform.position.x + 2; int max_x = (int)ConnectedClients[0].playerCharacter.transform.position.x + 2; for(int i = 0; i < 2; i++) { spawnposition = new Vector3(Random.Range(min_x, max_x), -0.5f, Random.Range(min_z, max_z)); checkLocation(spawnposition); } } private void checkLocation(Vector3 spawnposition) { bool duplicate = checkDuplicatePosition(spawnposition); if (duplicate == false) { bool valid = checkValid(spawnposition); if (valid == true) { spawnBlock(spawnposition); } else { //Block clostest = Utility.minBy(SpawnBlocks, p => Vector3.Distance(p.transform.position, spawnposition)); //checkLocation(new Vector3(spawnposition.x, spawnposition.y + 1.5f, spawnposition.z)); Debug.Log("Fail one"); } } else { //this needs to be changed //Block clostest = Utility.minBy(SpawnBlocks, p => Vector3.Distance(p.transform.position, spawnposition)); //checkLocation(new Vector3(spawnposition.x, spawnposition.y + 1.5f, spawnposition.z)); Debug.Log("Fail two"); } } 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 bool checkValid(Vector3 spawnposition) { //is over a walkable block for (int i = 0; i < SpawnBlocks.Length; i++) { if (SpawnBlocks[i].position.x == spawnposition.x && SpawnBlocks[i].position.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.5f; int number = (int)Random.Range(1.0f, spawnLogicList.Length); block.GetComponent().Collectable.element = spawnLogicList[number].element; block.GetComponent().Collectable.Count = spawnLogicList[number].Count; block.transform.position = spawnposition; Debug.Log("Instantiated new logic block: " + spawnLogicList[number].element + " at position: " + block.transform.position); spawnedLocations.Add(spawnposition); } }