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