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