Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
ВопросBoneMatrix TF2 разные id костей у разных моделей
Крч ищу я позицию головы для игры на sourse движке и возник вопрос это нормально что у некоторых моделей id головы может отличаться? или я нахожу не верную матрицу
Почему кости разные хз, разрабы наворотили вот и ответ, но то что они разные - это факт, при чем они у всех наёмников разные :) Искать в тф2 что-то через чит енджин хз, а зачем? Исходный код уже давным давно на гитхабе лежит, client.dll/engine.dll и т.д. модули ничем не обфусцированы и не запротекчены, если и влетать в реверс + гейм хакинг, то лучше кандидата не найдется. А теперь к костям, смотрим, что по этому поводу есть в исходном коде на гитхабе:
C_BasePlayer.cpp.
Если полазить подольше, можно собрать всех покемонов, что собственно выглядит примерно так:
все айдишники костей:
int headIdx = LookupBone(player, "bip_head");
int neckIdx = LookupBone(player, "bip_neck");
int spineIdx = LookupBone(player, "bip_spine_2");
int pelvisIdx = LookupBone(player, "bip_pelvis");
int lShoulderIdx = LookupBone(player, "bip_upperArm_L");
int lElbowIdx = LookupBone(player, "bip_lowerArm_L");
int lHandIdx = LookupBone(player, "bip_hand_L");
int rShoulderIdx = LookupBone(player, "bip_upperArm_R");
int rElbowIdx = LookupBone(player, "bip_lowerArm_R");
int rHandIdx = LookupBone(player, "bip_hand_R");
int lHipIdx = LookupBone(player, "bip_hip_L");
int lKneeIdx = LookupBone(player, "bip_knee_L");
int lFootIdx = LookupBone(player, "bip_foot_L");
int rHipIdx = LookupBone(player, "bip_hip_R");
int rKneeIdx = LookupBone(player, "bip_knee_R");
int rFootIdx = LookupBone(player, "bip_foot_R");
Эх, как же хорошо было бы воспользоваться этой волшебной функцией удовольствия и заиметь у себя в арсенале все кости на всех классах в нужных местах.
О чудо, мы можем это сделать!!!! Ура ура ура
Заходим в IDA, вспоминаем, что ранее на скриншоте из C_BasePlayer.cpp мы видели LookupBone вместе со строчкой в аргументе "prp_hat" и недолго думая(вообще не думая) делаем грязюку:
- Жмем shift+F12 в IDA, либо же View -> Open subviews -> Strings
- Пишем волшебное слово:
- Переходим и:
Переменная в секции .rdata, нажав X по ней мы увидим все места, где она используется (xrefs)
В псевдокоде выглядит так:
Знакомый код, где-то я его уже видел -_-
Жму по этой сабке и что же я вижу
Найдите 10 отличий как говорится.
С помощью плагина Fusion для IDA беру паттерн этой функции:
[Fusion] 40 53 48 83 EC ? 48 8B DA E8 ? ? ? ? 48 8B C8 48 8B D3 48 83 C4 ? 5B E9 ? ? ? ? CC CC 48 89 74 24
Теперь можно покуралесить не по детски.
Заходим в наш си плус плус и колдуем:
Получаем кости:
//Определяем тип функции по аналогии с тем, что мы видели в IDA
typedef int(__fastcall* LookupBoneFn)(void* entity, const char* boneName);
extern LookupBoneFn pLookupBone;
//Находим вашу функцию, где вы сканируете паттерны, а есои нет такой, то создаем функцию и добавляем в неё
pLookupBone = (LookupBoneFn)PatternScan("client.dll", "40 53 48 83 EC ? 48 8B DA E8 ? ? ? ? 48 8B C8 48 8B D3 48 83 C4 ? 5B E9 ? ? ? ? CC CC 48 89 74 24");
//Теперь мы довольные можем получить индекс любой кости на любом наемнике по её названию
Крч ищу я позицию головы для игры на sourse движке и возник вопрос это нормально что у некоторых моделей id головы может отличаться? или я нахожу не верную матрицу Посмотреть вложение 325893
Честно говоря метод сверху выглядит как дерьмо для пастеров. Все нужные вам методы есть в c_baseanimating. Начиная от SetupBones, заканчивая вам нужным LookupBone.
Такой же прикол есть в гмоде, когда человек который делал модельку сильно под солями он может засунуть индекс головы модельки в ноги.