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); } }
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(); } }