/// <summary> /// </summary> /// <param name="vicinityChatMessage"> /// </param> private void DistributeVicinityChat(VicinityChatMessage vicinityChatMessage) { byte[] packet = MsgVicinity.Create( (uint)vicinityChatMessage.SenderId, vicinityChatMessage.Text, (byte)vicinityChatMessage.MessageType); string lookup = CharacterDao.Instance.GetCharacterNameById(vicinityChatMessage.SenderId); byte[] nameLookup = NameLookupResult.Create((uint)vicinityChatMessage.SenderId, lookup); foreach (int charId in vicinityChatMessage.CharacterIds) { foreach (Client cli in this.ConnectedClients.Values) { if (cli.Character.CharacterId == charId) { if (!cli.KnownClients.Contains((uint)vicinityChatMessage.SenderId)) { // Name lookup cli.Send(nameLookup); cli.KnownClients.Add((uint)vicinityChatMessage.SenderId); } cli.Send(packet); } } } }
/// <summary> /// Read and send back Player name lookup packet /// </summary> /// <param name="client"> /// Client sending /// </param> /// <param name="packet"> /// Packet data /// </param> public static void Read(Client client, byte[] packet) { PacketReader reader = new PacketReader(ref packet); reader.ReadUInt16(); // packet ID reader.ReadUInt16(); // data length uint playerId = uint.MaxValue; string playerName = reader.ReadString(); client.Server.Debug( client, "{0} >> PlayerNameLookup: PlayerName: {1}", client.Character.characterName, playerName); reader.Finish(); SqlWrapper ms = new SqlWrapper(); string sqlQuery = "SELECT `ID` FROM `characters` WHERE `Name` = " + "'" + playerName + "'"; DataTable dt = ms.ReadDatatable(sqlQuery); if (dt.Rows.Count > 0) { // Yes, this double cast is correct playerId = (uint)(int)dt.Rows[0][0]; } byte[] namelookup = NameLookupResult.Create(playerId, playerName); client.Send(namelookup); client.KnownClients.Add(playerId); }
/// <summary> /// Read and send back Player name lookup packet /// </summary> /// <param name="client"> /// Client sending /// </param> /// <param name="packet"> /// Packet data /// </param> public static void Read(Client client, byte[] packet) { PacketReader reader = new PacketReader(ref packet); reader.ReadUInt16(); // packet ID reader.ReadUInt16(); // data length uint playerId = uint.MaxValue; string playerName = reader.ReadString(); if (playerName == string.Empty) { return; } if (playerName == ConfigReadWrite.Instance.CurrentConfig.RelayBotNick) { byte[] botlookup = NameLookupResult.Create( 0x80000000, ConfigReadWrite.Instance.CurrentConfig.RelayBotNick); client.Send(botlookup); client.Send(BuddyOnlineStatus.Create(0x80000000, 1, new byte[] { 0x00, 0x01, 0x00 })); return; } client.Server.Debug( client, "{0} >> PlayerNameLookup: PlayerName: {1}", client.Character.characterName, playerName); reader.Finish(); DBCharacter character = CharacterDao.GetByCharName(playerName); if (character != null) { playerId = (uint)character.Id; } byte[] namelookup = NameLookupResult.Create(playerId, playerName); client.Send(namelookup); client.Send( BuddyOnlineStatus.Create( playerId, (uint)OnlineDao.IsOnline((int)playerId).Online, new byte[] { 0x00, 0x01, 0x00 })); client.KnownClients.Add(playerId); }
/// <summary> /// Handler /// </summary> /// <param name="s"> /// </param> /// <param name="a"> /// </param> private void ISCClient_OnMessage(object s, OnMessageArgs a) { Console.WriteLine("[ISComm] Packet '" + a.ID + "' catched."); switch (a.ID) { case 0x0F: { MemoryStream stream = new MemoryStream(a.Data); BinaryReader reader = new BinaryReader(stream); uint senderId = reader.ReadUInt32(); byte msgType = reader.ReadByte(); short receiversAmount = reader.ReadInt16(); uint[] receivers = new uint[receiversAmount]; for (int i = 0; i < receiversAmount; i++) { receivers[i] = reader.ReadUInt32(); } string msg = reader.ReadString(); stream.Close(); reader.Close(); string lookup = string.Empty; foreach (Client cli in this.server.Clients) { if (cli.Character.characterId == senderId) { lookup = cli.Character.characterName; } } byte[] namelookup = NameLookupResult.Create(senderId, lookup); Console.WriteLine("Got chat from ZoneEngine: " + msg); byte[] packet = MsgVicinity.Create(senderId, msg, msgType); foreach (uint sendto in receivers) { foreach (Client cli in this.server.Clients) { if (cli.Character.characterId == sendto) { if (!cli.KnownClients.Contains(senderId)) { cli.Send(namelookup); // sending a namelookup ahead of the message cli.KnownClients.Add(senderId); } cli.Send(packet); } } } } break; // Add characters to Team chat channel case 0xF0: PacketReader packetReader = new PacketReader(ref a.Data); List <uint> charIds = new List <uint>(); uint numberofchars = packetReader.ReadUInt32(); while (numberofchars > 0) { charIds.Add(packetReader.ReadUInt32()); } uint[] chars = charIds.ToArray(); // Commented out to remove compile error. // Lists.ChatChannels.CreateTeamChannel(NextTeamId(),chars); break; } }