Example #1
0
 public SubPacket(SubPacket original, uint newTargetId)
 {
     header               = new SubPacketHeader();
     gameMessage          = original.gameMessage;
     header.subpacketSize = original.header.subpacketSize;
     header.type          = original.header.type;
     header.sourceId      = original.header.sourceId;
     header.targetId      = newTargetId;
     data = original.data;
 }
Example #2
0
        public unsafe SubPacket(byte[] bytes, ref int offset)
        {
            if (bytes.Length < offset + SUBPACKET_SIZE)
            {
                throw new OverflowException("Packet Error: Subpacket was too small");

                fixed(byte *pdata = &bytes[offset])
                {
                    header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader));
                }

                if (header.type == (ushort)SubPacketTypes.GamePacket)
                {
                    fixed(byte *pdata = &bytes[offset + GAMEMESSAGE_SIZE])
                    {
                        gameMessage = (GameMessageHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader));
                    }
                }

                if (header.type == (ushort)SubPacketTypes.Account)
                {
                    fixed(byte *pdata = &bytes[offset + ACCOUNTMESSAGE_SIZE])
                    {
                        accountHeader = (AccountHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(AccountHeader));
                    }
                }

                if (bytes.Length < offset + header.subpacketSize)
                {
                    throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data");
                }

                if (header.type == (ushort)SubPacketTypes.GamePacket) // if type in the header is a game packet copy the gamepacket header into 16bit array
                {
                    data = new byte[header.subpacketSize - SUBPACKET_SIZE - GAMEMESSAGE_SIZE];
                    Array.Copy(bytes, offset + SUBPACKET_SIZE + GAMEMESSAGE_SIZE, data, 0, data.Length);
                }
                else if (header.type == (ushort)SubPacketTypes.Account)
                {
                    data = new byte[header.subpacketSize - SUBPACKET_SIZE - ACCOUNTMESSAGE_SIZE];
                    Array.Copy(bytes, offset + SUBPACKET_SIZE + ACCOUNTMESSAGE_SIZE, data, 0, data.Length);
                }
                else //else no second header just data
                {
                    data = new byte[header.subpacketSize - SUBPACKET_SIZE];
                    Array.Copy(bytes, offset + SUBPACKET_SIZE, data, 0, data.Length);
                }

                offset += header.subpacketSize;
        }
Example #3
0
        //Shorthand for SubPacket with gamepacket type
        public SubPacket(GamePacketOpCode opCode, uint sourceId, uint targetId, byte[] data, SubPacketTypes spt)
        {
            header      = new SubPacketHeader();
            gameMessage = new GameMessageHeader();

            gameMessage.opcode = (ushort)opCode;
            header.sourceId    = sourceId;
            header.targetId    = targetId;

            gameMessage.timestamp = Utils.UnixTimeStampUTC();

            header.type                 = (ushort)spt;
            header.subpacketMisc        = 0x00;
            gameMessage.gamepacketMisc  = 0x0;
            gameMessage.gamepacketMisc2 = 0;
            gameMessage.gamepacketMisc3 = 0;

            this.data = data;

            header.subpacketSize = (ushort)(SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length);
        }