/// <summary> /// Unsubscribes <see cref="Room" /> from networked events."/> /// </summary> private void ClearRoomHandlers() { if (_pingThread != null) { _pingThread.Abort(); _pingThread = null; } if (_room == null) { return; } _room.State.networkedEntities.OnAdd -= OnEntityAdd; _room.State.networkedEntities.OnRemove -= OnEntityRemoved; _room.State.networkedUsers.OnAdd -= OnUserAdd; _room.State.networkedUsers.OnRemove -= OnUserRemove; _room.colyseusConnection.OnError -= Room_OnError; _room.colyseusConnection.OnClose -= Room_OnClose; _room.OnStateChange -= OnStateChangeHandler; _room.OnLeave -= OnLeaveRoom; _room = null; _currentNetworkedUser = null; }
/// <summary> /// Subscribes the manager to <see cref="room" />'s networked events /// and starts measuring latency to the server. /// </summary> public virtual void RegisterRoomHandlers() { LSLog.LogImportant($"sessionId: {_room.SessionId}"); if (_pingThread != null) { _pingThread.Abort(); _pingThread = null; } _pingThread = new Thread(RunPingThread); _pingThread.Start(_room); _room.OnLeave += OnLeaveRoom; _room.OnStateChange += OnStateChangeHandler; _room.OnMessage <ExampleNetworkedUser>("onJoin", currentNetworkedUser => { Debug.Log($"Received 'ExampleNetworkedUser' after join/creation call {currentNetworkedUser.id}!"); Debug.Log(Json.SerializeToString(currentNetworkedUser)); _currentNetworkedUser = currentNetworkedUser; }); _room.OnMessage <ExampleRFCMessage>("onRFC", _rfc => { //Debug.Log($"Received 'onRFC' {_rfc.entityId}!"); if (_entityViews.Keys.Contains(_rfc.entityId)) { _entityViews[_rfc.entityId].RemoteFunctionCallHandler(_rfc); } }); _room.OnMessage <ExamplePongMessage>(0, message => { _lastPong = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); _serverTime = message.serverTime; _waitForPong = false; }); //Custom game logic //_room.OnMessage<YOUR_CUSTOM_MESSAGE>("messageNameInCustomLogic", objectOfTypeYOUR_CUSTOM_MESSAGE => { }); //======================== _room.State.networkedEntities.OnAdd += OnEntityAdd; _room.State.networkedEntities.OnRemove += OnEntityRemoved; _room.State.networkedUsers.OnAdd += OnUserAdd; _room.State.networkedUsers.OnRemove += OnUserRemove; _room.State.TriggerAll(); //======================== _room.colyseusConnection.OnError += Room_OnError; _room.colyseusConnection.OnClose += Room_OnClose; }
/// <summary> /// Callback for when a <see cref="ExampleNetworkedUser" /> is added to a room. /// </summary> /// <param name="user">The user object</param> /// <param name="key">The user key</param> private void OnUserAdd(string key, ExampleNetworkedUser user) { LSLog.LogImportant($"user [{user.__refId} | {user.id} | key {key}] Joined"); // Add "player" to map of players _users.Add(key, user); // On entity update... user.OnChange += changes => { user.updateHash = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); // If the change is for our current user then fire the event with the attributes that changed if (ExampleManager.Instance.CurrentUser != null && string.Equals(ExampleManager.Instance.CurrentUser.sessionId, user.sessionId)) { OnCurrentUserStateChanged?.Invoke(user.attributes); } }; }
/// <summary> /// Callback for when a user is removed from a room. /// </summary> /// <param name="user">The removed user.</param> /// <param name="key">The user key.</param> private void OnUserRemove(string key, ExampleNetworkedUser user) { LSLog.LogImportant($"user [{user.__refId} | {user.id} | key {key}] Left"); _users.Remove(key); }
/// <summary> /// Subscribes the manager to <see cref="room" />'s networked events /// and starts measuring latency to the server. /// </summary> public virtual void RegisterRoomHandlers() { LSLog.LogImportant($"sessionId: {_room.SessionId}"); if (_pingThread != null) { _pingThread.Abort(); _pingThread = null; } _pingThread = new Thread(RunPingThread); _pingThread.Start(_room); _room.OnLeave += OnLeaveRoom; _room.OnStateChange += OnStateChangeHandler; _room.OnMessage <ExampleNetworkedUser>("onJoin", currentNetworkedUser => { Debug.Log($"Received 'ExampleNetworkedUser' after join/creation call {currentNetworkedUser.id}!"); Debug.Log(Json.SerializeToString(currentNetworkedUser)); _currentNetworkedUser = currentNetworkedUser; }); _room.OnMessage <ExampleRFCMessage>("onRFC", _rfc => { //Debug.Log($"Received 'onRFC' {_rfc.entityId}!"); if (_entityViews.Keys.Contains(_rfc.entityId)) { _entityViews[_rfc.entityId].RemoteFunctionCallHandler(_rfc); } }); _room.OnMessage <ExamplePongMessage>(0, message => { _lastPong = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); _serverTime = message.serverTime; _waitForPong = false; }); //Custom game logic _room.OnMessage <ShootingGalleryNewTargetLineUpMessage>("newTargetLineUp", targets => { onGotTargetLineUp?.Invoke(targets); }); _room.OnMessage <ShootingGalleryScoreUpdateMessage>("onScoreUpdate", scoreUpdate => { onScoreUpdate?.Invoke(scoreUpdate); }); _room.OnMessage <ShootingGalleryMessage>("beginRoundCountDown", msg => { onBeginRoundCountDown?.Invoke(); }); _room.OnMessage <ShootingGalleryMessage>("beginRound", msg => { onBeginRound?.Invoke(); }); _room.OnMessage <ShootingGalleryRoundEndMessage>("onRoundEnd", winner => { onRoundEnd?.Invoke(winner.winner); }); //======================== Debug.Log($"Adding OnAdd/OnRemove callbacks for all {_room.State.networkedEntities.Count} entities! ***"); _room.State.networkedEntities.OnAdd += OnEntityAdd; _room.State.networkedEntities.OnRemove += OnEntityRemoved; _room.State.networkedUsers.OnAdd += OnUserAdd; _room.State.networkedUsers.OnRemove += OnUserRemove; _room.State.TriggerAll(); //======================== _room.colyseusConnection.OnError += Room_OnError; _room.colyseusConnection.OnClose += Room_OnClose; }