Разбирая структуру кеша обнаружил что
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;
}