forked from Unity-Technologies/com.unity.netcode.gameobjects
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMessageManager.cs
More file actions
96 lines (90 loc) · 4.23 KB
/
Copy pathMessageManager.cs
File metadata and controls
96 lines (90 loc) · 4.23 KB
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
using System;
using System.Collections.Generic;
using UnityEngine;
namespace MLAPI.NetworkingManagerComponents
{
internal static class MessageManager
{
internal static Dictionary<string, int> channels;
internal static Dictionary<int, string> reverseChannels;
internal static Dictionary<string, ushort> messageTypes;
internal static Dictionary<ushort, string> reverseMessageTypes;
internal static Dictionary<ushort, Dictionary<int, Action<int, byte[]>>> messageCallbacks;
internal static Dictionary<ushort, int> messageHandlerCounter;
internal static Dictionary<ushort, Stack<int>> releasedMessageHandlerCounters;
//Key: messageType, Value key: networkId, value value: handlerId
internal static Dictionary<ushort, Dictionary<uint, List<int>>> targetedMessages;
private static NetworkingManager netManager
{
get
{
return NetworkingManager.singleton;
}
}
internal static int AddIncomingMessageHandler(string name, Action<int, byte[]> action, uint networkId)
{
if (messageTypes.ContainsKey(name))
{
if(!targetedMessages.ContainsKey(messageTypes[name]))
{
targetedMessages.Add(messageTypes[name], new Dictionary<uint, List<int>>());
}
if(!targetedMessages[messageTypes[name]].ContainsKey(networkId))
{
targetedMessages[messageTypes[name]].Add(networkId, new List<int>());
}
if (messageCallbacks.ContainsKey(messageTypes[name]))
{
int handlerId = 0;
if (messageHandlerCounter.ContainsKey(messageTypes[name]))
{
if (!releasedMessageHandlerCounters.ContainsKey(messageTypes[name]))
releasedMessageHandlerCounters.Add(messageTypes[name], new Stack<int>());
if (releasedMessageHandlerCounters[messageTypes[name]].Count == 0)
{
handlerId = messageHandlerCounter[messageTypes[name]];
messageHandlerCounter[messageTypes[name]]++;
}
else
{
handlerId = releasedMessageHandlerCounters[messageTypes[name]].Pop();
}
}
else
{
messageHandlerCounter.Add(messageTypes[name], handlerId + 1);
}
messageCallbacks[messageTypes[name]].Add(handlerId, action);
targetedMessages[messageTypes[name]][networkId].Add(handlerId);
return handlerId;
}
else
{
messageCallbacks.Add(messageTypes[name], new Dictionary<int, Action<int, byte[]>>());
messageHandlerCounter.Add(messageTypes[name], 1);
messageCallbacks[messageTypes[name]].Add(0, action);
targetedMessages[messageTypes[name]][networkId].Add(0);
return 0;
}
}
else
{
Debug.LogWarning("MLAPI: The message type " + name + " has not been registered. Please define it in the netConfig");
return -1;
}
}
internal static void RemoveIncomingMessageHandler(string name, int counter, uint networkId)
{
if (counter == -1)
return;
if (messageTypes.ContainsKey(name) && messageCallbacks.ContainsKey(messageTypes[name]) && messageCallbacks[messageTypes[name]].ContainsKey(counter))
{
messageCallbacks[messageTypes[name]].Remove(counter);
if (!releasedMessageHandlerCounters.ContainsKey(messageTypes[name]))
releasedMessageHandlerCounters.Add(messageTypes[name], new Stack<int>());
releasedMessageHandlerCounters[messageTypes[name]].Push(counter);
targetedMessages[messageTypes[name]][networkId].Remove(counter);
}
}
}
}