2019-09-19 10:28:02 +00:00
|
|
|
using System;
|
2019-09-19 17:02:34 +00:00
|
|
|
using System.Linq;
|
2019-09-19 10:28:02 +00:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using UnityEngine;
|
|
|
|
using Mirror;
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
namespace BetterTee.Server
|
|
|
|
{
|
2019-09-19 10:28:02 +00:00
|
|
|
|
|
|
|
public class ServerMainController : MonoBehaviour
|
|
|
|
{
|
2019-09-19 17:02:34 +00:00
|
|
|
|
2019-09-19 10:28:02 +00:00
|
|
|
[Header("Status")]
|
2019-09-19 17:02:34 +00:00
|
|
|
public string lobbyPassword = null;
|
|
|
|
public Dictionary<NetworkConnection, ConnectedPlayer> players;
|
|
|
|
public Dictionary<NetworkConnection, ConnectedViewer> viewers;
|
2019-09-19 10:28:02 +00:00
|
|
|
public GamePhase phase = GamePhase.UNINTIALIZED;
|
2019-09-19 17:02:34 +00:00
|
|
|
public GameSettings gameSettings = null;
|
|
|
|
public int? currentActNumber = null;
|
|
|
|
|
|
|
|
public ActSettings CurrentActSettings {
|
|
|
|
get {
|
|
|
|
if(gameSettings == null) return null;
|
|
|
|
if(currentActNumber == null) return null;
|
|
|
|
return gameSettings.acts[currentActNumber.Value - 1];
|
|
|
|
}
|
|
|
|
}
|
2019-09-19 10:28:02 +00:00
|
|
|
|
|
|
|
[Header("Constants")]
|
|
|
|
public const int MAX_CONNECTIONS = 32;
|
2019-09-19 17:02:34 +00:00
|
|
|
|
|
|
|
#region Unity Methods
|
2019-09-19 10:28:02 +00:00
|
|
|
|
|
|
|
protected void Start() {
|
2019-09-19 17:02:34 +00:00
|
|
|
ServerStart();
|
2019-09-19 10:28:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void OnDestroy() {
|
|
|
|
if(NetworkServer.active) NetworkServer.Shutdown();
|
|
|
|
}
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
public void ServerStart() {
|
2019-09-19 10:28:02 +00:00
|
|
|
LogFilter.Debug = true;
|
|
|
|
phase = GamePhase.LOBBY;
|
2019-09-19 17:02:34 +00:00
|
|
|
players = new Dictionary<NetworkConnection, ConnectedPlayer>();
|
|
|
|
viewers = new Dictionary<NetworkConnection, ConnectedViewer>();
|
2019-09-19 10:28:02 +00:00
|
|
|
Transport.activeTransport = GetComponent<TelepathyTransport>();
|
|
|
|
|
|
|
|
#region Client Messages
|
|
|
|
NetworkServer.RegisterHandler<NetMsg.Client.PlayerJoin>(OnPlayerJoin);
|
2019-09-19 17:02:34 +00:00
|
|
|
NetworkServer.RegisterHandler<NetMsg.Client.ActResultsMsg>(OnActResults);
|
2019-09-19 10:28:02 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region Viewer Messages
|
2019-09-19 17:02:34 +00:00
|
|
|
NetworkServer.RegisterHandler<NetMsg.Viewer.Settings>(OnGameSettings);
|
2019-09-19 10:28:02 +00:00
|
|
|
NetworkServer.RegisterHandler<NetMsg.Viewer.ViewerLink>(OnViewerLink);
|
2019-09-19 17:02:34 +00:00
|
|
|
NetworkServer.RegisterHandler<NetMsg.Viewer.GameStart>(OnGameStart);
|
2019-09-19 10:28:02 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region Other Messages
|
|
|
|
NetworkServer.RegisterHandler<ConnectMessage>(OnConnect);
|
2019-09-19 17:02:34 +00:00
|
|
|
NetworkServer.RegisterHandler<DisconnectMessage>(OnDisconnect);
|
2019-09-19 10:28:02 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
NetworkServer.Listen(MAX_CONNECTIONS);
|
|
|
|
}
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
public void SendLobbyUpdate() {
|
|
|
|
SendToAllRegistered<NetMsg.Server.LobbyStatusChange>(new NetMsg.Server.LobbyStatusChange {
|
|
|
|
players = players.Values.ToList().ConvertAll<ConnectedPlayerData>(player => player.Data).ToArray(),
|
|
|
|
viewers = viewers.Values.ToList().ConvertAll<ConnectedViewerData>(viewer => viewer.Data).ToArray()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public void GameStart() {
|
|
|
|
phase = GamePhase.ACTS;
|
|
|
|
currentActNumber = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void ActInit() {
|
|
|
|
SendToAllRegistered<NetMsg.Server.ActInit>(new NetMsg.Server.ActInit {
|
|
|
|
settings = CurrentActSettings
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#region SendToAll Methods
|
|
|
|
|
|
|
|
public void SendToAllPlayers<T>(T message, int channelId = 0)
|
|
|
|
where T: IMessageBase {
|
|
|
|
foreach(NetworkConnection connection in players.Keys) {
|
|
|
|
connection.Send<T>(message, channelId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SendToAllViewers<T>(T message, int channelId = 0)
|
|
|
|
where T: IMessageBase {
|
|
|
|
foreach(NetworkConnection connection in viewers.Keys) {
|
|
|
|
connection.Send<T>(message, channelId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SendToAllRegistered<T>(T message, int channelId = 0)
|
|
|
|
where T: IMessageBase {
|
|
|
|
SendToAllPlayers<T>(message, channelId);
|
|
|
|
SendToAllViewers<T>(message, channelId);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
2019-09-19 10:28:02 +00:00
|
|
|
#region Network Events
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
protected void OnConnect(NetworkConnection connection, ConnectMessage message) {
|
|
|
|
//Kick out clients that don't identify in 5 seconds?
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void OnDisconnect(NetworkConnection connection, DisconnectMessage message) {
|
|
|
|
//How to handle disconnections?
|
|
|
|
try {
|
|
|
|
players.Remove(connection);
|
|
|
|
}
|
|
|
|
catch(KeyNotFoundException) {}
|
|
|
|
|
|
|
|
try {
|
|
|
|
viewers.Remove(connection);
|
|
|
|
}
|
|
|
|
catch(KeyNotFoundException) {}
|
|
|
|
|
|
|
|
SendLobbyUpdate();
|
|
|
|
}
|
2019-09-19 10:28:02 +00:00
|
|
|
|
|
|
|
protected void OnPlayerJoin(NetworkConnection connection, NetMsg.Client.PlayerJoin message)
|
|
|
|
{
|
2019-09-19 17:02:34 +00:00
|
|
|
if(message.gamePassword != lobbyPassword) {
|
2019-09-19 10:28:02 +00:00
|
|
|
connection.Send<NetMsg.Server.Error.InvalidPassword>(new NetMsg.Server.Error.InvalidPassword());
|
|
|
|
connection.Disconnect();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if(phase != GamePhase.LOBBY) {
|
|
|
|
connection.Send<NetMsg.Server.Error.GameAlreadyStarted>(new NetMsg.Server.Error.GameAlreadyStarted());
|
|
|
|
connection.Disconnect();
|
|
|
|
return;
|
|
|
|
}
|
2019-09-19 17:02:34 +00:00
|
|
|
if(players.Count >= gameSettings.maximumPlayers) {
|
|
|
|
connection.Send<NetMsg.Server.Error.MaxPlayersCapReached>(new NetMsg.Server.Error.MaxPlayersCapReached());
|
|
|
|
connection.Disconnect();
|
|
|
|
return;
|
|
|
|
}
|
2019-09-19 10:28:02 +00:00
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
ConnectedPlayer newPlayer = new ConnectedPlayer {
|
2019-09-19 10:28:02 +00:00
|
|
|
name = message.playerName,
|
|
|
|
id = players.Count
|
|
|
|
};
|
2019-09-19 17:02:34 +00:00
|
|
|
players.Add(connection, newPlayer);
|
2019-09-19 10:28:02 +00:00
|
|
|
|
|
|
|
Debug.LogFormat("Player {0} joined the game", message.playerName);
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
SendLobbyUpdate();
|
2019-09-19 10:28:02 +00:00
|
|
|
}
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
protected void OnActResults(NetworkConnection connection, NetMsg.Client.ActResultsMsg message) {
|
|
|
|
//Where should we put act results?
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void OnGameSettings(NetworkConnection connection, NetMsg.Viewer.Settings message) {
|
|
|
|
Debug.LogFormat("Received GameSettings from {0}", viewers[connection].name);
|
|
|
|
gameSettings = message.settings;
|
2019-09-19 10:28:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void OnViewerLink(NetworkConnection connection, NetMsg.Viewer.ViewerLink message)
|
|
|
|
{
|
2019-09-19 17:02:34 +00:00
|
|
|
if(message.gamePassword != lobbyPassword) {
|
2019-09-19 10:28:02 +00:00
|
|
|
connection.Send<NetMsg.Server.Error.InvalidPassword>(new NetMsg.Server.Error.InvalidPassword());
|
|
|
|
connection.Disconnect();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
ConnectedViewer newViewer = new ConnectedViewer {
|
|
|
|
name = message.viewerName,
|
2019-09-19 10:28:02 +00:00
|
|
|
id = viewers.Count
|
|
|
|
};
|
2019-09-19 17:02:34 +00:00
|
|
|
viewers.Add(connection, newViewer);
|
2019-09-19 10:28:02 +00:00
|
|
|
|
|
|
|
Debug.LogFormat("Viewer {0} is now linked to the game", message.viewerName);
|
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
SendLobbyUpdate();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void OnGameStart(NetworkConnection connection, NetMsg.Viewer.GameStart message) {
|
|
|
|
|
|
|
|
if(gameSettings == null) {
|
|
|
|
connection.Send<NetMsg.Server.Error.NoSettings>(new NetMsg.Server.Error.NoSettings());
|
|
|
|
connection.Disconnect();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(players.Count < gameSettings.minimumPlayers) {
|
|
|
|
connection.Send<NetMsg.Server.Error.NotEnoughPlayers>(new NetMsg.Server.Error.NotEnoughPlayers());
|
|
|
|
connection.Disconnect();
|
|
|
|
return;
|
|
|
|
}
|
2019-09-19 10:28:02 +00:00
|
|
|
|
2019-09-19 17:02:34 +00:00
|
|
|
GameStart();
|
2019-09-19 10:28:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|