Большое спасибо за разьяснение, но я имел в виду это
Код:
enum FriendStatus
{
FRIEND_STATUS_OFFLINE = 0,
FRIEND_STATUS_ONLINE = 1,
FRIEND_STATUS_AFK = 2,
FRIEND_STATUS_UNK3 = 3,
FRIEND_STATUS_DND = 4
};
enum SocialFlag
{
SOCIAL_FLAG_FRIEND = 0x01,
SOCIAL_FLAG_IGNORED = 0x02,
SOCIAL_FLAG_MUTED = 0x04, // guessed
SOCIAL_FLAG_RAF = 0x08 // Recruit-A-Friend
};
Правильнее, по-моему мнению, надо
Код:
enum FriendStatus
{
FRIEND_STATUS_OFFLINE = 0,
FRIEND_STATUS_ONLINE = 1,
FRIEND_STATUS_AFK = 2,
FRIEND_STATUS_UNK3 = 3,
FRIEND_STATUS_DND = 4,
FRIEND_STATUS_RAF = 8 // Recruit-A-Friend
};
enum SocialFlag
{
SOCIAL_FLAG_FRIEND = 0x01,
SOCIAL_FLAG_IGNORED = 0x02,
SOCIAL_FLAG_MUTED = 0x04, // guessed
};
И в вышеприведенной функции
Код:
if ( fInfo->Status & 8 )
{
FrameScript__PushNumber(a1, 1.0); // RAF
result = 8;
}
Ну и в самом пакете SMSG_CONTACT_LIST флаги и статус - разные вещи
Код:
CDataStore__GetInt64(v4, (int)&v36); // guid
CDataStore__GetInt32(v4, (int)&v33); // flags
CDataStore__GetString(v4, (int)&v23, 0x200u); // note
if ( v33 & 1 ) // if flags & SOCIAL_FLAG_FRIEND
{
v28 = 0;
v31 = 0;
v32 = 0;
CDataStore__GetInt8(v4, (int)&v37); // status
v8 = v37;
if ( v37 )
{
CDataStore__GetInt32(v4, (int)&v28); // area
CDataStore__GetInt32(v4, (int)&v31); // level
CDataStore__GetInt32(v4, (int)&v32); // class
v8 = v37;
}
Код:
data << uint64(itr->first); // player guid
data << uint32(itr->second.Flags); // player flag (0x1-friend?, 0x2-ignored?, 0x4-muted?)
data << itr->second.Note; // string note
if(itr->second.Flags & SOCIAL_FLAG_FRIEND) // if IsFriend()
{
data << uint8(itr->second.Status); // online/offline/etc?
if(itr->second.Status) // if online
{
data << uint32(itr->second.Area); // player area
data << uint32(itr->second.Level); // player level
data << uint32(itr->second.Class); // player class
}
}
Да, и в начале пакета сервер шлет семерку, как 1|2|4, что соответствует сигналам для интерфейса
x & 1 - friend list update
x & 2 - ignored list update
x & 4 - muted list update
Восьмерки там нет, и клиент такое не обрабатывает
И надо дропнуть
Код:
FRIEND_STATUS_UNK3 = 3
Т.к не используется и смысл для маски ошибочен