private void OnMessageReceived(MessageReader message) { var flag = message.Tag; Logger.Verbose("Server got {0}.", flag); switch (flag) { case MessageFlags.HostGame: { using (var packet = MessageWriter.Get(SendOption.Reliable)) { Message13Redirect.Serialize(packet, false, _nodeProvider.Get()); _connection.Send(packet); } break; } case MessageFlags.JoinGame: { Message01JoinGame.Deserialize(message, out var gameCode, out var unknown); using (var packet = MessageWriter.Get(SendOption.Reliable)) { var endpoint = _nodeLocator.Find(GameCode.IntToGameName(gameCode)); if (endpoint == null) { Message01JoinGame.SerializeError(packet, false, DisconnectReason.GameMissing); } else { Message13Redirect.Serialize(packet, false, endpoint); } _connection.Send(packet); } break; } case MessageFlags.GetGameListV2: { // TODO: Implement. using (var packet = MessageWriter.Get(SendOption.Reliable)) { Message01JoinGame.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.NotImplemented); _connection.Send(packet); } break; } default: { Logger.Warning("Received unsupported message flag on the redirector ({0}).", flag); break; } } }
private void OnMessageReceived(MessageReader message, SendOption sendOption) { var flag = message.Tag; Logger.Verbose("[{0}] Server got {1}.", Id, flag); switch (flag) { case MessageFlags.HostGame: { // Read game settings. var gameInfo = Message00HostGame.Deserialize(message); // Create game. var game = _gameManager.Create(gameInfo); if (game == null) { Player.SendDisconnectReason(DisconnectReason.ServerFull); return; } // Code in the packet below will be used in JoinGame. using (var writer = MessageWriter.Get(SendOption.Reliable)) { Message00HostGame.Serialize(writer, game.Code); Connection.Send(writer); } break; } case MessageFlags.JoinGame: { Message01JoinGame.Deserialize(message, out var gameCode, out var unknown); var game = _gameManager.Find(gameCode); if (game == null) { Player.SendDisconnectReason(DisconnectReason.GameMissing); return; } game.HandleJoinGame(Player); break; } case MessageFlags.StartGame: { if (!IsPacketAllowed(message, true)) { return; } Player.Game.HandleStartGame(message); break; } // No idea how this flag is triggered. case MessageFlags.RemoveGame: break; case MessageFlags.RemovePlayer: { if (!IsPacketAllowed(message, true)) { return; } Message04RemovePlayer.Deserialize(message, out var playerId, out var reason); Player.Game.HandleRemovePlayer(playerId, (DisconnectReason)reason); break; } case MessageFlags.GameData: case MessageFlags.GameDataTo: { if (!IsPacketAllowed(message, false)) { return; } // Broadcast packet to all other players. using (var writer = MessageWriter.Get(sendOption)) { if (flag == MessageFlags.GameDataTo) { var target = message.ReadPackedInt32(); writer.CopyFrom(message); Player.Game.SendTo(writer, target); } else { writer.CopyFrom(message); Player.Game.SendToAllExcept(writer, Player.Client.Id); } } break; } case MessageFlags.EndGame: { if (!IsPacketAllowed(message, true)) { return; } Player.Game.HandleEndGame(message); break; } case MessageFlags.AlterGame: { if (!IsPacketAllowed(message, true)) { return; } Message10AlterGame.Deserialize(message, out var gameTag, out var value); if (gameTag != AlterGameTags.ChangePrivacy) { return; } Player.Game.HandleAlterGame(message, Player, value); break; } case MessageFlags.KickPlayer: { if (!IsPacketAllowed(message, true)) { return; } Message11KickPlayer.Deserialize(message, out var playerId, out var isBan); Player.Game.HandleKickPlayer(playerId, isBan); break; } case MessageFlags.GetGameListV2: { Message16GetGameListV2.Deserialize(message, out var options); Player.OnRequestGameList(options); break; } default: Logger.Warning("Server received unknown flag {0}.", flag); break; } #if DEBUG if (flag != MessageFlags.GameData && flag != MessageFlags.GameDataTo && flag != MessageFlags.EndGame && message.Position < message.Length) { Logger.Warning("Server did not consume all bytes from {0} ({1} < {2}).", flag, message.Position, message.Length); } #endif }