Skip to content

Commit 06774ea

Browse files
committed
Merge branch 'master' of https://github.com/TwoTenPvP/MLAPI
2 parents f6dc01a + 5a3d065 commit 06774ea

File tree

7 files changed

+86
-64
lines changed

7 files changed

+86
-64
lines changed

MLAPI/Data/NetworkingConfiguration.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ public class NetworkingConfiguration
1515
internal HashSet<ushort> RegisteredPassthroughMessageTypes = new HashSet<ushort>();
1616
public List<string> RegisteredScenes = new List<string>();
1717
public int MessageBufferSize = 65535;
18-
public int Tickrate = 64;
18+
public int ReceiveTickrate = 64;
19+
public int MaxReceiveEventsPerTickRate = 500;
20+
public int SendTickrate = 64;
21+
public int EventTickrate = 64;
1922
public int MaxConnections = 100;
2023
public int Port = 7777;
2124
public string Address = "127.0.0.1";

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ internal void FlushToClient(int clientId)
333333
}
334334
}
335335
}
336-
NetworkingManager.singleton.Send(clientId, "MLAPI_SYNC_VAR_UPDATE", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.ToArray());
336+
NetworkingManager.singleton.Send(clientId, "MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", stream.ToArray());
337337
}
338338
}
339339

@@ -426,7 +426,7 @@ internal void SyncVarUpdate()
426426
}
427427
}
428428
}
429-
NetworkingManager.singleton.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.ToArray());
429+
NetworkingManager.singleton.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", stream.ToArray());
430430
}
431431
lastSyncTime = Time.time;
432432
}

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 70 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ private void OnValidate()
7373
private ConnectionConfig Init(NetworkingConfiguration netConfig)
7474
{
7575
NetworkConfig = netConfig;
76-
76+
lastSendTickTime = 0;
77+
lastEventTickTime = 0;
78+
lastReceiveTickTime = 0;
7779
pendingClients = new HashSet<int>();
7880
connectedClients = new Dictionary<int, NetworkedClient>();
7981
messageBuffer = new byte[NetworkConfig.MessageBufferSize];
@@ -109,7 +111,7 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
109111
};
110112

