Esempio n. 1
0
        public static void VerifyLinks(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var timestamp  = (ulong)packet.ReadInt();
            var count      = (ulong)packet.ReadShort();
            var newChannel = packet.ReadByte();
            var oldChannel = packet.ReadByte();
            var magickey   = packet.ReadInt();

            var key = (count << 32) + timestamp;

            var syncServer = client.Metadata["syncServer"] as SyncReceiver;

            Authentication.AddUser(syncServer, key, client.AccountID);
            Authentication.UpdateOnline(syncServer, client.AccountID, true);

            builder.New(0x8D);
            {
                builder += newChannel;  // server
                builder += oldChannel;  // channel
                builder += (byte)0;
            }

            client.Send(builder, "VerifyLinks");
        }
Esempio n. 2
0
        public static void AddSkillPoints(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var       sync      = client.Metadata["syncServer"] as SyncReceiver;
            var       server    = (int)client.Metadata["server"];
            Character character = client.Metadata["fullchar"] as Character;

            var skill    = packet.ReadUShort();
            var slot     = packet.ReadByte();
            var oldlevel = packet.ReadUShort();
            var newlevel = packet.ReadUShort();

            if ((newlevel == oldlevel + 1) || (newlevel == oldlevel - 1))
            {
                CharacterManagement.UpdateSkillPoints(sync, server, character.id, skill, newlevel, slot);
                builder.New(0x0A56);
                client.Send(builder, "AddSkillPoints");
            }
            else //Punishment for hackers :D
            {
                var map = client.Metadata["map"] as IMap;
                CharacterManagement.UpdatePosition(sync, server, client.AccountID, character.slot, character.map, character.x, character.y);
                client.Disconnect();
            }
        }
Esempio n. 3
0
        public static void MessageEvent(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            Character character = client.Metadata["fullchar"] as Character;
            var       name      = character.name;
            var       x         = (ushort)character.x;
            var       y         = (ushort)character.y;
            var       id        = character.id;
            var       map       = client.Metadata["map"] as IMap;
            var       clients   = map.GetSurroundingClients(client, 1);

            int unk = packet.ReadInt();

            packet.Skip(4);
            int size = packet.ReadShort() - 3;

            packet.Skip(2);
            var type = packet.ReadByte();
            var msg  = packet.ReadString(size);

            var smsg = msg.Split(' ');

            if (msg == "/quit")
            {
                client.Disconnect();
                return;
            }

            #region DebugCommands
#if DEBUG
            if (smsg.Length > 1 && string.IsNullOrEmpty(smsg[0]) == false)
            {
                switch (smsg[0])
                {
                case "_drop":
                    int itemid = 0;

                    if (int.TryParse(smsg[1], out itemid))
                    {
                        map.DropItem(x, y, itemid, (uint)id, (uint)id);
                    }

                    break;

                case "_warp":
                    ushort mapid = 0;
                    ushort curx  = 0;
                    ushort cury  = 0;

                    if (!ushort.TryParse(smsg[1], out mapid))
                    {
                        return;
                    }

                    if (!ushort.TryParse(smsg[2], out curx))
                    {
                        return;
                    }

                    if (!ushort.TryParse(smsg[3], out cury))
                    {
                        return;
                    }

                    var p = client.CreatePacket("PC_WarpCommand", mapid, curx, cury, client);

                    events.Warped("world.Initialized", client, mapid, curx, cury);

                    client.Send(p, "PC_WarpCommand");

                    break;

                case "_levelup":
                    ushort level = 0;

                    if (!ushort.TryParse(smsg[1], out level))
                    {
                        return;
                    }

                    builder.New(0x03F0);
                    {
                        builder += (byte)2;
                        builder += (uint)1371;
                        builder += (uint)1367;
                    }

                    client.Send(builder, "LevelUp");

                    break;

                case "_spawn":
                    ushort mobid  = 0;
                    ushort specid = 0;

                    if (!ushort.TryParse(smsg[1], out mobid))
                    {
                        return;
                    }

                    if (!ushort.TryParse(smsg[2], out specid))
                    {
                        return;
                    }

                    var p1 = client.CreatePacket("MobSpawned", mobid, specid);

                    client.Send(p1, "MobSpawned");

                    break;

                case "/Partytime":
                    uint pid = 1337;

                    foreach (var c in clients)
                    {
                        builder.New(0xC9);
                        {
                            builder += (int)pid;
                            builder += (byte)12;

                            //b = builder.Data;
                        }

                        var timestamp = (uint)c.Metadata["timestamp"];
                        var style     = (uint)c.Metadata["style"];

                        c.Send(builder, "NFY_DelUserList");

                        builder.New(0xC8);
                        {
                            builder += (short)0x3101;
                            builder += (int)pid++;
                            builder += (short)0x000D;
                            builder += (short)0x0100;
                            builder += 1;
                            builder += Environment.TickCount - (int)timestamp;
                            builder += (short)(x + 1);
                            builder += (short)y;
                            builder += (short)(x + 1);
                            builder += (short)y;
                            builder += (byte)0;
                            builder += 0;
                            builder += (short)0;
                            builder += (int)style;
                            builder += (byte)1;
                            builder += (byte)0;
                            builder += 0;
                            builder += 0;
                            builder += (byte)0;

                            var equipment = (List <CItem>)c.Metadata["equipment"];

                            builder += (byte)(equipment.Count);
                            builder += (short)0;
                            builder += (byte)0;
                            builder += 0;

                            name = "PARTY TIME!!";

                            builder += (byte)(name.Length + 1);
                            builder += name;
                            builder += (byte)0;

                            foreach (var e in equipment)
                            {
                                builder += (short)e.ID;
                                builder += e.Slot;
                            }
                        }

                        c.Send(builder, "NFY_NewUserList");
                    }
                    return;
                }
            }
#endif
            #endregion

            builder.New(0xD9);
            {
                builder += id;
                builder += (byte)0;
                builder += (byte)unk;
                builder += (byte)0;
                builder += (byte)(msg.Length + 3);
                builder += (byte)0;
                builder += (byte)254;
                builder += (byte)254;
                builder += type;
                builder += msg;
                builder += new byte[3];
            }

            foreach (var c in clients)
            {
                c.Send(builder, "NFY_MessageEvnt");
            }

            events.SaidLocal("world.MessageEvnt", id, name, msg);
        }
