/
UnityNetworkServer.cs
128 lines (108 loc) · 3.86 KB
/
UnityNetworkServer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
namespace PlayFab.Networking
{
using System;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using UnityEngine.Events;
public class UnityNetworkServer : NetworkManager
{
public static UnityNetworkServer Instance { get; private set; }
public PlayerEvent OnPlayerAdded = new PlayerEvent();
public PlayerEvent OnPlayerRemoved = new PlayerEvent();
public int MaxConnections = 100;
public int Port = 7777; // overwritten by the code in AgentListener.cs
public List<UnityNetworkConnection> Connections
{
get { return _connections; }
private set { _connections = value; }
}
private List<UnityNetworkConnection> _connections = new List<UnityNetworkConnection>();
public class PlayerEvent : UnityEvent<string> { }
// Use this for initialization
public override void Awake()
{
base.Awake();
Instance = this;
NetworkServer.RegisterHandler<ReceiveAuthenticateMessage>(OnReceiveAuthenticate);
}
public void StartListen()
{
this.GetComponent<TelepathyTransport>().port = (ushort)Port;
NetworkServer.Listen(MaxConnections);
}
public override void OnApplicationQuit()
{
base.OnApplicationQuit();
NetworkServer.Shutdown();
}
private void OnReceiveAuthenticate(NetworkConnection nconn, ReceiveAuthenticateMessage message)
{
var conn = _connections.Find(c => c.ConnectionId == nconn.connectionId);
if(conn != null)
{
conn.PlayFabId = message.PlayFabId;
conn.IsAuthenticated = true;
OnPlayerAdded.Invoke(message.PlayFabId);
}
}
public override void OnServerConnect(NetworkConnection conn)
{
base.OnServerConnect(conn);
Debug.LogWarning("Client Connected");
var uconn = _connections.Find(c => c.ConnectionId == conn.connectionId);
if (uconn == null)
{
_connections.Add(new UnityNetworkConnection()
{
Connection = conn,
ConnectionId = conn.connectionId,
LobbyId = PlayFabMultiplayerAgentAPI.SessionConfig.SessionId
});
}
}
public override void OnServerError(NetworkConnection conn, Exception ex)
{
base.OnServerError(conn, ex);
Debug.Log(string.Format("Unity Network Connection Status: exception - {0}", ex.Message));
}
public override void OnServerDisconnect(NetworkConnection conn)
{
base.OnServerDisconnect(conn);
var uconn = _connections.Find(c => c.ConnectionId == conn.connectionId);
if (uconn != null)
{
if (!string.IsNullOrEmpty(uconn.PlayFabId))
{
OnPlayerRemoved.Invoke(uconn.PlayFabId);
}
_connections.Remove(uconn);
}
}
}
[Serializable]
public class UnityNetworkConnection
{
public bool IsAuthenticated;
public string PlayFabId;
public string LobbyId;
public int ConnectionId;
public NetworkConnection Connection;
}
public class CustomGameServerMessageTypes
{
public const short ReceiveAuthenticate = 900;
public const short ShutdownMessage = 901;
public const short MaintenanceMessage = 902;
}
public struct ReceiveAuthenticateMessage : NetworkMessage
{
public string PlayFabId;
}
public struct ShutdownMessage : NetworkMessage {}
[Serializable]
public struct MaintenanceMessage : NetworkMessage
{
public DateTime ScheduledMaintenanceUTC;
}
}