111113
//MLAPI channels and messageTypes
112-
NetworkConfig.Channels.Add("MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", QosType.ReliableFragmentedSequenced);
114+
NetworkConfig.Channels.Add("MLAPI_INTERNAL", QosType.ReliableFragmentedSequenced);
113115
NetworkConfig.Channels.Add("MLAPI_POSITION_UPDATE", QosType.StateUpdate);
114116
NetworkConfig.Channels.Add("MLAPI_ANIMATION_UPDATE", QosType.ReliableSequenced);
115117
MessageManager.messageTypes.Add("MLAPI_CONNECTION_REQUEST", 0);
@@ -295,75 +297,92 @@ private void Shutdown()
295297
private int channelId;
296298
private int receivedSize;
297299
private byte error;
298-
private float lastTickTime;
300+
private float lastReceiveTickTime;
301+
private float lastSendTickTime;
302+
private float lastEventTickTime;
299303
private void Update()
300304
{
301-
if(isListening && (Time.time - lastTickTime >= (1f / NetworkConfig.Tickrate)))
305+
if(isListening)
302306
{
303-
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
304-
{
305-
NetworkTransport.SendQueuedMessages(hostId, pair.Key, out error);
306-
}
307-
NetworkEventType eventType = NetworkTransport.Receive(out hostId, out clientId, out channelId, messageBuffer, messageBuffer.Length, out receivedSize, out error);
308-
NetworkError networkError = (NetworkError)error;
309-
if (networkError == NetworkError.Timeout)
307+
if((Time.time - lastSendTickTime >= (1f / NetworkConfig.SendTickrate)) || NetworkConfig.SendTickrate <= 0)
310308
{
311-
//Client timed out.
312-
if (isServer)
309+
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
313310
{
314-
OnClientDisconnect(clientId);
315-
return;
311+
NetworkTransport.SendQueuedMessages(hostId, pair.Key, out error);
316312
}
313+
lastSendTickTime = Time.time;
317314
}
318-
else if (networkError != NetworkError.Ok)
319-
{
320-
Debug.LogWarning("MLAPI: NetworkTransport receive error: " + networkError.ToString());
321-
return;
322-
}
323-
324-
switch (eventType)
315+
if((Time.time - lastReceiveTickTime >= (1f / NetworkConfig.ReceiveTickrate)) || NetworkConfig.ReceiveTickrate <= 0)
325316
{
326-
case NetworkEventType.ConnectEvent:
327-
if (isServer)
317+
NetworkEventType eventType;
318+
int processedEvents = 0;
319+
do
320+
{
321+
processedEvents++;
322+
eventType = NetworkTransport.Receive(out hostId, out clientId, out channelId, messageBuffer, messageBuffer.Length, out receivedSize, out error);
323+
NetworkError networkError = (NetworkError)error;
324+
if (networkError == NetworkError.Timeout)
328325
{
329-
pendingClients.Add(clientId);
330-
StartCoroutine(ApprovalTimeout(clientId));
326+
//Client timed out.
327+
if (isServer)
328+
{
329+
OnClientDisconnect(clientId);
330+
return;
331+
}
331332
}
332-
else
333+
else if (networkError != NetworkError.Ok)
333334
{
334-
int sizeOfStream = 32;
335-
if (NetworkConfig.ConnectionApproval)
336-
sizeOfStream += 2 + NetworkConfig.ConnectionData.Length;
335+
Debug.LogWarning("MLAPI: NetworkTransport receive error: " + networkError.ToString());
336+
return;
337+
}
337338

338-
using (MemoryStream writeStream = new MemoryStream(sizeOfStream))
339-
{
340-
using (BinaryWriter writer = new BinaryWriter(writeStream))
339+
switch (eventType)
340+
{
341+
case NetworkEventType.ConnectEvent:
342+
if (isServer)
343+
{
344+
pendingClients.Add(clientId);
345+
StartCoroutine(ApprovalTimeout(clientId));
346+
}
347+
else
341348
{
342-
writer.Write(NetworkConfig.GetConfig());
349+
int sizeOfStream = 32;
343350
if (NetworkConfig.ConnectionApproval)
351+
sizeOfStream += 2 + NetworkConfig.ConnectionData.Length;
352+
353+
using (MemoryStream writeStream = new MemoryStream(sizeOfStream))
344354
{
345-
writer.Write((ushort)NetworkConfig.ConnectionData.Length);
346-
writer.Write(NetworkConfig.ConnectionData);
355+
using (BinaryWriter writer = new BinaryWriter(writeStream))
356+
{
357+
writer.Write(NetworkConfig.GetConfig());
358+
if (NetworkConfig.ConnectionApproval)
359+
{
360+
writer.Write((ushort)NetworkConfig.ConnectionData.Length);
361+
writer.Write(NetworkConfig.ConnectionData);
362+
}
363+
}
364+
Send(clientId, "MLAPI_CONNECTION_REQUEST", "MLAPI_INTERNAL", writeStream.GetBuffer());
347365
}
348366
}
349-
Send(clientId, "MLAPI_CONNECTION_REQUEST", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", writeStream.GetBuffer());
350-
}
367+
break;
368+
case NetworkEventType.DataEvent:
369+
HandleIncomingData(clientId, messageBuffer, channelId);
370+
break;
371+
case NetworkEventType.DisconnectEvent:
372+
if (isServer)
373+
OnClientDisconnect(clientId);
374+
break;
351375
}
352-
break;
353-
case NetworkEventType.DataEvent:
354-
HandleIncomingData(clientId, messageBuffer, channelId);
355-
break;
356-
case NetworkEventType.DisconnectEvent:
357-
if (isServer)
358-
OnClientDisconnect(clientId);
359-
break;
376+
// Only do another iteration if: there are no more messages AND (there is no limit to max events or we have processed less than the maximum)
377+
} while (eventType != NetworkEventType.Nothing && (NetworkConfig.MaxReceiveEventsPerTickRate <= 0 || processedEvents < NetworkConfig.MaxReceiveEventsPerTickRate));
378+
lastReceiveTickTime = Time.time;
360379
}
361-
if (isServer)
380+
if (isServer && ((Time.time - lastEventTickTime >= (1f / NetworkConfig.EventTickrate)) || NetworkConfig.EventTickrate <= 0))
362381
{
363382
LagCompensationManager.AddFrames();
364383
NetworkedObject.InvokeSyncvarUpdate();
384+
lastEventTickTime = Time.time;
365385
}
366-
lastTickTime = Time.time;
367386
}
368387
}
369388

@@ -1074,7 +1093,7 @@ private void OnClientDisconnect(int clientId)
10741093
{
10751094
writer.Write(clientId);
10761095
}
1077-
Send("MLAPI_CLIENT_DISCONNECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer(), clientId);
1096+
Send("MLAPI_CLIENT_DISCONNECT", "MLAPI_INTERNAL", stream.GetBuffer(), clientId);
10781097
}
10791098
}
10801099
}
@@ -1153,7 +1172,7 @@ private void HandleApproval(int clientId, bool approved)
11531172
}
11541173
}
11551174
}
1156-
Send(clientId, "MLAPI_CONNECTION_APPROVED", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", writeStream.GetBuffer());
1175+
Send(clientId, "MLAPI_CONNECTION_APPROVED", "MLAPI_INTERNAL", writeStream.GetBuffer());
11571176
}
11581177

