Как все красиво в кэше
в хендлере пакета идет вот так
Код:
[Parser(Opcode.SMSG_CREATURE_QUERY_RESPONSE)]
public static void HandleCreatureQueryResponse(Packet p)
{
var entry = p.ReadUInt32("Entry");
var hasData = p.ReadBit("Has Data");
var maleLen = new uint[4];
var femaleLen = new uint[4];
var subNameLen = 0u;
var unk505Len = 0u;
var iconNameLen = 0u;
var questItemCount = 0u;
if (hasData)
{
for (var i = 0; i < 4; ++i)
{
maleLen[i] = p.ReadBits(11);
femaleLen[i] = p.ReadBits(11);
}
questItemCount = p.ReadBits(22);
iconNameLen = p.ReadBits("Icon name size", 6);
subNameLen = p.ReadBits("Sub name size", 11);
unk505Len = p.ReadBits("unk505 len", 11);
p.ReadBit("Is racial leader");
}
if (hasData)
{
p.ReadInt32("Type");
p.ReadInt32("Kill Credit 1");
p.ReadInt32("Model Id 4");
p.ReadInt32("Model Id 3");
for (var i = 0; i < questItemCount; ++i)
p.ReadInt32("Quest Item", i);
p.ReadInt32("Expansion Unk");
for (var i = 0; i < 4; ++i)
{
if (femaleLen[i] > 1)
p.ReadCString("Name Female", i);
if (maleLen[i] > 1)
p.ReadCString("Name Male", i);
}
if (unk505Len > 1)
p.ReadCString("Unk505");
p.ReadSingle("Mana Mod");
p.ReadInt32("Model Id 1");
if (iconNameLen > 1)
p.ReadCString("Icon Name");
p.ReadInt32("Kill Credit 0");
p.ReadInt32("Model Id 2");
if (subNameLen > 1)
p.ReadCString("Subname");
for (var i = 0; i < 2; ++i)
p.ReadUInt32("Type Flags", i);
p.ReadSingle("Health Mod");
p.ReadInt32("Family");
p.ReadInt32("Rank");
p.ReadInt32("Movement Id");
}
}
причем близы, если строка пустая, шлют либо 0 либо 1 рандомом, строки всегда null-terminated