Skip to content

Commit 5be6a02

Browse files
authored
Merge pull request #48 from TwoTenPvP/custom-transport
Custom transport
2 parents 2cee9b0 + 822a801 commit 5be6a02

18 files changed

+361
-223
lines changed

MLAPI/Data/Channel.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using UnityEngine.Networking;
32

43
namespace MLAPI.Data
54
{
@@ -16,7 +15,7 @@ public class Channel
1615
/// <summary>
1716
/// The Transport QOS type
1817
/// </summary>
19-
public QosType Type;
18+
public ChannelType Type;
2019
/// <summary>
2120
/// Wheter or not the channel should be encrypted
2221
/// </summary>

MLAPI/Data/NetworkConfig.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using MLAPI.NetworkingManagerComponents.Binary;
1+
using MLAPI.Data.Transports.UNET;
2+
using MLAPI.NetworkingManagerComponents.Binary;
23
using System;
34
using System.Collections.Generic;
45
using System.Security.Cryptography;
@@ -19,15 +20,7 @@ public class NetworkConfig
1920
/// <summary>
2021
/// The transport hosts the sever uses
2122
/// </summary>
22-
public List<TransportHost> ServerTransports = new List<TransportHost>()
23-
{
24-
new TransportHost()
25-
{
26-
Name = "UDP Socket",
27-
Port = 7777,
28-
Websockets = false
29-
}
30-
};
23+
public IUDPTransport NetworkTransport = new UnetTransport();
3124
/// <summary>
3225
/// Channels used by the NetworkedTransport
3326
/// </summary>

MLAPI/Data/Transports/ChannelType.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
namespace MLAPI.Data
2+
{
3+
public enum ChannelType
4+
{
5+
Unreliable,
6+
UnreliableFragmented,
7+
UnreliableSequenced,
8+
Reliable,
9+
ReliableFragmented,
10+
ReliableSequenced,
11+
StateUpdate,
12+
ReliableStateUpdate,
13+
AllCostDelivery,
14+
UnreliableFragmentedSequenced,
15+
ReliableFragmentedSequenced
16+
}
17+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace MLAPI.Data
2+
{
3+
public interface IUDPTransport
4+
{
5+
ChannelType InternalChannel { get; }
6+
uint ServerNetId { get; }
7+
uint HostDummyId { get; }
8+
uint InvalidDummyId { get; }
9+
void QueueMessageForSending(uint clientId, ref byte[] dataBuffer, int dataSize, int channelId, bool skipQueue, out byte error);
10+
void SendQueue(uint clientId, out byte error);
11+
NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error);
12+
int AddChannel(ChannelType type, object settings);
13+
void Connect(string address, int port, object settings, out byte error);
14+
void RegisterServerListenSocket(object settings);
15+
void DisconnectClient(uint clientId);
16+
void DisconnectFromServer();
17+
int GetCurrentRTT(uint clientId, out byte error);
18+
int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error);
19+
int GetNetworkTimestamp();
20+
object GetSettings();
21+
void Shutdown();
22+
}
23+
}

MLAPI/Data/Transports/NetEventType.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace MLAPI.Data
2+
{
3+
public enum NetEventType
4+
{
5+
Data,
6+
Connect,
7+
Disconnect,
8+
Nothing
9+
}
10+
}

MLAPI/Data/NetId.cs renamed to MLAPI/Data/Transports/UNET/NetId.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using MLAPI.MonoBehaviours.Core;
2-
3-
namespace MLAPI.Data
1+
namespace MLAPI.Data.Transports.UNET
42
{
53
/// <summary>
64
/// Represents a ClientId structure
@@ -37,17 +35,6 @@ public bool IsInvalid()
3735
return Meta == 2;
3836
}
3937
/// <summary>
40-
/// Static ServerNetId for comparison
41-
/// </summary>
42-
/// <value>The server net identifier.</value>
43-
public static NetId ServerNetId
44-
{
45-
get
46-
{
47-
return new NetId((byte)NetworkingManager.singleton.serverHostId, (ushort)NetworkingManager.singleton.serverConnectionId, false, false);
48-
}
49-
}
50-
/// <summary>
5138
/// Initializes a new instance of the netId struct from transport values
5239
/// </summary>
5340
/// <param name="hostId">Host identifier.</param>

