// coroutine that sends out the HostStateChangeMessage messages // sends changes to mouse pos and tracked objects to the server, every 50 milliseconds public IEnumerator SendStateAsHost() { while (true) { List <Change2d> changes = new List <Change2d>(); List <string> removeIds = new List <string>(); foreach (ChangeTracker changeTracker in trackingMap.Values.Where(t => t.dirty)) { changeTracker.dirty = false; if (changeTracker.create != null) { //DebugLog($"Adding change tracker for {changeTracker.create.ObjectID}"); changes.Add(changeTracker.create); changeTracker.create = null; } else if (changeTracker.destroy != null) { //DebugLog($"Removing change tracker for {changeTracker.destroy.ObjectID}"); changes.Add(changeTracker.destroy); removeIds.Add(changeTracker.destroy.ObjectID); changeTracker.destroy = null; } else { //DebugLog($"Updating change tracker for {changeTracker.update.ObjectID}"); changes.Add(changeTracker.update); } } foreach (string objectId in removeIds) { trackingMap.Remove(objectId); } if (changes.Count > 0) { // the server forwards host state change messages to all guests Message message = new HostStateChangeMessage() { Payload = new StateChange { Changes = changes } }; stateFluxClient.SendRequest(message); } yield return(new WaitForSeconds(0.1f)); } }
// host requests the server to broadcast state changes public Message HostStateChange(HostStateChangeMessage message) { Player currentPlayer = _websocket.GetCurrentSessionPlayer(); Assert.ThrowIfNull(currentPlayer, "requires a user session", _websocket); var outgoingMessage = new HostStateChangedMessage { Payload = message.Payload }; _websocket.Broadcast(outgoingMessage, currentPlayer.GameInstanceRef, meToo: false); return(null); }