/// <summary> /// The process network messages. /// </summary> private void ProcessNetworkMessages() { NetIncomingMessage im; while ((im = this.networkManager.ReadMessage()) != null) { switch (im.MessageType) { case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.WarningMessage: case NetIncomingMessageType.ErrorMessage: Console.WriteLine(im.ReadString()); break; case NetIncomingMessageType.StatusChanged: switch ((NetConnectionStatus)im.ReadByte()) { case NetConnectionStatus.Connected: if (!this.IsHost) { var message = new UpdatePlayerStateMessage(im.SenderConnection.RemoteHailMessage); this.playerManager.AddPlayer( message.Id, message.Position, message.Velocity, message.Rotation, true); Console.WriteLine("Connected to {0}", im.SenderEndpoint); } else { Console.WriteLine("{0} Connected", im.SenderEndpoint); } break; case NetConnectionStatus.Disconnected: Console.WriteLine( this.IsHost ? "{0} Disconnected" : "Disconnected from {0}", im.SenderEndpoint); break; case NetConnectionStatus.RespondedAwaitingApproval: NetOutgoingMessage hailMessage = this.networkManager.CreateMessage(); new UpdatePlayerStateMessage(this.playerManager.AddPlayer(false)).Encode(hailMessage); im.SenderConnection.Approve(hailMessage); break; } break; case NetIncomingMessageType.Data: var gameMessageType = (GameMessageTypes)im.ReadByte(); switch (gameMessageType) { case GameMessageTypes.UpdateAsteroidState: this.HandleUpdateAsteroidStateMessage(im); break; case GameMessageTypes.UpdatePlayerState: this.HandleUpdatePlayerStateMessage(im); break; case GameMessageTypes.ShotFired: this.HandleShotFiredMessage(im); break; case GameMessageTypes.EnemySpawned: this.HandleEnemySpawnedMessage(im); break; } break; } this.networkManager.Recycle(im); } }
/// <summary> /// The handle update player state message. /// </summary> /// <param name="im"> /// The im. /// </param> private void HandleUpdatePlayerStateMessage(NetIncomingMessage im) { var message = new UpdatePlayerStateMessage(im); var timeDelay = (float)(NetTime.Now - im.SenderConnection.GetLocalTime(message.MessageTime)); Player player = this.playerManager.GetPlayer(message.Id) ?? this.playerManager.AddPlayer( message.Id, message.Position, message.Velocity, message.Rotation, false); player.EnableSmoothing = true; if (player.LastUpdateTime < message.MessageTime) { player.SimulationState.Position = message.Position += message.Velocity * timeDelay; player.SimulationState.Velocity = message.Velocity; player.SimulationState.Rotation = message.Rotation; player.LastUpdateTime = message.MessageTime; } }