@@ -34,6 +34,109 @@ internal static bool ObjectEqual(object o1, object o2)
34
34
return o1 . Equals ( o2 ) ;
35
35
}
36
36
37
+ //TODO: Better description, method name is not very descriptive.
38
+ internal static object GetReferenceArrayValue ( object newValue , object currentValue )
39
+ {
40
+ if ( newValue . GetType ( ) . IsArray )
41
+ {
42
+ Array newArray = ( Array ) newValue ;
43
+ Array currentArray = ( Array ) currentValue ;
44
+ if ( currentValue != null && newArray . Length == currentArray . Length )
45
+ {
46
+ for ( int i = 0 ; i < newArray . Length ; i ++ ) newArray . SetValue ( currentArray . GetValue ( i ) , i ) ; //Copy the old array values
47
+ return newArray ;
48
+ }
49
+ else
50
+ {
51
+ //Create a new instance.
52
+ Array newArr = Array . CreateInstance ( newValue . GetType ( ) . GetElementType ( ) , newArray . Length ) ;
53
+ for ( int i = 0 ; i < newArray . Length ; i ++ ) newArr . SetValue ( newArray . GetValue ( i ) , i ) ;
54
+ return newArr ;
55
+ }
56
+ }
57
+ return newValue ;
58
+ }
59
+
60
+ internal static void WriteFieldType ( BitWriter writer , object newValue , object oldValue )
61
+ {
62
+ Type type = newValue . GetType ( ) ;
63
+ if ( type . IsArray )
64
+ {
65
+ Array newArray = ( Array ) newValue ;
66
+ Array oldArray = ( Array ) oldValue ;
67
+ if ( oldValue == null || newArray . Length != oldArray . Length )
68
+ {
69
+ writer . WriteBool ( false ) ; //False = not a diff
70
+ //Send the full array.
71
+ ushort arrayLength = ( ushort ) newArray . Length ;
72
+ writer . WriteUShort ( arrayLength ) ;
73
+ foreach ( object element in newArray ) WriteFieldType ( writer , element ) ;
74
+ }
75
+ else
76
+ {
77
+ writer . WriteBool ( true ) ; //True = diff
78
+ //Send diff
79
+ for ( int i = 0 ; i < newArray . Length ; i ++ )
80
+ {
81
+ bool changed = newArray . GetValue ( i ) != oldArray . GetValue ( i ) ;
82
+ writer . WriteBool ( changed ) ;
83
+ if ( changed ) WriteFieldType ( writer , newArray . GetValue ( i ) ) ;
84
+ }
85
+ }
86
+ }
87
+ else
88
+ {
89
+ if ( newValue is bool )
90
+ writer . WriteBool ( ( bool ) newValue ) ;
91
+ else if ( newValue is byte )
92
+ writer . WriteByte ( ( byte ) newValue ) ;
93
+ else if ( newValue is double )
94
+ writer . WriteDouble ( ( double ) newValue ) ;
95
+ else if ( newValue is float )
96
+ writer . WriteFloat ( ( float ) newValue ) ;
97
+ else if ( newValue is int )
98
+ writer . WriteInt ( ( int ) newValue ) ;
99
+ else if ( newValue is long )
100
+ writer . WriteLong ( ( long ) newValue ) ;
101
+ else if ( newValue is sbyte )
102
+ writer . WriteSByte ( ( sbyte ) newValue ) ;
103
+ else if ( newValue is short )
104
+ writer . WriteShort ( ( short ) newValue ) ;
105
+ else if ( newValue is uint )
106
+ writer . WriteUInt ( ( uint ) newValue ) ;
107
+ else if ( newValue is ulong )
108
+ writer . WriteULong ( ( ulong ) newValue ) ;
109
+ else if ( newValue is ushort )
110
+ writer . WriteUShort ( ( ushort ) newValue ) ;
111
+ else if ( newValue is string )
112
+ writer . WriteString ( ( string ) newValue ) ;
113
+ else if ( newValue is Vector3 )
114
+ {
115
+ Vector3 vector3 = ( Vector3 ) newValue ;
116
+ writer . WriteFloat ( vector3 . x ) ;
117
+ writer . WriteFloat ( vector3 . y ) ;
118
+ writer . WriteFloat ( vector3 . z ) ;
119
+ }
120
+ else if ( newValue is Vector2 )
121
+ {
122
+ Vector2 vector2 = ( Vector2 ) newValue ;
123
+ writer . WriteFloat ( vector2 . x ) ;
124
+ writer . WriteFloat ( vector2 . y ) ;
125
+ }
126
+ else if ( newValue is Quaternion )
127
+ {
128
+ Vector3 euler = ( ( Quaternion ) newValue ) . eulerAngles ;
129
+ writer . WriteFloat ( euler . x ) ;
130
+ writer . WriteFloat ( euler . y ) ;
131
+ writer . WriteFloat ( euler . z ) ;
132
+ }
133
+ else
134
+ {
135
+ BinarySerializer . Serialize ( newValue , writer ) ;
136
+ }
137
+ }
138
+ }
139
+
37
140
internal static void WriteFieldType ( BitWriter writer , object value )
38
141
{
39
142
Type type = value . GetType ( ) ;
@@ -97,6 +200,88 @@ internal static void WriteFieldType(BitWriter writer, object value)
97
200
}
98
201
}
99
202
203
+ internal static object ReadFieldType ( BitReader reader , Type type , ref object oldValueRef )
204
+ {
205
+ if ( type . IsArray )
206
+ {
207
+ bool diffMode = reader . ReadBool ( ) ;
208
+ if ( diffMode )
209
+ {
210
+ Array arr = ( Array ) oldValueRef ;
211
+ for ( int i = 0 ; i < arr . Length ; i ++ )
212
+ {
213
+ if ( ! reader . ReadBool ( ) ) //If it's not changed
214
+ continue ;
215
+
216
+ arr . SetValue ( ReadFieldType ( reader , type . GetElementType ( ) ) , i ) ;
217
+ }
218
+ return arr ;
219
+ }
220
+ else
221
+ {
222
+ ushort arrayLength = reader . ReadUShort ( ) ;
223
+ Type elementType = type . GetElementType ( ) ;
224
+ Array array = Array . CreateInstance ( elementType , arrayLength ) ;
225
+ for ( int i = 0 ; i < arrayLength ; i ++ ) array . SetValue ( ReadFieldType ( reader , elementType ) , i ) ;
226
+ return array ;
227
+ }
228
+ }
229
+ else
230
+ {
231
+ if ( type == typeof ( bool ) )
232
+ return reader . ReadBool ( ) ;
233
+ else if ( type == typeof ( byte ) )
234
+ return reader . ReadByte ( ) ;
235
+ else if ( type == typeof ( double ) )
236
+ return reader . ReadDouble ( ) ;
237
+ else if ( type == typeof ( float ) )
238
+ return reader . ReadFloat ( ) ;
239
+ else if ( type == typeof ( int ) )
240
+ return reader . ReadInt ( ) ;
241
+ else if ( type == typeof ( long ) )
242
+ return reader . ReadLong ( ) ;
243
+ else if ( type == typeof ( sbyte ) )
244
+ return reader . ReadSByte ( ) ;
245
+ else if ( type == typeof ( short ) )
246
+ return reader . ReadShort ( ) ;
247
+ else if ( type == typeof ( uint ) )
248
+ return reader . ReadUInt ( ) ;
249
+ else if ( type == typeof ( ulong ) )
250
+ return reader . ReadULong ( ) ;
251
+ else if ( type == typeof ( ushort ) )
252
+ return reader . ReadUShort ( ) ;
253
+ else if ( type == typeof ( string ) )
254
+ return reader . ReadString ( ) ;
255
+ else if ( type == typeof ( Vector3 ) )
256
+ {
257
+ Vector3 vector3 = new Vector3 ( ) ;
258
+ vector3 . x = reader . ReadFloat ( ) ;
259
+ vector3 . x = reader . ReadFloat ( ) ;
260
+ vector3 . y = reader . ReadFloat ( ) ;
261
+ return vector3 ;
262
+ }
263
+ else if ( type == typeof ( Vector2 ) )
264
+ {
265
+ Vector2 vector2 = new Vector2 ( ) ;
266
+ vector2 . x = reader . ReadFloat ( ) ;
267
+ vector2 . x = reader . ReadFloat ( ) ;
268
+ return vector2 ;
269
+ }
270
+ else if ( type == typeof ( Quaternion ) )
271
+ {
272
+ Vector3 euler = new Vector3 ( ) ;
273
+ euler . x = reader . ReadFloat ( ) ;
274
+ euler . x = reader . ReadFloat ( ) ;
275
+ euler . y = reader . ReadFloat ( ) ;
276
+ return Quaternion . Euler ( euler ) ;
277
+ }
278
+ else
279
+ {
280
+ return BinarySerializer . Deserialize ( reader , type ) ;
281
+ }
282
+ }
283
+ }
284
+
100
285
internal static object ReadFieldType ( BitReader reader , Type type )
101
286
{
102
287
if ( type . IsArray )
0 commit comments