public void SendMessage(string serializedMessage) { try { BesiegedMessage message = serializedMessage.FromXml<BesiegedMessage>(); if (message is GenericServerMessage && (message as GenericServerMessage).MessageEnum == ServerMessage.ServerMessageEnum.StartServer) { m_ServerCallback = OperationContext.Current.GetCallbackChannel<IClient>(); GenericServerMessage started = new GenericServerMessage() { MessageEnum = ServerMessage.ServerMessageEnum.ServerStarted }; m_ServerCallback.SendMessage(started.ToXml()); m_IsServerInitialized.Value = true; //StartProcessingMessages(); ProcessMessages(); } else if (message is ConnectMessage) { IClient callback = OperationContext.Current.GetCallbackChannel<IClient>(); string clientId = Guid.NewGuid().ToString(); ConnectedClient connectedClient = new ConnectedClient((message as ConnectMessage).Name, clientId, callback); AggregateMessage aggregate = new AggregateMessage(); GenericClientMessage success = new GenericClientMessage() { ClientId = clientId, MessageEnum = ClientMessage.ClientMessageEnum.ConnectSuccessful }; aggregate.MessageList.Add(success); if (m_Games.Count > 0) // notify the client of any pre-existing game instances that they might be able to join { foreach (KeyValuePair<string, BesiegedGameInstance> game in m_Games) { if (!game.Value.IsGameInstanceFull) { string capacity = string.Format("{0}/{1} players", game.Value.Players.Count, game.Value.MaxPlayers); GameInfoMessage gameInfo = new GameInfoMessage(game.Value.GameId, game.Value.Name, capacity, false, game.Value.Password != string.Empty ? true : false); aggregate.MessageList.Add(gameInfo); } } } callback.SendMessage(aggregate.ToXml()); ConsoleLogger.Push(string.Format("{0} has joined the server", connectedClient.Name)); m_ConnectedClients.GetOrAdd(clientId, connectedClient); // Add an entry to the global client hook } else { m_MessageQueue.Add(message); } } catch (Exception ex) { ErrorLogger.Push(ex); } }
public void AddPlayer(ConnectedClient client) { Player player = new Player(client.Name, client.ClientId, client.Callback, ColorPool.Pop()); Players.Add(player); ConsoleLogger.Push(string.Format("{0} with ClientId {1} has joined game {2}", player.Name, player.ClientId, Name)); SendUpdatedGameInfo(); player.IsReady.ValueChanged += (from, to) => { PlayerInfoMessage playerInfo = new PlayerInfoMessage() { ClientId = player.ClientId, Name = player.Name, Color = player.PlayerColor, IsReady = to }; NotifyAllPlayers(playerInfo.ToXml()); if (to) { CheckIfAllAreReady(); } else { m_GameMachine.Fire(Trigger.PlayerNotReady); } }; AggregateMessage aggregate = new AggregateMessage(); PlayerGameInfoMessage playerGameInfo = new PlayerGameInfoMessage() { GameId = this.GameId, IsCreator = (Players.Count == 1) ? true : false }; aggregate.MessageList.Add(playerGameInfo); PlayerInfoMessage playerInfoMessage = new PlayerInfoMessage() { ClientId = player.ClientId, Name = player.Name, Color = player.PlayerColor, IsReady = false }; foreach (Player p in Players) { if (p.ClientId != player.ClientId) { p.Callback.SendMessage(playerInfoMessage.ToXml()); } aggregate.MessageList.Add(new PlayerInfoMessage() { ClientId = p.ClientId, Name = p.Name, Color = p.PlayerColor, IsReady = p.IsReady.Value }); } player.Callback.SendMessage(aggregate.ToXml()); }