예제 #1
0
파일: Server.cs 프로젝트: plukich/webgames
        private void HandleRequest(Player p, LoginRequest m)
        {
            try
            {
                if (clients.Count > 100)
                {
                    p.Send(Serialize(new LoginResponse { Success = false, Reason = "The maximum number of clients has been reached on this server.  Please try again later." }));
                }
                else
                {
                    // remove invalid chars
                    m.Username = RemoveInvalidUsernameCharacters(m.Username);

                    bool nameValid = true;
                    lock (clients)
                    {
                        foreach (var client in clients)
                        {
                            if (client.Username == m.Username)
                            {
                                nameValid = false;
                                break;
                            }
                        }

                        // reserve the name for this user
                        if (nameValid)
                            p.Username = m.Username;
                    }
                    if (nameValid)
                    {
                        lock (nextPlayerIDLock)
                        {
                            p.ID = nextPlayerID;
                            nextPlayerID++;
                        }
                        p.State = PlayerState.IN_LOBBY;
                        p.Send(Serialize(new LoginResponse { Success = true }));
                        lock (clients)
                        {
                            foreach (var player in clients.Where(x => IsInLobby(x)))
                            {
                                // tell existing players, that 'p' has connected
                                player.Send(Serialize(new UpdatePlayerMessage { PlayerID = p.ID, Status = p.State.ToString(), Username = p.Username, Reason = String.Format("{0} connected.", p.Username) }));

                                // tell 'p' that each existing player is online
                                if(player.ID != p.ID)
                                {
                                    p.Send(Serialize(new UpdatePlayerMessage { PlayerID = player.ID, Status = player.State.ToString(), Username = player.Username  }));

                                }
                            }
                        }
                    }
                    else
                    {
                        p.Send(Serialize(new LoginResponse { Success = false, Reason = String.Format("The Username '{0}' is already taken.  Please try another Username.", m.Username) }));
                    }
                }
            }
            catch (Exception ex)
            {
                Log(ex.ToString());
            }
        }
예제 #2
0
파일: Server.cs 프로젝트: plukich/webgames
        private void HandleRequest(Player p, ConnectFourMoveRequest m)
        {
            bool gameFound = false;
            ConnectFourGame game = null;

            foreach (var g in games)
            {
                if (g.ID == m.GameID)
                {
                    game = g as ConnectFourGame;
                    gameFound = true;
                    break;
                }
            }

            if (!gameFound)
            {
                p.Send(Serialize(new ConnectFourMoveResponse { Success = false, Reason = String.Format("Move failed.  The game was not found on the server.") }));
            }
            else
            {
                game.TryMove(m.PlayerNumber, m.Column);
            }
        }
예제 #3
0
파일: Server.cs 프로젝트: plukich/webgames
 private void Send(Player p, Message m)
 {
     p.Send(Serialize(m));
 }
예제 #4
0
파일: Server.cs 프로젝트: plukich/webgames
        private void HandleRequest(Player p, JoinGameRequest m)
        {
            bool gameFound = false;
            Game game = null;
            int newPlayerNumber = 0;

            foreach (var g in games)
            {
                if (g.ID == m.GameID)
                {
                    game = g;
                    lock (game)
                    {
                        game.AddPlayer(p);
                        newPlayerNumber = game.Players.Count;
                        gameFound = true;
                        break;
                    }
                }
            }

            if (!gameFound)
            {
                p.Send(Serialize(new JoinGameResponse { Success = false, Reason = String.Format("Failed to join the game.  The game was not found on the server.") }));

            }
            else
            {
                p.Send(Serialize(new JoinGameResponse { Success = true, MaxPlayers = game.MaxPlayers }));
                // broadcast player joined
                foreach (var player in game.Players)
                {
                    player.Send(Serialize(new AddPlayerMessage { GameID = game.ID, Username = p.Username, CanStartGame = game.CanStart, PlayerNumber = newPlayerNumber }));

                    // Tell the joining player what other players are in the game.
                    if (player != p)
                    {
                        p.Send(Serialize(new AddPlayerMessage { GameID = game.ID, PlayerNumber = game.Players.IndexOf(player) + 1, Username = player.Username }));
                    }
                }
            }
        }
