示例#1
0
        private void HandleSetDataRequest(TcpSession session, Packet p)
        {
            //_logger.Debug("-C_SETDATA_REQ-");

            Player plr;

            if (!_players.TryGetValue(session.Guid, out plr))
            {
                session.StopListening();
                return;
            }

            p.ReadUInt16(); // unk
            p.ReadUInt64(); // accID
            plr.ServerID = p.ReadUInt16();
            var channelID = p.ReadInt16();
            var roomID    = p.ReadInt32();

            if (roomID == -1)
            {
                roomID = 0;
            }
            if (channelID == -1)
            {
                channelID = 0;
            }

            plr.Room = new Room(null, EServerType.Chat)
            {
                ID = (uint)roomID
            };
            plr.CommunityByte = p.ReadByte();
            p.ReadUInt32();  // total exp
            p.ReadBytes(32); // td/dm info

            plr.AllowCombiRequest  = (EAllowCommunityRequest)p.ReadByte();
            plr.AllowFriendRequest = (EAllowCommunityRequest)p.ReadByte();
            plr.AllowInvite        = (EAllowCommunityRequest)p.ReadByte();
            plr.AllowInfoRequest   = (EAllowCommunityRequest)p.ReadByte();

            plr.CommunityData = p.ReadBytes(41);

            Channel channel;

            if (!_channels.TryGetValue((ushort)channelID, out channel))
            {
                return;
            }
            if (plr.Channel == null && channelID > 0) // join
            {
                var ack = new Packet(EChatPacket.SChannelPlayerListInfoAck);
                ack.Write((uint)channel.ID);
                ack.Write(channel.Players.Count);
                foreach (var player in channel.Players.Values)
                {
                    ack.WriteChatUserData(player);
                }

                session.Send(ack);
                channel.Join(plr);
            }
            else if (channelID == 0) // leave
            {
                if (plr.Channel != null)
                {
                    plr.Channel.Leave(plr);
                }
            }
            else // update
            {
                var ack = new Packet(EChatPacket.SChannelPlayerListInfoAck);
                ack.Write((uint)channel.ID);
                ack.Write(channel.Players.Count);
                foreach (var player in channel.Players.Values)
                {
                    ack.WriteChatUserData(player);
                }

                channel.Broadcast(ack);
            }
        }