MLAPI/Data/TransportHost.cs renamed to MLAPI/Data/Transports/UNET/TransportHost.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
22

3-
namespace MLAPI.Data
3+
namespace MLAPI.Data.Transports.UNET
44
{
55
/// <summary>
66
/// Represents a Transport host
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
using MLAPI.MonoBehaviours.Core;
2+
using System;
3+
using System.Collections.Generic;
4+
using UnityEngine.Networking;
5+
6+
namespace MLAPI.Data.Transports.UNET
7+
{
8+
[Serializable]
9+
public class UnetTransport : IUDPTransport
10+
{
11+
public ChannelType InternalChannel { get => ChannelType.ReliableFragmentedSequenced; }
12+
13+
public uint HostDummyId { get => new NetId(0,0,true,false).GetClientId(); }
14+
15+
public uint InvalidDummyId { get => new NetId(0, 0, false, true).GetClientId(); }
16+
17+
public uint ServerNetId { get => new NetId((byte)serverHostId, (ushort)serverConnectionId, false, false).GetClientId(); }
18+
19+
public int serverConnectionId;
20+
public int serverHostId;
21+
22+
public List<TransportHost> ServerTransports = new List<TransportHost>()
23+
{
24+
new TransportHost()
25+
{
26+
Name = "UDP Socket",
27+
Port = 7777,
28+
Websockets = false
29+
}
30+
};
31+
32+
public int Connect(string address, int port, object settings, bool websocket, out byte error)
33+
{
34+
NetworkTransport.Init();
35+
int hostId = NetworkTransport.AddHost((HostTopology)settings);
36+
return NetworkTransport.Connect(hostId, address, port, 0, out error);
37+
}
38+
39+
public void DisconnectClient(uint clientId)
40+
{
41+
NetId netId = new NetId(clientId);
42+
if (netId.IsHost() || netId.IsInvalid())
43+
return;
44+
byte error;
45+
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out error);
46+
}
47+
48+
public void DisconnectFromServer()
49+
{
50+
byte error;
51+
NetworkTransport.Disconnect(serverHostId, serverConnectionId, out error);
52+
}
53+
54+
public int GetCurrentRTT(uint clientId, out byte error)
55+
{
56+
NetId netId = new NetId(clientId);
57+
return NetworkTransport.GetCurrentRTT(netId.HostId, netId.ConnectionId, out error);
58+
}
59+
60+
public int GetNetworkTimestamp()
61+
{
62+
return NetworkTransport.GetNetworkTimestamp();
63+
}
64+
65+
public int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error)
66+
{
67+
NetId netId = new NetId(clientId);
68+
return NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteTimestamp, out error);
69+
}
70+
71+
public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error)
72+
{
73+
int hostId;
74+
int connectionId;
75+
byte err;
76+
NetworkEventType eventType = NetworkTransport.Receive(out hostId, out connectionId, out channelId, data, bufferSize, out receivedSize, out err);
77+
clientId = new NetId((byte)hostId, (ushort)connectionId, false, false).GetClientId();
78+
NetworkError errorType = (NetworkError)err;
79+
if (errorType == NetworkError.Timeout)
80+
eventType = NetworkEventType.DisconnectEvent; //In UNET. Timeouts are not disconnects. We have to translate that here.
81+
error = 0;
82+
83+
//Translate NetworkEventType to NetEventType
84+
switch (eventType)
85+
{
86+
case NetworkEventType.DataEvent:
87+
return NetEventType.Data;
88+
case NetworkEventType.ConnectEvent:
89+
return NetEventType.Connect;
90+
case NetworkEventType.DisconnectEvent:
91+
return NetEventType.Disconnect;
92+
case NetworkEventType.Nothing:
93+
return NetEventType.Nothing;
94+
case NetworkEventType.BroadcastEvent:
95+
return NetEventType.Nothing;
96+
}
97+
return NetEventType.Nothing;
98+
}
99+
100+
public void QueueMessageForSending(uint clientId, ref byte[] dataBuffer, int dataSize, int channelId, bool skipqueue, out byte error)
101+
{
102+
NetId netId = new NetId(clientId);
103+
if (netId.IsHost() || netId.IsInvalid())
104+
{
105+
error = 0;
106+
return;
107+
}
108+
if (skipqueue)
109+
NetworkTransport.Send(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
110+
else
111+
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
112+
}
113+
114+
public void Shutdown()
115+
{
116+
NetworkTransport.Shutdown();
117+
}
118+
119+
public void SendQueue(uint clientId, out byte error)
120+
{
121+
NetId netId = new NetId(clientId);
122+
NetworkTransport.SendQueuedMessages(netId.HostId, netId.ConnectionId, out error);
123+
}
124+
125+
public void RegisterServerListenSocket(object settings)
126+
{
127+
HostTopology topology = new HostTopology((ConnectionConfig)settings, NetworkingManager.singleton.NetworkConfig.MaxConnections);
128+
for (int i = 0; i < ServerTransports.Count; i++)
129+
{
130+
if (ServerTransports[i].Websockets)
131+
NetworkTransport.AddWebsocketHost(topology, ServerTransports[i].Port);
132+
else
133+
NetworkTransport.AddHost(topology, ServerTransports[i].Port);
134+
}
135+
}
136+
137+
public int AddChannel(ChannelType type, object settings)
138+
{
139+
ConnectionConfig config = (ConnectionConfig)settings;
140+
switch (type)
141+
{
142+
case ChannelType.Unreliable:
143+
return config.AddChannel(QosType.Unreliable);
144+
case ChannelType.UnreliableFragmented:
145+
return config.AddChannel(QosType.UnreliableFragmented);
146+
case ChannelType.UnreliableSequenced:
147+
return config.AddChannel(QosType.UnreliableSequenced);
148+
case ChannelType.Reliable:
149+
return config.AddChannel(QosType.Reliable);
150+
case ChannelType.ReliableFragmented:
151+
return config.AddChannel(QosType.ReliableFragmented);
152+
case ChannelType.ReliableSequenced:
153+
return config.AddChannel(QosType.ReliableSequenced);
154+
case ChannelType.StateUpdate:
155+
return config.AddChannel(QosType.StateUpdate);
156+
case ChannelType.ReliableStateUpdate:
157+
return config.AddChannel(QosType.ReliableStateUpdate);
158+
case ChannelType.AllCostDelivery:
159+
return config.AddChannel(QosType.AllCostDelivery);
160+
case ChannelType.UnreliableFragmentedSequenced:
161+
return config.AddChannel(QosType.UnreliableFragmentedSequenced);
162+
case ChannelType.ReliableFragmentedSequenced:
163+
return config.AddChannel(QosType.ReliableFragmentedSequenced);
164+
}
165+
return 0;
166+
}
167+
168+
public object GetSettings()
169+
{
170+
NetworkTransport.Init();
171+
return new ConnectionConfig()
172+
{
173+
SendDelay = 0
174+
};
175+
}
176+
177+
public void Connect(string address, int port, object settings, out byte error)
178+
{
179+
serverHostId = NetworkTransport.AddHost(new HostTopology((ConnectionConfig)settings, 1));
180+
serverConnectionId = NetworkTransport.Connect(serverHostId, address, port, 0, out error);
181+
}
182+
}
183+
}

