public byte[] UpdateState(byte[] buffer) { //this buffer is encrypted with crypt_in key - decrypt it crypt_in.decrypt(buffer); //buffer is decrypted in place //0x04 - user info packet //0x03 - char info packet //0x01 - char move to location packet //0x27 - inventory update packet [not needed for now] //0x83 - clan info //0x0e - status update if (buffer[0] == 0x0b) { System.Console.WriteLine("char selected packet"); System.Console.WriteLine(buffer[buffer.Length - 4]); System.Console.WriteLine(buffer[buffer.Length - 3]); System.Console.WriteLine(buffer[buffer.Length - 2]); System.Console.WriteLine(buffer[buffer.Length - 1]); int xkey = BitConverter.ToInt32(buffer, buffer.Length - 4); t15crypt = new GameT15Crypter(); t15crypt.generateOpcodeTable(xkey); } ByteBuffer data = new ByteBuffer(buffer); lock (updateq_lock) { updateq.Enqueue((object)data); update_mre.Set(); } //buffer is currently decrypted it //encrypt it with crypt_client_in crypt_client_in.encrypt(buffer); return buffer; }
public Client(Socket _socket, GameServer _gs) { try { gs = _gs; proxy2client = _socket; cv = new ClientView(this); gs.bwindow.SuspendLayout(); gs.bwindow.d_addClient(cv); gs.bwindow.ResumeLayout(true); bufflist = new List<PlayerBuffs>(); bufflock = new object(); fightbufflist = new List<PlayerBuffs>(); commandlock = new Object(); commandlist = new List<htmcommand>(20); askills = new List<AttackSkills>(); dskills = new List<DefenseSkills>(); skilllist = new List<skill>(); // itemlist = new List<ClientItems>(); doafterskill = new Dictionary<uint, evtSkill>(); doonskill = new Dictionary<uint, evtSkill>(); buffform = new BuffForm(this, gs); itemlist = new List<ClientItems>(); useItems = new List<ClientItems>(); m_lock = new Object(); mq = new Queue(); updateq = new Queue(); updateq_lock = new Object(); hpmq = new Queue(); q_mre = new ManualResetEvent(false); update_mre = new ManualResetEvent(false); buff_mre = new ManualResetEvent(false); fightbuff_mre = new ManualResetEvent(false); sbuff_mre = new ManualResetEvent(false); item_mre = new ManualResetEvent(false); asform = new Skills(this, gs); dsform = new Defense(this, gs); pform = new Party(this, gs); fform = new Fight(this, gs); iform = new ItemUseForm(this, gs); x = new Random(); pinfo = new Player_Info(); aslock = new object(); dslock = new object(); dancelock = new object(); initParty(); rebuffqueue = new Queue<PlayerBuffs>(); rebufflock = new object(); redolist = new Queue<ReSkill>(); redolistlock = new object(); PeriodicThread = new Thread(PeriodicFunction); updatestatusthread = new Thread(this.updatestatefunc); skillthread = new Thread(this.skillfunction); defendthread = new Thread(this.defendfunction); attackthread = new Thread(this.attackfunction); buffthread = new Thread(this.bufffunction); movethread = new Thread(this.movepawnthread); statusmonitor = new Thread(this.statusmonthread); singlebuffthread = new Thread(this.singlebufffunction); fightbuffthread = new Thread(this.fightbufffunction); itemthread = new Thread(this.itemfunction); dancethread = new Thread(this.dancefunction); timebuffthread = new Thread(this.timebufffunction); inthread = new Thread(this.dataIn); outthread = new Thread(this.dataOut); sendthread = new Thread(this.sendData); IPEndPoint remoteGS = new IPEndPoint(IPAddress.Parse(gs.gsIP), gs.gsPort); proxy2server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); proxy2server.Connect(remoteGS); p2c = new NetworkStream(proxy2client, FileAccess.ReadWrite, true); p2s = new NetworkStream(proxy2server, FileAccess.ReadWrite, true); { Client c = (Client)this; byte[] buffer; int length = 0; int lenlo = c.p2c.ReadByte(); int lenhi = c.p2c.ReadByte(); length = lenhi * 256 + lenlo; buffer = new byte[length]; buffer[0] = (byte)lenlo; buffer[1] = (byte)lenhi; buffer[2] = (byte)10; c.p2c.Read(buffer, 2, length - 2); c.p2s.Write(buffer, 0, length); lenlo = c.p2s.ReadByte(); lenhi = c.p2s.ReadByte(); length = lenhi * 256 + lenlo; buffer = new byte[length]; buffer[0] = (byte)lenlo; buffer[1] = (byte)lenhi; c.p2s.Read(buffer, 2, length - 2); byte[] key = new byte[16]; key[0] = buffer[4]; key[1] = buffer[5]; key[2] = buffer[6]; key[3] = buffer[7]; key[4] = buffer[8]; key[5] = buffer[9]; key[6] = buffer[10]; key[7] = buffer[11]; key[8] = (byte)0xc8; key[9] = (byte)0x27; key[10] = (byte)0x93; key[11] = (byte)0x01; key[12] = (byte)0xa1; key[13] = (byte)0x6c; key[14] = (byte)0x31; key[15] = (byte)0x97; int xkey = buffer[21] + buffer[22] * 256 + buffer[23] * 256 * 256 + buffer[24] * 256 * 256 * 256; System.Console.WriteLine("Key Packet"); System.Console.WriteLine(buffer[21]); System.Console.WriteLine(buffer[22]); System.Console.WriteLine(buffer[23]); System.Console.WriteLine(buffer[24]); c.crypt_in = new Crypt(); c.crypt_out = new Crypt(); c.crypt_client_in = new Crypt(); c.crypt_client_out = new Crypt(); t15crypt = new GameT15Crypter(); t15crypt.generateOpcodeTable(xkey); //t15crypt = null; //crypt for data from server c.crypt_in.setKey(key); //crypt for data to server c.crypt_out.setKey(key); //crypt for data from client c.crypt_client_out.setKey(key); //crypt for data to client c.crypt_client_in.setKey(key); // Console.WriteLine(length); c.p2c.Write(buffer, 0, length); } System.Console.WriteLine("got keys"); if (gs.leader == null) gs.leader = this; //inthread.Priority = ThreadPriority.BelowNormal; //outthread.Priority = ThreadPriority.BelowNormal; outthread.Name = "outthread"; inthread.Name = "inthread"; sendthread.Name = "sendthread"; outthread.Start(); inthread.Start(); sendthread.Start(); updatestatusthread.Start(); statusmonitor.Start(); movethread.Start(); attackthread.Start(); defendthread.Start(); skillthread.Start(); buffthread.Start(); singlebuffthread.Start(); itemthread.Start(); fightbuffthread.Start(); dancethread.Start(); timebuffthread.Start(); PeriodicThread.Start(); } catch { if (gs.leader == this) { gs.leader = null; } if (proxy2client != null) proxy2client.Close(); if (proxy2server != null) proxy2server.Close(); gs.bwindow.d_removeClient(cv); if (inthread != null) { inthread.Abort(); outthread.Abort(); sendthread.Abort(); updatestatusthread.Abort(); movethread.Abort(); statusmonitor.Abort(); if (cv != null) gs.bwindow.d_removeClient(cv); } } }