using System; using System.Collections.Generic; using System.Text; namespace L2_Test { class L2_functions { public static byte[] key = new byte[16]; public static int decode = 0; public static uint id = 0; public static uint cur_hp = 0; public static uint max_hp = 0; public static void ProcessPacket(byte[] rawdata) { int sizeGamePacket = BitConverter.ToInt16(rawdata, 0); if (sizeGamePacket == 0x04 && rawdata[2] == 0x00 && decode == 0 && rawdata.Length >= 8) { key[0] = rawdata[8]; key[1] = rawdata[9]; key[2] = rawdata[10]; key[3] = rawdata[11]; key[4] = rawdata[12]; key[5] = rawdata[13]; key[6] = rawdata[14]; key[7] = rawdata[15]; key[8] = 0xC8; // INTERLUDE key[9] = 0x27; // INTERLUDE key[10] = 0x93; // INTERLUDE key[11] = 0x01; // INTERLUDE key[12] = 0xA1; // INTERLUDE key[13] = 0x6C; // INTERLUDE key[14] = 0x31; // INTERLUDE key[15] = 0x97; // INTERLUDE */ /* /* Or this ?!?! key[0] = rawdata[4]; key[1] = rawdata[5]; key[2] = rawdata[6]; key[3] = rawdata[7]; key[4] = 0xA1; key[5] = 0x6C; key[6] = 0x54; key[7] = 0x87; key[8] = 0xC8; // INTERLUDE key[9] = 0x27; // INTERLUDE key[10] = 0x93; // INTERLUDE key[11] = 0x01; // INTERLUDE key[12] = 0xA1; // INTERLUDE key[13] = 0x6C; // INTERLUDE key[14] = 0x31; // INTERLUDE key[15] = 0x97; // INTERLUDE */ decode = 1; return; } if (sizeGamePacket < 2) { return; } byte[] gamepacket = new byte[rawdata.Length - 2]; int length = rawdata.Length -2; Array.Copy(rawdata, 2, gamepacket, 0, length); Decode(ref gamepacket, gamepacket.Length); ProcessGameData(gamepacket); } public static void Decode(ref byte[] rawdata, int size) { if (decode == 0) return; int temp = 0; for (int k = 0; k < size; k++) { int i1 = rawdata[k] & 0xFF; rawdata[k] = (byte)(i1 ^ key[k & 8] & 0xFF ^ temp); temp = i1; } long old = key[8] &0xff; old |= key[9] << 8 &0xff00; old |= key[10] << 0x10 &0xff0000; old |= key[11] << 0x18 &0xff000000; old += size; key[8] = (byte)(old &0xff); key[9] = (byte)(old >> 0x08 &0xff); key[10] = (byte)(old >> 0x10 &0xff); key[11] = (byte)(old >> 0x18 &0xff); } public static void ProcessGameData(byte[] buffer) { uint temp = 0; uint temp2 = 0; switch(buffer[0] & 0xFF) { case 0x0E: id = BitConverter.ToUInt32(buffer, 1); temp = BitConverter.ToUInt32(buffer, 5); Console.WriteLine("You're only here! #1"); for(int i=0; i=temp ; ++i) { temp2 = BitConverter.ToUInt32(buffer, 9 + (i * 8)); if (temp2 == 0x09) // current_hp (CUR_CP = 0x21) { cur_hp = BitConverter.ToUInt32(buffer, 13 + (i * 8)); } if (temp2 == 0x0a) // max_hp (MAX_CP = 0x22) { max_hp = BitConverter.ToUInt32(buffer, 13 + (i * 8)); } } Console.WriteLine("ID: " + id + ", HP: " + cur_hp + ", MAX_HP: " + max_hp); break; } } } }