|
|
@ -0,0 +1,189 @@ |
|
|
|
using System.Collections; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using UnityEngine; |
|
|
|
using UnityEngine.Networking; |
|
|
|
using Networking.Server; |
|
|
|
using Networking; |
|
|
|
using UnityEngine.SceneManagement; |
|
|
|
|
|
|
|
|
|
|
|
public class GameManagerRacetrack : MonoBehaviour |
|
|
|
{ |
|
|
|
#region Inspector Field
|
|
|
|
[Header("Settings")] |
|
|
|
[SerializeField] |
|
|
|
private float AnimationTime; |
|
|
|
[SerializeField] |
|
|
|
private GameModeReference 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; |
|
|
|
private GameMode gamemode; |
|
|
|
#endregion Private Variables
|
|
|
|
|
|
|
|
#region Read Only
|
|
|
|
private IEnumerable<PlayerData> playerArray { get { return playerData.Values; } } |
|
|
|
#endregion Read Only
|
|
|
|
|
|
|
|
public GameObject levelInfo; |
|
|
|
public blockSpawn bspawn; |
|
|
|
|
|
|
|
public void Awake() |
|
|
|
{ |
|
|
|
gamemode = CurrentGameMode.Value; |
|
|
|
RegisterHandlers(); |
|
|
|
SpawnCharacters(); |
|
|
|
ClientList.ForEach(p => p.ChangeScene("ClientScene")); |
|
|
|
} |
|
|
|
|
|
|
|
private void Start() |
|
|
|
{ |
|
|
|
StartCoroutine(displayforSeconds(levelInfo, 5.0f)); |
|
|
|
gamemode.GameStart(playerArray.ToArray()); |
|
|
|
StartRound(); |
|
|
|
} |
|
|
|
|
|
|
|
private void Update() |
|
|
|
{ |
|
|
|
server.ServerUpdate(); |
|
|
|
} |
|
|
|
|
|
|
|
IEnumerator displayforSeconds(GameObject display, float time) |
|
|
|
{ |
|
|
|
display.SetActive (true); |
|
|
|
yield return new WaitForSeconds(time); |
|
|
|
display.SetActive (false); |
|
|
|
} |
|
|
|
|
|
|
|
private void RecieveLogicList(NetworkMessage msg) |
|
|
|
{ |
|
|
|
LogicProtocols.LogicMsg logicMsg; |
|
|
|
if (!msg.TryRead(out logicMsg)) |
|
|
|
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)) |
|
|
|
DoRoundRoutine(); |
|
|
|
} |
|
|
|
|
|
|
|
private void DoRoundRoutine() |
|
|
|
{ |
|
|
|
Debug.Log("Starting Round"); |
|
|
|
StartCoroutine(RoundRoutine()); |
|
|
|
} |
|
|
|
|
|
|
|
private void StartRound() |
|
|
|
{ |
|
|
|
gamemode.RoundStart(playerArray.ToArray()); |
|
|
|
LogicProtocols.FloatMsg RoundTime = new LogicProtocols.FloatMsg( gamemode.GetRoundTime()); |
|
|
|
bspawn.Spawn(); |
|
|
|
playerArray.ForEach(p => p.client.conn.Send(LogicProtocols.SendRoundTime, RoundTime)); |
|
|
|
} |
|
|
|
|
|
|
|
private IEnumerator RoundRoutine() |
|
|
|
{ |
|
|
|
playerArray.ForEach(p => p.recievedList = false); |
|
|
|
|
|
|
|
//Debug.Log("Doing Round Routine");
|
|
|
|
|
|
|
|
while (playerArray.Any(p => !p.blockReader.Finished)) |
|
|
|
{ |
|
|
|
//Debug.Log("One Move");
|
|
|
|
foreach (PlayerData player in playerArray) |
|
|
|
StartCoroutine(RunOnce(player)); |
|
|
|
|
|
|
|
//wait until all players have finished
|
|
|
|
yield return new WaitUntil(() => playerArray.All(p => p.waiting)); |
|
|
|
|
|
|
|
gamemode.FinishedMove(playerArray.ToArray()); |
|
|
|
playerArray.ForEach(p => p.client.SendScore()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (gamemode.isGameOver(playerArray.ToArray())) |
|
|
|
{ |
|
|
|
Debug.Log("Game Over"); |
|
|
|
SceneManager.LoadScene("ScoreBoards"); |
|
|
|
} |
|
|
|
|
|
|
|
gamemode.RoundEnd(playerArray.ToArray()); |
|
|
|
|
|
|
|
foreach (PlayerData player in playerArray) |
|
|
|
{ |
|
|
|
player.blockReader.Reset(); |
|
|
|
player.waiting = false; |
|
|
|
player.client.SendInventory(); |
|
|
|
player.client.ChangeScene("ClientScene"); |
|
|
|
} |
|
|
|
//Debug.Log("Finished Moving");
|
|
|
|
|
|
|
|
StartRound(); |
|
|
|
} |
|
|
|
|
|
|
|
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); |
|
|
|
newChar.transform.forward = startingBlock.SpawnDirection.ToVector(); |
|
|
|
playerData.Add(client.ID, new PlayerData(newChar,client)); |
|
|
|
newChar.ClientLink = client; |
|
|
|
client.playerCharacter = newChar; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void RegisterHandlers() |
|
|
|
{ |
|
|
|
server.server.RegisterHandler(LogicProtocols.SendLogicList, RecieveLogicList); |
|
|
|
} |
|
|
|
|
|
|
|
private IEnumerator RunOnce(PlayerData data) |
|
|
|
{ |
|
|
|
data.waiting = false; |
|
|
|
bool blockFinished = false; |
|
|
|
float waitTime; |
|
|
|
while (!blockFinished && !data.blockReader.Finished) |
|
|
|
{ |
|
|
|
//Debug.Log(data.client + "Moving once");
|
|
|
|
|
|
|
|
if (data.blockReader.CurrentBlock != null && !data.blockReader.CurrentBlock.hasBeenRemoved) |
|
|
|
{ |
|
|
|
data.client.Inventory.Remove(data.blockReader.CurrentBlock); |
|
|
|
data.blockReader.CurrentBlock.hasBeenRemoved = true; |
|
|
|
} |
|
|
|
|
|
|
|
blockFinished = data.blockReader.Read(data.character, AnimationTime,out waitTime); |
|
|
|
|
|
|
|
//Debug.Log("Waiting: " + waitTime);
|
|
|
|
yield return new WaitForSeconds(waitTime); |
|
|
|
gamemode.OnePlayerMoved(data); |
|
|
|
} |
|
|
|
data.waiting = true; |
|
|
|
} |
|
|
|
} |