You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

115 lines
4.0 KiB

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);
}
}