private async Task <bool> WeaveAsync(IClient host, WeaveMode mode, params IClient[] members) { // Lập tổ đội. var textileLevel = (int)textileLevelInput.Value; try { host.PacketReceived += OnPacketReceived; var limit = (hostLegionButton.Checked ? WeaveTeamLimit.Legion : WeaveTeamLimit.None); var p = await host.CreateWeaveAsync(textileLevel, limit); if (p == null) { return(false); } if (p.HasError) { LogInfo(String.Format("{0}: {1}", host.PlayerName, p.Message)); return(false); } } finally { host.PacketReceived -= OnPacketReceived; } if (hostingTeamId == NoTeam) { // Host is in parallel login mode. var p = await host.RefreshWeaveAsync(); if (p == null) { return(false); } var info = WeaveInfo.Parse(JToken.Parse(p.Message)); var hostingTeam = info.Teams.Find(team => team.Name == host.PlayerName); hostingTeamId = hostingTeam.Id; } try { Debug.Assert(hostingTeamId != NoTeam); var tasks = new List <Task <Packet> >(); foreach (var member in members) { tasks.Add(member.JoinWeaveAsync(hostingTeamId)); } // Gia nhập tổ đội. var p2s = await Task.WhenAll(tasks); int memberIndex = 0; foreach (var p in p2s) { if (p == null) { // Mất kết nối. // Huỷ tổ đội. await host.DisbandWeaveAsync(hostingTeamId); return(false); } if (p.HasError) { // Lỗi gia nhập. LogInfo(String.Format("{0}: {1}", members[memberIndex].PlayerName, p.ErrorMessage)); // Huỷ tổ đội. await host.DisbandWeaveAsync(hostingTeamId); return(false); } ++memberIndex; } if (mode == WeaveMode.WeaveTogether) { var p3 = await host.MakeWeaveAsync(hostingTeamId); if (p3 == null) { return(false); } } else { var p4 = await host.QuitAndMakeWeaveAsync(hostingTeamId); if (p4 == null) { return(false); } } return(true); } finally { hostingTeamId = NoTeam; } }
private async Task <bool> WeaveAsync(long hostId, WeaveMode mode, params long[] memberIds) { var members = memberIds.Select(id => clients[id]).ToArray(); return(await WeaveAsync(clients[hostId], mode, members)); }