예제 #5
0
파일: Server.cs 프로젝트: plukich/webgames
 private void HandleRequest(Player p, ResetGameRequest m)
 {
     Game game = games.FirstOrDefault(x => x.ID == m.GameID);
     if (game != null)
     {
         ConnectFourGame g = game as ConnectFourGame;
         g.Start();
         foreach (var player in g.Players)
         {
             player.Send(Serialize(new ResetGameResponse { Success = true, GameID = m.GameID, PlayerNumber = g.Players.IndexOf(player) + 1, FirstTurnPlayerNumber = g.NextTurnPlayerNumber() }));
         }
     }
     else
     {
         p.Send(Serialize(new ResetGameResponse { GameID = m.GameID, Success = false, Reason = "The game you attempted to reset was not found on the server." }));
     }
 }
예제 #6
0
파일: Server.cs 프로젝트: plukich/webgames
        private void HandleRequest(Player p, InvitePlayerRequest m)
        {
            bool gameFound = false;
            bool playerFound = false;

            // find game
            foreach (var game in games)
            {
                if (game.ID == m.GameID)
                {
                    // game found.  find player
                    foreach (var player in clients)
                    {
                        if (player.Username == m.UsernameInvited)
                        {
                            // player found.  send invitation
                            player.Send(Serialize(new PlayerInvitationMessage { GameID = game.ID, InvitedByUsername = p.Username }));
                            playerFound = true;
                            break;
                        }
                    }

                    gameFound = true;
                    break;
                }
            }

            if (!gameFound)
                p.Send(Serialize(new InvitePlayerResponse { Success = false, Reason = String.Format("Failed to invite {0} to the game.  The game was not found on the server.", m.UsernameInvited) }));
            else if (!playerFound)
                p.Send(Serialize(new InvitePlayerResponse { Success = false, Reason = String.Format("Failed to invite {0} to the game.  The user is not currently logged in.", m.UsernameInvited) }));
            else
                p.Send(Serialize(new InvitePlayerResponse { Success = true }));
        }
예제 #7
0
파일: Server.cs 프로젝트: plukich/webgames
 private void HandleRequest(Player p, StartGameRequest m)
 {
     bool gameFound = false;
     foreach (var game in games)
     {
         if (game.ID == m.GameID)
         {
             gameFound = true;
             game.Start();
             var response = new StartGameResponse { Success = true };
             foreach (var player in game.Players)
             {
                 player.Send(Serialize(response));
             }
             break;
         }
     }
     if (!gameFound)
         p.Send(Serialize(new StartGameResponse { Success = false, Reason = "Failed to start the game.  The game was not found on the server." }));
 }
예제 #8
0
파일: Server.cs 프로젝트: plukich/webgames
 private void HandleRequest(Player p, CreateGameRequest m)
 {
     if (games.Count > 100)
     {
         p.Send(Serialize(new CreateGameResponse { Success = false, Reason = "The server has reached the maximum number of simultaneous games allowed.  Please try to create a game later." }));
     }
     else
     {
         var game = new ConnectFourGame(p);
         games.Add(game);
         game.AddPlayer(p);
         p.Send(Serialize(new CreateGameResponse { Success = true, GameID = game.ID, MaxPlayers = game.MaxPlayers }));
         p.Send(Serialize(new AddPlayerMessage { GameID = game.ID, Username = p.Username, PlayerNumber = 1, CanStartGame = false }));
     }
 }
예제 #9
0
파일: Server.cs 프로젝트: plukich/webgames
 private void HandleRequest(Player p, PingRequest m)
 {
     p.Send(Serialize(new PingResponse { }));
 }
예제 #10
0
파일: Server.cs 프로젝트: plukich/webgames
 private void HandleRequest(Player p, LogoutRequest m)
 {
     // free-up username
     try
     {
         p.Username = "";
         p.Send(Serialize(new LogoutResponse { }));
     }
     catch (Exception ex)
     {
         Log(ex.ToString());
     }
 }