Exemple #1
0
        public void Update(GameTime time)
        {
            NetIncomingMessage im;

            while ((im = Peer.ReadMessage()) != null)
            {
                // handle incoming message
                switch (im.MessageType)
                {
                case NetIncomingMessageType.DebugMessage:
                case NetIncomingMessageType.ErrorMessage:
                case NetIncomingMessageType.WarningMessage:
                case NetIncomingMessageType.VerboseDebugMessage:
                    Console.WriteLine($"NetMessage {im.MessageType}: {im.ReadString()}");
                    break;

                case NetIncomingMessageType.StatusChanged:
                    NetConnectionStatus status = (NetConnectionStatus)im.ReadByte();

                    if (status == NetConnectionStatus.Connected)
                    {
                        IsConnected = true;
                        Sync.AddConnection(im.SenderConnection);
                        Connected?.Invoke(this, null);
                        SendToServer(new LobbyPlayerGreeting {
                            PlayerName = Ballz.The().Settings.PlayerName
                        });                                                                                         // TODO: Use actual player name
                    }
                    else
                    {
                        IsConnected = false;
                    }

                    if (status == NetConnectionStatus.Disconnected)
                    {
                        Disconnected?.Invoke(this, null);
                    }

                    break;

                case NetIncomingMessageType.Data:
                    Sync.ReadMessage(im);
                    break;

                default:
                    Console.WriteLine($"Unhandled message type: {im.MessageType} {im.LengthBytes} bytes");
                    break;
                }
                Peer.Recycle(im);
            }
        }
Exemple #2
0
        public void Update(GameTime time)
        {
            NetIncomingMessage im;

            while ((im = Peer.ReadMessage()) != null)
            {
                switch (im.MessageType)
                {
                case NetIncomingMessageType.StatusChanged:
                    NetConnectionStatus status = (NetConnectionStatus)im.ReadByte();

                    string reason = im.ReadString();

                    if (!GameRunning && status == NetConnectionStatus.Connected)
                    {
                        Sync.AddConnection(im.SenderConnection);
                        NewConnection?.Invoke(this, im.SenderConnection);
                    }

                    break;

                case NetIncomingMessageType.DiscoveryRequest:
                    // Respond to discovery requests with a json-serialized game info
                    // But only send the non-secret parts
                    var publicInfo     = GameInfo.PublicInfo();
                    var serializedInfo = JsonConvert.SerializeObject(publicInfo);
                    var response       = Peer.CreateMessage();
                    response.Write(serializedInfo);
                    Peer.SendDiscoveryResponse(response, im.SenderEndPoint);
                    break;

                case NetIncomingMessageType.Data:
                    Sync.ReadMessage(im);
                    break;
                }

                Peer.Recycle(im);
            }

            if (GameRunning && WorldSyncTimer.ElapsedMilliseconds > Network.WorldSyncIntervalMs)
            {
                // Send full world state on every frame.
                //Todo: Only send updates for world synchronization
                SendWorldState();
                WorldSyncTimer.Restart();
            }
        }