Konctantin
25.03.2014, 17:24
Сегодня запросил с сервера список всех QUEST_POI.
Отсылал такие пакеты:
Packet:CMSG (0x16B8) CMSG_QUEST_POI_QUERY, Data size: 7
|---------------------------------------------------------------------------|
| OFFSET | 0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
|----------------------------------------------------------|----------------|
|00000000| 00 00 04 BD 0C 00 00 -- -- -- -- -- -- -- -- -- |................|
|----------------------------------------------------------|----------------|
В ответ приходили такие пакеты:
Если данных нет, то приходит 3 байта:
Packet:SMSG (0x0957) SMSG_QUEST_POI_QUERY_RESPONSE, Data size: 3
|---------------------------------------------------------------------------|
| OFFSET | 0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
|----------------------------------------------------------|----------------|
|00000000| 00 00 00 -- -- -- -- -- -- -- -- -- -- -- -- -- |................|
|----------------------------------------------------------|----------------|
Иначе вот так, других пакетов не нашел, надо выгрузить все и поискать, но пока лень:
Packet:SMSG (0x0957) SMSG_QUEST_POI_QUERY_RESPONSE, Data size: 14
|---------------------------------------------------------------------------|
| OFFSET | 0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
|----------------------------------------------------------|----------------|
|00000000| 00 00 08 00 00 20 3B 0D 00 00 BD 0C 00 00 -- -- |..... ;.........|
|----------------------------------------------------------|----------------|
Нашел для них такой обработчик:
unsigned int __thiscall sub_6B760F(void *this, int a2, int a3)
{
void *v3; // esi@1
unsigned int v4; // eax@1
unsigned int result; // eax@1
int v6; // eax@3
int v7; // edi@4
int v8; // eax@5
int v9; // eax@6
int v10; // ecx@6
int v11; // eax@7
int v12; // [sp+14h] [bp-Ch]@1
unsigned int v13; // [sp+18h] [bp-8h]@1
int v14; // [sp+1Ch] [bp-4h]@2
LOBYTE(v12) = 0;
v3 = this;
v4 = CDataStore__Read21Bits(v12);
sub_6B718B((char *)v3 + 16, v4);
result = 0;
v13 = 0;
if ( *((_DWORD *)v3 + 4) )
{
v14 = 0;
do
{
LOBYTE(v12) = 0;
v6 = CDataStore__Read22Bits(v12);
CDataStore__StoreAndCheck22Bits_0(v6);
++v13;
result = v13;
v14 += 20;
}
while ( v13 < *((_DWORD *)v3 + 4) );
}
v7 = 0;
v13 = 0;
if ( *((_DWORD *)v3 + 4) )
{
do
{
v8 = *((_DWORD *)v3 + 5);
v12 = 0;
if ( *(_DWORD *)(v7 + v8 + 4) )
{
do
{
v14 = 0;
CDataStore__GetInt32(&v14);
v9 = v12;
*(_DWORD *)(*(_DWORD *)(v7 + *((_DWORD *)v3 + 5) + 8) + 4 * v12) = v14;
v10 = *((_DWORD *)v3 + 5);
v12 = v9 + 1;
}
while ( (unsigned int)(v9 + 1) < *(_DWORD *)(v7 + v10 + 4) );
}
v12 = 0;
CDataStore__GetInt32(&v12);
v11 = *((_DWORD *)v3 + 5);
++v13;
*(_DWORD *)(v7 + v11) = v12;
result = v13;
v7 += 20;
}
while ( v13 < *((_DWORD *)v3 + 4) );
}
return result;
}
вот как запрятали они сам обработчик (ну и гады близы, так извращаются):
if ( v5 == 340 )
{
sub_6BAE5F(this, a2, a5, a3);
sub_6AE9EC(&v43);
CDataStore__ReleasePacket2(&v43);
return 1;
}
v17 = v5 - 253;// 267-253=14
if ( !v17 )
{
sub_6B64C1(this, a2, a5, a3);
sub_6AED50(&v40);
sub_6B1710(&v40);
return 1;
}
v18 = v17 - 14;//267 SMSG_QUEST_POI_RESPONSE
if ( !v18 )
{
sub_6B9574(this, a2, a5, a3);
sub_6AF2AA(&v40);
sub_6B5C71(&v40);
return 1;
}
Ну да ладно, фиг с ними.
Но вот прикол в том, что поменялось содержимое пакета.
Если раньше в пакете содержались координаты областей и т.п. то сейчас непонятно что:
QuestCount: 1
Block_0 size: 1
Unk_0_0: 3387
Quest_0 Id: 3261
Подозреваю что сами POI хранятся в другом месте а Unk_0_0: 3387 это ID записи.
Но вот что и где, не знаю.
ЗЫ. Запрашивал POI так:
#define CMSG_QUEST_POI_QUERY 0x16B8 // opcode
#define CLIENT_SERVICES_SEND2 0x8F9A
#define CDATA_STORE_V_TABLE 0x9298F0
// proto
typedef void(__stdcall *Send2)(CDataStore *pData);
void SendQuestPOIQuery(int max_entry)
{
CDataStore packet = { (void*)(baseAddress + CDATA_STORE_V_TABLE) };
for (int entry = 1; entry < max_entry; ++entry)
{
packet.Init(4 + 3 + 4);
// write opcode
*(DWORD*)(packet.buffer + 0) = CMSG_QUEST_POI_QUERY;
*(BYTE*)(packet.buffer + 4) = 0;
*(BYTE*)(packet.buffer + 5) = 0;
*(BYTE*)(packet.buffer + 6) = 1 << 2; // 22 bits
*(DWORD*)(packet.buffer + 7) = entry;
printf("Send packet CMSG_QUEST_POI_QUERY, entry %i\n", entry);
Send2(baseAddress + CLIENT_SERVICES_SEND2)(&packet);
free(packet.buffer);
Sleep(50);
}
}
Отсылал такие пакеты:
Packet:CMSG (0x16B8) CMSG_QUEST_POI_QUERY, Data size: 7
|---------------------------------------------------------------------------|
| OFFSET | 0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
|----------------------------------------------------------|----------------|
|00000000| 00 00 04 BD 0C 00 00 -- -- -- -- -- -- -- -- -- |................|
|----------------------------------------------------------|----------------|
В ответ приходили такие пакеты:
Если данных нет, то приходит 3 байта:
Packet:SMSG (0x0957) SMSG_QUEST_POI_QUERY_RESPONSE, Data size: 3
|---------------------------------------------------------------------------|
| OFFSET | 0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
|----------------------------------------------------------|----------------|
|00000000| 00 00 00 -- -- -- -- -- -- -- -- -- -- -- -- -- |................|
|----------------------------------------------------------|----------------|
Иначе вот так, других пакетов не нашел, надо выгрузить все и поискать, но пока лень:
Packet:SMSG (0x0957) SMSG_QUEST_POI_QUERY_RESPONSE, Data size: 14
|---------------------------------------------------------------------------|
| OFFSET | 0 1 2 3 4 5 6 7 8 9 A B C D E F |0123456789ABCDEF|
|----------------------------------------------------------|----------------|
|00000000| 00 00 08 00 00 20 3B 0D 00 00 BD 0C 00 00 -- -- |..... ;.........|
|----------------------------------------------------------|----------------|
Нашел для них такой обработчик:
unsigned int __thiscall sub_6B760F(void *this, int a2, int a3)
{
void *v3; // esi@1
unsigned int v4; // eax@1
unsigned int result; // eax@1
int v6; // eax@3
int v7; // edi@4
int v8; // eax@5
int v9; // eax@6
int v10; // ecx@6
int v11; // eax@7
int v12; // [sp+14h] [bp-Ch]@1
unsigned int v13; // [sp+18h] [bp-8h]@1
int v14; // [sp+1Ch] [bp-4h]@2
LOBYTE(v12) = 0;
v3 = this;
v4 = CDataStore__Read21Bits(v12);
sub_6B718B((char *)v3 + 16, v4);
result = 0;
v13 = 0;
if ( *((_DWORD *)v3 + 4) )
{
v14 = 0;
do
{
LOBYTE(v12) = 0;
v6 = CDataStore__Read22Bits(v12);
CDataStore__StoreAndCheck22Bits_0(v6);
++v13;
result = v13;
v14 += 20;
}
while ( v13 < *((_DWORD *)v3 + 4) );
}
v7 = 0;
v13 = 0;
if ( *((_DWORD *)v3 + 4) )
{
do
{
v8 = *((_DWORD *)v3 + 5);
v12 = 0;
if ( *(_DWORD *)(v7 + v8 + 4) )
{
do
{
v14 = 0;
CDataStore__GetInt32(&v14);
v9 = v12;
*(_DWORD *)(*(_DWORD *)(v7 + *((_DWORD *)v3 + 5) + 8) + 4 * v12) = v14;
v10 = *((_DWORD *)v3 + 5);
v12 = v9 + 1;
}
while ( (unsigned int)(v9 + 1) < *(_DWORD *)(v7 + v10 + 4) );
}
v12 = 0;
CDataStore__GetInt32(&v12);
v11 = *((_DWORD *)v3 + 5);
++v13;
*(_DWORD *)(v7 + v11) = v12;
result = v13;
v7 += 20;
}
while ( v13 < *((_DWORD *)v3 + 4) );
}
return result;
}
вот как запрятали они сам обработчик (ну и гады близы, так извращаются):
if ( v5 == 340 )
{
sub_6BAE5F(this, a2, a5, a3);
sub_6AE9EC(&v43);
CDataStore__ReleasePacket2(&v43);
return 1;
}
v17 = v5 - 253;// 267-253=14
if ( !v17 )
{
sub_6B64C1(this, a2, a5, a3);
sub_6AED50(&v40);
sub_6B1710(&v40);
return 1;
}
v18 = v17 - 14;//267 SMSG_QUEST_POI_RESPONSE
if ( !v18 )
{
sub_6B9574(this, a2, a5, a3);
sub_6AF2AA(&v40);
sub_6B5C71(&v40);
return 1;
}
Ну да ладно, фиг с ними.
Но вот прикол в том, что поменялось содержимое пакета.
Если раньше в пакете содержались координаты областей и т.п. то сейчас непонятно что:
QuestCount: 1
Block_0 size: 1
Unk_0_0: 3387
Quest_0 Id: 3261
Подозреваю что сами POI хранятся в другом месте а Unk_0_0: 3387 это ID записи.
Но вот что и где, не знаю.
ЗЫ. Запрашивал POI так:
#define CMSG_QUEST_POI_QUERY 0x16B8 // opcode
#define CLIENT_SERVICES_SEND2 0x8F9A
#define CDATA_STORE_V_TABLE 0x9298F0
// proto
typedef void(__stdcall *Send2)(CDataStore *pData);
void SendQuestPOIQuery(int max_entry)
{
CDataStore packet = { (void*)(baseAddress + CDATA_STORE_V_TABLE) };
for (int entry = 1; entry < max_entry; ++entry)
{
packet.Init(4 + 3 + 4);
// write opcode
*(DWORD*)(packet.buffer + 0) = CMSG_QUEST_POI_QUERY;
*(BYTE*)(packet.buffer + 4) = 0;
*(BYTE*)(packet.buffer + 5) = 0;
*(BYTE*)(packet.buffer + 6) = 1 << 2; // 22 bits
*(DWORD*)(packet.buffer + 7) = entry;
printf("Send packet CMSG_QUEST_POI_QUERY, entry %i\n", entry);
Send2(baseAddress + CLIENT_SERVICES_SEND2)(&packet);
free(packet.buffer);
Sleep(50);
}
}