|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Копаем клиент Копаем клиент |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
22.07.2016, 08:58 | #1 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
7.0.3 WDB cache handlers
Разбирая структуру кеша обнаружил что CDataStore::GetFloat заменены на CDataStore::GetInt32, хотя данные в этих полях хранятся в формете float. Я понимаю что в памяти хоть так хоть так будет 4 байта, но это несколько усложнило разбор самих изменений.
вот код хандлера: Код:
unsigned int __thiscall ClientCache::GetCreatureCacheRow(void *this, int a2, int a3) { void *v3; // esi@1 int v4; // eax@1 int v5; // ST08_4@1 int v6; // eax@1 int v7; // ST08_4@1 _DWORD *v8; // ebx@1 signed int v9; // edi@1 int v10; // eax@2 int v11; // ST08_4@2 int v12; // edi@3 int v13; // ebx@3 signed int v14; // esi@3 int *v15; // ebx@5 signed int v16; // esi@5 void *v17; // esi@7 int v18; // eax@7 signed int v19; // ebx@7 int *v20; // esi@7 int *v21; // ebx@9 signed int v22; // esi@9 int v23; // esi@11 int v24; // xmm0_4@11 int v25; // xmm0_4@11 int v26; // ebx@11 int v27; // eax@11 int v28; // eax@11 int v29; // eax@11 char v30; // ST08_1@11 int v31; // ST04_4@11 unsigned int v32; // esi@11 unsigned int result; // eax@12 int *v34; // ecx@16 int v35; // [sp+Ch] [bp-14h]@1 __int16 v36; // [sp+10h] [bp-10h]@1 int v37; // [sp+14h] [bp-Ch]@2 int v38; // [sp+18h] [bp-8h]@1 void *v39; // [sp+1Ch] [bp-4h]@1 v3 = this; LOBYTE(v38) = 0; v39 = this; v35 = a2; v36 = 2048; v4 = CDataStore::GetBits11(v38); // title len LOBYTE(v38) = 0; v5 = v38; *((_DWORD *)v3 + 1) = v4; v6 = CDataStore::GetBits11(v5); // titleAlt_len LOBYTE(v38) = 0; v7 = v38; *((_DWORD *)v3 + 4) = v6; *((_DWORD *)v3 + 7) = CDataStore::GetBits6((int)&v35, v7);// cursorName_len v8 = (char *)v3 + 180; *((_BYTE *)v3 + 56) = CDataStore::GetBit(&v35) != 0;// racial leader v9 = 4; do { LOBYTE(v38) = 0; v10 = CDataStore::GetBits11(v38); // name len LOBYTE(v37) = 0; v11 = v37; *(v8 - 12) = v10; *v8 = CDataStore::GetBits11(v11); // name alt len v8 += 3; --v9; } while ( v9 ); v12 = a2; v13 = (int)v3 + 128; v14 = 4; do { CDataStore::GetDynamicString(v12, *(_DWORD *)(v13 + 4), a3);// name CDataStore::GetDynamicString(v12, *(_DWORD *)(v13 + 52), a3);// name alt v13 += 12; --v14; } while ( v14 ); v15 = (int *)((char *)v39 + 96); v16 = 2; do { a2 = 0; CDataStore::GetInt32(&a2); // flags *v15 = a2; ++v15; --v16; } while ( v16 ); a2 = 0; CDataStore::GetInt32(&a2); // CreatureType v17 = v39; v18 = a2; a2 = 0; *((_DWORD *)v39 + 9) = v18; CDataStore::GetInt32(&a2); // CreatureFamily *((_DWORD *)v17 + 10) = a2; a2 = 0; CDataStore::GetInt32(&a2); // Classification *((_DWORD *)v17 + 11) = a2; v19 = 2; v20 = (int *)((char *)v17 + 104); do { a2 = 0; CDataStore::GetInt32(&a2); // ProxyCreatureID *v20 = a2; ++v20; --v19; } while ( v19 ); v21 = (int *)((char *)v39 + 112); v22 = 4; do { a2 = 0; CDataStore::GetInt32(&a2); // CreatureDisplayID *v21 = a2; ++v21; --v22; } while ( v22 ); a2 = 0; CDataStore::GetInt32(&a2); // float HpMulti v23 = (int)v39; v24 = a2; a2 = 0; *((_DWORD *)v39 + 12) = v24; CDataStore::GetInt32(&a2); // float EnergyMulti v25 = a2; a2 = 0; *(_DWORD *)(v23 + 52) = v25; CDataStore::GetInt32(&a2); // quest item cont v26 = v23 + 60; sub_60633B(a2); a2 = 0; CDataStore::GetInt32(&a2); // creatureMovementInfoID v27 = a2; a2 = 0; *(_DWORD *)(v23 + 80) = v27; CDataStore::GetInt32(&a2); // requireExpansion v28 = a2; a2 = 0; *(_DWORD *)(v23 + 84) = v28; CDataStore::GetInt32(&a2); // questFlag v29 = a2; a2 = 0; *(_DWORD *)(v23 + 88) = v29; CDataStore::GetInt32(&a2); // unk (legion) v30 = a3; v31 = *(_DWORD *)(v23 + 4); *(_DWORD *)(v23 + 92) = a2; CDataStore::GetDynamicString(v12, v31, v30); // title CDataStore::GetDynamicString(v12, *(_DWORD *)(v23 + 16), a3);// title alt CDataStore::GetDynamicString(v12, *(_DWORD *)(v23 + 28), a3);// cursor name v32 = 0; while ( 1 ) { result = *(_DWORD *)(v26 + 16); if ( result == -1 ) result = *(_DWORD *)v26; if ( v32 >= result ) break; a3 = 0; CDataStore::GetInt32(&a3); // QuestItem if ( *(_DWORD *)(v26 + 16) == -1 ) v34 = (int *)(*(_DWORD *)(v26 + 4) + 4 * v32); else v34 = (int *)(v26 + 4 * v32); ++v32; *v34 = a3; } return result; } |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Add Outdoor PvP handlers to various files | newsbot | CMaNGOS Commits | 0 | 18.08.2012 02:00 |
Cache | Nimlot | Новичкам | 1 | 23.07.2012 20:20 |
WDB Cache | Konctantin | Копаем клиент | 12 | 21.03.2011 11:59 |