Skip to content

Commit 1d79222

Browse files
committed
bring back callbacks.OnChange() for collections
1 parent cc08703 commit 1d79222

File tree

4 files changed

+57
-5
lines changed

4 files changed

+57
-5
lines changed

.github/workflows/upmsemver.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ jobs:
8686
body: |
8787
${{ steps.Changelog.outputs.changelog }}
8888
draft: false
89-
prerelease: true
89+
prerelease: false
9090
- name: Upload Release Asset
9191
id: upload-release-asset
9292
uses: actions/upload-release-asset@v1

Assets/Colyseus/Runtime/Colyseus/Serializer/Schema/Callbacks/Callbacks.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections;
32
using System.Collections.Generic;
43
using System.Linq.Expressions;
54

@@ -16,7 +15,7 @@ namespace Colyseus.Schema
1615
/// <summary>
1716
/// Delegate function when any property on the schema structure has changed.
1817
/// </summary>
19-
public delegate void OnChangeEventHandler();
18+
public delegate void OnInstanceChangeEventHandler();
2019

2120
/// <summary>
2221
/// Delegate function for handling <see cref="Schema" /> removal
@@ -121,7 +120,7 @@ public Action Listen<TInstance, TReturn>(TInstance instance, Expression<Func<TIn
121120
return AddCallback(instance.__refId, propertyName, handler);
122121
}
123122

124-
public Action OnChange<T>(T instance, OnChangeEventHandler handler)
123+
public Action OnChange<T>(T instance, OnInstanceChangeEventHandler handler)
125124
where T : Schema
126125
{
127126
return AddCallback(instance.__refId, OPERATION.REPLACE, handler);
@@ -149,6 +148,28 @@ public Action OnAdd<TInstance, TReturn>(TInstance instance, Expression<Func<TIns
149148
return AddCallbackOrWaitCollectionAvailable(instance, propertyExpression, OPERATION.ADD, handler, immediate);
150149
}
151150

151+
public Action OnChange<TReturn>(Expression<Func<TState, ArraySchema<TReturn>>> propertyExpression, KeyValueEventHandler<int, TReturn> handler)
152+
{
153+
return OnChange(Decoder.State, propertyExpression, handler);
154+
}
155+
156+
public Action OnChange<TInstance, TReturn>(TInstance instance, Expression<Func<TInstance, ArraySchema<TReturn>>> propertyExpression, KeyValueEventHandler<int, TReturn> handler)
157+
where TInstance : Schema
158+
{
159+
return AddCallbackOrWaitCollectionAvailable(instance, propertyExpression, OPERATION.REPLACE, handler);
160+
}
161+
162+
public Action OnChange<TReturn>(Expression<Func<TState, MapSchema<TReturn>>> propertyExpression, KeyValueEventHandler<string, TReturn> handler)
163+
{
164+
return OnChange(Decoder.State, propertyExpression, handler);
165+
}
166+
167+
public Action OnChange<TInstance, TReturn>(TInstance instance, Expression<Func<TInstance, MapSchema<TReturn>>> propertyExpression, KeyValueEventHandler<string, TReturn> handler)
168+
where TInstance : Schema
169+
{
170+
return AddCallbackOrWaitCollectionAvailable(instance, propertyExpression, OPERATION.REPLACE, handler);
171+
}
172+
152173
public Action OnRemove<TReturn>(Expression<Func<TState, ArraySchema<TReturn>>> propertyExpression, KeyValueEventHandler<int, TReturn> handler)
153174
{
154175
return OnRemove(Decoder.State, propertyExpression, handler);

Assets/Colyseus/Tests/Editor/ColyseusTests/SchemaDeserializerTest.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,15 @@ public void MapSchemaTypesTest()
203203
callbacks.OnRemove(state => state.mapOfStrings, (key, value) => mapOfStringsRemove++);
204204
callbacks.OnRemove(state => state.mapOfInt32, (key, value) => mapOfIntRemove++);
205205

206+
var mapOfSchemasChange = 0;
207+
var mapOfNumbersChange = 0;
208+
var mapOfStringsChange = 0;
209+
var mapOfIntChange = 0;
210+
callbacks.OnChange(state => state.mapOfSchemas, (key, value) => mapOfSchemasChange++);
211+
callbacks.OnChange(state => state.mapOfNumbers, (key, value) => mapOfNumbersChange++);
212+
callbacks.OnChange(state => state.mapOfStrings, (key, value) => mapOfStringsChange++);
213+
callbacks.OnChange(state => state.mapOfInt32, (key, value) => mapOfIntChange++);
214+
206215
decoder.Decode(bytes);
207216

208217
Assert.AreEqual(state.mapOfSchemas.Count, 3);
@@ -245,6 +254,11 @@ public void MapSchemaTypesTest()
245254
Assert.AreEqual(mapOfNumbersRemove, 2);
246255
Assert.AreEqual(mapOfStringsRemove, 2);
247256
Assert.AreEqual(mapOfIntRemove, 2);
257+
258+
Assert.AreEqual(mapOfSchemasChange, 3);
259+
Assert.AreEqual(mapOfNumbersChange, 3);
260+
Assert.AreEqual(mapOfStringsChange, 3);
261+
Assert.AreEqual(mapOfIntChange, 3);
248262
}
249263

250264
[Test]
@@ -423,8 +437,11 @@ public void CallbacksTest()
423437

424438
var onListenContainer = 0;
425439
var onPlayerAdd = 0;
440+
var onPlayerChange = 0;
426441
var onPlayerRemove = 0;
442+
427443
var onItemAdd = 0;
444+
var onItemChange = 0;
428445
var onItemRemove = 0;
429446

430447
callbacks.Listen(state => state.container, (container, _) =>
@@ -440,12 +457,22 @@ public void CallbacksTest()
440457
onItemAdd++;
441458
});
442459

