@@ -34,6 +34,109 @@ internal static bool ObjectEqual(object o1, object o2)
3434 return o1 . Equals ( o2 ) ;
3535 }
3636
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+
37140 internal static void WriteFieldType ( BitWriter writer , object value )
38141 {
39142 Type type = value . GetType ( ) ;
@@ -97,6 +200,88 @@ internal static void WriteFieldType(BitWriter writer, object value)
97200 }
98201 }
99202
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+
100285 internal static object ReadFieldType ( BitReader reader , Type type )
101286 {
102287 if ( type . IsArray )
0 commit comments