أهلا وسهلا بك زائرنا الكريم في منتدى دعم PBBoard الرسمي، لكي تتمكن من المشاركة ومشاهدة جميع أقسام المنتدى وكافة الميزات ، يجب عليك إنشاء حساب جديد بالتسجيل بالضغط هنا أو تسجيل الدخول اضغط هنا إذا كنت عضواً .

محتاج اضيف محرر sceditor


مشاهدة المشاركة في الموضوع بالعرض العادي
look/images/icons/i1.gif محتاج اضيف محرر sceditor
  23-02-2024 04:37 مساءً  
ahmedothman
معلومات الكاتب
CODE
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProtoBuf;
using System.IO;
namespace Conquer_Online_Server.Network.GamePackets
{
    [ProtoContract]
    public class ItemPacket
    {
        [ProtoMember(1, IsRequired = true)]
        public uint UID;
        [ProtoMember(2, IsRequired = true)]
        public uint ID;
        [ProtoMember(3, IsRequired = true)]
        public uint Unknowen1;
        [ProtoMember(4, IsRequired = true)]
        public uint Socket1;
        [ProtoMember(5, IsRequired = true)]
        public uint Socket2;
        [ProtoMember(6, IsRequired = true)]
        public uint Unknowen4;
        [ProtoMember(7, IsRequired = true)]
        public uint Unknowen5;
        [ProtoMember(8, IsRequired = true)]
        public uint Plus;
        [ProtoMember(9, IsRequired = true)]
        public uint Bless;
        [ProtoMember(10, IsRequired = true)]
        public uint Bound;
        [ProtoMember(11, IsRequired = true)]
        public uint HP;
        [ProtoMember(12, IsRequired = true)]
        public uint Unknowen10;
        [ProtoMember(13, IsRequired = true)]
        public uint Unknowen11;
        [ProtoMember(14, IsRequired = true)]
        public uint Lock;
        [ProtoMember(15, IsRequired = true)]
        public uint Unknowen13;
        [ProtoMember(16, IsRequired = true)]
        public uint Unknowen14;
        [ProtoMember(17, IsRequired = true)]
        public uint Unknowen15;
        [ProtoMember(18, IsRequired = true)]
        public uint Unknowen16;
        [ProtoMember(19, IsRequired = true)]
        public uint Unknowen17;
        [ProtoMember(20, IsRequired = true)]
        public uint Unknowen18;
        [ProtoMember(21, IsRequired = true)]
        public uint Unknowen19;
        [ProtoMember(22, IsRequired = true)]
        public uint Dura;
        [ProtoMember(23, IsRequired = true)]
        public uint MaxDura;
    }
    [ProtoContract]
    public class WarDrobePacket
    {
        [ProtoMember(1, IsRequired = true)]
        public WarDrobe.ActionType Action;
        [ProtoMember(2, IsRequired = true)]
        public uint UID;
        [ProtoMember(3, IsRequired = true)]
        public uint Data;
        [ProtoMember(4, IsRequired = true)]
        public uint Unknowen;
    }
    [ProtoContract]
    public class StoragePacket
    {
        [ProtoMember(1, IsRequired = true)]
        public uint Action;
        [ProtoMember(2, IsRequired = true)]
        public uint Param;
        [ProtoMember(3, IsRequired = true)]
        public uint Param1;
        [ProtoMember(4, IsRequired = true)]
        public ulong Param2;
        [ProtoMember(5, IsRequired = true)]
        public ulong Param3;
    }
    public class WarDrobe
    {
        public enum ActionType : uint
        {
            Default = 0,
            Add = 1,
            Remove = 2,
            Equip = 5,
            UnEquip = 6
        }
        public ActionType Action;
        public uint UID;
        public uint Data;
        public uint Unknowen;
        public byte[] Buffer;
        public WarDrobe(byte[] buff)
        {
            Buffer = buff;
        }
        public void Deserialize()
        {
            byte[] Packet = new byte[Buffer.Length - 12];
            System.Buffer.BlockCopy(Buffer, 4, Packet, 0, Buffer.Length - 12);
            var result = Serializer.Deserialize<WarDrobePacket>(new MemoryStream(Packet));
            this.Action = result.Action;
            this.UID = result.UID;
            this.Data = result.Data;
            this.Unknowen = result.Unknowen;
        }
        public void Serialize()
        {
            WarDrobePacket Packet = new WarDrobePacket();
            Packet.Action = this.Action;
            Packet.UID = this.UID;
            Packet.Data = this.Data;
            Packet.Unknowen = this.Unknowen;
            byte[] buffer;
            using (var ms = new MemoryStream())
            {
                Serializer.Serialize(ms, Packet);
                buffer = ms.ToArray();
            }
            byte[] Array = new byte[buffer.Length + 12];
            System.Buffer.BlockCopy(buffer, 0, Array, 4, buffer.Length);
            Writer.WriteUInt16((ushort)(Array.Length - 8), 0, Array);
            Writer.WriteUInt16(3300, 2, Array);
            this.Buffer = Array;
        }
        public static void Process(byte[] Data, Client.GameState client)
        {
            WarDrobe Packet = new WarDrobe(Data);
            Packet.Deserialize();
            switch (Packet.Action)
            {
                case ActionType.Add:
                    {
                        ConquerItem item;
                        if (client.Inventory.TryGetItem(Packet.UID, out item))
                        {
                            if (client.WarDrobe.Add(item))
                            {
                                WarDrobe res = new WarDrobe(null);
                                res.Action = ActionType.Add;
                                res.UID = item.UID;
                                res.Data = item.ID;
                                res.Unknowen = 0;
                                res.Serialize();
                                client.Send(res.Buffer);
                            }
                        }
                        break;
                    }
                case ActionType.Remove:
                    {
                        ConquerItem item = null;
                        if (client.WarDrobe.TryGetItem(Packet.UID, out item))
                        {
                            if (client.WarDrobe.Remove(item))
                            {
                                WarDrobe res = new WarDrobe(null);
                                res.Action = ActionType.Remove;
                                res.UID = item.UID;
                                res.Data = item.ID;
                                res.Unknowen = 0;
                                res.Serialize();
                                client.Send(res.Buffer);
                            }
                        }
                        break;
                    }
                case ActionType.Equip:
                    {
                        ConquerItem item = null;
                        if (client.WarDrobe.TryGetItem(Packet.UID, out item))
                        {
                            if (PacketHandler.Equipable(item, client))
                            {
                                WarDrobe res = new WarDrobe(null);
                                res.Action = ActionType.Equip;
                                res.UID = item.UID;
                                res.Data = item.ID;
                                res.Unknowen = 0;
                                res.Serialize();
                                client.Send(res.Buffer);
                                ItemUsage usage = new ItemUsage(true);
                                usage.dwParam = Packet.Data;
                                usage.UID = Packet.UID;
                                PacketHandler.EquipItem(usage, client);
                            }
                        }
                        break;
                    }
                case ActionType.UnEquip:
                    {
                        ConquerItem item = null;
                        if (client.WarDrobe.TryGetItem(Packet.UID, out item))
                        {
                            WarDrobe res = new WarDrobe(null);
                            res.Action = ActionType.UnEquip;
                            res.UID = item.UID;
                            res.Data = item.ID;
                            res.Unknowen = 0;
                            res.Serialize();
                            client.Send(res.Buffer);
                            ItemUsage usage = new ItemUsage(true);
                            usage.dwParam = Packet.Data;
                            PacketHandler.UnequipItem(usage, client);
                        }
                        break;
                    }
                default:
                    {
                        client.Entity.SendSysMesage("3300: unknowen type " + Packet.Action);
                        break;
                    }
            }
        }
        public static void SendItems(Client.GameState client)
        {
            var Items = client.WarDrobe.Objects.ToList();
            int i = 0;
            i = Items.Count;
        laple_121:
            byte[] buffer = null;
            int done = 1;
            List<ItemPacket> packets = new List<ItemPacket>();
            while (i > 0 && done < 10)
            {
                var Wrap = client.WarDrobe.Objects[i - 1];
                if (Wrap.Position == 0)
                {
                    ItemPacket item = new ItemPacket();
                    item.ID = Wrap.ID;
                    item.Socket1 = (uint)Wrap.SocketOne;
                    item.Socket2 = (uint)Wrap.SocketTwo;
                    item.Plus = (uint)Wrap.Plus;
                    item.Bless = (uint)Wrap.Bless;
                    item.Bound = (uint)(Wrap.Bound ? 1 : 0);
                    item.HP = Wrap.Enchant;
                    item.Lock = Wrap.Lock;
                    item.UID = Wrap.UID;
                    item.Dura = Wrap.Durability;
                    item.MaxDura = Wrap.MaximDurability;
                    packets.Add(item);
                }
                done++;
                i--;
            }
            WarDrobe wardrobe = new WarDrobe(null);
            wardrobe.Action = ActionType.Default;
            wardrobe.Unknowen = 0;
            wardrobe.Serialize();
            if (packets.Count > 0)
            {
                using (var ms = new System.IO.MemoryStream())
                {
                    ProtoBuf.Serializer.Serialize<List<ItemPacket>>(ms, packets);
                    buffer = ms.ToArray();
                    uint value = buffer[1];
                    int offset = 2;
                    while (offset < buffer.Length)
                    {
                        buffer[offset - 2] = 42;
                        offset += buffer[offset - 1] + 2;
                    }
                }
            }
            if (buffer != null)
            {
                byte[] array = new byte[wardrobe.Buffer.Length + buffer.Length];
                System.Buffer.BlockCopy(wardrobe.Buffer, 0, array, 0, wardrobe.Buffer.Length);
                System.Buffer.BlockCopy(buffer, 0, array, wardrobe.Buffer.Length - 8, buffer.Length);
                Writer.WriteUInt16((ushort)(array.Length - 8), 0, array);
                client.Send(array);
            }
            else
            {
                client.Send(wardrobe.Buffer);
            }
            if (i > 0)
            {
                goto laple_121;
            }
        }
    }
    public class Storage
    {
        public uint Action;
        public uint Param;
        public uint Param1;
        public ulong Param2;
        public byte[] Buffer;
        public Storage(byte[] buff)
        {
            Buffer = buff;
        }
        public void Deserialize()
        {
            byte[] Packet = new byte[Buffer.Length - 12];
            System.Buffer.BlockCopy(Buffer, 4, Packet, 0, Buffer.Length - 12);
            var result = Serializer.Deserialize<StoragePacket>(new MemoryStream(Packet));
            this.Action = (uint)result.Action;
            this.Param = result.Param;
            this.Param1 = result.Param1;
            this.Param2 = result.Param2;
        }
        public static void Send(Client.GameState client)
        {
            uint Points = 0;
            byte[] buffer = null;
            List<StoragePacket> packets = new List<StoragePacket>();
            foreach (var item in client.StorageItems.Values)
            {
                StoragePacket packet = new StoragePacket()
                {
                    Action = (uint)item.Type,
                    Param = item.ID,
                    Param1 = 0,
                    Param2 = 0,
                    Param3 = 0,
                };
                if (client.Entity.TitleID == (uint)item.Type * 10000 + item.ID)
                {
                    packet.Param1 = 1;
                }
                if (client.Entity.WingID == (uint)item.Type * 10000 + item.ID)
                {
                    packet.Param1 = 1;
                }
                if (item.Type == Database.WarDrobe.StorageType.Conqueror || item.Type == Database.WarDrobe.StorageType.RisingStar)
                {
                    Points += 300;
                }
                if (item.Type == Database.WarDrobe.StorageType.GrandMaster)
                {
                    Points += 500;
                }
                if (item.Type == Database.WarDrobe.StorageType.Fashionist || item.Type == Database.WarDrobe.StorageType.OverLord
                    || item.Type == Database.WarDrobe.StorageType.Talent
                    || item.Type == Database.WarDrobe.StorageType.Victor
                    || item.Type == Database.WarDrobe.StorageType.SwiftChaser)
                {
                    Points += 150;
                }
                packets.Add(packet);
            }
            Storage wardrobe = new Storage(null);
            wardrobe.Action = 0;
            wardrobe.Param = Points;
            wardrobe.Param1 = 0;
            wardrobe.Param2 = 0;
            wardrobe.Serialize();
            if (packets.Count > 0)
            {
                using (var ms = new System.IO.MemoryStream())
                {
                    ProtoBuf.Serializer.Serialize<List<StoragePacket>>(ms, packets);
                    buffer = ms.ToArray();
                    uint value = buffer[1];
                    int offset = 2;
                    while (offset < buffer.Length)
                    {
                        buffer[offset - 2] = 42;
                        offset += buffer[offset - 1] + 2;
                    }
                }
            }
            if (buffer != null)
            {
                byte[] array = new byte[wardrobe.Buffer.Length + buffer.Length];
                System.Buffer.BlockCopy(wardrobe.Buffer, 0, array, 0, wardrobe.Buffer.Length);
                System.Buffer.BlockCopy(buffer, 0, array, wardrobe.Buffer.Length - 8, buffer.Length);
                Writer.WriteUInt16((ushort)(array.Length - 8), 0, array);
                client.Send(array);
            }
            else
            {
                client.Send(wardrobe.Buffer);
            }
        }
        public void Serialize()
        {
            StoragePacket Packet = new StoragePacket();
            Packet.Action = this.Action;
            Packet.Param = this.Param;
            Packet.Param1 = this.Param1;
            Packet.Param2 = this.Param2;
            byte[] buffer;
            using (var ms = new MemoryStream())
            {
                Serializer.Serialize(ms, Packet);
                buffer = ms.ToArray();
            }
            byte[] Array = new byte[buffer.Length + 12];
            System.Buffer.BlockCopy(buffer, 0, Array, 4, buffer.Length);
            Writer.WriteUInt16((ushort)(Array.Length - 8), 0, Array);
            Writer.WriteUInt16(3301, 2, Array);
            this.Buffer = Array;
        }
        public static void Process(byte[] packet, Client.GameState client)
        {
            Storage Packet = new Storage(packet);
            Packet.Deserialize();
            switch (Packet.Action)
            {
                case 4:
                    {
                        if (client.StorageItems.ContainsKey((Database.WarDrobe.StorageType)Packet.Param1))
                        {
                            if (Packet.Param1 == 4001 ||
                                Packet.Param1 == 6001 ||
                                Packet.Param1 == 6002 ||
                                Packet.Param1 == 6003 ||
                                Packet.Param1 == 6004)
                            {
                                client.Entity.WingID = (uint)((Packet.Param1 * 10000) + Packet.Param2);
                                client.Send(packet);
                            }
                            else
                            {
                                client.Entity.TitleID = (uint)((Packet.Param1 * 10000) + Packet.Param2);
                                client.Send(packet);
                            }
                        }
                        break;
                    }
                case 5:
                    {
                        if (client.StorageItems.ContainsKey((Database.WarDrobe.StorageType)Packet.Param1))
                        {
                            if (Packet.Param1 == 4001 ||
                                Packet.Param1 == 6001 ||
                                Packet.Param1 == 6002 ||
                                Packet.Param1 == 6003 ||
                                Packet.Param1 == 6004)
                            {
                                client.Entity.WingID = 0;
                                client.Send(packet);
                            }
                            else
                            {
                                client.Entity.TitleID = 0;
                                client.Send(packet);
                            }
                        }
                        break;
                    }
            }
        }
    }
}  


الساعة الآن 09:38 AM