Esempio n. 4
0
        public static void DeleteCharacter(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var charID = packet.ReadInt();

            var server     = (int)client.Metadata["server"];
            var syncServer = client.Metadata["syncServer"] as SyncReceiver;

            var status = CharacterManagement.DeleteCharacter(syncServer, server, client.AccountID, charID - client.AccountID * 8);

            builder.New(0x87);
            {
                builder += (byte)status;
            }

            client.Send(builder, "DelMyChartr");
        }
Esempio n. 5
0
        public static void CheckUserPrivacyData(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            packet.Skip(4);
            var pass = packet.ReadString(32).Trim('\0');

            var  syncServer = client.Metadata["syncServer"] as SyncReceiver;
            bool auth       = Authentication.VerifyPassword(syncServer, client.AccountID, pass);

            builder.New(0x320);
            {
                builder += (auth) ? (byte)1 : (byte)0;
            }

            client.Send(builder, "CheckUserPrivacyData");
        }
Esempio n. 6
0
 public static void Heartbeat(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
 {
     builder.New(0x09FE);
     client.Send(builder, "Unknown9FE");
 }
Esempio n. 7
0
        public static void ArrivedAtLocation(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            //byte[] b;

            var x = packet.ReadShort();
            var y = packet.ReadShort();

            var id = (uint)client.Metadata["cid"];

            builder.New(0xD3);
            {
                builder += (int)id;
                builder += x;
                builder += y;

                client.Metadata["x"]      = (ushort)x;
                client.Metadata["y"]      = (ushort)y;
                client.Metadata["dest_x"] = (ushort)x;
                client.Metadata["dest_y"] = (ushort)y;

                //b = builder.Data;
            }

            //var clients = client.Metadata["clients"] as Dictionary<ulong, ClientHandler>;
            var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2);

            foreach (var c in clients)
            {
                //var b2 = b;
                c.Send(builder, "MoveEnded");
            }
        }
Esempio n. 8
0
        public virtual void AuthAccount(ref byte[] message, ClientHandler client, EventHandler events)
        {
            var p = new Outgoing.AuthAccount(true);

            // Check username and password
            int userLength = message[0x0B];
            int passLength = message[0x0A] - userLength;
            var user       = System.Text.Encoding.ASCII.GetString(message, 0x0C, userLength);
            var pass       = System.Text.Encoding.ASCII.GetString(message, 0x0C + userLength, passLength);
            var ip         = client.RemoteEndPoint.ToString().Split(':')[0];

            int  auth   = 0;
            bool online = false;

            var database = client.Metadata["database"] as IDatabaseContracts;
            var dbresult = database.FetchAccount(user);

            if (dbresult != null)
            {
                if (dbresult.Item1 == GenerateHash(pass))
                {
                    auth = dbresult.Item2;

                    if (auth == 0)
                    {
                        p.Status = AccountStatus.Unverified;
                    }
                    else if (auth == 2)
                    {
                        p.Status = AccountStatus.Banned;
                    }
                    else
                    {
                        online = dbresult.Item3;
                        if (online)
                        {
                            p.Status = AccountStatus.Online;
                        }
                        else
                        {
                            client.AccountID = dbresult.Item4;
                            p.Status         = AccountStatus.Normal;
                            events.SuccessfulLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.Success, client.AccountID));
                        }
                    }
                }
                else
                {
                    p.Status = AccountStatus.Incorrect;
                    events.FailedLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.WrongPassword));
                }
            }
            else
            {
                p.Status = AccountStatus.Incorrect;
                events.FailedLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.UnknownUsername));
            }

            var b = p.ToByteArray();

            client.Send(ref b, "AuthAccount");

            if (auth == 1 && !online)
            {
                SendChannelList(client);

                var timer = new System.Timers.Timer(5000);
                timer.AutoReset = true;
                timer.Elapsed  += (sender, e) => { SendChannelList(client); };

                timer.Start();
                client.Metadata["timer"] = timer;
            }
        }
