Skip to content

Commit 5223e7a

Browse files
committed
Merge branch 'dev'
2 parents 96262a6 + 7f76c8e commit 5223e7a

20 files changed

+969
-120
lines changed

Assets/Plugins/Colyseus/Room.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,17 @@ public void SetConnection (Connection connection)
8686
this.OnReadyToConnect.Invoke (this, new EventArgs());
8787
}
8888

89-
public void SetState( IndexedDictionary<string, object> state, uint remoteCurrentTime, uint remoteElapsedTime)
89+
public void SetState( byte[] encodedState, uint remoteCurrentTime, uint remoteElapsedTime)
9090
{
91-
this.Set(state);
92-
9391
// Deserialize
94-
var serializationOutput = new MemoryStream();
95-
MsgPack.Serialize (state, serializationOutput);
92+
var state = MsgPack.Deserialize<IndexedDictionary<string, object>> (new MemoryStream(encodedState));
93+
94+
this.Set(state);
9695

9796
if (this.OnUpdate != null)
9897
this.OnUpdate.Invoke(this, new RoomUpdateEventArgs(state, true));
9998

100-
this._previousState = serializationOutput.ToArray();
99+
this._previousState = encodedState;
101100
}
102101

103102
/// <summary>
@@ -138,7 +137,7 @@ protected void ParseMessage (byte[] recv)
138137
this.Leave ();
139138

