1
1
using MLAPI . Data ;
2
2
using System . Collections . Generic ;
3
3
using System . IO ;
4
+ using System . Linq ;
4
5
using MLAPI . Logging ;
5
6
using MLAPI . Serialization ;
6
7
using UnityEngine ;
@@ -91,16 +92,6 @@ private bool sendMessagesAllowed
91
92
}
92
93
}
93
94
94
- /// <summary>
95
- /// Registers message handlers
96
- /// </summary>
97
- public override void NetworkStart ( )
98
- {
99
- //RegisterMessageHandler("MLAPI_HandleAnimationMessage", HandleAnimMsg);
100
- //RegisterMessageHandler("MLAPI_HandleAnimationParameterMessage", HandleAnimParamsMsg);
101
- //RegisterMessageHandler("MLAPI_HandleAnimationTriggerMessage", HandleAnimTriggerMsg);
102
- }
103
-
104
95
/// <summary>
105
96
/// TODO
106
97
/// </summary>
@@ -127,14 +118,13 @@ private void FixedUpdate()
127
118
return ;
128
119
}
129
120
130
- using ( MemoryStream stream = new MemoryStream ( ) )
121
+ using ( PooledBitStream stream = PooledBitStream . Get ( ) )
131
122
{
132
- using ( BinaryWriter writer = new BinaryWriter ( stream ) )
133
- {
134
- writer . Write ( stateHash ) ;
135
- writer . Write ( normalizedTime ) ;
136
- WriteParameters ( writer , false ) ;
137
- }
123
+ BitWriter writer = new BitWriter ( stream ) ;
124
+ writer . WriteInt32Packed ( stateHash ) ;
125
+ writer . WriteSinglePacked ( normalizedTime ) ;
126
+ WriteParameters ( stream , false ) ;
127
+
138
128
if ( isServer )
139
129
{
140
130
if ( EnableProximity )
@@ -145,15 +135,18 @@ private void FixedUpdate()
145
135
if ( Vector3 . Distance ( transform . position , client . Value . PlayerObject . transform . position ) <= ProximityRange )
146
136
clientsInProximity . Add ( client . Key ) ;
147
137
}
148
- //SendToClientsTarget(clientsInProximity ,"MLAPI_HandleAnimationMessage", "MLAPI_ANIMATION_UPDATE" , stream.ToArray() );
138
+ InvokeClientRpc ( HandleAnimMsg , clientsInProximity , stream ) ;
149
139
}
150
140
else
151
- new System . Exception ( ) ;
152
- //SendToNonLocalClientsTarget("MLAPI_HandleAnimationMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray());
141
+ {
142
+ List < uint > clientIds = NetworkingManager . singleton . ConnectedClientsList . Select ( x => x . ClientId ) . ToList ( ) ; //BAD
143
+ clientIds . Remove ( OwnerClientId ) ;
144
+ InvokeClientRpc ( HandleAnimMsg , clientIds , stream ) ;
145
+ }
153
146
}
154
147
else
155
148
{
156
- //SendToServerTarget("MLAPI_HandleAnimationMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray() );
149
+ InvokeServerRpc ( HandleAnimMsg , stream ) ;
157
150
}
158
151
}
159
152
}
@@ -199,12 +192,10 @@ private void CheckSendRate()
199
192
{
200
193
sendTimer = NetworkingManager . singleton . NetworkTime + sendRate ;
201
194
202
- using ( MemoryStream stream = new MemoryStream ( ) )
195
+ using ( PooledBitStream stream = PooledBitStream . Get ( ) )
203
196
{
204
- using ( BinaryWriter writer = new BinaryWriter ( stream ) )
205
- {
206
- WriteParameters ( writer , true ) ;
207
- }
197
+ WriteParameters ( stream , true ) ;
198
+
208
199
if ( isServer )
209
200
{
210
201
if ( EnableProximity )
@@ -215,15 +206,18 @@ private void CheckSendRate()
215
206
if ( Vector3 . Distance ( transform . position , client . Value . PlayerObject . transform . position ) <= ProximityRange )
216
207
clientsInProximity . Add ( client . Key ) ;
217
208
}
218
- //SendToClientsTarget(clientsInProximity, "MLAPI_HandleAnimationParameterMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray() );
209
+ InvokeClientRpc ( HandleAnimParamsMsg , clientsInProximity , stream ) ;
219
210
}
220
211
else
221
- new System . Exception ( ) ;
222
- //SendToNonLocalClientsTarget("MLAPI_HandleAnimationParameterMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray());
212
+ {
213
+ List < uint > clientIds = NetworkingManager . singleton . ConnectedClientsList . Select ( x => x . ClientId ) . ToList ( ) ; //BAD
214
+ clientIds . Remove ( OwnerClientId ) ;
215
+ InvokeClientRpc ( HandleAnimParamsMsg , clientIds , stream ) ;
216
+ }
223
217
}
224
218
else
225
219
{
226
- //SendToServerTarget("MLAPI_HandleAnimationParameterMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray() );
220
+ InvokeServerRpc ( HandleAnimParamsMsg , stream ) ;
227
221
}
228
222
}
229
223
}
@@ -251,13 +245,13 @@ private void SetRecvTrackingParam(string p, int i)
251
245
if ( i == 5 ) param5 = p ;
252
246
}
253
247
254
- private void HandleAnimMsg ( uint clientId , BitReader reader )
248
+ [ ClientRPC ]
249
+ [ ServerRPC ]
250
+ private void HandleAnimMsg ( uint clientId , Stream stream )
255
251
{
256
252
// usually transitions will be triggered by parameters, if not, play anims directly.
257
253
// NOTE: this plays "animations", not transitions, so any transitions will be skipped.
258
254
// NOTE: there is no API to play a transition(?)
259
- byte [ ] data = reader . ReadByteArray ( ) ;
260
-
261
255
if ( isServer )
262
256
{
263
257
if ( EnableProximity )
@@ -268,30 +262,30 @@ private void HandleAnimMsg(uint clientId, BitReader reader)
268
262
if ( Vector3 . Distance ( transform . position , client . Value . PlayerObject . transform . position ) <= ProximityRange )
269
263
clientsInProximity . Add ( client . Key ) ;
270
264
}
271
- //SendToClientsTarget(clientsInProximity, "MLAPI_HandleAnimationMessage", "MLAPI_ANIMATION_UPDATE", data );
265
+ InvokeClientRpc ( HandleAnimMsg , clientsInProximity , stream ) ;
272
266
}
273
267
else
274
- new System . Exception ( ) ;
275
- //SendToNonLocalClientsTarget("MLAPI_HandleAnimationMessage", "MLAPI_ANIMATION_UPDATE", data);
276
- }
277
- using ( MemoryStream stream = new MemoryStream ( data ) )
278
- {
279
- using ( BinaryReader bReader = new BinaryReader ( stream ) )
280
268
{
281
- int stateHash = bReader . ReadInt32 ( ) ;
282
- float normalizedTime = bReader . ReadSingle ( ) ;
283
- if ( stateHash != 0 )
284
- {
285
- animator . Play ( stateHash , 0 , normalizedTime ) ;
286
- }
287
- ReadParameters ( bReader , false ) ;
269
+ List < uint > clientIds = NetworkingManager . singleton . ConnectedClientsList . Select ( x => x . ClientId ) . ToList ( ) ; //BAD
270
+ clientIds . Remove ( OwnerClientId ) ;
271
+ InvokeClientRpc ( HandleAnimMsg , clientIds , stream ) ;
288
272
}
289
273
}
274
+
275
+ BitReader reader = new BitReader ( stream ) ;
276
+ int stateHash = reader . ReadInt32Packed ( ) ;
277
+ float normalizedTime = reader . ReadSinglePacked ( ) ;
278
+ if ( stateHash != 0 )
279
+ {
280
+ animator . Play ( stateHash , 0 , normalizedTime ) ;
281
+ }
282
+ ReadParameters ( stream , false ) ;
290
283
}
291
-
292
- private void HandleAnimParamsMsg ( uint clientId , BitReader reader )
284
+
285
+ [ ClientRPC ]
286
+ [ ServerRPC ]
287
+ private void HandleAnimParamsMsg ( uint clientId , Stream stream )
293
288
{
294
- byte [ ] data = reader . ReadByteArray ( ) ;
295
289
if ( isServer )
296
290
{
297
291
if ( EnableProximity )
@@ -302,24 +296,23 @@ private void HandleAnimParamsMsg(uint clientId, BitReader reader)
302
296
if ( Vector3 . Distance ( transform . position , client . Value . PlayerObject . transform . position ) <= ProximityRange )
303
297
clientsInProximity . Add ( client . Key ) ;
304
298
}
305
- //SendToClientsTarget(clientsInProximity, "MLAPI_HandleAnimationParameterMessage", "MLAPI_ANIMATION_UPDATE", data );
299
+ InvokeClientRpc ( HandleAnimParamsMsg , clientsInProximity , stream ) ;
306
300
}
307
301
else
308
- new System . Exception ( ) ;
309
- //SendToNonLocalClientsTarget("MLAPI_HandleAnimationParameterMessage", "MLAPI_ANIMATION_UPDATE", data);
310
- }
311
- using ( MemoryStream stream = new MemoryStream ( data ) )
312
- {
313
- using ( BinaryReader bReader = new BinaryReader ( stream ) )
314
302
{
315
- ReadParameters ( bReader , true ) ;
303
+ List < uint > clientIds = NetworkingManager . singleton . ConnectedClientsList . Select ( x => x . ClientId ) . ToList ( ) ; //BAD
304
+ clientIds . Remove ( OwnerClientId ) ;
305
+ InvokeClientRpc ( HandleAnimParamsMsg , clientIds , stream ) ;
316
306
}
317
307
}
308
+
309
+ ReadParameters ( stream , true ) ;
318
310
}
319
311
320
- private void HandleAnimTriggerMsg ( uint clientId , BitReader reader )
312
+ [ ClientRPC ]
313
+ [ ServerRPC ]
314
+ private void HandleAnimTriggerMsg ( uint clientId , Stream stream )
321
315
{
322
- byte [ ] data = reader . ReadByteArray ( ) ;
323
316
if ( isServer )
324
317
{
325
318
if ( EnableProximity )
@@ -330,23 +323,24 @@ private void HandleAnimTriggerMsg(uint clientId, BitReader reader)
330
323
if ( Vector3 . Distance ( transform . position , client . Value . PlayerObject . transform . position ) <= ProximityRange )
331
324
clientsInProximity . Add ( client . Key ) ;
332
325
}
333
- //SendToClientsTarget(clientsInProximity, "MLAPI_HandleAnimationTriggerMessage", "MLAPI_ANIMATION_UPDATE", data );
326
+ InvokeClientRpc ( HandleAnimTriggerMsg , clientsInProximity , stream ) ;
334
327
}
335
328
else
336
- new System . Exception ( ) ;
337
- //SendToNonLocalClientsTarget("MLAPI_HandleAnimationTriggerMessage", "MLAPI_ANIMATION_UPDATE", data);
338
- }
339
- using ( MemoryStream stream = new MemoryStream ( data ) )
340
- {
341
- using ( BinaryReader bReader = new BinaryReader ( stream ) )
342
329
{
343
- animator . SetTrigger ( bReader . ReadInt32 ( ) ) ;
330
+ List < uint > clientIds = NetworkingManager . singleton . ConnectedClientsList . Select ( x => x . ClientId ) . ToList ( ) ; //BAD
331
+ clientIds . Remove ( OwnerClientId ) ;
332
+ InvokeClientRpc ( HandleAnimTriggerMsg , clientIds , stream ) ;
344
333
}
345
334
}
335
+
336
+ BitReader reader = new BitReader ( stream ) ;
337
+ animator . SetTrigger ( reader . ReadInt32Packed ( ) ) ;
346
338
}
347
339
348
- private void WriteParameters ( BinaryWriter writer , bool autoSend )
340
+ private void WriteParameters ( Stream stream , bool autoSend )
349
341
{
342
+ BitWriter writer = new BitWriter ( stream ) ;
343
+
350
344
if ( animatorParameters == null )
351
345
animatorParameters = animator . parameters ;
352
346
@@ -358,29 +352,31 @@ private void WriteParameters(BinaryWriter writer, bool autoSend)
358
352
AnimatorControllerParameter par = animatorParameters [ i ] ;
359
353
if ( par . type == AnimatorControllerParameterType . Int )
360
354
{
361
- writer . Write ( ( uint ) animator . GetInteger ( par . nameHash ) ) ;
355
+ writer . WriteUInt32Packed ( ( uint ) animator . GetInteger ( par . nameHash ) ) ;
362
356
363
357
SetSendTrackingParam ( par . name + ":" + animator . GetInteger ( par . nameHash ) , i ) ;
364
358
}
365
359
366
360
if ( par . type == AnimatorControllerParameterType . Float )
367
361
{
368
- writer . Write ( animator . GetFloat ( par . nameHash ) ) ;
362
+ writer . WriteSinglePacked ( animator . GetFloat ( par . nameHash ) ) ;
369
363
370
364
SetSendTrackingParam ( par . name + ":" + animator . GetFloat ( par . nameHash ) , i ) ;
371
365
}
372
366
373
367
if ( par . type == AnimatorControllerParameterType . Bool )
374
368
{
375
- writer . Write ( animator . GetBool ( par . nameHash ) ) ;
369
+ writer . WriteBool ( animator . GetBool ( par . nameHash ) ) ;
376
370
377
371
SetSendTrackingParam ( par . name + ":" + animator . GetBool ( par . nameHash ) , i ) ;
378
372
}
379
373
}
380
374
}
381
375
382
- private void ReadParameters ( BinaryReader reader , bool autoSend )
376
+ private void ReadParameters ( Stream stream , bool autoSend )
383
377
{
378
+ BitReader reader = new BitReader ( stream ) ;
379
+
384
380
if ( animatorParameters == null )
385
381
animatorParameters = animator . parameters ;
386
382
@@ -392,23 +388,23 @@ private void ReadParameters(BinaryReader reader, bool autoSend)
392
388
AnimatorControllerParameter par = animatorParameters [ i ] ;
393
389
if ( par . type == AnimatorControllerParameterType . Int )
394
390
{
395
- int newValue = ( int ) reader . ReadUInt32 ( ) ;
391
+ int newValue = ( int ) reader . ReadUInt32Packed ( ) ;
396
392
animator . SetInteger ( par . nameHash , newValue ) ;
397
393
398
394
SetRecvTrackingParam ( par . name + ":" + newValue , i ) ;
399
395
}
400
396
401
397
if ( par . type == AnimatorControllerParameterType . Float )
402
398
{
403
- float newFloatValue = reader . ReadSingle ( ) ;
399
+ float newFloatValue = reader . ReadSinglePacked ( ) ;
404
400
animator . SetFloat ( par . nameHash , newFloatValue ) ;
405
401
406
402
SetRecvTrackingParam ( par . name + ":" + newFloatValue , i ) ;
407
403
}
408
404
409
405
if ( par . type == AnimatorControllerParameterType . Bool )
410
406
{
411
- bool newBoolValue = reader . ReadBoolean ( ) ;
407
+ bool newBoolValue = reader . ReadBool ( ) ;
412
408
animator . SetBool ( par . nameHash , newBoolValue ) ;
413
409
414
410
SetRecvTrackingParam ( par . name + ":" + newBoolValue , i ) ;
@@ -433,12 +429,11 @@ public void SetTrigger(int hash)
433
429
{
434
430
if ( isLocalPlayer || isOwner )
435
431
{
436
- using ( MemoryStream stream = new MemoryStream ( ) )
432
+ using ( PooledBitStream stream = PooledBitStream . Get ( ) )
437
433
{
438
- using ( BinaryWriter writer = new BinaryWriter ( stream ) )
439
- {
440
- writer . Write ( hash ) ;
441
- }
434
+ BitWriter writer = new BitWriter ( stream ) ;
435
+ writer . WriteInt32Packed ( hash ) ;
436
+
442
437
if ( isServer )
443
438
{
444
439
if ( EnableProximity )
@@ -449,15 +444,18 @@ public void SetTrigger(int hash)
449
444
if ( Vector3 . Distance ( transform . position , client . Value . PlayerObject . transform . position ) <= ProximityRange )
450
445
clientsInProximity . Add ( client . Key ) ;
451
446
}
452
- //SendToClientsTarget(clientsInProximity, "MLAPI_HandleAnimationTriggerMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray() );
447
+ InvokeClientRpc ( HandleAnimTriggerMsg , clientsInProximity , stream ) ;
453
448
}
454
449
else
455
- new System . Exception ( ) ;
456
- //SendToNonLocalClientsTarget("MLAPI_HandleAnimationTriggerMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray());
450
+ {
451
+ List < uint > clientIds = NetworkingManager . singleton . ConnectedClientsList . Select ( x => x . ClientId ) . ToList ( ) ; //BAD
452
+ clientIds . Remove ( OwnerClientId ) ;
453
+ InvokeClientRpc ( HandleAnimTriggerMsg , clientIds , stream ) ;
454
+ }
457
455
}
458
456
else
459
457
{
460
- //SendToServerTarget("MLAPI_HandleAnimationTriggerMessage", "MLAPI_ANIMATION_UPDATE", stream.ToArray() );
458
+ InvokeServerRpc ( HandleAnimTriggerMsg , stream ) ;
461
459
}
462
460
}
463
461
}
0 commit comments