Esempio n. 9
0
        /*
         * Unknown_7D6 Packet
         * -------------------------
         * Client2Server Structure:
         *
         * ushort   : magic code
         * ushort   : size
         * int      : padding
         * ushort   : opcode
         *
         * int      : unk1
         * byte[]   : encrypted data    #array size depends on RSA keylength, see PublicKey packet
         * -------------------------
         * Server2Client Structure:
         *
         * ushort   : magic code
         * ushort   : size
         * ushort   : opcode
         *
         * int      : unk1              #is set to 1 upon successful login; otherwise 0
         * int      : unk2
         * byte     : unk3
         * int      : status            #account status
         * -------------------------
         * If login was successful, server sends another Unknown_7D6 packet:
         * Server2Client Structure:
         *
         * ushort   : magic code
         * ushort   : size
         * ushort   : opcode
         *
         * int      : unk1              #is set to 1 upon successful login; otherwise 0
         * int      : unk2
         * byte     : unk3
         * int      : status            #account status
         * int      : unk4
         * byte     : unk5
         * int      : unk6
         * long     : unk7
         * byte     : unk8
         * int      : unk9
         * byte     : unk10
         * int      : unk11
         * int      : unk12
         * int      : unk13
         * char[32] : auth key          #possibly used for cash shop
         * short    : unk14
         * byte     : server count
         *
         * foreach server
         *      byte     : server id
         *      byte     : character count
         *
         * byte[]   : unk15             #array length is 248
         */
        #endregion

        public static void Unknown_7D6(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            packet.Skip(4);

            var rsa = client.Metadata["rsa"] as RSA;

            if (rsa == null)
            {
                Log.Error("Unable to decrypt RSA data!");
                client.Disconnect();
                client = null;
                return;
            }

            byte[] encrypted = packet.ReadBytes(rsa.KeyLength / 8); // keylength is in bits
            byte[] details   = rsa.Decrypt(encrypted);
            byte[] tmpdata   = new byte[16];

            if (details == null)
            {
                Log.Error("Unable to decrypt RSA data!");
                client.Disconnect();
                client = null;
                return;
            }

            Array.Copy(details, tmpdata, 16);
            string name = Encoding.UTF8.GetString(tmpdata).Trim('\0');

            Array.Copy(details, 65, tmpdata, 0, 16);
            string pass = Encoding.UTF8.GetString(tmpdata).Trim('\0');

            Log.Notice("Login authentication: " + name);

            string ip         = client.RemoteEndPoint.ToString().Split(':')[0];
            var    syncServer = client.Metadata["syncServer"] as SyncReceiver;
            var    data       = Authentication.FetchAccount(syncServer, name, pass);
            bool   kick       = false;

            if (data == null || data.id == -1)
            {
                builder.New(0x7D6);
                {
                    builder += 0;
                    builder += 0;
                    builder += (byte)0;
                    builder += (int)AccountStatus.OutOfService;
                }

                events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.OutOfService));
                client.Send(builder, "Unknown_7D6");
                return;
            }

            builder.New(0x7D6);
            {
                switch (data.status)
                {
                case AuthStatus.Unverified:
                    builder += 0;
                    builder += 0;
                    builder += (byte)0;
                    builder += (int)AccountStatus.Unverified;
                    break;

                case AuthStatus.Banned:
                    builder += 0;
                    builder += 0;
                    builder += (byte)0;
                    builder += (int)AccountStatus.Banned;
                    break;

                case AuthStatus.IncorrectName:
                case AuthStatus.IncorrectPass:
                    builder += 0;
                    builder += 0;
                    builder += (byte)0;
                    builder += (int)AccountStatus.Incorrect;
                    var tmp = data.status == AuthStatus.IncorrectName ? LoginResult.UnknownUsername : LoginResult.WrongPassword;
                    events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, tmp));
                    break;

                case AuthStatus.Verified:
                    client.AccountID = data.id;
                    Authentication.UpdateIPDate(syncServer, client.AccountID, ip, DateTime.Now);
                    Authentication.UpdateOnline(syncServer, client.AccountID, true);
                    builder += 1;
                    builder += 0;
                    builder += (byte)0;
                    builder += (int)AccountStatus.Normal;
                    events.SuccessfulLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.Success, client.AccountID));
                    break;

                default:
                    kick = true;
                    break;
                }
            }

            client.Send(builder, "Unknown_7D6");

            if (kick)
            {
                client.Disconnect();
            }

            if (data.id > 0 && data.status == AuthStatus.Verified)
            {
                builder.New(0x7D6);
                {
                    builder += 1;
                    builder += 0x0900;
                    builder += (byte)0;

                    builder += (int)AccountStatus.Normal;
                    builder += 0x4B6359;
                    builder += (byte)1;
                    builder += 0x67;
                    builder += (long)0;
                    builder += (byte)0;
                    builder += 0x43A56B60;
                    builder += (byte)0;
                    builder += 1;
                    builder += 0;
                    builder += 0;
                    builder += "0A47130EA1D04A4D99D58F094B7E88C3";           // AuthKey
                    builder += (short)0;
                    builder += (byte)1;                                      // Char Num of all servers
                    builder += (byte)1;                                      // Server ID
                    builder += (byte)1;                                      // CharNum
                }

                client.Send(builder, "Unknown_7D6");

                URLToClient(packet, builder, client, events);
                SystemMessg(packet, builder, client, events);

                SendChannels.SendChannelList(client);

                var timer = new System.Timers.Timer(5000);
                timer.AutoReset = true;
                timer.Elapsed  += (sender, e) => { SendChannels.SendChannelList(client); };

                timer.Start();
                client.Metadata["timer"] = timer;
            }
        }
