Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос BoneMatrix TF2 разные id костей у разных моделей

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Фев 2025
Сообщения
67
Реакции
1
Крч ищу я позицию головы для игры на sourse движке и возник вопрос это нормально что у некоторых моделей id головы может отличаться? или я нахожу не верную матрицу
1769507382684.png
 
у негра голова находится по другому тоесть у всех норм ебальники у негра отличается поэтому да это нормис
А почему в кс у каждой модели тогда одинаковый id костей
 
Почему кости разные хз, разрабы наворотили вот и ответ, но то что они разные - это факт, при чем они у всех наёмников разные :) Искать в тф2 что-то через чит енджин хз, а зачем? Исходный код уже давным давно на гитхабе лежит, client.dll/engine.dll и т.д. модули ничем не обфусцированы и не запротекчены, если и влетать в реверс + гейм хакинг, то лучше кандидата не найдется. А теперь к костям, смотрим, что по этому поводу есть в исходном коде на гитхабе:
C_BasePlayer.cpp.
1769578662183.png
1769578699085.png

Если полазить подольше, можно собрать всех покемонов, что собственно выглядит примерно так:
все айдишники костей:
Expand Collapse Copy
    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
1769579330655.png

- Пишем волшебное слово:
1769579371230.png

- Переходим и:
1769579393552.png

Переменная в секции .rdata, нажав X по ней мы увидим все места, где она используется (xrefs)
1769579436859.png

В псевдокоде выглядит так:
1769579472272.png

Знакомый код, где-то я его уже видел -_-
Жму по этой сабке и что же я вижу
1769579727801.png
1769579767631.png

Найдите 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
Теперь можно покуралесить не по детски.
Заходим в наш си плус плус и колдуем:

Получаем кости:
Expand Collapse Copy
//Определяем тип функции по аналогии с тем, что мы видели в 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.

Такой же прикол есть в гмоде, когда человек который делал модельку сильно под солями он может засунуть индекс головы модельки в ноги.
 
Последнее редактирование:
Назад
Сверху Снизу