MLAPI/MLAPI.csproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,19 @@
7272
<Compile Include="Attributes\TargetRpc.cs" />
7373
<Compile Include="Data\Cache.cs" />
7474
<Compile Include="Data\Channel.cs" />
75+
<Compile Include="Data\Transports\ChannelType.cs" />
7576
<Compile Include="Data\FieldType.cs" />
7677
<Compile Include="Attributes\SyncedVar.cs" />
7778
<Compile Include="Data\FixedQueue.cs" />
79+
<Compile Include="Data\Transports\IUDPTransport.cs" />
80+
<Compile Include="Data\Transports\NetEventType.cs" />
7881
<Compile Include="Data\NetworkConfig.cs" />
7982
<Compile Include="Data\NetworkedPrefab.cs" />
8083
<Compile Include="Data\NetworkPool.cs" />
8184
<Compile Include="Data\SyncedVarField.cs" />
8285
<Compile Include="Data\TrackedPointData.cs" />
83-
<Compile Include="Data\TransportHost.cs" />
86+
<Compile Include="Data\Transports\UNET\TransportHost.cs" />
87+
<Compile Include="Data\Transports\UNET\UnetTransport.cs" />
8488
<Compile Include="GlobalSuppressions.cs" />
8589
<Compile Include="MonoBehaviours\Prototyping\NetworkedAnimator.cs" />
8690
<Compile Include="MonoBehaviours\Prototyping\NetworkedNavMeshAgent.cs" />
@@ -105,7 +109,7 @@
105109
<Compile Include="NetworkingManagerComponents\Core\NetworkSceneManager.cs" />
106110
<Compile Include="NetworkingManagerComponents\Core\SpawnManager.cs" />
107111
<Compile Include="Properties\AssemblyInfo.cs" />
108-
<Compile Include="Data\NetId.cs" />
112+
<Compile Include="Data\Transports\UNET\NetId.cs" />
109113
<Compile Include="NetworkingManagerComponents\Binary\MessageChunker.cs" />
110114
<Compile Include="Data\MessageType.cs" />
111115
<Compile Include="NetworkingManagerComponents\Core\InternalMessageHandler.Send.cs" />

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ protected void InvokeCommand(string methodName, params object[] methodParams)
215215
FieldTypeHelper.WriteFieldType(writer, methodParams[i], fieldType);
216216
}
217217