Esempio n. 10
0
        /*
         * SpecialInventoryList Packet
         * -------------------------
         * Server2Client Structure:
         *
         * Unknown8BD -> E2 B7 16 00 BD 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
         *
         * ushort   : magic code
         * ushort   : size
         * ushort   : opcode
         *
         * byte[16] : UnknItemData
         */

        public static void SpecialInventoryList(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            builder.New(0x8BD);
            {
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)0;
            }

            client.Send(builder, "SpecialInventoryList");
        }
Esempio n. 11
0
        public static void SubPasswordSet(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var pass = packet.ReadString(10).Trim('\0');

            packet.Skip(5);
            var question = packet.ReadInt();
            var answer   = packet.ReadString(16).Trim('\0');

            packet.Skip(112);
            var changeSub = packet.ReadInt();

            var syncServer = client.Metadata["syncServer"] as SyncReceiver;

            if (changeSub == 0)
            {
                SubpassManagement.SetSubPass(syncServer, client.AccountID, pass, question, answer);
            }
            else
            {
                SubpassManagement.SetSubPass(syncServer, client.AccountID, pass, -1, string.Empty);
            }

            builder.New(0x406);
            {
                builder += 1;
                builder += 0;
                builder += 1;
                builder += 0;
            }

            SubpassManagement.SetSubPassTime(syncServer, client.AccountID, 0);
            client.Send(builder, "SubPasswordSet");
        }
Esempio n. 12
0
        public static void AuthAccount(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            //byte[] b;

            int passLength = packet.ReadByte();
            int userLength = packet.ReadByte();

            passLength -= userLength;
            var user = packet.ReadString(userLength);
            var pass = packet.ReadString(passLength);

            var ip = client.RemoteEndPoint.ToString().Split(':')[0];

            int  auth   = 0;
            bool online = false;

            var database = client.Metadata["database"] as IDatabaseContracts;
            var dbresult = database.FetchAccount(user);

            builder.New(0x7d2);

            {
                // Check username and password
                if (dbresult != null)
                {
                    if (dbresult.Item1 == GenerateHash(pass))
                    {
                        auth = dbresult.Item2;

                        if (auth == 0)
                        {
                            builder += (byte)AccountStatus.Unverified;
                        }
                        else if (auth == 2)
                        {
                            builder += (byte)AccountStatus.Banned;
                        }
                        else
                        {
                            online = dbresult.Item3;
                            if (online)
                            {
                                builder += (byte)AccountStatus.Online;
                            }
                            else
                            {
                                client.AccountID = dbresult.Item4;
                                builder         += (byte)AccountStatus.Normal;
                                events.SuccessfulLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.Success, client.AccountID));
                            }
                        }
                    }
                    else
                    {
                        builder += (byte)AccountStatus.Incorrect;
                        events.FailedLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.WrongPassword));
                    }
                }
                else
                {
                    builder += (byte)AccountStatus.Incorrect;
                    events.FailedLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.UnknownUsername));
                }

                builder += 0x0022F756;
                builder += (short)0x6301;
                builder += new byte[14];
                builder += "000102030405060708090A0B0C0D0E0F";                  // Key used when accessing cash shop and guild board.
                builder += (short)0x0100;
                builder += new byte[12];
                builder += (byte)0;
                // For each server, append byte server_id and byte character_count

                //b = builder.Data;
            }

            client.Send(builder, "AuthAccount");

            if (auth == 1 && !online)
            {
                //var cash = "http://shop.cabalonline.com/login.aspx?v1=";
                //var cashdead = "http://shop.cabalonline.com/login.aspx?isdead=1&v1=";
                //var guild = "http://nguild.cabalonline.com/CabalGuild/SecureLogin.aspx?EncVal=";

                //builder.New(0x80);	// Cash shop and guild board URL's.
                //{
                //    builder += (short)0xB4;
                //    builder += (short)0xB2;
                //    builder += cash.Length;
                //    builder += cash;
                //    builder += cashdead.Length;
                //    builder += cashdead;
                //    builder += 0;
                //    builder += guild.Length;
                //    builder += guild;
                //    builder += 0;

                //    //b = builder.Data;
                //}

                //client.Send(builder, "CashGuildURLs");

                //builder.New(0x78);	// Unknown packet
                //{
                //    builder += (byte)9;
                //    builder += (short)0;

                //    //b = builder.Data;
                //}

                //client.Send(builder, "UnknownPacket_0x78");

                //builder.New(0x7D2);	// Unknown packet
                //{
                //    builder += (short)0x7D2;

                //    b = builder.Data;
                //}

                //client.Send(builder, "2002");

                SendChannelList(client);

                var timer = new System.Timers.Timer(5000);
                timer.AutoReset = true;
                timer.Elapsed  += (sender, e) => { SendChannelList(client); };

                timer.Start();
                client.Metadata["timer"] = timer;
            }
        }
