Автор Тема: Сущности.  (Прочитано 1821 раз)

Оффлайн Jak łaska za praca

  • Прохожий
  • *
  • Сообщений: 58
  • Репутация: +1/-0
  • Как украшение на торт
    • aktel999
    • Просмотр профиля
Сущности.
« : Декабрь 14, 2014, 01:18:07 pm »
Где можно найти класс работы с сущностями?
Это ведь нормально узнавать тип сущности сравнивая виртуальную таблицу класса?
« Последнее редактирование: Декабрь 14, 2014, 01:44:58 pm от Jak łaska za praca »
Украшаю торты на своих вечеринках, классных вечеринках.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +33/-0
    • Просмотр профиля
Re: Сущности.
« Ответ #1 : Декабрь 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. };

Оффлайн Jak łaska za praca

  • Прохожий
  • *
  • Сообщений: 58
  • Репутация: +1/-0
  • Как украшение на торт
    • aktel999
    • Просмотр профиля
Re: Сущности.
« Ответ #2 : Декабрь 14, 2014, 03:16:15 pm »
А сравнивать тип по _vtable религиозно ;D ?
Украшаю торты на своих вечеринках, классных вечеринках.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +33/-0
    • Просмотр профиля
Re: Сущности.
« Ответ #3 : Декабрь 14, 2014, 03:50:02 pm »
Зачем его сравнивать? Да это обычный указатель на виртуальную таблицу.

Оффлайн Jak łaska za praca

  • Прохожий
  • *
  • Сообщений: 58
  • Репутация: +1/-0
  • Как украшение на торт
    • aktel999
    • Просмотр профиля
Re: Сущности.
« Ответ #4 : Декабрь 14, 2014, 04:12:26 pm »
Ты подумал наверно про memcmp? Я хотел написать, узнать тип CPed или CVehicle, мне игра кажется это делает по другому, а может быть и так?
« Последнее редактирование: Декабрь 14, 2014, 07:52:27 pm от Jak łaska za praca »
Украшаю торты на своих вечеринках, классных вечеринках.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +57/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Сущности.
« Ответ #5 : Декабрь 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

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 174
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Сущности.
« Ответ #6 : Декабрь 15, 2014, 09:25:34 pm »
Вдогонку вопрос: можно по модели узнать, что она пед? Как проверить, что она авто я знаю.
I know everything and nothing...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +57/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Сущности.
« Ответ #7 : Декабрь 16, 2014, 05:39:26 am »
Не очень понятно, в каких случаях все это может понадобиться. Типа выхватил сущность из мира и смотришь, что с ней сделать. Может проще сразу использовать обращение к пулу машин 0xA0FDE4 и пулу педов 0x97F2AC и циклом обрабатывать весь существующий трафик.

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 174
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Сущности.
« Ответ #8 : Декабрь 16, 2014, 02:53:01 pm »
Дело не в этом, мне нужно осуществить перебор моделей от 0 до последней и так по циклу. Если модель пед то создать его и показать допустим на экране. Это нужно для добавления новых педов.
I know everything and nothing...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +57/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Сущности.
« Ответ #9 : Декабрь 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
« Последнее редактирование: Декабрь 16, 2014, 07:28:10 pm от xanser »

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 174
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Сущности.
« Ответ #10 : Декабрь 16, 2014, 06:04:27 pm »
Т.е. получается всего моделей в игре может быть 6500, плюс ограничение лимита. Это мне надо перейти к нужному адресу в массиве, потом прочитать его. По получившемуся адресу перейти по смещению 0x19 и затем вновь прочитать адрес. И если будет 7 значит это пед, так?
I know everything and nothing...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +57/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Сущности.
« Ответ #11 : Декабрь 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
« Последнее редактирование: Декабрь 16, 2014, 08:27:31 pm от xanser »