using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using Networking.Server;
|
|
|
|
public class blockSpawn : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
public Inventory.Data[] spawnLogicList;
|
|
List<ClientData> ConnectedClients;
|
|
public ClientList clientDataList;
|
|
public Block[] SpawnBlocks;
|
|
List<Vector3> spawnedLocations;
|
|
int min_z = -2, max_z = 2;
|
|
Vector3 spawnposition = new Vector3(0, 0, 0);
|
|
|
|
void Awake()
|
|
{
|
|
ConnectedClients = clientDataList.ConnectedClients;
|
|
spawnedLocations = new List<Vector3>();
|
|
}
|
|
public void wakeup()
|
|
{
|
|
SpawnBlocks = FindObjectsOfType<Block>().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<LogicCollectable_Multiplayer>().Collectable.element = spawnLogicList[number].element;
|
|
block.GetComponent<LogicCollectable_Multiplayer>().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);
|
|
}
|
|
}
|