Esempio n. 13
0
        static void SendChannelList(ClientHandler client)
        {
            //byte[] b;

            var proxy    = client.Metadata["proxy"] as ILoginContracts;
            var channels = proxy.GetChannels();

            #region PSEUDOCODE

/*
 *                                                      short header;
 *                                                      short size;
 *                                                      short opcode;
 *                                                      byte servers;
 *                                                      foreach (server)
 *                                                      {
 *                                                              short id;
 *                                                              uint padding;	// Possibly character count?
 *                                                              byte channels;
 *                                                              foreach (channel)
 *                                                              {
 *                                                                      byte id;
 *                                                                      short players;
 *                                                                      byte[22] padding;
 *                                                                      short maxplayers;
 *                                                                      uint ip;
 *                                                                      short port;
 *                                                                      int type;
 *                                                              }
 *                                                      }
 */
            #endregion

            var p = new PacketBuilder();
            p.New(0x79);
            {
                p += (byte)channels.Count;

                foreach (var s in channels)
                {
                    p += (short)s.Key;
                    p += 0;
                    p += (byte)s.Value.Count;

                    foreach (var c in s.Value)
                    {
                        p += (byte)c.Key;
                        p += c.Value.Item5;
                        p += new byte[22];
                        p += c.Value.Item4;

                        var wan = (uint)client.Metadata["wan"];
                        var lan = (uint)client.Metadata["lan"];

                        var isLocal = client.RemoteEndPoint.ToString().Contains("127.0.0.1");
                        var isLan   = client.RemoteEndPoint.ToString().Contains("192.168.");
                        var samePC  = c.Value.Item2 == wan;

                        p += (isLocal && samePC) ? 0x0100007F : (isLan && samePC) ? (int)lan : (int)c.Value.Item2;
                        p += c.Value.Item3;
                        p += c.Value.Item1;
                    }
                }

                //b = p.Data;
            }


            client.Send(p, "ServerList");
        }
Esempio n. 14
0
 public static void Remove(Dictionary <ulong, ClientHandler> clients, SyncReceiver syncServer, EventHandler events, ulong magic, ClientHandler client, System.Net.EndPoint ip, int AccID)
 {
     try
     {
         foreach (ClientHandler cli in clients.Values)
         {
             if (cli.RemoteEndPoint == null)
             {
                 clients.Remove((ulong)cli.Metadata["magic"]);
                 Authentication.GetUser(syncServer, (ulong)cli.Metadata["magic"]);
                 client.Disconnect();
             }
             else if (cli.RemoteEndPoint == ip)
             {
                 clients.Remove(magic);
                 Authentication.GetUser(syncServer, magic);
                 events.ClientDisconnected(events, client);
             }
         }
     }
     catch (Exception)
     {
         Log.Notice("Account {0} already removed", AccID);
     }
 }
