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); }
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); } }
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); }
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); }
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() } }); }
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); }