Тема: QUEST_POI
Показать сообщение отдельно
Старый 25.03.2014, 17:24   #1
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию QUEST_POI

Сегодня запросил с сервера список всех 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;
}


Но вот прикол в том, что поменялось содержимое пакета.
Если раньше в пакете содержались координаты областей и т.п. то сейчас непонятно что:
Код:
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);
    }
}
__________________
Konctantin вне форума   Ответить с цитированием