Esempio n. 15
0
        public static void AlterDestination(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var turnX = packet.ReadUShort();
            var turnY = packet.ReadUShort();
            var endX  = packet.ReadUShort();
            var endY  = packet.ReadUShort();
            //var unkX = packet.ReadShort();
            //var unkY = packet.ReadShort();
            //var unk0 = packet.ReadShort();

            Character character = client.Metadata["fullchar"] as Character;
            var       id        = character.id;
            var       timestamp = (uint)client.Metadata["timestamp"];

            character.x = (byte)turnX;
            character.y = (byte)turnY;
            client.Metadata["dest_x"] = endX;
            client.Metadata["dest_y"] = endY;

            var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2);

            builder.New(0xD4);
            {
                builder += id;
                builder += Environment.TickCount - timestamp;
                builder += turnX;
                builder += turnY;
                builder += endX;
                builder += endY;
            }

            foreach (var c in clients)
            {
                c.Send(builder, "NFY_MoveChanged");
            }

            NewMobsList(packet, builder, client, events);
            //NewUserList(packet, builder, client, events);

            CharacterManagement.UpdatePosition(client.Metadata["syncServer"] as SyncReceiver, (int)client.Metadata["server"], client.AccountID, character.slot, character.map, character.x, character.y);
        }
Esempio n. 16
0
        public static void CharacterSelect(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            builder.New(0x03D9);
            {
                builder += (byte)1;
            }

            Character character = client.Metadata["fullchar"] as Character;

            CharacterManagement.UpdatePosition(client.Metadata["syncServer"] as SyncReceiver, (int)client.Metadata["server"], client.AccountID, character.slot, character.map, character.x, character.y);

            client.Send(builder, "CharacterSelect");



            if (character.id != -999999998)
            {
                character.id = -999999998;
            }
            else
            {
                Log.Error("Character ID Already -999999998!", "[Channel::CharacterSelect::CharacterSelect()]");
            }
        }
Esempio n. 17
0
        static void SendChannelList(ClientHandler client)
        {
            var proxy    = client.Metadata["proxy"] as ILoginContracts;
            var channels = proxy.GetChannels();

            #region PSEUDOCODE

/*
 *                                                      short header;
 *                                                      short size;
 *                                                      short opcode;
 *                                                      byte servers;
 *                                                      foreach (server)
 *                                                      {
 *                                                              short id;
 *                                                              byte channels;
 *                                                              foreach (channel)
 *                                                              {
 *                                                                      byte id;
 *                                                                      short players;
 *                                                                      short maxplayers;
 *                                                                      uint ip;
 *                                                                      short port;
 *                                                                      int type;
 *                                                              }
 *                                                      }
 */
            #endregion

            var p = new PacketBuilder(0x79);

            /*p += (byte)1;
             * p += (byte)0x01;
             * p += (byte)0x10;
             * p += (byte)0x01;
             * p += -1;
             * p += -1;
             * p += -1;
             * p += -1;
             * p += -1;
             * p += (byte)0xFF;*/

            p += (byte)channels.Count;

            foreach (var s in channels)
            {
                p += (short)s.Key;
                p += (byte)s.Value.Count;

                foreach (var c in s.Value)
                {
                    p += (byte)c.Key;
                    p += c.Value.Item5;
                    p += c.Value.Item4;

                    var wan = (uint)client.Metadata["wan"];
                    var lan = (uint)client.Metadata["lan"];

                    var isLocal = client.RemoteEndPoint.ToString().Contains("127.0.0.1");
                    var isLan   = client.RemoteEndPoint.ToString().Contains("192.168.");
                    var samePC  = c.Value.Item2 == wan;

                    p += (isLocal && samePC) ? 0x0100007F : (isLan && samePC) ? lan : c.Value.Item2;
                    p += c.Value.Item3;
                    p += c.Value.Item1;
                }
            }

            var b = p.Data;

            client.Send(ref b, "ServerList", true);
        }
Esempio n. 18
0
 public void RemoveClient(ClientHandler client)
 {
     (client.Metadata["cell"] as MapCell).RemoveClient(client);
 }
Esempio n. 19
0
        public static void UpdateHelpInfo(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            Character character  = client.Metadata["fullchar"] as Character;
            var       clients    = client.Metadata["clients"] as Dictionary <ulong, ClientHandler>;
            var       syncServer = client.Metadata["syncServer"] as SyncReceiver;
            var       server     = (int)client.Metadata["server"];
            var       x          = character.x;
            var       y          = character.y;
            var       map        = client.Metadata["map"] as IMap;

            builder.New(0x087D);
            {
                builder += (byte)1;
            }

            CharacterManagement.UpdatePosition(syncServer, server, client.AccountID, character.slot, character.map, x, y);

            client.Send(builder, "UpdateHelpInfo");
        }
Esempio n. 20
0
 public List <ClientHandler> GetSurroundingClients(ClientHandler client, int radius)
 {
     return(GetSurroundingClients((MapCell)client.Metadata["cell"], radius));
 }
