Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Опкоды, Формулы, Клиент > Копаем клиент

Важная информация

Копаем клиент Копаем клиент

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.07.2011, 14:23   #1
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию CMSG_GET_MIRRORIMAGE_DATA

Пытаюсь понять при каких условиях клиент посылает CMSG_GET_MIRRORIMAGE_DATA. Нашел вот такой кусок:
Код:
signed int __usercall sub_5D2890<eax>(int a1<ecx>, double a2<st6>, double a3<st5>, double a4<st4>, double a5<st3>, double a6<st2>, double a7<st1>)
{
  int v7; // ecx@1
  int v8; // ebx@1
  int v9; // esi@1
  int v10; // eax@2
  int v11; // eax@3
  signed int result; // eax@9
  signed int v13; // edi@25
  int v14; // eax@26
  int v15; // eax@30
  int v16; // [sp-4h] [bp-14h]@11
  int v17; // [sp+8h] [bp-8h]@30
  int v18; // [sp+Ch] [bp-4h]@30

  v9 = a1;
  v7 = *(_DWORD *)(a1 + 204);
  v8 = 0;
  if ( !v7 || (sub_77A9E0(v7), !v10) )
    return 0;
  v11 = *(_DWORD *)(v9 + 3084);
  *(_DWORD *)(v9 + 2824) &= 0xFFBFFFFFu;
  if ( v11 )
  {
    sub_66A320(v11);
    *(_DWORD *)(v9 + 3084) = 0;
  }
  if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )
  {
    if ( !(*(_DWORD *)(v9 + 2824) & 0x20000) )
      CGUnit_C__RequestMirrorImageData((void *)v9);
    *(_DWORD *)(v9 + 2824) |= 0x400000u;
    return 0;
  }
  if ( sub_5B8CC0(v9) )
  {
    v16 = 1;
LABEL_18:
    sub_5BD0A0(v9, v9, v16);
    goto LABEL_19;
  }
  if ( *(_DWORD *)(v9 + 2604) )
  {
    result = sub_5BD0A0(v9, 0, 1);
    if ( !result )
      return result;
    goto LABEL_19;
  }
  if ( ((unsigned int)*(_WORD *)(*(_DWORD *)(v9 + 8) + 8) >> 4) & 1 && *(_BYTE *)(*(_DWORD *)(v9 + 2608) + 4) & 4 )
  {
    v16 = 0;
    goto LABEL_18;
  }
LABEL_19:
  if ( !(((unsigned int)*(_WORD *)(*(_DWORD *)(v9 + 8) + 8) >> 4) & 1) || !sub_575BA0(v9, a2, a3, a4, a5, a6, a7) )
  {
    if ( !sub_573210() || !CGUnit_C__sub_5BC230(v9) )
    {
      if ( *(_DWORD *)(v9 + 3084) )
      {
        if ( *(_DWORD *)(v9 + 2604) )
        {
          v13 = 32;
          do
          {
            v14 = *(_DWORD *)(v13 + *(_DWORD *)(v9 + 2604));
            if ( v14 )
              sub_66B510(*(void **)(v9 + 3084), v8, v14, 0);
            v13 += 4;
            ++v8;
          }
          while ( (unsigned int)v13 < 0x4C );
        }
      }
    }
    sub_5D02B0(v9, a2, a3, a4, a5, a6, a7, 0);
    sub_5D02B0(v9, a2, a3, a4, a5, a6, a7, 1);
    sub_5D02B0(v9, a2, a3, a4, a5, a6, a7, 2);
  }
  sub_5B54F0(v9);
  v15 = *(_DWORD *)(v9 + 8);
  v17 = *(_DWORD *)v15;
  v18 = *(_DWORD *)(v15 + 4);
  sub_8262B0((int)&v17, 3);
  sub_5C1F50(v9);
  return 1;
}
Код:
if ( !(*(_DWORD *)(v9 + 2824) & 0x20000) )
Я думаю, что это unit_flags, а вот это что за махинация я не могу понять
Код:
if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )

Последний раз редактировалось HuntsMan; 27.07.2011 в 14:30.
HuntsMan вне форума   Ответить с цитированием
Старый 27.07.2011, 14:34   #2
Deamon
WowCore Dev
 
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
Deamon Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от HuntsMan Посмотреть сообщение
Я думаю, что это unit_flags, а вот это что за махинация я не могу понять
Код:
if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )
if (v9[248][280] & ( 1u << 4) )
где v9 - это DWORD**
Deamon вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
HuntsMan (27.07.2011)
Старый 27.07.2011, 14:34   #3
TOM_RUS
MaNGOS Dev
 
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
TOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небес
По умолчанию

Цитата:
Сообщение от HuntsMan Посмотреть сообщение
Код:
if ( !(*(_DWORD *)(v9 + 2824) & 0x20000) )
Это какие-то внутренние клиентские флаги...
Цитата:
Сообщение от HuntsMan Посмотреть сообщение
Код:
if ( (*(_DWORD *)(*(_DWORD *)(v9 + 248) + 280) >> 4) & 1 )
Это
Код:
if(unit->data->UNIT_FIELD_FLAGS_2 & UNIT_FLAG2_CLONED)

Последний раз редактировалось TOM_RUS; 27.07.2011 в 14:46.
TOM_RUS вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
HuntsMan (27.07.2011)
Старый 27.07.2011, 14:46   #4
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

Цитата:
Это какие-то внутренние клиентские флаги...
Т.е. на них можно забить?
HuntsMan вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 20:03. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot