Esempio n. 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")
            {
                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. 2
0
        public static void EnterWorld(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            byte[] b;

            b = new byte[0x0C] {
                0xE2, 0xB7, 0x0C, 0x00, 0x45, 0x01, 0x08, 0x3B, 0x21, 0xAF, 0x07, 0x01
            };                                                                                                          // Looks like it sends an updated premium time to the client.
            client.Send(ref b, "UnknownPacket_0x145");

            var id = packet.ReadInt();

            client.Metadata["cid"]  = id;
            client.Metadata["slot"] = (int)id % 8;

            var unk0 = packet.ReadShort();

            var database = client.Metadata["database"] as IDatabaseContracts;
            var server   = (int)client.Metadata["server"];

            var fullcharacter = database.GetFullCharacter(server, client.AccountID, (int)client.Metadata["slot"]);
            var character     = fullcharacter.Item1;
            var equipment     = fullcharacter.Item2;
            var stats         = fullcharacter.Item3;
            var items         = fullcharacter.Item4;
            var skills        = fullcharacter.Item5;
            var quickslots    = fullcharacter.Item6;

            client.Metadata["id"] = character.Item1;

            var level = character.Item4;
            var map   = character.Rest.Item3;
            var x     = (ushort)character.Rest.Item4;
            var y     = (ushort)character.Rest.Item5;

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

            client.Metadata["level"]  = level;
            client.Metadata["hp"]     = stats.Item1;
            client.Metadata["max_hp"] = stats.Item2;
            client.Metadata["mp"]     = stats.Item3;
            client.Metadata["max_mp"] = stats.Item4;

            var name = character.Item3;

            client.Metadata["name"] = name;

            var style = (uint)character.Item5;

            style += stats.Rest.Item5 << 3;
            style += (uint)(character.Item6 << 8);
            style += (uint)(character.Rest.Item1 << 13);
            style += (uint)(character.Item7 << 17);
            style += (!character.Rest.Item2) ? 0 : (uint)(1 << 26);

            client.Metadata["style"] = style;

            var cequipment = new List <CEquipment>();

            for (int i = 0; i < equipment.Count; i++)
            {
                if (equipment[i] != null)
                {
                    var de   = (DItem)(equipment[i].ToStructure <DItem>());
                    var slot = (EquipmentSlots)i;
                    cequipment.Add(de.ToClient(slot));
                }
            }

            client.Metadata["equipment"] = cequipment;

            var ditems = new List <byte[]>();
            var citems = new List <byte[]>();

            foreach (var i in items)
            {
                var di   = (DItem)(i.Item1.ToStructure <DItem>());
                var slot = i.Item3;
                var ci   = (CItem)(di.ToClient(slot));
                var item = ci.ToByteArray();

                if (i.Item2 != 0)
                {
                    BitConverter.GetBytes(i.Item2).CopyTo(item, 2);
                }

                ditems.Add(di.ToByteArray());
                citems.Add(item);
            }

            client.Metadata["inventory"] = ditems;

            builder.New(0x8E);
            {
                builder += new byte[50];
                builder += (short)unk0;
                builder += (byte)0;
                builder += map;
                builder += (short)x;
                builder += (short)y;
                builder += (long)stats.Item7;           // XP
                builder += (long)stats.Rest.Rest.Item5; // Alz
                builder += (int)level;
                builder += 0;                           // ?
                builder += stats.Rest.Item1;            // STR
                builder += stats.Rest.Item3;            // DEX
                builder += stats.Rest.Item2;            // INT
                builder += 0;                           // ?
                builder += stats.Rest.Item6;            // Sword Rank
                builder += stats.Rest.Rest.Item2;       // Magic Rank
                builder += new byte[6];
                builder += stats.Item1;                 // Current HP
                builder += stats.Item2;                 // Max HP
                builder += stats.Item3;                 // Current MP
                builder += stats.Item4;                 // Max MP
                builder += stats.Item5;                 // Current SP
                builder += stats.Item6;                 // Max SP
                builder += stats.Rest.Item7;            // Sword Skill XP
                builder += stats.Rest.Rest.Item1;       // Sword Skill Points
                builder += stats.Rest.Rest.Item3;       // Magic Skill XP
                builder += stats.Rest.Rest.Item4;       // Magic Skill Points
                builder += (ushort)0;                   // Sword Rank Progress
                builder += (ushort)0;                   // Magic Rank Progress
                builder += 0;                           // ?
                builder += 0;                           // ?
                builder += stats.Rest.Item4;            // Honour
                builder += 0;                           // Penalty XP
                builder += 0;                           // ?
                builder += (ushort)0;                   // ?
                builder += (byte)127;                   // Chat IP
                builder += (byte)0;
                builder += (byte)0;
                builder += (byte)1;
                builder += (ushort)38121;               // Chat Port
                builder += (byte)0;                     // Nation
                builder += 0;                           // ?
                builder += 0;                           // Warp Codes
                builder += (uint)(1 << (map - 1));      // Map Codes
                builder += style;
                builder += new byte[3];
                builder += (byte)cequipment.Count;
                builder += (ushort)citems.Count;
                builder += (byte)skills.Count;
                builder += quickslots.Count;
                builder += new byte[128];               // Quest Data
                builder += new byte[128];               // Quest Flags
                builder += new byte[128];               // Quest Dungeon Data
                builder += new byte[128];               // Quest Dungeon Flags
                builder += (byte)1;                     // Craft Level 0
                builder += (byte)1;                     // Craft Level 1
                builder += (byte)1;                     // Craft Level 2
                builder += (byte)1;                     // Craft Level 3
                builder += (byte)1;                     // Craft Level 4
                builder += (byte)0;                     // Craft XP 0
                builder += (byte)0;                     // Craft XP 1
                builder += (byte)0;                     // Craft XP 2
                builder += (byte)0;                     // Craft XP 3
                builder += (byte)0;                     // Craft XP 4
                builder += new byte[16];                // Craft Flags
                builder += 0;                           // Craft Type
                builder += (byte)0;                     // ?
                builder += (byte)(name.Length + 1);
                builder += name;

                foreach (var e in cequipment)
                {
                    builder += e.ToByteArray();
                }

                foreach (var i in citems)
                {
                    builder += i;
                }

                foreach (var s in skills)
                {
                    builder += (ushort)s[0];                    // Skill ID
                    builder += (byte)s[1];                      // Skill Level
                    builder += (byte)s[2];                      // Skill Slot
                }

                foreach (var q in quickslots)
                {
                    builder += (byte)q[0];                      // Skill ID (referenced by Skill Slot)
                    builder += (byte)q[1];                      // Slot (in quickslot bars)
                }

                //b = builder.Data;
            }

            client.Send(builder, "Initialised");

            events.Warped("world.700.Initialized", client, map, x, y);

            #region PSEUDOCODE

            /*
             * ushort header
             * ushort size
             * ushort opcode
             * ushort players?
             *
             * foreach player
             *
             * uint characterID (acc * 8 + slot)
             * ushort unk0
             * byte unk1
             * byte unk2
             * uint unk3
             * uint timestamp? (probably that milliseconds since server start crap)
             * ushort x_current
             * ushort y_current
             * ushort x_destination
             * ushort y_destination
             * byte pk_level
             * byte[6] unk4
             * uint style
             * byte animation
             * byte[9] unk5 (one of these is most likely an animation keystamp of some sort)
             * byte isDead
             * byte equipment_count
             * ushort unk6
             * byte isSelling
             * uint unk7
             * byte name_length (+1)
             * byte[name_length - 1] name
             * byte guild_length
             * byte[guild_length] guild
             * byte unk8
             * byte isHelmVisible
             * byte unk9
             *
             * a series of ushort-byte pairs follow, and contains the current equipment
             * foreach equipment
             *
             * ushort item_id (merged with bonus and isBound, obviously)
             * byte slot
             *
             */
            #endregion

            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)
                    {
                        if (c == client)
                        {
                            continue;
                        }
                        if (!c.Metadata.ContainsKey("id") || (uint)c.Metadata["cid"] == 0)
                        {
                            continue;
                        }

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

                        builder += (int)cid;
                        builder += (short)0x000D;
                        builder += (short)0x0100;
                        builder += (int)level;
                        builder += Environment.TickCount - (int)timestamp;
                        builder += (short)x;
                        builder += (short)y;
                        builder += (short)dx;
                        builder += (short)dy;
                        builder += (byte)0;                             // PK penalty
                        builder += 0;
                        builder += (short)0;
                        builder += (int)style;
                        builder += (byte)0;                             // Animation ID
                        builder += 0;
                        builder += 0;
                        builder += (byte)0;
                        builder += (byte)0;                             // 1 = dead

                        cequipment = (List <CEquipment>)c.Metadata["equipment"];

                        builder += (byte)cequipment.Count;
                        builder += (short)0;
                        builder += (byte)0;                             // 1 = has private shop open
                        builder += 0;

                        name = c.Metadata["name"] as string;

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

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

                    //b = builder.Data;
                }

                client.Send(builder, "UnknownPacket_0xC8");

                foreach (var c in clients)
                {
                    if (c == client)
                    {
                        continue;
                    }

                    builder.New(0xC8);
                    {
                        builder += (short)0x3101;

                        var cid = (uint)client.Metadata["cid"];
                        level = (uint)client.Metadata["level"];
                        var timestamp = (uint)client.Metadata["timestamp"];
                        x = (ushort)client.Metadata["x"];
                        y = (ushort)client.Metadata["y"];
                        var dx = (ushort)client.Metadata["dest_x"];
                        var dy = (ushort)client.Metadata["dest_y"];
                        style = (uint)client.Metadata["style"];

                        builder += (int)cid;
                        builder += (short)0x000D;
                        builder += (short)0x0100;
                        builder += (int)level;
                        builder += Environment.TickCount - (int)timestamp;
                        builder += (short)x;
                        builder += (short)y;
                        builder += (short)dx;
                        builder += (short)dy;
                        builder += (byte)0;                             // PK penalty
                        builder += 0;
                        builder += (short)0;
                        builder += (int)style;
                        builder += (byte)0;                             // Animation ID
                        builder += 0;
                        builder += 0;
                        builder += (byte)0;
                        builder += (byte)0;                             // 1 = dead

                        cequipment = (List <CEquipment>)client.Metadata["equipment"];

                        builder += (byte)cequipment.Count;
                        builder += (short)0;
                        builder += (byte)0;                             // 1 = has private shop open
                        builder += 0;

                        name = c.Metadata["name"] as string;

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

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

                        //b = builder.Data;
                    }

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

            b = new byte[0x48] {
                0xE2, 0xB7, 0x48, 0x00, 0x6D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x97, 0xB6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            };

            client.Send(ref b, "UnknownPacket_0x026D");
        }
Esempio n. 3
0
        public static void Warp(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            //byte[] b;

            var npc   = packet.ReadByte();
            var unk0  = packet.ReadShort();
            var order = packet.ReadShort();

            var map = client.Metadata["map"] as IMap;

            int[] dest = map.GetWarpDestination(npc, (int)order);

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

            if (clients.Count > 1)
            {
                var id = (uint)client.Metadata["cid"];

                builder.New(0xC9);
                {
                    builder += (int)id;
                    builder += (byte)dest[0];

                    //b = builder.Data;
                }

                foreach (var c in clients)
                {
                    if (c == client)
                    {
                        continue;
                    }

                    //var b2 = b;

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

                builder.New(0xC9);
                {
                    foreach (var c in clients)
                    {
                        if (c == client)
                        {
                            continue;
                        }

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

                        builder += (int)id;
                    }

                    builder += (byte)dest[0];
                    //b = builder.Data;
                }

                client.Send(builder, "UnknownPacket_0xC9");
            }

            builder.New(0xF4);
            {
                builder += (short)dest[1];                      // x
                builder += (short)dest[2];                      // y
                builder += 0;
                builder += 0;
                builder += 0;
                builder += 0;
                builder += (byte)0;
                builder += 0;

                //b = builder.Data;
            }

            client.Send(builder, "WarpCommand");

            client.Metadata["x"] = (ushort)dest[1];
            client.Metadata["y"] = (ushort)dest[2];

            map.RemoveClient(client);
            events.Warped("world.700.WarpCommand", client, dest[0], dest[1], dest[2]);

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

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

                    foreach (var c in clients)
                    {
                        if (c == client)
                        {
                            continue;
                        }
                        //if (!c.Metadata.ContainsKey("id") || (uint)c.Metadata["cid"] == 0) continue;

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

                        builder += (int)id;
                        builder += (short)0x000D;
                        builder += (short)0x0100;
                        builder += (int)level;
                        builder += Environment.TickCount - (int)timestamp;
                        builder += (short)x;
                        builder += (short)y;
                        builder += (short)dx;
                        builder += (short)dy;
                        builder += (byte)0;                             // PK penalty
                        builder += 0;
                        builder += (short)0;
                        builder += (int)style;
                        builder += (byte)0;                             // Animation ID
                        builder += 0;
                        builder += 0;
                        builder += (byte)0;
                        builder += (byte)0;                             // 1 = dead

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

                        builder += (byte)equipment.Count;
                        builder += (short)0;
                        builder += (byte)0;                             // 1 = has private shop open
                        builder += 0;

                        var name = c.Metadata["name"] as string;

                        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;
                }

                client.Send(builder, "UnknownPacket_0xC8");

                foreach (var c in clients)
                {
                    if (c == client)
                    {
                        continue;
                    }

                    builder.New(0xC8);
                    {
                        builder += (short)0x3101;

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

                        builder += (int)id;
                        builder += (short)0x000D;
                        builder += (short)0x0100;
                        builder += (int)level;
                        builder += Environment.TickCount - (int)timestamp;
                        builder += (short)x;
                        builder += (short)y;
                        builder += (short)dx;
                        builder += (short)dy;
                        builder += (byte)0;                             // PK penalty
                        builder += 0;
                        builder += (short)0;
                        builder += (int)style;
                        builder += (byte)0;                             // Animation ID
                        builder += 0;
                        builder += 0;
                        builder += (byte)0;
                        builder += (byte)0;                             // 1 = dead

                        var equipment = (List <CEquipment>)client.Metadata["equipment"];

                        builder += (byte)equipment.Count;
                        builder += (short)0;
                        builder += (byte)0;                             // 1 = has private shop open
                        builder += 0;

                        var name = c.Metadata["name"] as string;

                        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");
                }
            }

            var database = client.Metadata["database"] as IDatabaseContracts;
            var server   = (int)client.Metadata["server"];
            var slot     = (int)((uint)client.Metadata["cid"] % 8);

            database.UpdateCharacterPosition(server, client.AccountID, slot, (byte)dest[0], (byte)dest[1], (byte)dest[2]);
        }
Esempio n. 4
0
        public static void EnterWorld2(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            if (packet.Size < 14)
            {
                return;
            }
            var id = packet.ReadInt();

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

            ServerData[] servers     = GetChannels(syncServer);
            ChannelData  channelData = null;

            foreach (var svr in servers)
            {
                if (svr.id == server)
                {
                    foreach (var chn in svr.channels)
                    {
                        if (chn.id == (int)client.Metadata["channel"])
                        {
                            channelData = chn;
                        }
                    }
                }
            }

            if (channelData == null)
            {
                return;
            }

            var charslot = id % 8;
            var ip       = BitConverter.ToUInt32(Configuration.channelIp.GetAddressBytes(), 0);
            var chport   = Configuration.channelPort;

            if (client.AccountID <= 0)
            {
                client.AccountID = Authentication.GetUser(syncServer, (ulong)client.Metadata["magic"]);
            }


            Character character = CharacterManagement.GetFullCharacter(syncServer, server, client.AccountID, charslot);

            client.Metadata["fullchar"] = character;
            client.Metadata["id"]       = (int)id;

            client.Metadata["map"] = null;

            var equipment = character.equipment.GetEquipment();

            var level = character.level;
            var map   = character.map;
            var x     = (ushort)character.x;
            var y     = (ushort)character.y;

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



            var style = (int)character._class;

            style += (int)character.stats.rank << 3;
            style += (character.face << 8);
            style += (character.colour << 13);
            style += (character.hair << 17);
            style += (!character.gender) ? 0 : (1 << 26);
            style += 152;

            client.Metadata["style"]     = style;
            client.Metadata["equipment"] = equipment;


            var ditems = new List <byte[]>();
            var citems = new List <byte[]>();

            foreach (var i in character.inv)
            {
                var di   = (DItem)(i.item.ToStructure <DItem>());
                var slot = i.slot;
                var ci   = (CItem)(di.ToClient(slot));
                var item = ci.ToByteArray();

                if (i.amount != 0)
                {
                    BitConverter.GetBytes(i.amount).CopyTo(item, 8);
                }

                ditems.Add(di.ToByteArray());
                citems.Add(item);
            }

            client.Metadata["inventory"] = ditems;

            builder.New(0x8E, true);
            {
                builder += new byte[58];
                builder += (byte)0x14;
                builder += (byte)server;
                builder += (short)channelData.id;
                builder += new byte[22];
                builder += (byte)255;
                builder += (short)channelData.maxPlayers;
                builder += ip;                                          // channel ip
                builder += (ushort)chport;                              // channel port
                builder += (long)0;
                builder += 0x01000BF1;
                builder += (int)map;                                    // map
                builder += 0;
                builder += x;                                           // x
                builder += y;                                           // y
                builder += character.stats.exp;                         // exp
                builder += character.stats.alz;                         // alz
                builder += (ulong)0;                                    // wexp
                builder += level;                                       // level
                builder += 0;
                builder += character.stats.str_stat;                    // str
                builder += character.stats.dex_stat;                    // dex
                builder += character.stats.int_stat;                    // int
                builder += character.stats.pnt_stat;                    // points
                builder += character.stats.swordrank;                   // sword rank
                builder += (byte)0;                                     // magic rank **UNUSED**
                builder += new byte[6];
                builder += (uint)character.stats.maxhp;                 // max hp
                builder += (uint)character.stats.curhp;                 // curr hp
                builder += (uint)character.stats.maxmp;                 // max mp
                builder += (uint)character.stats.curmp;                 // curr mp
                builder += character.stats.maxsp;                       // max sp
                builder += character.stats.cursp;                       // curr sp
                builder += 8;                                           // max rage
                builder += (uint)0;                                     // DP
                builder += (ushort)0x2A30;
                builder += (ushort)0;
                builder += (uint)0;
                builder += (uint)0;                                     //SkillExpBars
                builder += (uint)0;                                     //SkillExp
                builder += (uint)0;                                     //SkillPoints
                builder += 0x0857;                                      //Unk 0x33
                builder += (uint)0;                                     //Unknw
                builder += (uint)999;                                   //Honor Points
                builder += (uint)0;
                builder += (uint)0;
                builder += (uint)0;
                builder += (uint)0;
                builder += (uint)0;
                builder += (ushort)0;
                builder += ip;                                          // unk server ip
                builder += (ushort)chport;                              // unk server port
                builder += ip;                                          // unk server ip Possible AuctionServer
                builder += (ushort)chport;                              // unk server port Possible AuctionServer
                builder += ip;                                          // unk server ip
                builder += (ushort)chport;                              // unk server port
                builder += (ushort)0xBBEE;
                builder += new byte[5];
                builder += 0x3FFFFF;                                    // warp codes?
                builder += 0x3FFFFF;                                    // map codes?
                builder += style;                                       // style
                builder += new byte[164];
                builder += (ushort)equipment.Count;                     // equip count
                builder += (ushort)citems.Count;                        // items count
                builder += (ushort)0;
                builder += (ushort)character.skills.Length;             // skills count
                builder += (ushort)character.qslots.Length;             // quickslots count
                builder += new byte[1540];
                builder += 0x03E8;                                      // help window..?
                builder += 59;

                /*
                 * builder += new byte[1975];
                 * builder += (int)1;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;                                      // 2 -> Unlimited Warp Active until 2000-00:00:00?
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;                                      // 1 or 0
                 * builder += (int)0;
                 * builder += (int)0;                                      // 0 or 1
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (int)0;
                 * builder += (byte)0;
                 * builder += (byte)0;
                 * builder += (int)0;                                      // My Merit Points (See UI for more accurate perception)
                 * builder += (int)0;                                      // Merit Point (See UI for more accurate perception)
                 * builder += (int)0;                                     // if 15 and the value bellow Force Gems is >2000 then Unlimited Warp Active until 2000-00:00:00?
                 * builder += (int)0;                                      // Force Gems
                 * builder += (int)0;                                   // Unknown Value Max (9999)?
                 */

                /*builder += new byte[2103];
                 * /*builder += (uint)0xFFFFFFFE;
                 * builder += new byte[2059];
                 * builder += (uint)0;                                     // Raise Spirit (millisecs)
                 * builder += new byte[16];
                 * builder += (int)0;                                      // My Merit Points (See UI for more accurate perception)
                 * builder += (int)0;                                      // Merit Point (See UI for more accurate perception)
                 * builder += (int)0;                                      // Unknown
                 * builder += (int)0;                                      // Force Gems
                 * builder += (int)0;                                      // Unknown*/

                builder += new byte[2115];

                builder += (byte)(character.name.Length + 1);           // name length + 1
                builder += character.name;                              // name

                foreach (var e in equipment)
                {
                    builder += e.ToByteArray();
                }

                foreach (var i in citems)
                {
                    builder += i;
                }

                foreach (var s in character.skills)
                {
                    builder += (short)s.skill;                          // Skill ID
                    builder += s.level;                                 // Skill Level
                    builder += s.slot;                                  // Skill Slot
                    builder += (byte)0;
                }

                foreach (var q in character.qslots)
                {
                    builder += (short)q.skill;                          // Skill ID (referenced by Skill Slot)
                    builder += (short)q.slot;                           // Slot (in quickslot bars)
                }

                builder += 0x20;
                builder += (ushort)0x21;
                builder += (ushort)0x01;
                builder += 0x0BC9;
                builder += (byte)0x01;
                builder += (byte)0x01;
                builder += (byte)0x00;
                builder += 0x0435;
                builder += 0;
            }

            client.Send(builder, "Initialised");
            events.Warped("world.Initialized", client, map, x, y);
            Authentication.UpdateOnline(syncServer, client.AccountID, true);

            NewUserList(packet, builder, client, events);
            //NewMobsList(packet, builder, client, events);
        }
Esempio n. 5
0
        public static void WarpCommand(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {

            Character character = client.Metadata["fullchar"] as Character;
            var npc = packet.ReadUShort();
            var unk1 = packet.ReadUShort();
            var unk2 = packet.ReadByte();
            var unk3 = packet.ReadByte();
            var unk4 = packet.ReadByte();

            var y = packet.ReadByte();
            var x = packet.ReadByte();
            var unk5 = packet.ReadByte();
            var unk6 = packet.ReadByte();

            var warpID = packet.ReadUInt();

            var unk7 = packet.ReadByte();
            var unk8 = packet.ReadByte();
            var unk9 = packet.ReadByte();
            var unk10 = packet.ReadByte();
            var unk11 = packet.ReadByte();
            var unk12 = packet.ReadByte();
            var unk13 = packet.ReadByte();
            var unk14 = packet.ReadByte();

            var map = (client.Metadata["map"] as IMap);
            var fee = character.stats.alz;
            var alive = (warpID == 0 && npc != 54 && npc != 63);

            int[] dest = null;

            if (alive)
                dest = map.GetWarpDestination(npc, 0);
            else if (npc == 201)
                warpID = (uint)map.ID;
            else
                dest = map.GetDeathDestination();

            if (dest!=null)
            {
                warpID = (byte)dest[0];
                x = (byte)dest[1];
                y = (byte)dest[2];
            }

            map.GetSurroundingClients(client, 1);
            map.RemoveClient(client);
            events.Warped("world.WarpCommand", client, (int)warpID, x, y);

            builder.New(0x00F4); // TODO: Load x,y values from WarpList
            {
                builder += (ushort)x;
                builder += (ushort)y;
                builder += (uint)character.stats.exp;
                builder += 0;                           //axp
                builder += fee;                         //Alz (for death penalty and fee?)
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (ulong)0;
                builder += warpID;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
                builder += (byte)1;
            }

            #region PacketAnalisys  
#if DEBUG
            string notice = "";

            /*for (int i = 0; i< packet.Size-10; i++)
            {
                notice += packet.ReadByte()+" ";   
            }
            */

            notice += npc + " " + unk1 + " " + unk2 + " " + unk3 + " " + unk4 + " " + x + " " + y + " " + unk5 + " " + unk6 + " " + warpID + " "
                + unk7 + " " + unk8 + " " + unk9 + " " + unk10 + " " + unk11 + " " + unk12 + " " + unk13 + " " + unk14;
            Log.Notice(notice);
#endif
            #endregion

            client.Send(builder, "WarpCommand");

            character.map = (byte)warpID;
            character.x = x;
            character.y = y;

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