Esempio n. 21
0
        public static void KeyMoveChanged(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var unk1 = packet.ReadLong();
            var unk2 = packet.ReadLong();

            packet.Skip(8);
            var unk3 = packet.ReadByte();

            Character character = client.Metadata["fullchar"] as Character;
            var       id        = character.id;
            var       timestamp = (uint)client.Metadata["timestamp"];
            var       clients   = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2);

            builder.New(0x196);
            {
                builder += id;
                builder += Environment.TickCount - (int)timestamp;
                builder += unk1;
                builder += unk2;
                builder += unk3;
            }

            foreach (var c in clients)
            {
                c.Send(builder, "NFY_KeyMoveBegined");
            }
        }
Esempio n. 22
0
 public List <MobData> GetSurroundingMobsData(ClientHandler client, int radius)
 {
     return(GetSurroundingMobsData((MapCell)client.Metadata["cell"], radius));
 }
Esempio n. 23
0
        public static void ChannelSelectList(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var syncServer = client.Metadata["syncServer"] as SyncReceiver;
            var channels   = GetChannels(syncServer);

            if (channels == null)
            {
                return;
            }

            var ipuint = BitConverter.ToUInt32(Global.Config.IP.GetAddressBytes(), 0);

            builder.New(0x840);
            {
                foreach (var server in channels)
                {
                    if (server.id == ((int)client.Metadata["server"]))
                    {
                        builder += (byte)server.channels.Length;
                        foreach (var channel in server.channels)
                        {
                            builder += (byte)server.id;
                            builder += (byte)channel.id;
                            builder += (ushort)channel.curPlayers;
                            builder += new byte[21];
                            builder += (byte)255;
                            builder += (ushort)channel.maxPlayers;
                            if (ipuint == 0)
                            {
                                builder += channel.ip;
                            }
                            else
                            {
                                builder += ipuint;
                            }
                            builder += (ushort)channel.port;
                            builder += (byte)0;
                            builder += channel.type;
                            builder += new byte[3];
                        }
                    }
                }
            }

            client.Send(builder, "ChannelSelectList");
        }
Esempio n. 24
0
        List <MapCell> GetSurroundingCells(ClientHandler client)
        {
            var list    = new List <MapCell>();
            var current = (MapCell)client.Metadata["cell"];
            var row     = current.Row;
            var column  = current.Column;

            var rI = 0;
            var cI = 0;

            for (int i = row; i < 16; i++)
            {
                if (rI == 3)
                {
                    break;
                }

                cI = 0;

                for (int j = column; j < 16; j++)
                {
                    if (cI == 3)
                    {
                        break;
                    }

                    list.Add(cells[i, j]);

                    cI++;
                }

                rI++;
            }

            rI = 0;

            for (int i = row; i > 0; i--)
            {
                if (rI == 3)
                {
                    break;
                }

                cI = 0;

                for (int j = column; j > 0; j--)
                {
                    if (cI == 3)
                    {
                        break;
                    }

                    list.Add(cells[i, j]);

                    cI++;
                }

                rI++;
            }

            return(list);
        }
Esempio n. 25
0
        public static void MoveToLocation(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var startX = packet.ReadUShort();
            var startY = packet.ReadUShort();
            var endX   = packet.ReadUShort();
            var endY   = packet.ReadUShort();
            //var unkX = packet.ReadShort();
            //var unkY = packet.ReadShort();
            //var map = packet.ReadShort();

            Character character = client.Metadata["fullchar"] as Character;
            var       id        = character.id;
            var       timestamp = (uint)client.Metadata["timestamp"];

            character.x = (byte)startX;
            character.y = (byte)startY;
            client.Metadata["dest_x"] = endX;
            client.Metadata["dest_y"] = endY;

            var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2);

            builder.New(0xD2);
            {
                builder += id;
                builder += Environment.TickCount - (int)timestamp;
                builder += startX;
                builder += startY;
                builder += endX;
                builder += endY;
            }

            foreach (var c in clients)
            {
                c.Send(builder, "NFY_MoveBegined");
            }
        }
Esempio n. 26
0
 public void UpdateCells(ClientHandler client)
 {
     client.Metadata["surroundingCells"] = GetSurroundingCells(client);
 }
