GTA Builder Форум

GTA Vice City => Общие вопросы => Тема начата: Jak łaska za praca от Декабрь 14, 2014, 01:18:07 pm

Название: Сущности.
Отправлено: Jak łaska za praca от Декабрь 14, 2014, 01:18:07 pm
Где можно найти класс работы с сущностями?
Это ведь нормально узнавать тип сущности сравнивая виртуальную таблицу класса?
Название: Re: Сущности.
Отправлено: Sektor от Декабрь 14, 2014, 02:09:47 pm
Код: C++
  1. struct CEntity {
  2.   int _vtable;
  3.   CPlaceable m_Coors;
  4.   RwObject *m_pRwObject;
  5.   BYTE flags;
  6.   BYTE type;
  7.   BYTE field_52;
  8.   BYTE field_53;
  9.   BYTE field_54;
  10.   BYTE field_55;
  11.   char gap_56[2];
  12.   WORD field_58;
  13.   WORD field_5A;
  14.   WORD m_wModelIndex;
  15.   BYTE buildingIsland;
  16.   BYTE interior;
  17.   DWORD pReference;
  18. };
Название: Re: Сущности.
Отправлено: Jak łaska za praca от Декабрь 14, 2014, 03:16:15 pm
А сравнивать тип по _vtable религиозно ;D ?
Название: Re: Сущности.
Отправлено: Sektor от Декабрь 14, 2014, 03:50:02 pm
Зачем его сравнивать? Да это обычный указатель на виртуальную таблицу.
Название: Re: Сущности.
Отправлено: Jak łaska za praca от Декабрь 14, 2014, 04:12:26 pm
Ты подумал наверно про memcmp? Я хотел написать, узнать тип CPed или CVehicle, мне игра кажется это делает по другому, а может быть и так?
Название: Re: Сущности.
Отправлено: xanser от Декабрь 14, 2014, 06:55:34 pm
В игре проверка на тип сущности выглядит примерно так if ( (Entity.flags & 7) == 3), 3-ка это CPed, 2-ка CVehicle. Это можно увидеть например в функции 0x5CCF90 CWeapon::FireProjectile, где идет проверка, кто выпустил ракету, игрок или транспорт (hunter). Это подтверждает и комментарий в описании структуры CEntity к flags ;low 3 bits - entity type: 1 - CBuilding, 2 - CVehicle, 3 - CPed, 4 - CObject, 5 - CDummy
Название: Re: Сущности.
Отправлено: mfisto от Декабрь 15, 2014, 09:25:34 pm
Вдогонку вопрос: можно по модели узнать, что она пед? Как проверить, что она авто я знаю.
Название: Re: Сущности.
Отправлено: xanser от Декабрь 16, 2014, 05:39:26 am
Не очень понятно, в каких случаях все это может понадобиться. Типа выхватил сущность из мира и смотришь, что с ней сделать. Может проще сразу использовать обращение к пулу машин 0xA0FDE4 и пулу педов 0x97F2AC и циклом обрабатывать весь существующий трафик.
Название: Re: Сущности.
Отправлено: mfisto от Декабрь 16, 2014, 02:53:01 pm
Дело не в этом, мне нужно осуществить перебор моделей от 0 до последней и так по циклу. Если модель пед то создать его и показать допустим на экране. Это нужно для добавления новых педов.
Название: Re: Сущности.
Отправлено: xanser от Декабрь 16, 2014, 03:45:25 pm
Тогда можно так, в игре массив указателей на 6500 моделей тут 0x92D4C8, тип указателей CBaseModelInfo, посмотри его структуру, там есть +0x19 m_ModelType.
Он, как я понял, показывает номера секций из ide файлов, у меня при прогоне всех моделей выдал такие номера:
1 - objs
2 - нет
3 - tobj
4 - weap (weapon)
5 - hier
6 - cars (id 130-236)
7 - peds (id 0-129)
То есть тип моделей педов получается 7
Название: Re: Сущности.
Отправлено: mfisto от Декабрь 16, 2014, 06:04:27 pm
Т.е. получается всего моделей в игре может быть 6500, плюс ограничение лимита. Это мне надо перейти к нужному адресу в массиве, потом прочитать его. По получившемуся адресу перейти по смещению 0x19 и затем вновь прочитать адрес. И если будет 7 значит это пед, так?
Название: Re: Сущности.
Отправлено: xanser от Декабрь 16, 2014, 07:11:34 pm
Вроде да, попробуй так, хотя лучше структуру или класс описать. Последний id я нашел 4684, а 6500 это лимит.

Код: C++
  1. #pragma pack (push, 1)
  2. struct CBaseModelInfo
  3. {
  4. /*0x000*/       char    _000[0x019-0x000];
  5. /*0x019*/       BYTE    type;
  6. /*0x01A*/       char    _01A[0x02C-0x01A];
  7. /*0x02C*/      
  8. };
  9. #pragma pack (pop)
  10.  
  11. auto Model = (CBaseModelInfo**)0x92D4C8;
  12. for (int i=0; i<6500; i++)
  13.     if (Model[i])
  14.         switch (Model[i]->type)
  15.         {
  16.             case 1:
  17.                 // objs
  18.                 break;
  19.             case 3:
  20.                 // tobj
  21.                 break;
  22.             case 4:
  23.                 // weap
  24.                 break;
  25.             case 5:
  26.                 // hier
  27.                 break;
  28.             case 6:
  29.                 // cars
  30.                 break;
  31.             case 7:
  32.                 // peds
  33.                 break;
  34.             default:
  35.                 break;
  36.         }
  37.     else
  38.         // i - это свободный id