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.
 
 
 
 
 
 

192 lines
6.8 KiB

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Networking.Server;
public class blockSpawn : MonoBehaviour
{
[SerializeField]
public Inventory.Data[] spawnLogicList;
public List<ClientData> ConnectedClients;
public ClientList clientDataList;
public Block[] SpawnBlocks;
public List<Vector3> spawnedLocations;
int scoreDifference = 0;
float average = 0;
void Awake()
{
ConnectedClients = clientDataList.ConnectedClients;
SpawnBlocks = FindObjectsOfType<Block>().Where(p => p.is_Walkable).ToArray();
spawnedLocations = new List<Vector3>();
}
public void Spawn()
{
getPlayerScores();
getPlayerLocations(ConnectedClients.ToArray(), 0.75f);
//second spawning block only if needed
/* if (scoreDifference > average)
{
List<ClientData> lessClients = new List<ClientData>(ConnectedClients);
lessClients.RemoveAt(lessClients.Count - 1);
getPlayerLocations(lessClients.ToArray(), 0.6f);
}*/
}
private void getPlayerScores()
{
ConnectedClients.Sort((b, a) => a.Lives.CompareTo(b.Lives));
int totalScores = 0;
scoreDifference = ConnectedClients[0].Lives + ConnectedClients[ConnectedClients.Count-1].Lives;
//Debug.Log("score difference " + scoreDifference);
for(int i = 0; i < ConnectedClients.Count; i++)
{
totalScores += ConnectedClients[i].Lives;
}
average = totalScores / ConnectedClients.Count;
//Debug.Log("score average " + average);
}
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)
{
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);
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);
}
private void checkLocation(Vector3 spawnposition)
{
bool duplicate = false;
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(clostest.position.x, clostest.position.y + 1.5f, clostest.position.z));
}
}
else
{
//this needs to be changed
Block clostest = Utility.minBy(SpawnBlocks, p => Vector3.Distance(p.transform.position, spawnposition));
checkLocation(new Vector3(clostest.position.x, clostest.position.y + 1.5f, clostest.position.z));
}
}
private void getPlayerLocations(ClientData[] clients, float weightMultiplier)
{
float[] weightings = new float[clients.Length];
if(clients.Length > 1)
{
Vector3 spawnposition = new Vector3(0, 0, 0);
for (int i = 0; i < clients.Length; i++)
{
spawnposition += clients[i].playerCharacter.CurrentBlock.VisualPosition;
//Debug.Log("currentBlock.VisualPosition " + clients[i].playerCharacter.CurrentBlock.VisualPosition);
}
spawnposition *= (1.0f / clients.Length);
//Debug.Log("spawnposition " + spawnposition);
Vector3[] direction = new Vector3[clients.Length];
for (int i = 0; i < clients.Length; i++)
{
direction[i] = (spawnposition - clients[i].playerCharacter.CurrentBlock.VisualPosition);
//Debug.Log("direction " + i + " " + direction[i]);
}
//weighting calculations
float[] difAvg = new float[clients.Length];
for (int i = 0; i < clients.Length; i++)
{
difAvg[i] = clients[i].Lives - average;
}
float[] ratio = new float[clients.Length];
//Debug.Log("difAvg[0] " + difAvg[0]);
if (difAvg[0] == 0)
{
for (int i = 0; i < clients.Length; i++)
{
weightings[i] = 0.5f * weightMultiplier;
//Debug.Log("weightings " + i + " " + weightings[i]);
}
}
else
{
for (int i = 0; i < clients.Length; i++)
{
ratio[i] = difAvg[i] / difAvg[0];
ratio[i] /= 2.0f;
ratio[i] += 0.5f;
weightings[i] = ratio[i] * weightMultiplier;
weightings[i] = Mathf.Clamp(weightings[i], 0, 1);
//Debug.Log("weightings " + i + " " + weightings[i]);
}
}
//multiply weightings by the direction
//take average point and add directions
for (int i = 0; i < clients.Length; i++)
{
spawnposition += (weightings[i] * direction[i]);
//Debug.Log("(weightings[i] * direction[i] " + (weightings[i] * direction[i]));
}
spawnposition += Vector3.one * 0.5f;
//Debug.Log("spawnposition " + spawnposition);
//spawn first block
checkLocation(spawnposition);
}
else
{
Vector2 playerOne = new Vector2(clients[0].playerCharacter.CurrentBlock.VisualPosition.x, clients[0].playerCharacter.CurrentBlock.VisualPosition.z);
int xVal = (int)Random.Range(-3.0f, 3.0f) + (int)playerOne.x;
int zVal = (int)Random.Range(-3.0f, 3.0f) + (int)playerOne.y;
checkLocation(new Vector3(xVal, 1.0f, zVal));
}
}
}