Esempio n. 27
0
        public static void NewUserList(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2);

            if (clients.Count > 1)
            {
                builder.New(0xC8);
                {
                    builder += (short)(clients.Count - 1);

                    foreach (var c in clients)
                    {
                        Character character = c.Metadata["fullchar"] as Character;
                        if (c == client)
                        {
                            continue;
                        }
                        if (character.id == 0)
                        {
                            continue;
                        }

                        var cid       = character.id;
                        var level     = character.level;
                        var timestamp = (uint)c.Metadata["timestamp"];
                        var x         = (ushort)character.x;
                        var y         = (ushort)character.y;
                        var dx        = (ushort)c.Metadata["dest_x"];
                        var dy        = (ushort)c.Metadata["dest_y"];
                        var style     = (int)c.Metadata["style"];
                        var name      = character.name;

                        builder += cid;
                        builder += (short)12;
                        builder += (short)0x0100;
                        builder += level;
                        builder += 0x01C2;
                        //builder += (int)(Environment.TickCount - (int)timestamp);
                        builder += x;
                        builder += y;
                        builder += dx;                      // end x
                        builder += dy;                      // end y
                        builder += (byte)0;                 // pk penalty
                        builder += 0;
                        builder += (short)0;
                        builder += style;
                        builder += (byte)0;                 // animation id..?
                        builder += new byte[2];
                        builder += 4;
                        builder += new byte[21];
                        builder += (byte)(name.Length + 1);
                        builder += name;
                        builder += (byte)0;
                        builder += (short)0x6901;
                        builder += new byte[7];
                        builder += (byte)2;
                        builder += (byte)150;
                        builder += new byte[7];
                        builder += (byte)3;
                        builder += (byte)195;
                        builder += new byte[7];
                        builder += (byte)4;
                        builder += (byte)90;
                        builder += new byte[7];
                    }
                }

                foreach (var c in clients)
                {
                    if (c == client)
                    {
                        continue;
                    }
                    c.Send(builder, "NFY_NewUserList");
                }
            }
            else
            {
                builder.New(0xC8);
                {
                    Character character = client.Metadata["fullchar"] as Character;
                    var       cid       = character.id;
                    var       level     = character.level;
                    var       timestamp = (uint)client.Metadata["timestamp"];
                    var       x         = (ushort)character.x;
                    var       y         = (ushort)character.y;
                    var       dx        = (ushort)client.Metadata["dest_x"];
                    var       dy        = (ushort)client.Metadata["dest_y"];
                    var       style     = (int)client.Metadata["style"];
                    var       name      = character.name;

                    builder += (short)0x3001;
                    builder += cid;
                    builder += (short)9;
                    builder += (short)0x0100;
                    builder += level;
                    builder += 0x01C2;
                    //builder += (int)(Environment.TickCount - (int)timestamp);
                    builder += x;
                    builder += y;
                    builder += dx;                      // end x
                    builder += dy;                      // end y
                    builder += (byte)0;                 // pk penalty
                    builder += 0;
                    builder += (short)0;
                    builder += style;
                    builder += (byte)0;                 // animation id..?
                    builder += new byte[2];
                    builder += 4;
                    builder += new byte[21];
                    builder += (byte)(name.Length + 1);
                    builder += name;
                    builder += (byte)0;
                    builder += (short)0x6901;
                    builder += new byte[7];
                    builder += (byte)2;
                    builder += (byte)150;
                    builder += new byte[7];
                    builder += (byte)3;
                    builder += (byte)195;
                    builder += new byte[7];
                    builder += (byte)4;
                    builder += (byte)90;
                    builder += new byte[7];

                    client.Send(builder, "NFY_NewUserList");
                }
            }
        }
Esempio n. 28
0
        public static void SubPasswordFindRequest(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var syncServer = client.Metadata["syncServer"] as SyncReceiver;

            var questionID = SubpassManagement.GetSubPassQuestion(syncServer, client.AccountID);

            builder.New(0x40C);
            {
                builder += questionID;
                builder += questionID;
                builder += 1;
            }

            client.Send(builder, "SubPasswordFindRequest");
        }
Esempio n. 29
0
        public static void SubPasswordDelRequest(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            packet.Skip(4);
            var pass = packet.ReadString(10).Trim('\0');

            var syncServer = client.Metadata["syncServer"] as SyncReceiver;
            var checksub   = SubpassManagement.CheckSubPw(syncServer, client.AccountID, pass);

            var tries = 0;

            builder.New(0x410);
            {
                if (checksub)
                {
                    client.Metadata["subTries"] = 0;
                    builder += 1;          // success
                    builder += (byte)0x00; // failed times
                }
                else
                {
                    client.Metadata["subTries"] = (int)client.Metadata["subTries"] + 1;
                    tries    = (int)client.Metadata["subTries"];
                    builder += 0;           // failed
                    builder += (byte)tries; // failed times
                }
                builder += 1;
            }

            client.Send(builder, "SubPasswordDelRequest");

            if ((int)client.Metadata["subTries"] > 3)
            {
                client.Disconnect();
            }
        }
Esempio n. 30
0
        public static void NFY_ChangeStyle(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var style = packet.ReadInt();
            var unk2  = packet.ReadInt();

            Character character = client.Metadata["fullchar"] as Character;
            var       cid       = character.id;
            var       clients   = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2);

            client.Metadata["style"] = style;

            builder.New(0x143);
            {
                builder += cid;
                builder += style;
                builder += unk2;
                builder += 0;
                builder += (short)0;
            }

            foreach (var c in clients)
            {
                c.Send(builder, "NFY_ChangeStyle");
            }
        }