PDA

Просмотр полной версии : QUEST_POI


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);
}
}

LordJZ
25.03.2014, 17:51
вот как запрятали они сам обработчик (ну и гады близы, так извращаются):Это так компилятор switch оптимизирует.

Konctantin
25.03.2014, 19:34
Оптимизирует обучение вычитания в столбик. :)

Добавлено через 1 час 36 минут
Нашел QuestPOIPoints.dbc, вот часть его содержимого:

entry X Y poi_id
72756, 2148, -5252, 22280
72757, 2172, -1169, 22281
72759, -10499, -1158, 22283
72760, -9056, -461, 22284
72761, -8934, -137, 22285
72762, -8797, -259, 22286
72763, -8766, -253, 22286
72764, -8754, -193, 22286
72765, -8751, -160, 22286
72766, -8750, -115, 22286
72767, -8766, -93, 22286
72768, -8795, -117, 22286
72769, -8811, -217, 22286
72770, -8809, -234, 22286
72771, -8806, -244, 22286
72772, -8903, -163, 22287

Но это таблица с данными, где-то должна быть еще таблица связей.

Vai Konteh
27.03.2014, 06:28
Здравствуйте извените что не много не по теме, подскажите пожалуйста, как найти опкоды для квестов?
И еще вопрос я пытаюсь снифить трафик через Wireshark. И увидел различие между заголовками пакетов которые снифят самодельные сниферы и между заголовками пакетов которые снифит Wireshark. Вообщем различие такое к примеру пакет CMD_AUTH_LOGON_CHELLENGE имеет заголовок В 1 байт 0х00 или CMD_AUTH_LOGON_PROF 0x01 ,а у самодельных заголовок состоит из 2 байт почему?

acteros
29.03.2014, 00:54
Заголовки шифруются просто так ты с помощью Wireshark ты их не расшифруешь