Вся информация в этом посте уже есть в открытом доступе.
Всем привет, должен сказать что я совсем не профи а такой же пастер как ты, он, и вот тот чувак тоже
Поэтому не воспринимайте мой код как идеальный
Для начала достанем наши волшебные функции:
Дальше где-то в вашем CreateMove или где вы там делаете свой автофаер:
Получим текущее отклонение пули
Вычислим направление
Я делаю все легитно и просто жду когда разброс окажется на цели, проверяю как-то так:
Очевидно тут нужно больше проверок с m_pHitEntity но это уже не касается nospread`a
Если вы думаете что это все, то вынужден вас огорчить. Еще нужно произвести выстрел в правильный тайминг когда сервер вычисляет spread с тем же seed`ом что и мы, я на данный момент не знаю как это сделать на все 100% идеально чтобы миссов не было, поэтому не буду вам давать код с неправильными расчетами. И вообще я этот пост создал для того чтобы уважаемые знатоки подсказали мне и вам, как это сделать... пожалуйста
Речь идет о авто выстреле путем установки флага IN_ATTACK в CUserCmd::CInButtonState, CSGOUserCmdPB::set_attack1_start_history_index и т.д. ну вы поняли, остальные способы я даже не рассматривал
На самом деле проблема с автофаером не связана с nospread`ом (по крайней мере у меня), если добавить принты там где вызывается код выстрела то видно что часто код отрабатывает но выстрел не происходит, а иногда происходит. я долго этого не замечал потому что выстреливает в любом случае.
И не говорите что я дал нерабочий код и вообще нахуя я создал этот пост, он вполне попадает ноускопом с авп в прыжке даже без всяких проверок тиков клиента и сервера больше половины выстрелов
Всем привет, должен сказать что я совсем не профи а такой же пастер как ты, он, и вот тот чувак тоже
Поэтому не воспринимайте мой код как идеальный
Для начала достанем наши волшебные функции:
C++:
// 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++:
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++:
Vector_t vForward, vRight, vUp;
Math::AngleVectors(this->m_angCurrentAngle, &vForward, &vRight, &vUp);
Vector_t vDirection = vForward + (vRight * spread_x) + (vUp * spread_y);
Я делаю все легитно и просто жду когда разброс окажется на цели, проверяю как-то так:
C++:
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`ом (по крайней мере у меня), если добавить принты там где вызывается код выстрела то видно что часто код отрабатывает но выстрел не происходит, а иногда происходит. я долго этого не замечал потому что выстреливает в любом случае.
И не говорите что я дал нерабочий код и вообще нахуя я создал этот пост, он вполне попадает ноускопом с авп в прыжке даже без всяких проверок тиков клиента и сервера больше половины выстрелов
Последнее редактирование: