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

Гайд Вычисляем Spread

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
15 Сен 2022
Сообщения
19
Реакции
2
Вся информация в этом посте уже есть в открытом доступе.

Всем привет, должен сказать что я совсем не профи а такой же пастер как ты, он, и вот тот чувак тоже
Поэтому не воспринимайте мой код как идеальный

Для начала достанем наши волшебные функции:
C++:
Expand Collapse Copy
// 48 89 5C 24 ? 57 48 81 EC ? ? ? ? F3 0F 10 0A @client.dll
inline unsigned int(__fastcall* fnGetHashSeed)(void* a1, QAngle_t* angle, std::uint32_t nPlayerTickCount);

// 48 8B C4 48 89 58 08 48 89 68 18 48 89 70 20 57 41 54 41 55 41 56 41 57 48 81 @client.dll
inline void(__fastcall* fnCalculateSpreadAngle)(int16_t, int, int, std::uint32_t, float, float, float, float*, float*);

Дальше где-то в вашем CreateMove или где вы там делаете свой автофаер:
Получим текущее отклонение пули
C++:
Expand Collapse Copy
auto seed = fnGetHashSeed(nullptr, &this->m_angCurrentAngle, G::m_pLocalPlayerController->m_nTickBase());

float spread_x, spread_y;
fnCalculateSpreadAngle(
    G::m_pLocalActiveWeapon->m_AttributeManager().m_Item().m_iItemDefinitionIndex(),
    G::m_pLocalActiveWeapon->Data()->m_nNumBullets(),
    1,
    seed + 1,
    G::m_pLocalActiveWeapon->GetInaccuracy(),
    G::m_pLocalActiveWeapon->GetSpread(),
    G::m_pLocalActiveWeapon->m_flRecoilIndex(),
    &spread_x, &spread_y
);

Вычислим направление
C++:
Expand Collapse Copy
Vector_t vForward, vRight, vUp;
Math::AngleVectors(this->m_angCurrentAngle, &vForward, &vRight, &vUp);

Vector_t vDirection = vForward + (vRight * spread_x) + (vUp * spread_y);

Я делаю все легитно и просто жду когда разброс окажется на цели, проверяю как-то так:
C++:
Expand Collapse Copy
Vector_t vEndPos = G::m_vShootPos + (vDirection * G::m_pLocalActiveWeapon->Data()->m_flRange());

TraceFilter_t filter{ 0x1C3003u, G::m_pLocalPlayerPawn, 0, 4 };
Ray_t ray = Ray_t();
GameTrace_t trace = GameTrace_t();

I::GameTraceManager->TraceShape(&ray, G::m_vShootPos, vEndPos, &filter, &trace);

if (!(trace.m_pHitEntity && trace.m_pHitEntity->IsPlayerPawn()))
    return;

Очевидно тут нужно больше проверок с m_pHitEntity но это уже не касается nospread`a

Если вы думаете что это все, то вынужден вас огорчить. Еще нужно произвести выстрел в правильный тайминг когда сервер вычисляет spread с тем же seed`ом что и мы, я на данный момент не знаю как это сделать на все 100% идеально чтобы миссов не было, поэтому не буду вам давать код с неправильными расчетами. И вообще я этот пост создал для того чтобы уважаемые знатоки подсказали мне и вам, как это сделать... пожалуйста

Речь идет о авто выстреле путем установки флага IN_ATTACK в CUserCmd::CInButtonState, CSGOUserCmdPB::set_attack1_start_history_index и т.д. ну вы поняли, остальные способы я даже не рассматривал
На самом деле проблема с автофаером не связана с nospread`ом (по крайней мере у меня), если добавить принты там где вызывается код выстрела то видно что часто код отрабатывает но выстрел не происходит, а иногда происходит. я долго этого не замечал потому что выстреливает в любом случае.

И не говорите что я дал нерабочий код и вообще нахуя я создал этот пост, он вполне попадает ноускопом с авп в прыжке даже без всяких проверок тиков клиента и сервера больше половины выстрелов
 
Последнее редактирование:
Вся информация в этом посте уже есть в открытом доступе.

Те кто будет говорить что это называется не Nospread или любую хуйню которая не касается технической части могут сразу пойти нахуй.

Всем привет, должен сказать что я совсем не профи а такой же пастер как ты, он, и вот тот чувак тоже
Поэтому не воспринимайте мой код как идеальный

Для начала достанем наши волшебные функции:
C++:
Expand Collapse Copy
// 48 89 5C 24 ? 57 48 81 EC ? ? ? ? F3 0F 10 0A @client.dll
inline unsigned int(__fastcall* fnGetHashSeed)(void* a1, QAngle_t* angle, std::uint32_t nPlayerTickCount);

// 48 8B C4 48 89 58 08 48 89 68 18 48 89 70 20 57 41 54 41 55 41 56 41 57 48 81 @client.dll
inline void(__fastcall* fnCalculateSpreadAngle)(int16_t, int, int, std::uint32_t, float, float, float, float*, float*);

Дальше где-то в вашем CreateMove или где вы там делаете свой автофаер:
Получим текущее отклонение пули
C++:
Expand Collapse Copy
auto seed = fnGetHashSeed(nullptr, &this->m_angCurrentAngle, G::m_pLocalPlayerController->m_nTickBase());

float spread_x, spread_y;
fnCalculateSpreadAngle(
    G::m_pLocalActiveWeapon->m_AttributeManager().m_Item().m_iItemDefinitionIndex(),
    G::m_pLocalActiveWeapon->Data()->m_nNumBullets(),
    1,
    seed + 1,
    G::m_pLocalActiveWeapon->GetInaccuracy(),
    G::m_pLocalActiveWeapon->GetSpread(),
    G::m_pLocalActiveWeapon->m_flRecoilIndex(),
    &spread_x, &spread_y
);

Вычислим направление
C++:
Expand Collapse Copy
Vector_t vForward, vRight, vUp;
Math::AngleVectors(this->m_angCurrentAngle, &vForward, &vRight, &vUp);

Vector_t vDirection = vForward + (vRight * spread_x) + (vUp * spread_y);

Я делаю все легитно и просто жду когда разброс окажется на цели, проверяю как-то так:
C++:
Expand Collapse Copy
Vector_t vEndPos = G::m_vShootPos + (vDirection * G::m_pLocalActiveWeapon->Data()->m_flRange());

TraceFilter_t filter{ 0x1C3003u, G::m_pLocalPlayerPawn, 0, 4 };
Ray_t ray = Ray_t();
GameTrace_t trace = GameTrace_t();

I::GameTraceManager->TraceShape(&ray, G::m_vShootPos, vEndPos, &filter, &trace);

if (!(trace.m_pHitEntity && trace.m_pHitEntity->IsPlayerPawn()))
    return;

Очевидно тут нужно больше проверок с m_pHitEntity но это уже не касается nospread`a

Если вы думаете что это все, то вынужден вас огорчить. Еще нужно произвести выстрел в правильный тайминг когда сервер вычисляет spread с тем же seed`ом что и мы, я на данный момент не знаю как это сделать на все 100% идеально чтобы миссов не было, поэтому не буду вам давать код с неправильными расчетами. И вообще я этот пост создал для того чтобы уважаемые знатоки подсказали мне и вам, как это сделать... пожалуйста

Речь идет о авто выстреле путем установки флага IN_ATTACK в CUserCmd::CInButtonState, CSGOUserCmdPB::set_attack1_start_history_index и т.д. ну вы поняли, остальные способы я даже не рассматривал
На самом деле проблема с автофаером не связана с nospread`ом (по крайней мере у меня), если добавить принты там где вызывается код выстрела то видно что часто код отрабатывает но выстрел не происходит, а иногда происходит. я долго этого не замечал потому что выстреливает в любом случае.

И не говорите что я дал нерабочий код и вообще нахуя я создал этот пост, он вполне попадает ноускопом с авп в прыжке даже без всяких проверок тиков клиента и сервера больше половины выстрелов
Гайд интересный но это сид триггер
 
По сути, это сид триггер, но для тех кто шарит время не займет переделать под нс, вообще легко, вычисляем просто куда полетит пуля, и двигаем прицел в противоположную сторону для этой пули, и у нас все летит в голову, тот же принцип что и сало
 
По сути, это сид триггер, но для тех кто шарит время не займет переделать под нс, вообще легко, вычисляем просто куда полетит пуля, и двигаем прицел в противоположную сторону для этой пули, и у нас все летит в голову, тот же принцип что и сало
сид меняется от углов
 
Назад
Сверху Снизу