Показать сообщение отдельно
Старый 02.01.2011, 20:25   #8
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Большое спасибо за разьяснение, но я имел в виду это
Код:
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
Т.к не используется и смысл для маски ошибочен

Последний раз редактировалось MaS0n; 02.01.2011 в 20:54.
MaS0n вне форума   Ответить с цитированием