Exemplo n.º 1
0
        public RemoteInvokeMethod ChangeTeam(LobbyInfo lobby)
        {
            var playerId = lobby.PlayerId;
            var roomName = lobby.Name;
            var index = Players.FindIndex(x => x.Id == playerId);
            var player = Players[index];
            player.Team = player.Team == Team.Blue ? Team.Red : Team.Blue;
            player.Slot = Lobbies[lobby.Name].TeamSlot(player.Team);

            var args = Lobbies[roomName].Players.Select(user => new Gambler
            {
                Name = user.Name,
                Id = user.Id,
                Slot = user.Slot,
                Response = Response.Succed.ToString()
            }).Cast<SerializableType>().ToList();

            var response = new RemoteInvokeMethod(Command.SyncLobby, args);
            var bytes = RemoteInvokeMethod.WriteToStream(response);
            var clients = Players.Where(client => client.Lobby == roomName);
            foreach (var client in clients)
            {
                client.Sock.Send(bytes, bytes.Length, 0);
            }
            return new RemoteInvokeMethod(args);
        }
Exemplo n.º 2
0
        public void Start(LobbyInfo lobby)
        {
            var roomName = lobby.Name;
            var board = Games[roomName];
            foreach (var player in Lobbies[roomName].Players)
            {
                board.Players.Add(player);
                player.State = State.Connect;
            }
            Lobbies[roomName].IsGameStart = true;

            var args = Lobbies[roomName].Players.Select(player => new Gambler
            {
                Id = player.Id,
                Name = player.Name,
                Slot = player.Slot,
                Response = Response.Succed.ToString()
            }).Cast<SerializableType>().ToList();

            var bytes = RemoteInvokeMethod.WriteToStream(new RemoteInvokeMethod(Command.Start, args));

            foreach (var player in Lobbies[roomName].Players)
            {
                player.Sock.Send(bytes, bytes.Length, 0);
            }
        }
Exemplo n.º 3
0
        public RemoteInvokeMethod Leave(LobbyInfo lobby)
        {
            var playerId = lobby.PlayerId;
            var player = Players.Find(x => x.Id == playerId);
            player.State = State.Lobby;
            Lobbies[lobby.Name].Players.Remove(player);
            if (Lobbies[lobby.Name].Players.Count < 1)
            {
                Lobbies.Remove(lobby.Name);
                var remainsLobbies = Lobbies.Values.Select(l => new LobbyInfo()
                {
                    PlayerId = l.CreatorId,
                    Name = l.Name,
                    GameType = l.GameType,
                    MaxPlayers = l.MaxPlayers,
                    CurrentPlayers = 2
                }).Cast<SerializableType>().ToList();
                return new RemoteInvokeMethod(Command.SyncRooms, remainsLobbies);
            }

            var args = Lobbies[lobby.Name].Players.Select(user => new Gambler
            {
                Name = user.Name,
                Id = user.Id,
                Slot = user.Slot,
                Response = Response.Succed.ToString()
            }).Cast<SerializableType>().ToList();

            //Sync Lobby
            var response = new RemoteInvokeMethod(Command.SyncLobby, args);
            var bytes = RemoteInvokeMethod.WriteToStream(response);
            foreach (var user in Lobbies[lobby.Name].Players)
            {
                user.Sock.Send(bytes, bytes.Length, 0);
            }
            return new RemoteInvokeMethod(args);
        }
Exemplo n.º 4
0
        public RemoteInvokeMethod Join(LobbyInfo lobby)
        {
            var playerId = lobby.PlayerId;
            var roomName = lobby.Name;
            var index = Players.FindIndex(x => x.Id == playerId);
            var emptySlot = Lobbies[roomName].EmptySlot();
            Players[index].Lobby = lobby.Name;
            var gambler = new Gambler()
            {
                Id = playerId,
                Name = Players[index].Name,
                Slot = emptySlot
            };

            if (emptySlot >= 0)
            {
                gambler.Response = Response.Succed.ToString();
            }
            else
            {
                gambler.Response = Response.Fail.ToString();
                var user = new List<SerializableType> { gambler };
                return new RemoteInvokeMethod(user);
            }

            SendSyncLobby(roomName, gambler);
            SendUnits(Players[index]);

            var args = new List<SerializableType>();
            var lobbyInfo = new LobbyInfo(Lobbies[roomName].CreatorId, Lobbies[roomName].Name, Lobbies[roomName].GameType, Lobbies[roomName].MaxPlayers, Lobbies[roomName].Players.Count);
            args.Add(lobbyInfo);

            args.AddRange(Lobbies[roomName].Players.Select(player => new Gambler
            {
                Name = player.Name,
                Id = player.Id,
                Slot = player.Slot,
                Response = Response.Succed.ToString()
            }));

            Lobbies[lobby.Name].Players.Add(Players[index]);
            Players[index].Slot = gambler.Slot;
            Players[index].Team = Players[index].Slot % 2 == 0 ? Team.Red : Team.Blue;

            Players[index].State = State.Join;
            args.Add(gambler);
            return new RemoteInvokeMethod(args);
        }
Exemplo n.º 5
0
 public RemoteInvokeMethod Disconnect(LobbyInfo lobby)
 {
     var creatorId = lobby.PlayerId;
     var player = Players.Find(x => x.Id == creatorId);
     Lobbies[player.Lobby].Players.Remove(player);
     if (Lobbies[player.Lobby].Players.Count < 1)
     {
         Lobbies.Remove(player.Lobby);
     }
     return new RemoteInvokeMethod(new List<SerializableType>
     {
         new SimpleMessage()
         {
             Message = Response.Succed.ToString()
         }
     });
 }
Exemplo n.º 6
0
        public RemoteInvokeMethod Create(LobbyInfo room)
        {
            var creatorId = room.PlayerId;
            var lobbyName = room.Name;
            var maxPlayer = room.MaxPlayers;
            var args = new List<SerializableType>();
            if (!Lobbies.ContainsKey(lobbyName))
            {
                var player = Players.SingleOrDefault(x => x.Id == creatorId);
                var newLobby = new Lobby(lobbyName, creatorId, maxPlayer, room.GameType);
                player.Team = Team.Red;
                player.Lobby = lobbyName;
                player.State = State.Join;
                player.Slot = 0;
                newLobby.Players.Add(player);
                Lobbies.Add(lobbyName, newLobby);

                var board = new BoardBehavior(BoardSizeWidth, BoardSizeHeight, lobbyName) { NetworkHandler = this };
                Games.Add(lobbyName, board);

                var message = new ResponseMessage
                {
                    Response = Response.Succed.ToString(),
                    Message = room.Name
                };
                SendUnits(player);
                args.Add(message);
                var lobby = new List<SerializableType> { room };
                var response = new RemoteInvokeMethod(Command.SyncRooms, lobby);
                var bytes = RemoteInvokeMethod.WriteToStream(response);
                var clients = Players.Where(client => client.State == State.Lobby);
                foreach (var client in clients)
                {
                    client.Sock.Send(bytes, bytes.Length, 0);
                }
                return new RemoteInvokeMethod(args);
            }
            args.Add(new ResponseMessage
            {
                Response = Response.Fail.ToString(),
                Message = "Room name already exist."
            });
            return new RemoteInvokeMethod(args);
        }