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.
 
 
 
 

151 lines
3.8 KiB

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Networking;
using Networking.Server;
using Networking;
public class GameManager : MonoBehaviour
{
#region Inspector Field
[Header("Settings")]
[SerializeField]
private float AnimationTime;
[SerializeField]
private GameMode CurrentGameMode;
[Header("References")]
[SerializeField]
[Tooltip("Prefab of character for players to play")]
private Character characterPrefab;
[SerializeField]
private ServerObject server;
[SerializeField]
private ClientList ClientList;
#endregion Inspector Field
#region Private Variables
private Dictionary<int, PlayerData> playerData;
#endregion Private Variables
public void Awake()
{
RegisterHandlers();
SpawnCharacters();
}
private void Update()
{
server.ServerUpdate();
}
private void RecieveLogicList(NetworkMessage msg)
{
LogicProtocols.LogicMsg logicMsg;
if (!msg.TryRead(out logicMsg))
{
Debug.Log("Recieved unknown message");
return;
}
Debug.Log("Recieved function from " + msg.conn.connectionId);
playerData[msg.conn.connectionId].blockReader.LogicChain = new List<LogicBlock>(logicMsg.elements);
playerData[msg.conn.connectionId].recievedList = true;
if (playerData.All(p => p.Value.recievedList))
StartRound();
}
private void StartRound()
{
Debug.Log("Starting Round");
StartCoroutine(RoundRoutine());
}
private IEnumerator RoundRoutine()
{
playerData.ForEach(p => p.Value.recievedList = false);
while (playerData.Any(p => !p.Value.blockReader.Finished))
{
foreach (PlayerData player in playerData.Values)
{
if (!player.waiting)
{
player.waiting = player.blockReader.Read(player.character, AnimationTime);
}
}
yield return new WaitForSeconds(AnimationTime);
foreach(KeyValuePair<int,PlayerData> player in playerData)
{
ClientData client = ClientList.ConnectedClients.First(p => p.ID == player.Key);
CurrentGameMode.OnPlayerFinishedMove(player.Value.character, client, player.Value.character.CurrentBlock);
}
if (playerData.All(p => p.Value.waiting))
{
playerData.ForEach(p => p.Value.waiting = false);
Debug.Log("Finished one move");
}
}
CurrentGameMode.OnRoundFinished();
CurrentGameMode.isGameOver();
Debug.Log("Finished Moving");
}
private void SpawnCharacters()
{
playerData = new Dictionary<int, PlayerData>();
Block[] SpawnBlocks = FindObjectsOfType<Block>().Where(p => p.isSpawnable).ToArray();
int spawnIndex = 0;
foreach (ClientData client in ClientList)
{
Character newChar = Instantiate(characterPrefab);
Block startingBlock = SpawnBlocks[(spawnIndex++ % ClientList.ConnectedClients.Count)];
newChar.Initialise(startingBlock, client.Inventory, client.characterAnimal);
playerData.Add(client.ID, new PlayerData(newChar));
}
}
private void RegisterHandlers()
{
server.server.RegisterHandler(LogicProtocols.SendLogicList, RecieveLogicList);
}
class PlayerData
{
public Character character;
public BlockReader blockReader;
public bool recievedList;
public bool waiting;
public PlayerData(Character character)
{
this.character = character;
blockReader = new BlockReader();
}
}
}