@@ -43,6 +43,8 @@ public enum ConnectionIdSpreadMethod
43
43
44
44
private byte _lastProcessedTransportIndex ;
45
45
46
+ public override bool IsSupported => true ;
47
+
46
48
public override void DisconnectLocalClient ( )
47
49
{
48
50
Transports [ GetFirstSupportedTransportIndex ( ) ] . DisconnectLocalClient ( ) ;
@@ -80,33 +82,46 @@ public override void Init()
80
82
}
81
83
}
82
84
83
- public override NetEventType PollEvent ( out ulong clientId , out string channelName , out ArraySegment < byte > payload )
85
+ public override NetEventType PollEvent ( out ulong clientId , out string channelName , out ArraySegment < byte > payload , out float receiveTime )
84
86
{
85
- if ( _lastProcessedTransportIndex > Transports . Length )
87
+ if ( _lastProcessedTransportIndex >= Transports . Length - 1 )
86
88
_lastProcessedTransportIndex = 0 ;
87
89
88
90
for ( byte i = _lastProcessedTransportIndex ; i < Transports . Length ; i ++ )
89
91
{
92
+ _lastProcessedTransportIndex = i ;
93
+
90
94
if ( Transports [ i ] . IsSupported )
91
95
{
92
- _lastProcessedTransportIndex = i ;
96
+ NetEventType @eventType = Transports [ i ] . PollEvent ( out ulong connectionId , out channelName , out payload , out receiveTime ) ;
97
+
98
+ if ( @eventType != NetEventType . Nothing )
99
+ {
100
+ clientId = GetMLAPIClientId ( i , connectionId , false ) ;
93
101
94
- return Transports [ i ] . PollEvent ( out clientId , out channelName , out payload ) ;
102
+ return @eventType ;
103
+ }
95
104
}
96
105
}
97
106
98
107
clientId = 0 ;
99
108
channelName = null ;
100
109
payload = new ArraySegment < byte > ( ) ;
110
+ receiveTime = 0 ;
101
111
102
112
return NetEventType . Nothing ;
103
113
}
104
114
115
+ public override NetEventType PollEvent ( out ulong clientId , out string channelName , out ArraySegment < byte > payload )
116
+ {
117
+ return PollEvent ( out clientId , out channelName , out payload , out float _ ) ;
118
+ }
119
+
105
120
public override void Send ( ulong clientId , ArraySegment < byte > data , string channelName , bool skipQueue )
106
121
{
107
122
GetMultiplexTransportDetails ( clientId , out byte transportId , out ulong connectionId ) ;
108
123
109
- Transports [ transportId ] . Send ( clientId , data , channelName , skipQueue ) ;
124
+ Transports [ transportId ] . Send ( connectionId , data , channelName , skipQueue ) ;
110
125
}
111
126
112
127
public override void Shutdown ( )
@@ -151,9 +166,6 @@ public ulong GetMLAPIClientId(byte transportId, ulong connectionId, bool isServe
151
166
}
152
167
else
153
168
{
154
- // 0 Is reserved.
155
- connectionId += 1 ;
156
-
157
169
switch ( SpreadMethod )
158
170
{
159
171
case ConnectionIdSpreadMethod . ReplaceFirstBits :
@@ -167,7 +179,7 @@ public ulong GetMLAPIClientId(byte transportId, ulong connectionId, bool isServe
167
179
// Place transportId there
168
180
ulong shiftedTransportId = ( ulong ) transportId << ( ( sizeof ( ulong ) * 8 ) - bits ) ;
169
181
170
- return clientId | shiftedTransportId ;
182
+ return ( clientId | shiftedTransportId ) + 1 ;
171
183
}
172
184
case ConnectionIdSpreadMethod . MakeRoomFirstBits :
173
185
{
@@ -180,7 +192,7 @@ public ulong GetMLAPIClientId(byte transportId, ulong connectionId, bool isServe
180
192
// Place transportId there
181
193
ulong shiftedTransportId = ( ulong ) transportId << ( ( sizeof ( ulong ) * 8 ) - bits ) ;
182
194
183
- return clientId | shiftedTransportId ;
195
+ return ( clientId | shiftedTransportId ) + 1 ;
184
196
}
185
197
case ConnectionIdSpreadMethod . ReplaceLastBits :
186
198
{
@@ -191,7 +203,7 @@ public ulong GetMLAPIClientId(byte transportId, ulong connectionId, bool isServe
191
203
ulong clientId = ( ( connectionId >> bits ) << bits ) ;
192
204
193
205
// Return the transport inserted at the end
194
- return clientId | transportId ;
206
+ return ( clientId | transportId ) + 1 ;
195
207
}
196
208
case ConnectionIdSpreadMethod . MakeRoomLastBits :
197
209
{
@@ -202,11 +214,11 @@ public ulong GetMLAPIClientId(byte transportId, ulong connectionId, bool isServe
202
214
ulong clientId = ( connectionId << bits ) ;
203
215
204
216
// Return the transport inserted at the end
205
- return clientId | transportId ;
217
+ return ( clientId | transportId ) + 1 ;
206
218
}
207
219
case ConnectionIdSpreadMethod . Spread :
208
220
{
209
- return connectionId * ( ulong ) Transports . Length + ( ulong ) transportId ;
221
+ return ( connectionId * ( ulong ) Transports . Length + ( ulong ) transportId ) + 1 ;
210
222
}
211
223
default :
212
224
{
@@ -229,44 +241,59 @@ public void GetMultiplexTransportDetails(ulong clientId, out byte transportId, o
229
241
{
230
242
case ConnectionIdSpreadMethod . ReplaceFirstBits :
231
243
{
244
+ // The first clientId is reserved. Thus every clientId is always offset by 1
245
+ clientId -- ;
246
+
232
247
// Calculate bits to store transportId
233
248
byte bits = ( byte ) UnityEngine . Mathf . CeilToInt ( UnityEngine . Mathf . Log ( Transports . Length , 2 ) ) ;
234
249
235
250
transportId = ( byte ) ( clientId >> ( ( sizeof ( ulong ) * 8 ) - bits ) ) ;
236
- connectionId = ( ( clientId << bits ) >> bits ) + 1 ;
251
+ connectionId = ( ( clientId << bits ) >> bits ) ;
237
252
break ;
238
253
}
239
254
case ConnectionIdSpreadMethod . MakeRoomFirstBits :
240
255
{
256
+ // The first clientId is reserved. Thus every clientId is always offset by 1
257
+ clientId -- ;
258
+
241
259
// Calculate bits to store transportId
242
260
byte bits = ( byte ) UnityEngine . Mathf . CeilToInt ( UnityEngine . Mathf . Log ( Transports . Length , 2 ) ) ;
243
261
244
262
transportId = ( byte ) ( clientId >> ( ( sizeof ( ulong ) * 8 ) - bits ) ) ;
245
- connectionId = ( clientId << bits ) + 1 ;
263
+ connectionId = ( clientId << bits ) ;
246
264
break ;
247
265
}
248
266
case ConnectionIdSpreadMethod . ReplaceLastBits :
249
267
{
268
+ // The first clientId is reserved. Thus every clientId is always offset by 1
269
+ clientId -- ;
270
+
250
271
// Calculate bits to store transportId
251
272
byte bits = ( byte ) UnityEngine . Mathf . CeilToInt ( UnityEngine . Mathf . Log ( Transports . Length , 2 ) ) ;
252
273
253
274
transportId = ( byte ) ( ( clientId << ( ( sizeof ( ulong ) * 8 ) - bits ) ) >> ( ( sizeof ( ulong ) * 8 ) - bits ) ) ;
254
- connectionId = ( ( clientId >> bits ) << bits ) + 1 ;
275
+ connectionId = ( ( clientId >> bits ) << bits ) ;
255
276
break ;
256
277
}
257
278
case ConnectionIdSpreadMethod . MakeRoomLastBits :
258
279
{
280
+ // The first clientId is reserved. Thus every clientId is always offset by 1
281
+ clientId -- ;
282
+
259
283
// Calculate bits to store transportId
260
284
byte bits = ( byte ) UnityEngine . Mathf . CeilToInt ( UnityEngine . Mathf . Log ( Transports . Length , 2 ) ) ;
261
285
262
286
transportId = ( byte ) ( ( clientId << ( ( sizeof ( ulong ) * 8 ) - bits ) ) >> ( ( sizeof ( ulong ) * 8 ) - bits ) ) ;
263
- connectionId = ( clientId >> bits ) + 1 ;
287
+ connectionId = ( clientId >> bits ) ;
264
288
break ;
265
289
}
266
290
case ConnectionIdSpreadMethod . Spread :
267
291
{
292
+ // The first clientId is reserved. Thus every clientId is always offset by 1
293
+ clientId -- ;
294
+
268
295
transportId = ( byte ) ( clientId % ( ulong ) Transports . Length ) ;
269
- connectionId = ( clientId / ( ulong ) Transports . Length ) + 1 ;
296
+ connectionId = ( clientId / ( ulong ) Transports . Length ) ;
270
297
break ;
271
298
}
272
299
default :
0 commit comments