218-
InternalMessageHandler.Send(NetId.ServerNetId.GetClientId(), "MLAPI_COMMAND", "MLAPI_INTERNAL", writer.Finalize(), null);
218+
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, "MLAPI_COMMAND", "MLAPI_INTERNAL", writer.Finalize(), null);
219219
}
220220
}
221221

@@ -505,7 +505,7 @@ internal void SyncVarUpdate()
505505
}
506506
else
507507
{
508-
if (!(isHost && new NetId(ownerClientId).IsHost()))
508+
if (!(isHost && ownerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId))
509509
{
510510
//It's sync time. This is the target receivers packet.
511511
using (BitWriter writer = new BitWriter())
@@ -606,7 +606,7 @@ protected void SendToServer(string messageType, string channelName, byte[] data)
606606
Debug.LogWarning("MLAPI: Server can not send messages to server.");
607607
return;
608608
}
609-
InternalMessageHandler.Send(NetId.ServerNetId.GetClientId(), messageType, channelName, data, null);
609+
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, messageType, channelName, data, null);
610610
}
611611

612612
/// <summary>
@@ -644,7 +644,7 @@ protected void SendToServerTarget(string messageType, string channelName, byte[]
644644
Debug.LogWarning("MLAPI: Server can not send messages to server.");
645645
return;
646646
}
647-
InternalMessageHandler.Send(NetId.ServerNetId.GetClientId(), messageType, channelName, data, null, networkId, networkedObject.GetOrderIndex(this));
647+
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, messageType, channelName, data, null, networkId, networkedObject.GetOrderIndex(this));
648648
}
649649

650650
/// <summary>

0 commit comments

Comments
 (0)