コード例 #1
0
        public async Task Handle(WorldClient client, GuildJoinResultPacket packet)
        {
            if (!_guildManager.HasGuild || _guildManager.GuildRank > 3)
            {
                return;
            }

            await _guildManager.RemoveRequestJoin(packet.CharacterId);

            var onlinePlayer = _gameWorld.Players[packet.CharacterId];

            if (!packet.Ok)
            {
                if (onlinePlayer != null)
                {
                    _packetFactory.SendGuildJoinResult(onlinePlayer.GameSession.Client, false);
                }

                return;
            }

            var dbCharacter = await _guildManager.TryAddMember(packet.CharacterId);

            if (dbCharacter is null)
            {
                if (onlinePlayer != null)
                {
                    _packetFactory.SendGuildJoinResult(onlinePlayer.GameSession.Client, false);
                }

                return;
            }

            // Update guild members.
            foreach (var member in _guildManager.GuildMembers.ToList())
            {
                if (!_gameWorld.Players.ContainsKey(member.Id))
                {
                    continue;
                }

                var guildPlayer = _gameWorld.Players[member.Id];
                guildPlayer.GuildManager.GuildMembers.Add(dbCharacter);
                _packetFactory.SendGuildUserListAdd(guildPlayer.GameSession.Client, dbCharacter, onlinePlayer != null);
            }

            // Send additional info to new member, if he is online.
            if (onlinePlayer != null)
            {
                onlinePlayer.GuildManager.GuildId   = _guildManager.GuildId;
                onlinePlayer.GuildManager.GuildName = _guildManager.GuildName;
                onlinePlayer.GuildManager.GuildRank = 9;
                onlinePlayer.GuildManager.GuildMembers.AddRange(_guildManager.GuildMembers);
                onlinePlayer.WarehouseManager.GuildId = _guildManager.GuildId;

                _packetFactory.SendGuildJoinResult(onlinePlayer.GameSession.Client, true, onlinePlayer.GuildManager.GuildId, onlinePlayer.GuildManager.GuildRank, onlinePlayer.GuildManager.GuildName);
                _packetFactory.SendGuildNpcs(onlinePlayer.GameSession.Client, await onlinePlayer.GuildManager.GetGuildNpcs());

                var online    = new List <DbCharacter>();
                var notOnline = new List <DbCharacter>();
                foreach (var m in _guildManager.GuildMembers)
                {
                    if (_gameWorld.Players.ContainsKey(m.Id))
                    {
                        online.Add(m);
                    }
                    else
                    {
                        notOnline.Add(m);
                    }
                }
                _packetFactory.SendGuildMembersOnline(onlinePlayer.GameSession.Client, online, true);
                _packetFactory.SendGuildMembersOnline(onlinePlayer.GameSession.Client, notOnline, false);
            }
        }