Large diffs are not rendered by default.

@@ -3,12 +3,23 @@
using System;
using System.Linq;

public class GameState : MonoBehaviour
public class GameState
{
public event Action OnGameStateChanged = delegate { };

List<Player> connectedPlayers = new List<Player> ();

public void SetPlayerState (List<Player> playerState)
{
connectedPlayers = playerState;
OnGameStateChanged ();
}

public List<Player> GetPlayerState ()
{
return new List<Player> (connectedPlayers);
}

public bool HasPlayer (int id)
{
return FindPlayer (id) != null;
@@ -4,15 +4,15 @@

public enum CustomMsgType
{
JoinGroup = 41 + 8 + 1,
LeaveGroup,
JoinSide,
LeaveSide,
PlayerStatus,
StartRowing,
StopRowing,
UpdateFromFinishedRow,

Test = 99,
RegisterView = 100
JoinGroup = 41 + 8 + 1,
LeaveGroup,
JoinSide,
LeaveSide,
PlayerStatus,
StartRowing,
StopRowing,
UpdateFromFinishedRow,
UpdateGameState,
Test = 99,
RegisterView = 100
}
@@ -5,175 +5,9 @@

public class Manager : NetworkManager
{
private bool serverStarted = false;
private int gameViewClientId;

public void JoinGroup (int group)
{
if (client != null)
{
client.Send ((short)CustomMsgType.JoinGroup, new IntegerMessage (group));
}
}

public void LeaveGroup ()
{
if (client != null)
{
client.Send ((short)CustomMsgType.LeaveGroup, new EmptyMessage ());
}
}

public void JoinSide (int side)
{
if (client != null)
{
client.Send ((short)CustomMsgType.JoinSide, new IntegerMessage (side));
}
}

public void LeaveSide ()
{
if (client != null)
{
client.Send ((short)CustomMsgType.LeaveSide, new EmptyMessage ());
}
}

public void StartGameServer ()
{
TryStartServer ();
Debug.Log ("Server started!");
}

public void StartClient (string ip)
{
if (client == null)
{
networkAddress = ip;
StartClient ();
}

if (client != null)
{
Debug.Log ("Started client and connecting to " + ip);
}
else
{
Debug.LogError ("Failed to start clien!");
}
}

public void StartGameViewClient (string ip)
{
StartClient (ip);

if (client == null)
{
Debug.LogError ("Client not started!");
return;
}

Debug.Log ("registering GameView client...");
client.Send ((short)CustomMsgType.RegisterView, new IntegerMessage (0));
client.RegisterHandler ((short)CustomMsgType.Test, (netMsg) =>
{

});
}

private void TryStartServer ()
{
if (serverStarted)
{
return;
}


serverStarted = StartServer ();

if (!serverStarted)
{
Debug.LogError ("Failed to start server!");
return;
}
NetworkServer.RegisterHandler ((short)CustomMsgType.JoinGroup, OnJoinGroup);
NetworkServer.RegisterHandler ((short)CustomMsgType.LeaveGroup, OnLeaveGroup);
NetworkServer.RegisterHandler ((short)CustomMsgType.JoinSide, OnJoinSide);
NetworkServer.RegisterHandler ((short)CustomMsgType.LeaveSide, OnLeaveSide);

NetworkServer.RegisterHandler ((short)CustomMsgType.Test, (netMsg) =>
{
var msg = netMsg.ReadMessage<IntegerMessage> ();
NetworkServer.SendToClient (gameViewClientId, (short)CustomMsgType.Test, msg);
});
NetworkServer.RegisterHandler ((short)CustomMsgType.RegisterView, (netMsg) =>
{
gameViewClientId = netMsg.conn.connectionId;
});

Debug.Log ("Server started!");
}

private void OnJoinGroup (NetworkMessage netMsg)
{
var gameState = GetComponent<GameState> ();
var playerId = netMsg.conn.connectionId;
var group = netMsg.ReadMessage<IntegerMessage> ().value;

if (!gameState.HasPlayer (playerId))
{
gameState.AddPlayer (playerId, groupId: group);
}
else
{
gameState.SetGroupId (playerId, group);
}
}

private void OnLeaveGroup (NetworkMessage netMsg)
{
var gameState = GetComponent<GameState> ();
var playerId = netMsg.conn.connectionId;

gameState.SetGroupId (playerId, Player.NO_GROUP);
}

private void OnJoinSide (NetworkMessage netMsg)
{
var gameState = GetComponent<GameState> ();
var playerId = netMsg.conn.connectionId;
var side = netMsg.ReadMessage<IntegerMessage> ().value;

if (!gameState.HasPlayer (playerId))
{
gameState.AddPlayer (playerId, sideId: side);
}
else
{
gameState.SetSideId (playerId, side);
}
}

private void OnLeaveSide (NetworkMessage netMsg)
{
var gameState = GetComponent<GameState> ();
var playerId = netMsg.conn.connectionId;
gameState.SetSideId (playerId, Player.NO_SIDE);
}


public override void OnClientConnect (NetworkConnection conn)
{
var gameState = GetComponent<GameState> ();
gameState.AddPlayer (conn.connectionId);
base.OnClientConnect (conn);
}

public override void OnClientDisconnect (NetworkConnection conn)
{
var gameState = GetComponent<GameState> ();
gameState.RemovePlayer (conn.connectionId);
base.OnClientDisconnect (conn);
}
}
@@ -0,0 +1,22 @@
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.Collections.Generic;

public class UpdateGameStateMessage : MessageBase
{
public List<Player> ConnectedPlayers;

public override void Serialize (NetworkWriter writer)
{
string json = JsonUtility.ToJson (ConnectedPlayers);
Debug.LogError (json);
writer.Write (json);
}

public override void Deserialize (NetworkReader reader)
{
string json = reader.ReadString ();
ConnectedPlayers = JsonUtility.FromJson<List<Player>> (json);
}
}
@@ -8,9 +8,6 @@ public class StartBehaviour : MonoBehaviour

private void Start ()
{
Debug.Log ("Create new game state...");
gameObject.AddComponent<GameState> ();

Debug.Log ("Loading UI...");
SceneManager.LoadScene ("UI", LoadSceneMode.Additive);
}
@@ -6,53 +6,99 @@

public class TestClient : NetworkManager
{
public RowingView View;
private float CountdownMove;
private float CountdownWait;
private float MoveDuration;
private float WaitDuration;

bool IsMoving = false;
// Use this for initialization
void Start()
{
client = StartClient();
}

// Update is called once per frame
void Update()
{
if (client == null || !client.isConnected)
{
return;
}
if (!IsMoving)
{
if (CountdownWait <= 0)
{
client.Send ((short)CustomMsgType.StartRowing, new IntegerMessage (0));
View.StartRowing();
public RowingView View;
private float CountdownMove;
private float CountdownWait;
private float MoveDuration;
private float WaitDuration;

bool IsMoving = false;

public void JoinGroup (int group)
{
if (client != null)
{
client.Send ((short)CustomMsgType.JoinGroup, new IntegerMessage (group));
}
}

public void LeaveGroup ()
{
if (client != null)
{
client.Send ((short)CustomMsgType.LeaveGroup, new EmptyMessage ());
}
}

public void JoinSide (int side)
{
if (client != null)
{
client.Send ((short)CustomMsgType.JoinSide, new IntegerMessage (side));
}
}

public void LeaveSide ()
{
if (client != null)
{
client.Send ((short)CustomMsgType.LeaveSide, new EmptyMessage ());
}
}

public void StartClient (string ip)
{
if (client == null)
{
networkAddress = ip;
StartClient ();
}

if (client != null)
{
Debug.Log ("Started client and connecting to " + ip);
}
else
{
Debug.LogError ("Failed to start clien!");
}
}



void Update ()
{
if (client == null || !client.isConnected)
{
return;
}
if (!IsMoving)
{
if (CountdownWait <= 0)
{
client.Send ((short)CustomMsgType.StartRowing, new IntegerMessage (0));
View.StartRowing ();
MoveDuration = 2; // Random.Range(0.5f, 4);
View.SetAnimationDuration(MoveDuration);
CountdownMove = MoveDuration;
IsMoving = true;
}
else
{
CountdownWait -= Time.deltaTime;
}
}
else
{
CountdownMove -= Time.deltaTime;
if (CountdownMove <= 0)
{
WaitDuration = Random.Range(1, 3);
View.SetAnimationDuration (MoveDuration);
CountdownMove = MoveDuration;
IsMoving = true;
}
else
{
CountdownWait -= Time.deltaTime;
}
}
else
{
CountdownMove -= Time.deltaTime;
if (CountdownMove <= 0)
{
WaitDuration = Random.Range (1, 3);
CountdownWait = 6; // WaitDuration;
client.Send((short)CustomMsgType.StopRowing, new IntegerMessage(0));
View.StopRowing();
IsMoving = false;
}
}
}
client.Send ((short)CustomMsgType.StopRowing, new IntegerMessage (0));
View.StopRowing ();
IsMoving = false;
}
}
}
}
@@ -7,38 +7,144 @@

public class TestServer : NetworkManager
{
private int WorldClientId;
private bool WorldClientIdSet = false;
private Dictionary<int, RowerData> RowerData = new Dictionary<int, RowerData>();

// Use this for initialization
void Start()
{
StartServer();
NetworkServer.RegisterHandler((short)CustomMsgType.StartRowing, OnStartRowing);
NetworkServer.RegisterHandler((short)CustomMsgType.StopRowing, OnStopRowing);
NetworkServer.RegisterHandler((short)CustomMsgType.RegisterView, (netMsg) =>
{
WorldClientId = netMsg.conn.connectionId;
WorldClientIdSet = true;
});
}

private void OnStopRowing(NetworkMessage netMsg)
{
var data = RowerData[netMsg.conn.connectionId];
data.Stop = DateTime.Now;

var updateMsg = new ViewUpdateRowerMessage { Id = netMsg.conn.connectionId, Duration = (float)(data.Stop - data.Start).TotalSeconds };

if (WorldClientIdSet)
{
NetworkServer.SendToClient(WorldClientId, (short)CustomMsgType.UpdateFromFinishedRow, updateMsg);
}
}

private void OnStartRowing(NetworkMessage netMsg)
{
RowerData[netMsg.conn.connectionId] = new RowerData { Start = DateTime.Now };
}
private Dictionary<int, RowerData> RowerData = new Dictionary<int, RowerData> ();

private bool ServerStarted = false;

private int GameViewClientId;
private bool GameViewClientSet = false;

private GameState GameState;

// Use this for initialization
void Start ()
{
StartServer ();
NetworkServer.RegisterHandler ((short)CustomMsgType.StartRowing, OnStartRowing);
NetworkServer.RegisterHandler ((short)CustomMsgType.StopRowing, OnStopRowing);
NetworkServer.RegisterHandler ((short)CustomMsgType.RegisterView, (netMsg) =>
{
GameViewClientId = netMsg.conn.connectionId;
GameViewClientSet = true;
});

GameState = new GameState ();
}

public void TryStartServer ()
{
if (ServerStarted)
{
return;
}

ServerStarted = StartServer ();

if (!ServerStarted)
{
Debug.LogError ("Failed to start server!");
return;
}
NetworkServer.RegisterHandler ((short)CustomMsgType.JoinGroup, OnJoinGroup);
NetworkServer.RegisterHandler ((short)CustomMsgType.LeaveGroup, OnLeaveGroup);
NetworkServer.RegisterHandler ((short)CustomMsgType.JoinSide, OnJoinSide);
NetworkServer.RegisterHandler ((short)CustomMsgType.LeaveSide, OnLeaveSide);

NetworkServer.RegisterHandler ((short)CustomMsgType.Test, (netMsg) =>
{
var msg = netMsg.ReadMessage<IntegerMessage> ();
NetworkServer.SendToClient (GameViewClientId, (short)CustomMsgType.Test, msg);
});
NetworkServer.RegisterHandler ((short)CustomMsgType.RegisterView, (netMsg) =>
{
GameViewClientId = netMsg.conn.connectionId;
});

Debug.Log ("Server started!");
}

private void SendGameStateToView ()
{
UpdateGameStateMessage msg = new UpdateGameStateMessage ();
msg.ConnectedPlayers = GameState.GetPlayerState ();
NetworkServer.SendToClient (GameViewClientId, (short)CustomMsgType.UpdateGameState, msg);
}

private void OnJoinGroup (NetworkMessage netMsg)
{
var playerId = netMsg.conn.connectionId;
var group = netMsg.ReadMessage<IntegerMessage> ().value;

if (!GameState.HasPlayer (playerId))
{
GameState.AddPlayer (playerId, groupId: group);
}
else
{
GameState.SetGroupId (playerId, group);
}
}

private void OnLeaveGroup (NetworkMessage netMsg)
{
var playerId = netMsg.conn.connectionId;

GameState.SetGroupId (playerId, Player.NO_GROUP);
}

private void OnJoinSide (NetworkMessage netMsg)
{
var playerId = netMsg.conn.connectionId;
var side = netMsg.ReadMessage<IntegerMessage> ().value;

if (!GameState.HasPlayer (playerId))
{
GameState.AddPlayer (playerId, sideId: side);
}
else
{
GameState.SetSideId (playerId, side);
}

SendGameStateToView ();
}

private void OnLeaveSide (NetworkMessage netMsg)
{
var playerId = netMsg.conn.connectionId;
GameState.SetSideId (playerId, Player.NO_SIDE);

SendGameStateToView ();
}


public override void OnClientConnect (NetworkConnection conn)
{
GameState.AddPlayer (conn.connectionId);
base.OnClientConnect (conn);
}

public override void OnClientDisconnect (NetworkConnection conn)
{
GameState.RemovePlayer (conn.connectionId);
base.OnClientDisconnect (conn);
}

private void OnStopRowing (NetworkMessage netMsg)
{
var data = RowerData[netMsg.conn.connectionId];
data.Stop = DateTime.Now;

var updateMsg = new ViewUpdateRowerMessage { Id = netMsg.conn.connectionId, Duration = (float)(data.Stop - data.Start).TotalSeconds };

if (GameViewClientSet)
{
NetworkServer.SendToClient (GameViewClientId, (short)CustomMsgType.UpdateFromFinishedRow, updateMsg);
}
}

private void OnStartRowing (NetworkMessage netMsg)
{
RowerData[netMsg.conn.connectionId] = new RowerData { Start = DateTime.Now };
}
}
@@ -5,42 +5,58 @@
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;

public class TestView : NetworkManager {
public class TestView : NetworkManager
{
public GameState GameState { get; private set; }

public List<RowingView> Views;
public List<RowingView> Views;
// Use this for initialization
void Start () {
StartClient();
StartCoroutine(Co_WaitForClientReady());



public void StartWorldView ()
{
StartClient ();
StartCoroutine (Co_WaitForClientReady ());

GameState = new GameState ();
}

private IEnumerator Co_WaitForClientReady()
private IEnumerator Co_WaitForClientReady ()
{
while (!client.isConnected) {
yield return null;
while (client != null || !client.isConnected)
{
yield return null;
}
client.Send((short)CustomMsgType.RegisterView, new IntegerMessage(0));
client.RegisterHandler((short)CustomMsgType.UpdateFromFinishedRow, OnViewUpdate);
Debug.Log ("registering GameView client...");
client.Send ((short)CustomMsgType.RegisterView, new IntegerMessage (0));
client.RegisterHandler ((short)CustomMsgType.UpdateFromFinishedRow, OnViewUpdate);
client.RegisterHandler ((short)CustomMsgType.UpdateGameState, OnGameStateUpdate);
}

private void OnViewUpdate(NetworkMessage netMsg)
private void OnViewUpdate (NetworkMessage netMsg)
{
var rowerData = netMsg.ReadMessage<ViewUpdateRowerMessage>();
foreach (var rower in Views) {
if (rower.Id == rowerData.Id) {
rower.SetAnimationDuration(rowerData.Duration);
rower.StartRowing();
StartCoroutine(Co_WaitForAnimationFinish(rowerData));
var rowerData = netMsg.ReadMessage<ViewUpdateRowerMessage> ();
foreach (var rower in Views)
{
if (rower.Id == rowerData.Id)
{
rower.SetAnimationDuration (rowerData.Duration);
rower.StartRowing ();
StartCoroutine (Co_WaitForAnimationFinish (rowerData));
}
}
}


private IEnumerator Co_WaitForAnimationFinish(ViewUpdateRowerMessage rower)
private void OnGameStateUpdate (NetworkMessage netMsg)
{
yield return new WaitForSeconds(rower.Duration);
Views[rower.Id].StopRowing();
var msg = netMsg.ReadMessage<UpdateGameStateMessage> ();
GameState.SetPlayerState (msg.ConnectedPlayers);
}


private IEnumerator Co_WaitForAnimationFinish (ViewUpdateRowerMessage rower)
{
yield return new WaitForSeconds (rower.Duration);
Views[rower.Id].StopRowing ();
}
}
@@ -22,18 +22,35 @@ public class UIManager : MonoBehaviour
public Text GroupBLeft;
public Text GroupBRight;

private Manager netManager;
public TestView WorldView;
public TestClient ClientView;

public bool IsPresenter;
public bool IsClient;


private GameState gameState;

private void OnEnable ()
{
ShowConnect ();
var gameManager = GameObject.FindGameObjectWithTag ("GameManager");
netManager = gameManager.GetComponent<Manager> ();
if (IsPresenter)
{
WorldView.StartWorldView ();
ShowWaiting (false);
}
else
{
ShowConnect ();
}

if (IsPresenter)
{
gameState = WorldView.GameState;
gameState.OnGameStateChanged -= UpdateText;
gameState.OnGameStateChanged += UpdateText;
}


gameState = gameManager.GetComponent<GameState> ();
gameState.OnGameStateChanged -= UpdateText;
gameState.OnGameStateChanged += UpdateText;
}

public void ShowConnect ()
@@ -73,41 +90,35 @@ public void ShowWaiting (bool showBackButton)

public void OnHostButton ()
{
netManager.StartGameServer ();
//netManager.StartGameServer ();
ShowWaiting (false);
}

public void OnConnectButton ()
{
string ip = string.IsNullOrEmpty (IpInput.text) ? (IpInput.placeholder as Text).text : IpInput.text;
netManager.StartClient (ip);
ClientView.StartClient (ip);
ShowGroupSelection ();
}

public void OnConnectAsGameViewClient ()
{
string ip = string.IsNullOrEmpty (IpInput.text) ? (IpInput.placeholder as Text).text : IpInput.text;
netManager.StartGameViewClient (ip);
ShowGroupSelection ();
}

public void OnBackButton ()
{
netManager.LeaveSide ();
netManager.LeaveGroup ();
ClientView.LeaveSide ();
ClientView.LeaveGroup ();
ShowGroupSelection ();
}

public void OnGroupSelect (int team)
{
ShowSideSelection ();
netManager.JoinGroup (team);
ClientView.JoinGroup (team);
}

public void OnSideSelect (int side)
{
ShowWaiting (true);
netManager.JoinSide (side);
ClientView.JoinSide (side);
}

private void UpdateText ()