Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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));
        }