Beispiel #1
0
        // 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);
        }