140139
} else if (code == Protocol.ROOM_STATE) {
141-
var state = (IndexedDictionary<string, object>) message [2];
140+
byte[] encodedState = (byte[]) message [2];
142141

143142
// TODO:
144143
// https://github.com/deniszykov/msgpack-unity3d/issues/8
@@ -148,7 +147,7 @@ protected void ParseMessage (byte[] recv)
148147

149148
// this.SetState (state, remoteCurrentTime, remoteElapsedTime);
150149

151-
this.SetState (state, 0, 0);
150+
this.SetState (encodedState, 0, 0);
152151

153152
} else if (code == Protocol.ROOM_STATE_PATCH) {
154153

Assets/Plugins/GameDevWare.Serialization/Json.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*
1+
/*
22
Copyright (c) 2016 Denis Zykov, GameDevWare.com
33
44
This a part of "Json & MessagePack Serialization" Unity Asset - https://www.assetstore.unity3d.com/#!/content/59918
@@ -18,13 +18,15 @@ to use it in your project you should accept Terms of Service and EULA
1818
using System.Globalization;
1919
using System.IO;
2020
using System.Text;
21+
using GameDevWare.Serialization.MessagePack;
2122
using GameDevWare.Serialization.Serializers;
2223

2324
// ReSharper disable once CheckNamespace
2425
namespace GameDevWare.Serialization
2526
{
2627
public static class Json
2728
{
29+
2830
private static IFormatProvider _DefaultFormat = CultureInfo.InvariantCulture;
2931
private static Encoding _DefaultEncoding = new UTF8Encoding(false, true);
3032
private static string[] _DefaultDateTimeFormats;
@@ -92,6 +94,7 @@ static Json()
9294
new VersionSerializer(),
9395
new TimeSpanSerializer(),
9496
new DictionaryEntrySerializer(),
97+
9598
#if UNITY_5 || UNITY_4 || UNITY_3_3 || UNITY_3_4 || UNITY_3_5
9699
new BoundsSerializer(),
97100
new Matrix4x4Serializer(),

Assets/Plugins/GameDevWare.Serialization/JsonReader.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*
1+
/*
22
Copyright (c) 2016 Denis Zykov, GameDevWare.com
33
44
This a part of "Json & MessagePack Serialization" Unity Asset - https://www.assetstore.unity3d.com/#!/content/59918
@@ -24,7 +24,7 @@ namespace GameDevWare.Serialization
2424
{
2525
public abstract class JsonReader : IJsonReader
2626
{
27-
private static readonly long UNIX_EPOCH_TICKS = new DateTime(0x7b2, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
27+
2828
protected const int DEFAULT_BUFFER_SIZE = 1024;
2929

3030
private sealed class Buffer : IList<char>
@@ -543,7 +543,7 @@ public bool NextToken()
543543
var ticks = JsonUtils.StringToInt64(buffer.GetChars(), buffer.Offset + start + 6, len - 8);
544544

545545
token = JsonToken.DateTime;
546-
var dateTime = new DateTime(ticks * 0x2710L + UNIX_EPOCH_TICKS, DateTimeKind.Utc);
546+
var dateTime = new DateTime(ticks * 0x2710L + JsonUtils.UnixEpochTicks, DateTimeKind.Utc);
547547
lazyValue.Raw = dateTime;
548548
}
549549
else if (!quoted && IsNumber(buffer, start, len))

Assets/Plugins/GameDevWare.Serialization/JsonUtils.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*
1+
/*
22
Copyright (c) 2016 Denis Zykov, GameDevWare.com
33
44
This a part of "Json & MessagePack Serialization" Unity Asset - https://www.assetstore.unity3d.com/#!/content/59918
@@ -21,6 +21,8 @@ namespace GameDevWare.Serialization
2121
{
2222
internal static class JsonUtils
2323
{
24+
internal static readonly long UnixEpochTicks = new DateTime(0x7b2, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
25+
2426
private static readonly char[] ZerBuff = new char[] {'0', '0', '0', '0', '0', '0', '0', '0',};
2527
private static readonly char[] HexChar = "0123456789ABCDEF".ToCharArray();
2628

Assets/Plugins/GameDevWare.Serialization/JsonWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*
1+
/*
22
Copyright (c) 2016 Denis Zykov, GameDevWare.com
33
44
This a part of "Json & MessagePack Serialization" Unity Asset - https://www.assetstore.unity3d.com/#!/content/59918
@@ -197,7 +197,7 @@ public void Write(DateTimeOffset dateTimeOffset)
197197
{
198198
this.WriteFormatting(JsonToken.DateTime);
199199

200-
var dateTimeFormat = this.Context.DateTimeFormats.First();
200+
var dateTimeFormat = this.Context.DateTimeFormats.FirstOrDefault() ?? "o";
201201
var dateString = dateTimeOffset.ToString(dateTimeFormat, this.Context.Format);
202202
this.Write(dateString);
203203
}
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
// ReSharper disable once CheckNamespace
5+
namespace GameDevWare.Serialization.MessagePack
6+
{
7+
public sealed class DefaultMessagePackExtensionTypeHandler : MessagePackExtensionTypeHandler
8+
{
9+
public const int EXTENSION_TYPE_TIMESTAMP = -1;
10+
public const int EXTENSION_TYPE_DATE_TIME = 40;
11+
public const int EXTENSION_TYPE_DATE_TIME_OFFSET = 41;
12+
public const int EXTENSION_TYPE_DECIMAL = 42;
13+
public const int EXTENSION_TYPE_GUID = 43;
14+
public const int GUID_SIZE = 16;
15+
public const int DECIMAL_SIZE = 16;
16+
public const int DATE_TIME_SIZE = 16;
17+
public const int DATE_TIME_OFFSET_SIZE = 16;
18+
19+
private static readonly Type[] DefaultExtensionTypes = new[] { typeof(decimal), typeof(DateTime), typeof(DateTimeOffset), typeof(Guid), typeof(DateTimeOffset), typeof(MessagePackTimestamp) };
20+
public static DefaultMessagePackExtensionTypeHandler Instance = new DefaultMessagePackExtensionTypeHandler(EndianBitConverter.Little);
21+
22+
private readonly EndianBitConverter bitConverter;
23+
24+
public override IEnumerable<Type> ExtensionTypes
25+
{
26+
get { return DefaultExtensionTypes; }
27+
}
28+
29+
internal DefaultMessagePackExtensionTypeHandler(EndianBitConverter bitConverter)
30+
{
31+
if (bitConverter == null) throw new ArgumentNullException("bitConverter");
32+
33+
this.bitConverter = bitConverter;
34+
}
35+
36+
/// <inheritdoc />
37+
public override bool TryRead(sbyte type, ArraySegment<byte> data, out object value)
38+
{
39+
if (data.Array == null) throw new ArgumentNullException("data");
40+
41+
value = default(object);
42+
switch (type)
43+
{
44+
case EXTENSION_TYPE_TIMESTAMP:
45+
unchecked
46+
{
47+
var seconds = 0L;
48+
var nanoSeconds = 0u;
49+
switch (data.Count)
50+
{
51+
case 4:
52+
seconds = this.bitConverter.ToInt32(data.Array, data.Offset);
53+
value = new MessagePackTimestamp(seconds, nanoSeconds);
54+
return true;
55+
case 8:
56+
var data64 = this.bitConverter.ToUInt64(data.Array, data.Offset);
57+
seconds = (int)(data64 & 0x00000003ffffffffL);
58+
nanoSeconds = (uint)(data64 >> 34 & uint.MaxValue);
59+
value = new MessagePackTimestamp(seconds, nanoSeconds);
60+
return true;
61+
case 12:
62+
nanoSeconds = this.bitConverter.ToUInt32(data.Array, data.Offset);
63+
seconds = this.bitConverter.ToInt64(data.Array, data.Offset + 4);
64+
value = new MessagePackTimestamp(seconds, nanoSeconds);
65+
return true;
66+
default:
67+
return false;
68+
}
69+
}
70+
case EXTENSION_TYPE_DATE_TIME:
71+
if (data.Count != DATE_TIME_SIZE)
72+
return false;
73+
var dateTime = new DateTime(this.bitConverter.ToInt64(data.Array, data.Offset + 1), (DateTimeKind)data.Array[data.Offset]);
74+
value = dateTime;
75+
return true;
76+
case EXTENSION_TYPE_DATE_TIME_OFFSET:
77+
if (data.Count != DATE_TIME_OFFSET_SIZE)
78+
return false;
79+
var offset = new TimeSpan(this.bitConverter.ToInt64(data.Array, data.Offset + 8));
80+
var ticks = this.bitConverter.ToInt64(data.Array, data.Offset);
81+
var dateTimeOffset = new DateTimeOffset(ticks, offset);
82+
value = dateTimeOffset;
83+
return true;
84+
case EXTENSION_TYPE_DECIMAL:
85+
if (data.Count != DECIMAL_SIZE)
86+
return false;
87+
var decimalValue = this.bitConverter.ToDecimal(data.Array, data.Offset);
88+
value = decimalValue;
89+
return true;
90+
case EXTENSION_TYPE_GUID:
91+
if (data.Count != GUID_SIZE)
92+
return false;
93+
94+
var buffer = data.Array;
95+
var guidValue = new Guid
96+
(
97+
this.bitConverter.ToUInt32(buffer, data.Offset),
98+
this.bitConverter.ToUInt16(buffer, data.Offset + 4),
99+
this.bitConverter.ToUInt16(buffer, data.Offset + 6),
100+
buffer[data.Offset + 8],
101+
buffer[data.Offset + 9],
102+
buffer[data.Offset + 10],
103+
buffer[data.Offset + 11],
104+
buffer[data.Offset + 12],
105+
buffer[data.Offset + 13],
106+
buffer[data.Offset + 14],
107+
buffer[data.Offset + 15]
108+
);
109+
value = guidValue;
110+
return true;
111+
default:
112+
return false;
113+
}
114+
}
115+
/// <inheritdoc />
116+
public override bool TryWrite(object value, out sbyte type, ref ArraySegment<byte> data)
117+
{
118+
if (value == null)
119+
{
120+
type = 0;
121+
return false;
122+
}
123+
else if (value is DateTime)
124+
{
125+
type = EXTENSION_TYPE_DATE_TIME;
126+
if (data.Array == null || data.Count < DATE_TIME_SIZE)
127+
data = new ArraySegment<byte>(new byte[DATE_TIME_SIZE]);
128+
129+
var dateTime = (DateTime)(object)value;
130+
Array.Clear(data.Array, data.Offset, DATE_TIME_SIZE);
131+
this.bitConverter.CopyBytes(dateTime.Ticks, data.Array, data.Offset + 1);
132+
data.Array[data.Offset] = (byte)dateTime.Kind;
133+
134+
if (data.Count != DATE_TIME_SIZE)
135+
data = new ArraySegment<byte>(data.Array, data.Offset, DATE_TIME_SIZE);
136+
return true;
137+
}
138+
else if (value is DateTimeOffset)
139+
{
140+
type = EXTENSION_TYPE_DATE_TIME_OFFSET;
141+
if (data.Array == null || data.Count < DATE_TIME_OFFSET_SIZE)
142+
data = new ArraySegment<byte>(new byte[DATE_TIME_OFFSET_SIZE]);
143+
144+
var dateTimeOffset = (DateTimeOffset)(object)value;
145+
this.bitConverter.CopyBytes(dateTimeOffset.DateTime.Ticks, data.Array, data.Offset);
146+
this.bitConverter.CopyBytes(dateTimeOffset.Offset.Ticks, data.Array, data.Offset + 8);
147+
148+
if (data.Count != DATE_TIME_OFFSET_SIZE)
149+
data = new ArraySegment<byte>(data.Array, data.Offset, DATE_TIME_OFFSET_SIZE);
150+
return true;
151+
}
152+
else if (value is decimal)
153+
{
154+
155+
type = EXTENSION_TYPE_DECIMAL;
156+
if (data.Array == null || data.Count < DECIMAL_SIZE)
157+
data = new ArraySegment<byte>(new byte[DECIMAL_SIZE]);
158+
159+
var number = (decimal)(object)value;
160+
this.bitConverter.CopyBytes(number, data.Array, data.Offset);
161+
162+
if (data.Count != DECIMAL_SIZE)
163+
data = new ArraySegment<byte>(data.Array, data.Offset, DECIMAL_SIZE);
164+
return true;
165+
}
166+
else if (value is Guid)
167+
{
168+
type = EXTENSION_TYPE_GUID;
169+
var guid = (Guid)(object)value;
170+
data = new ArraySegment<byte>(guid.ToByteArray());
171+
return true;
172+
}
173+
else if (value is MessagePackTimestamp)
174+
{
175+
type = EXTENSION_TYPE_TIMESTAMP;
176+
var timestamp = (MessagePackTimestamp)(object)value;
177+
178+
unchecked
179+
{
180+
181+
if (timestamp.Seconds <= int.MaxValue && timestamp.Seconds >= int.MinValue)
182+
{
183+
if (timestamp.NanoSeconds == 0)
184+
{
185+
const int TIMESTAMP_SIZE = 4;
186+
187+
if (data.Array == null || data.Count < TIMESTAMP_SIZE)
188+
data = new ArraySegment<byte>(new byte[TIMESTAMP_SIZE]);
189+
190+
// timestamp 32
191+
this.bitConverter.CopyBytes((int)timestamp.Seconds, data.Array, data.Offset);
192+
193+
if (data.Count != TIMESTAMP_SIZE)
194+
data = new ArraySegment<byte>(data.Array, data.Offset, TIMESTAMP_SIZE);
195+
}
196+
else
197+
{
198+
const int TIMESTAMP_SIZE = 8;
199+
200+
if (data.Array == null || data.Count < TIMESTAMP_SIZE)
201+
data = new ArraySegment<byte>(new byte[TIMESTAMP_SIZE]);
202+
203+
var data64 = ((ulong)timestamp.NanoSeconds << 34) | ((ulong)timestamp.Seconds & uint.MaxValue);
204+
// timestamp 64
205+
this.bitConverter.CopyBytes(data64, data.Array, data.Offset);
206+
207+
if (data.Count != TIMESTAMP_SIZE)
208+
data = new ArraySegment<byte>(data.Array, data.Offset, TIMESTAMP_SIZE);
209+
}
210+
}
211+
else
212+
{
213+
const int TIMESTAMP_SIZE = 12;
214+
215+
if (data.Array == null || data.Count < TIMESTAMP_SIZE)
216+
data = new ArraySegment<byte>(new byte[TIMESTAMP_SIZE]);
217+
218+
// timestamp 96
219+
this.bitConverter.CopyBytes(timestamp.NanoSeconds, data.Array, data.Offset);
220+
this.bitConverter.CopyBytes(timestamp.Seconds, data.Array, data.Offset + 4);
221+
222+
if (data.Count != TIMESTAMP_SIZE)
223+
data = new ArraySegment<byte>(data.Array, data.Offset, TIMESTAMP_SIZE);
224+
}
225+
}
226+
return true;
227+
}
228+
else
229+
{
230+
type = default(sbyte);
231+
return false;
232+
}
233+
}
234+
}
235+
}
236+

0 commit comments

Comments
 (0)