Автор Тема: CarRec  (Прочитано 2399 раз)

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: CarRec
« Ответ #15 : Июнь 27, 2017, 07:25:51 pm »
Спасибо, будет от чего отталкиваться. А про углы поворота костей(чтение и запись) случаем что-нибудь знаешь? Как ты реализовал в "First Person View" повороты рук при "выглядывании из окна" автомобиля?
Дело в том, что чтение/запись поворота костей было бы в сотни раз лучше, чем работать с анимациями. Можно было бы запилить эпичнейшие вещи...

Код: C++
  1. #pragma pack(push, 1)
  2. struct gtaHAnimIFrame
  3. {
  4.         int unk0;
  5.         int unk1;
  6.         RtQuat Quat;
  7.         RwV3d Pos;
  8. };
  9. #pragma pack(pop)
  10.  
  11. #pragma pack(push, 1)
  12. struct CBone
  13. {
  14.         unsigned int m_bFlags;
  15.         RwV3d m_vOffset;
  16.         gtaHAnimIFrame *AnimFrame;
  17.         unsigned int m_dwNodeId;
  18. };
  19. #pragma pack(pop)
  20.  
  21. CBone *GetPedBone(CPed *ped, DWORD bone)
  22. {
  23.         bone = RpHAnimIDGetIndex(Game::GetAnimHierarchyFromSkinClump(ped->m_pRwObject), bone);
  24.         return (CBone *)(*(int *)(*(int *)((int)ped->m_pRwObject + *Game::ClumpOffset) + 0x10) + bone * 0x18);
  25. }
Вращать по квартерниону из поля Quat структуры gtaHAnimIFrame.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: CarRec
« Ответ #16 : Июнь 27, 2017, 10:03:14 pm »
Правильно ли я понимаю, что сначала нужно найти адрес иерархии костей педа с помощью GetAnimHierarchyFromSkinClump,
потом адрес конкретной кости с помощью RpHAnimIDGetIndex,
а потом кватернионы по смещению 0x02?
Функции я найду в базе, но немного не понятно происходящее в коде.

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: CarRec
« Ответ #17 : Июнь 28, 2017, 06:46:08 am »
...а потом кватернионы по смещению 0x02?
Функции я найду в базе, но немного не понятно происходящее в коде.
Не совсем.  Потом нужно сместиться по такой траектории:
Код: C++
  1. return (CBone *)(*(int *)(*(int *)((int)ped->m_pRwObject + *Game::ClumpOffset) + 0x10) + bone * 0x18);
Где bone это уже не номер кости, который мы передали в функцию, а результат этого присваивания:
Код: C++
  1. bone = RpHAnimIDGetIndex(Game::GetAnimHierarchyFromSkinClump(ped->m_pRwObject), bone);

Это мы нашли CBone. Дальше, чтобы добраться до квартерниона кости, нужно сместиться так CBone->AnimFrame.Quat, а до смещения - CBone->AnimFrame.Pos.
« Последнее редактирование: Июнь 28, 2017, 08:11:00 am от GeniusZ »

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: CarRec
« Ответ #18 : Июнь 29, 2017, 02:44:23 pm »
Не совсем.  Потом нужно сместиться по такой траектории:
Код: C++
  1. return (CBone *)(*(int *)(*(int *)((int)ped->m_pRwObject + *Game::ClumpOffset) + 0x10) + bone * 0x18);
Вот эту запись я и не до конца понял.
*Game::ClumpOffset - это что за адрес?
Я просто собираюсь делать PedRec, как и CarRec, т.е. на CLEO, а там нужно знать конкретные адреса. Со всем остальным вроде проблем не возникнет(посмотрю в IDA адреса функций и тут - оффсеты), а вещи вроде "*Game::ClumpOffset" непонятно, откуда взять(SDK у меня не "встанет" на VS 2010)
« Последнее редактирование: Июнь 29, 2017, 02:48:17 pm от Shagg_E »

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: CarRec
« Ответ #19 : Июнь 29, 2017, 06:39:08 pm »
Код: C++
  1. unsigned int* ClumpOffset = (unsigned int*)0x978798;

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: CarRec
« Ответ #20 : Июнь 29, 2017, 08:04:59 pm »
Спасибо :)

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: CarRec
« Ответ #21 : Июль 02, 2017, 07:44:59 am »
GeniusZ> окей, у меня получилось прочитать кватернионы и позицию(правда, пришлось использовать смещение RpClump, а не RwObject - иначе не работало), но когда я пытаюсь задать какой-нибудь кватернион или позицию для кости - ничего не происходит, словно стоит какой-то блок на изменение поворота и позиции кости. Что это может быть? Нужно ли как-то отключать для педа "обновление анимации" или что-то вроде того? Или нужно задавать вращение как-то иначе, а не просто записывая значения в те же адреса, из которых они читаются?
« Последнее редактирование: Июль 02, 2017, 07:48:52 am от Shagg_E »

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: CarRec
« Ответ #22 : Июль 02, 2017, 07:55:14 am »
Дело в том, что скрипты обрабатываются раньше, чем анимация. Из-за этого игра переписывает значения кости анимацией.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: CarRec
« Ответ #23 : Июль 02, 2017, 07:58:44 am »
Дело в том, что скрипты обрабатываются раньше, чем анимация. Из-за этого игра переписывает значения кости анимацией.
Т.е. выхода из данной ситуации нет?(если говорить о написании сего именно в CLEO)

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: CarRec
« Ответ #24 : Июль 02, 2017, 02:45:00 pm »
Конечно есть. Можно написать dll, которая внедряет процедуру поворота костей и содержит функции, через которые можно манипулировать этой процедурой через CLEO. Или можно написать ассемблерную вставку и внедрить ее в нужное место.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: CarRec
« Ответ #25 : Июль 03, 2017, 02:18:14 pm »
Ой, ну как всегда: стоит мне подумать, что какая-то вещь вполне себе легко осуществима - и она оказывается самой сложной.
Как бы я не изворачивался(откопал кучу адресов, которые, как я думал, помогут мне с этой проблемой) - ничего путного стандартными средствами CLEO не выходило.

Окей, плагин так плагин...
« Последнее редактирование: Июль 03, 2017, 02:21:49 pm от Shagg_E »