1
Fork 0
mirror of https://github.com/Steffo99/better-tee.git synced 2024-11-22 23:34:18 +00:00
better-tee/Assets/Code/Server/ServerMainController.cs

211 lines
7.2 KiB
C#
Raw Normal View History

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
}
}