예제 #1
0
        /// <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);
                    }
                }
            }
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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;
            }
        }