예제 #1
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")
            {
                CharacterManagement.UpdatePosition(client.Metadata["syncServer"] as SyncReceiver, (int)client.Metadata["server"], client.AccountID, character.slot, character.map, character.x, character.y);

                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 "_slm":
                    Unknown_86C(packet, builder, client, events);
                    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;

                    var exp = character.stats.exp;

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

                    character.stats.exp = 0;


                    /*
                     * builder.New(0x011F); // 3: Increase Hp, 4: Increase Mp, 5: SP, 8: Party Exp Bonus, 9:
                     * {
                     *  builder += (byte)9;
                     *  builder += (uint)0x5;
                     * }*/

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

                    builder.New(0x0120);
                    {
                        builder += (byte)level;
                        builder += character.id;
                    }

                    character.level += 1;

                    client.Send(builder, "LevelUp");

                    NFY_ChargeInfo(packet, builder, client, events);

                    Unknown9D6(packet, builder, client, events);

                    Unknown9E0(packet, builder, client, events);

                    builder.New(0x03F0);
                    {
                        builder += (byte)4;
                        builder += (uint)1428;
                        builder += (uint)1431;
                        builder += (uint)1430;
                        builder += (uint)1429;
                    }

                    client.Send(builder, "Unk3F0");

                    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);
        }
예제 #2
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;
            }
        }
예제 #3
0
        public static void MessageEvent(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            //byte[] b;

            var name = client.Metadata["name"] as string;
            var x    = (ushort)client.Metadata["x"];
            var y    = (ushort)client.Metadata["y"];
            var id   = (uint)client.Metadata["id"];
            var cid  = (uint)client.Metadata["cid"];
            var map  = client.Metadata["map"] as IMap;

            int size = packet.ReadByte() - 3;

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

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

            if (smsg.Length > 1 && smsg[0] == "/drop")
            {
                int itemid = 0;

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

                return;
            }

            var clients = map.GetSurroundingClients(client, 1);

            if (smsg.Length > 1 && smsg[0] == "/spawn")
            {
                ushort mobid = 0;

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

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

                client.Send(p, "MobSpawned");

                return;
            }

            if (msg == "/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, "UnknownPacket_0xC9");

                    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 += (byte)e.Slot;
                        }

                        //b = builder.Data;
                    }

                    c.Send(builder, "UnknownPacket_0xC8");
                }

                return;
            }

            foreach (var c in clients)
            {
                builder.New(0xD9);
                {
                    builder += (int)cid;
                    builder += (byte)(msg.Length + 3);
                    builder += (byte)0xFE;
                    builder += (byte)0xFE;
                    builder += type;
                    builder += msg;

                    //b = builder.Data;
                }

                c.Send(builder, "MessageEvnt");
            }

            events.SaidLocal("world.700.MessageEvnt", (int)cid, name, msg);
        }