11591178
//Inform old clients of the new player
@@ -1179,7 +1198,7 @@ private void HandleApproval(int clientId, bool approved)
11791198
writer.Write(clientId);
11801199
}
11811200
}
1182-
Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer(), clientId);
1201+
Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer(), clientId);
11831202
}
11841203
//Flush syncvars:
11851204
foreach (KeyValuePair<uint, NetworkedObject> networkedObject in SpawnManager.spawnedObjects)

MLAPI/NetworkingManagerComponents/NetworkPoolManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static GameObject SpawnPoolObject(string poolName, Vector3 position, Quat
5858
writer.Write(rotation.eulerAngles.y);
5959
writer.Write(rotation.eulerAngles.z);
6060
}
61-
NetworkingManager.singleton.Send("MLAPI_SPAWN_POOL_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
61+
NetworkingManager.singleton.Send("MLAPI_SPAWN_POOL_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer());
6262
}
6363
return go;
6464
}
@@ -77,7 +77,7 @@ public static void DestroyPoolObject(NetworkedObject netObject)
7777
{
7878
writer.Write(netObject.NetworkId);
7979
}
80-
NetworkingManager.singleton.Send("MLAPI_DESTROY_POOL_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
80+
NetworkingManager.singleton.Send("MLAPI_DESTROY_POOL_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer());
8181
}
8282
}
8383
}

MLAPI/NetworkingManagerComponents/NetworkSceneManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public static void SwitchScene(string sceneName)
5555
{
5656
writer.Write(sceneNameToIndex[sceneName]);
5757
}
58-
NetworkingManager.singleton.Send("MLAPI_SWITCH_SCENE", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
58+
NetworkingManager.singleton.Send("MLAPI_SWITCH_SCENE", "MLAPI_INTERNAL", stream.GetBuffer());
5959
}
6060
}
6161

MLAPI/NetworkingManagerComponents/SpawnManager.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ internal static void RemoveOwnership(uint netId)
4242
writer.Write(netId);
4343
writer.Write(-2);
4444
}
45-
netManager.Send("MLAPI_CHANGE_OWNER", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
45+
netManager.Send("MLAPI_CHANGE_OWNER", "MLAPI_INTERNAL", stream.GetBuffer());
4646
}
4747
}
4848

@@ -59,7 +59,7 @@ internal static void ChangeOwnership(uint netId, int clientId)
5959
writer.Write(netId);
6060
writer.Write(clientId);
6161
}
62-
netManager.Send("MLAPI_CHANGE_OWNER", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
62+
netManager.Send("MLAPI_CHANGE_OWNER", "MLAPI_INTERNAL", stream.GetBuffer());
6363
}
6464
}
6565

@@ -136,9 +136,9 @@ internal static void OnDestroyObject(uint networkId, bool destroyGameObject)
136136
}
137137
//If we are host, send to everyone except ourselves. Otherwise, send to all
138138
if (netManager != null && netManager.isHost)
139-
netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer(), -1);
139+
netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer(), -1);
140140
else
141-
netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
141+
netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer());
142142
}
143143
}
144144
}
@@ -193,9 +193,9 @@ internal static void OnSpawnObject(NetworkedObject netObject, int? clientOwnerId
193193
}
194194
//If we are host, send to everyone except ourselves. Otherwise, send to all
195195
if (netManager.isHost)
196-
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer(), -1);
196+
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer(), -1);
197197
else
198-
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
198+
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer());
199199
}
200200
}
201201
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ MLAPI (Mid level API) is a framework that hopefully simplifies building networke
1313
* Replace the integer QOS with names. When you setup the networking you specify names that are associated with a channel. This makes it easier to manage. You can thus specify that a message should be sent on the "damage" channel which handles all damage related logic and is running on the AllCostDelivery channel.
1414
* ProtocolVersion to allow making different versions not talk to each other.
1515
* NetworkedBehaviours does not have to be on the root, it's simply just a class that implements the send methods etc.
16-
* Multiple messages processed every frame with the ability to specify a maximum to prevent freezes in the normal game logic
16+
* Custom tickrate
1717
* Supports separate Unity projects crosstalking
1818
* Passthrough messages \[[Wiki page](https://github.com/TwoTenPvP/MLAPI/wiki/Passthrough-messages)\]
1919
* Scene Management \[[Wiki page](https://github.com/TwoTenPvP/MLAPI/wiki/Scene-Management)\]

0 commit comments

Comments
 (0)