460+
callbacks.OnChange(player, player => player.items, (key, item) =>
461+
{
462+
onItemChange++;
463+
});
464+
443465
callbacks.OnRemove(player, player => player.items, (key, item) =>
444466
{
445467
onItemRemove++;
446468
});
447469
});
448470

471+
callbacks.OnChange(container, container => container.playersMap, (sessionId, player) =>
472+
{
473+
onPlayerChange++;
474+
});
475+
449476
callbacks.OnRemove(container, container => container.playersMap, (sessionId, player) =>
450477
{
451478
onPlayerRemove++;
@@ -460,7 +487,9 @@ public void CallbacksTest()
460487

461488
Assert.AreEqual(1, onListenContainer);
462489
Assert.AreEqual(2, onPlayerAdd);
490+
Assert.AreEqual(2, onPlayerChange);
463491
Assert.AreEqual(6, onItemAdd);
492+
Assert.AreEqual(6, onItemChange);
464493

465494
// (2nd encode)
466495
decoder.Decode(new byte[] { 255, 1, 255, 2, 64, 1, 128, 2, 165, 116, 104, 114, 101, 101, 16, 255, 2, 255, 3, 255, 4, 255, 5, 64, 0, 64, 1, 128, 3, 166, 105, 116, 101, 109, 45, 52, 15, 255, 8, 255, 5, 255, 5, 255, 15, 128, 166, 73, 116, 101, 109, 32, 52, 129, 4, 255, 2, 255, 16, 128, 17, 129, 18, 255, 17, 128, 1, 129, 2, 130, 3, 255, 18, 128, 0, 166, 105, 116, 101, 109, 45, 49, 19, 128, 1, 166, 105, 116, 101, 109, 45, 50, 20, 128, 2, 166, 105, 116, 101, 109, 45, 51, 21, 255, 19, 128, 166, 73, 116, 101, 109, 32, 49, 129, 1, 255, 20, 128, 166, 73, 116, 101, 109, 32, 50, 129, 2, 255, 21, 128, 166, 73, 116, 101, 109, 32, 51, 129, 3 });
@@ -471,9 +500,11 @@ public void CallbacksTest()
471500
Assert.AreEqual(2, onListenContainer);
472501
Assert.AreEqual(4, onPlayerAdd);
473502
Assert.AreEqual(1, onPlayerRemove);
503+
Assert.AreEqual(4, onPlayerChange);
474504

475505
Assert.AreEqual(11, onItemAdd);
476506
Assert.AreEqual(2, onItemRemove);
507+
Assert.AreEqual(11, onItemChange);
477508
}
478509

479510
}

Assets/Colyseus/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "io.colyseus.sdk",
3-
"version": "0.16.1",
3+
"version": "0.16.2",
44
"displayName": "Colyseus SDK",
55
"description": "Colyseus Multiplayer SDK for Unity",
66
"unity": "2019.1",

0 commit comments

Comments
 (0)