Example #1
0
 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;
 }
Example #2
0
        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);
                }
            }
        }