diff --git a/TempleWare-CS2/source/templeware/config/config.cpp b/TempleWare-CS2/source/templeware/config/config.cpp index ae877a9..77abe2e 100644 --- a/TempleWare-CS2/source/templeware/config/config.cpp +++ b/TempleWare-CS2/source/templeware/config/config.cpp @@ -81,4 +81,5 @@ namespace Config { bool always_on_silent_aim = false; float silent_aim_smooth_slider = 0.0f; // Новый параметр для ползунка смуза bool silent_shooterAfterAim = false; // Аналог shooterAfterAim для сайлент аимбота + bool silent_rage = false; // По умолчанию выключен } diff --git a/TempleWare-CS2/source/templeware/config/config.h b/TempleWare-CS2/source/templeware/config/config.h index b4709b3..52f4abc 100644 --- a/TempleWare-CS2/source/templeware/config/config.h +++ b/TempleWare-CS2/source/templeware/config/config.h @@ -88,4 +88,5 @@ namespace Config { extern bool always_on_silent_aim; extern float silent_aim_smooth_slider; // Новый параметр для ползунка смуза extern bool silent_shooterAfterAim; // Аналог shooterAfterAim для сайлент аимбота + extern bool silent_rage; // Включает постоянный поиск цели (rage-режим) } diff --git a/TempleWare-CS2/source/templeware/config/configmanager.h b/TempleWare-CS2/source/templeware/config/configmanager.h index b70f299..24703d6 100644 --- a/TempleWare-CS2/source/templeware/config/configmanager.h +++ b/TempleWare-CS2/source/templeware/config/configmanager.h @@ -136,6 +136,7 @@ namespace internal_config j["triggerbot_key"] = Config::triggerbot_key; j["triggerbot_alt_key"] = Config::triggerbot_alt_key; j["triggerbot_delay"] = Config::triggerbot_delay; + j["silent_rage"] = Config::silent_rage; j["enemyChamsInvisible"] = Config::enemyChamsInvisible; j["enemyChams"] = Config::enemyChams; @@ -252,6 +253,7 @@ namespace internal_config Config::triggerbot_key = j.value("triggerbot_key", 0x05); Config::triggerbot_alt_key = j.value("triggerbot_alt_key", 0x06); Config::triggerbot_delay = j.value("triggerbot_delay", 0.0f); + Config::silent_rage = j.value("silent_rage", false); Config::antiflash = j.value("antiflash", false); diff --git a/TempleWare-CS2/source/templeware/features/aim/CUserCmd.h b/TempleWare-CS2/source/templeware/features/aim/CUserCmd.h index e030e48..1e862a6 100644 --- a/TempleWare-CS2/source/templeware/features/aim/CUserCmd.h +++ b/TempleWare-CS2/source/templeware/features/aim/CUserCmd.h @@ -1,29 +1,150 @@ #pragma once #include -#include #include "../../../templeware/utils/math/vector/vector.h" -struct CCmdQAngle { +#pragma pack(push, 1) +// --- Протобуферные структуры для сабтиков (CS2) --- + +struct CCmdQAnglePB { QAngle_t angValue; }; -class CBaseUserCmdPB { -public: - char pad_0x00[0x40]; - CCmdQAngle* pViewangles; // 0x40 - // ... другие поля не нужны для silent aim +struct CCmdVectorPB { + Vector4D_t vecValue; }; -class CCSGOUserCmdPB { -public: - char pad_0x00[0x18]; - CBaseUserCmdPB* pBase; // 0x18 - // ... другие поля не нужны для silent aim +struct CBasePB_CS2 { + void* vtable; + uint32_t nHasBits; + uint64_t nCachedBits; }; +struct CInButtonStatePB_CS2 : CBasePB_CS2 { + uint64_t nValue; + uint64_t nValueChanged; + uint64_t nValueScroll; +}; + +struct CSubtickMoveStepPB_CS2 : CBasePB_CS2 { + uint64_t nButton; + bool bPressed; + float flWhen; + float flAnalogForwardDelta; + float flAnalogLeftDelta; +}; + +struct CCSGOInterpolationInfoPB_CS2 : CBasePB_CS2 { + float flFraction; + int nSrcTick; + int nDstTick; +}; + +struct CMsgQAnglePB_CS2 { QAngle_t angValue; }; +struct CMsgVectorPB_CS2 { Vector4D_t vecValue; }; + +struct CCSGOInputHistoryEntryPB_CS2 { + CMsgQAnglePB_CS2* pViewAngles; + CMsgVectorPB_CS2* pShootPosition; + CMsgVectorPB_CS2* pTargetHeadPositionCheck; + CMsgVectorPB_CS2* pTargetAbsPositionCheck; + CMsgQAnglePB_CS2* pTargetAngPositionCheck; + CCSGOInterpolationInfoPB_CS2* cl_interp; + CCSGOInterpolationInfoPB_CS2* sv_interp0; + CCSGOInterpolationInfoPB_CS2* sv_interp1; + CCSGOInterpolationInfoPB_CS2* player_interp; + int nRenderTickCount; + float flRenderTickFraction; + int nPlayerTickCount; + float flPlayerTickFraction; + int nFrameNumber; + int nTargetEntIndex; +}; + +template +struct RepeatedPtrFieldPB_CS2 { + struct Rep_t { + int nAllocatedSize; + T* tElements[128]; + }; + void* pArena; // 0x0 (8 байт) + int nCurrentSize; // 0x8 (4 байта) + int nTotalSize; // 0xC (4 байта) + Rep_t* pRep; // 0x10 (8 байт) + // 0x18 +}; +static_assert(sizeof(RepeatedPtrFieldPB_CS2) == 0x18, "RepeatedPtrFieldPB_CS2 size mismatch!"); + +struct CBaseUserCmdPB_CS2 { + RepeatedPtrFieldPB_CS2 subtickMovesField; // 0x0 (0x18) + void* strMoveCrc; // 0x18 + void* pInButtonState; // 0x20 + CMsgQAnglePB_CS2* pViewAngles; // 0x28 + int32_t nLegacyCommandNumber; // 0x30 + int32_t nClientTick; // 0x34 + float flForwardMove; // 0x38 + float flSideMove; // 0x3C + float flUpMove; // 0x40 + int32_t nImpulse; // 0x44 + int32_t nWeaponSelect; // 0x48 + int32_t nRandomSeed; // 0x4C + int32_t nMousedX; // 0x50 + int32_t nMousedY; // 0x54 + uint32_t nConsumedServerAngleChanges; // 0x58 + int32_t nCmdFlags; // 0x5C + uint32_t nPawnEntityHandle; // 0x60 + char pad[0x80 - 0x64]; // паддинг до 0x80 +}; +static_assert(sizeof(CBaseUserCmdPB_CS2) == 0x80, "CBaseUserCmdPB_CS2 size mismatch!"); + +struct CCSGOUserCmdPB_CS2 { + uint32_t nHasBits; // 0x0 + uint64_t nCachedSize; // 0x8 + RepeatedPtrFieldPB_CS2 inputHistoryField; // 0x10 (0x18) + CBaseUserCmdPB_CS2* pBaseCmd; // 0x28 + bool bLeftHandDesired; // 0x30 + char pad1[3]; // 0x31-0x33 + int32_t nAttack3StartHistoryIndex; // 0x34 + int32_t nAttack1StartHistoryIndex; // 0x38 + int32_t nAttack2StartHistoryIndex; // 0x3C + char pad2[4]; // 0x40-0x43 (чтобы размер стал 0x40) +}; +static_assert(sizeof(CCSGOUserCmdPB_CS2) == 0x40, "CCSGOUserCmdPB_CS2 size mismatch!"); + +struct CInButtonState_CS2 { + void* vtable; // 0x0 + uint64_t nValue; // 0x8 + uint64_t nValueChanged; // 0x10 + uint64_t nValueScroll; // 0x18 +}; +static_assert(sizeof(CInButtonState_CS2) == 0x20, "CInButtonState_CS2 size mismatch!"); + class CUserCmd { public: - char pad_0x00[0x18]; - CCSGOUserCmdPB pBase; // 0x18 - // ... другие поля не нужны для silent aim -}; \ No newline at end of file + char pad_0x00[0x8]; // 0x0 + char pad_0x08[0x10]; // 0x8 + CCSGOUserCmdPB_CS2 csgoUserCmd; // 0x18 + CInButtonState_CS2 nButtons; // 0x58 + char pad_0x78[0x20]; // 0x78 + + CCSGOInputHistoryEntryPB_CS2* GetInputHistoryEntry(int nIndex) { + if (!csgoUserCmd.inputHistoryField.pRep) return nullptr; + if (nIndex < 0 || nIndex >= csgoUserCmd.inputHistoryField.nCurrentSize) return nullptr; + return csgoUserCmd.inputHistoryField.pRep->tElements[nIndex]; + } + + void SetSubTickAngle(const QAngle_t& angView) { + if (!csgoUserCmd.inputHistoryField.pRep) return; + for (int i = 0; i < csgoUserCmd.inputHistoryField.nCurrentSize; ++i) { + CCSGOInputHistoryEntryPB_CS2* pInputEntry = GetInputHistoryEntry(i); + if (!pInputEntry || !pInputEntry->pViewAngles) continue; + pInputEntry->pViewAngles->angValue = angView; + } + } +}; +static_assert(sizeof(CUserCmd) == 0x98, "CUserCmd size mismatch! Проверь паддинг и порядок полей."); + +// static_assert(sizeof(CUserCmd) == 0x98, "CUserCmd size mismatch! Проверь паддинг и порядок полей."); + +// Для overlay/hud: +// extern size_t g_szCBaseUserCmdPB_CS2; +// extern size_t g_szRepeatedPtrFieldPB_CS2; \ No newline at end of file diff --git a/TempleWare-CS2/source/templeware/features/aim/aim.cpp b/TempleWare-CS2/source/templeware/features/aim/aim.cpp index 9bd40d3..d819ac0 100644 --- a/TempleWare-CS2/source/templeware/features/aim/aim.cpp +++ b/TempleWare-CS2/source/templeware/features/aim/aim.cpp @@ -15,21 +15,22 @@ #include #include "../../menu/hud.h" #include "../../menu/menu.h" +#include // Адреса из дампа (актуально для 2024-07-18) #define DW_SENSITIVITY 0x1A6A9D8 #define DW_SENSITIVITY_SENS 0x40 float GetGameSensitivity() { - static float fallback = 2.0f; - HMODULE hClient = GetModuleHandleA("client.dll"); - if (!hClient) return fallback; - uintptr_t sensBase = reinterpret_cast(hClient) + DW_SENSITIVITY; - uintptr_t sensPtr = *reinterpret_cast(sensBase); - if (!sensPtr) return fallback; - float sens = *reinterpret_cast(sensPtr + DW_SENSITIVITY_SENS); - if (sens < 0.01f || sens > 20.0f) return fallback; - return sens; + static float fallback = 2.0f; + HMODULE hClient = GetModuleHandleA("client.dll"); + if (!hClient) return fallback; + uintptr_t sensBase = reinterpret_cast(hClient) + DW_SENSITIVITY; + uintptr_t sensPtr = *reinterpret_cast(sensBase); + if (!sensPtr) return fallback; + float sens = *reinterpret_cast(sensPtr + DW_SENSITIVITY_SENS); + if (sens < 0.01f || sens > 20.0f) return fallback; + return sens; } // Индексы костей (актуально для CS2) @@ -42,21 +43,21 @@ static int lastBoneIdx = -1; inline QAngle_t CalcAngles(Vector_t viewPos, Vector_t aimPos) { - QAngle_t angle = { 0, 0, 0 }; + QAngle_t angle = { 0, 0, 0 }; - Vector_t delta = aimPos - viewPos; + Vector_t delta = aimPos - viewPos; - angle.x = -asin(delta.z / delta.Length()) * (180.0f / 3.141592654f); - angle.y = atan2(delta.y, delta.x) * (180.0f / 3.141592654f); + angle.x = -asin(delta.z / delta.Length()) * (180.0f / 3.141592654f); + angle.y = atan2(delta.y, delta.x) * (180.0f / 3.141592654f); - return angle; + return angle; } inline float GetFov(const QAngle_t& viewAngle, const QAngle_t& aimAngle) { - QAngle_t delta = (aimAngle - viewAngle).Normalize(); + QAngle_t delta = (aimAngle - viewAngle).Normalize(); - return sqrtf(powf(delta.x, 2.0f) + powf(delta.y, 2.0f)); + return sqrtf(powf(delta.x, 2.0f) + powf(delta.y, 2.0f)); } // // Сигнатура функции GetBonePosition (актуально для client.dll): @@ -72,42 +73,42 @@ inline float GetFov(const QAngle_t& viewAngle, const QAngle_t& aimAngle) // } Vector_t GetBonePosition(const C_CSPlayerPawn* Entity, int boneIdx) { - if (!Entity) return {}; - // Внешний способ: читаем Vector3 по адресу boneMatrix + boneIdx * 0x20 - uintptr_t pGameSceneNode = *reinterpret_cast((uintptr_t)Entity + 0x328); - if (!pGameSceneNode) return {}; - uintptr_t pBoneMatrix = *reinterpret_cast(pGameSceneNode + 0x1F0); - if (!pBoneMatrix) return {}; - return *reinterpret_cast(pBoneMatrix + boneIdx * 0x20); + if (!Entity) return {}; + // Внешний способ: читаем Vector3 по адресу boneMatrix + boneIdx * 0x20 + uintptr_t pGameSceneNode = *reinterpret_cast((uintptr_t)Entity + 0x328); + if (!pGameSceneNode) return {}; + uintptr_t pBoneMatrix = *reinterpret_cast(pGameSceneNode + 0x1F0); + if (!pBoneMatrix) return {}; + return *reinterpret_cast(pBoneMatrix + boneIdx * 0x20); } // Получить позицию для аимбота в зависимости от выбора пользователя Vector_t GetAimbotTargetPos(const C_CSPlayerPawn* Entity, const Vector_t& from, const QAngle_t& viewAngles) { - switch (Config::aimbot_bone) { - case Config::BONE_HEAD: - return GetBonePosition(Entity, BONE_INDEX_HEAD); - case Config::BONE_NECK: - return GetBonePosition(Entity, BONE_INDEX_NECK); - case Config::BONE_BODY: - return GetBonePosition(Entity, BONE_INDEX_BODY); - case Config::BONE_NEAREST: - default: { - // Каждый раз ищем ближайшую кость по FOV - std::array bones = {BONE_INDEX_HEAD, BONE_INDEX_BODY}; - float bestFov = FLT_MAX; - int bestIdx = BONE_INDEX_HEAD; - for (int idx : bones) { - Vector_t pos = GetBonePosition(Entity, idx); - QAngle_t ang = CalcAngles(from, pos); // <-- Исправлено! - float fov = GetFov(viewAngles, ang); - if (fov < bestFov && std::isfinite(fov)) { - bestFov = fov; - bestIdx = idx; - } - } - return GetBonePosition(Entity, bestIdx); - } - } + switch (Config::aimbot_bone) { + case Config::BONE_HEAD: + return GetBonePosition(Entity, BONE_INDEX_HEAD); + case Config::BONE_NECK: + return GetBonePosition(Entity, BONE_INDEX_NECK); + case Config::BONE_BODY: + return GetBonePosition(Entity, BONE_INDEX_BODY); + case Config::BONE_NEAREST: + default: { + // Каждый раз ищем ближайшую кость по FOV + std::array bones = { BONE_INDEX_HEAD, BONE_INDEX_BODY }; + float bestFov = FLT_MAX; + int bestIdx = BONE_INDEX_HEAD; + for (int idx : bones) { + Vector_t pos = GetBonePosition(Entity, idx); + QAngle_t ang = CalcAngles(from, pos); // <-- Исправлено! + float fov = GetFov(viewAngles, ang); + if (fov < bestFov && std::isfinite(fov)) { + bestFov = fov; + bestIdx = idx; + } + } + return GetBonePosition(Entity, bestIdx); + } + } } @@ -130,397 +131,595 @@ Vector_t GetEntityEyePos(const C_CSPlayerPawn* Entity) { // Удаляем все вспомогательные функции инкапсуляции void Aimbot() { - static C_CSPlayerPawn* lockedTarget = nullptr; - static bool prevAimbotState = false; - static bool targetWasLost = false; - static QAngle_t last_punch_angle = {0,0,0}; - static int shotCount = 0; - float sensitivity = GetGameSensitivity(); - bool aimbotActive = Config::always_on_aimbot ? true : Config::aimbot; - // --- shooterAfterAim + triggerbot_key --- - if (Config::shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { - aimbotActive = true; - } - C_CSPlayerPawn* lp = H::oGetLocalPlayer(0); - if (cached_players.empty() || !lp || !lp->handle().valid() || lp->getHealth() <= 0) - return; - Vector_t lep = GetEntityEyePos(lp); - QAngle_t* viewangles = (QAngle_t*)(modules.getModule("client") + 0x1A78650); + static C_CSPlayerPawn* lockedTarget = nullptr; + static bool prevAimbotState = false; + static bool targetWasLost = false; + static QAngle_t last_punch_angle = { 0,0,0 }; + static int shotCount = 0; + float sensitivity = GetGameSensitivity(); + bool aimbotActive = Config::always_on_aimbot ? true : Config::aimbot; + // --- shooterAfterAim + triggerbot_key --- + if (Config::shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { + aimbotActive = true; + } + C_CSPlayerPawn* lp = H::oGetLocalPlayer(0); + if (cached_players.empty() || !lp || !lp->handle().valid() || lp->getHealth() <= 0) + return; + Vector_t lep = GetEntityEyePos(lp); + QAngle_t* viewangles = (QAngle_t*)(modules.getModule("client") + 0x1A78650); bool isShooting = (GetAsyncKeyState(Config::triggerbot_key) & 0x8000) || (GetAsyncKeyState(VK_LBUTTON) & 0x8000); - int shotsFired = lp ? lp->getShotsFired() : 0; - shotCount = shotsFired; - //g_DebugString = "debug: " + std::to_string(shotsFired) + "Sens: " + std::to_string(sensitivity); - - if (Config::aimbot_on_lmb && !Config::always_on_aimbot) { - aimbotActive = isShooting; - } + int shotsFired = lp ? lp->getShotsFired() : 0; + shotCount = shotsFired; + //g_DebugString = "debug: " + std::to_string(shotsFired) + "Sens: " + std::to_string(sensitivity); - // Получаем локального игрока и viewangles всегда, чтобы не дублировать код - // C_CSPlayerPawn* lp = H::oGetLocalPlayer(0); - // Vector_t lep = GetEntityEyePos(lp); - // QAngle_t* viewangles = (QAngle_t*)(modules.getModule("client") + 0x1A78650); + if (Config::aimbot_on_lmb && !Config::always_on_aimbot) { + aimbotActive = isShooting; + } - // Проверка: стреляет ли игрок (LMB) - // bool isShooting = (GetAsyncKeyState(VK_LBUTTON) & 0x8000); + // Получаем локального игрока и viewangles всегда, чтобы не дублировать код + // C_CSPlayerPawn* lp = H::oGetLocalPlayer(0); + // Vector_t lep = GetEntityEyePos(lp); + // QAngle_t* viewangles = (QAngle_t*)(modules.getModule("client") + 0x1A78650); - // --- Новый режим: always_on_aimbot --- - if (Config::always_on_aimbot) { - float bestFov = Config::aimbot_fov; - PlayerCache* bestTarget = nullptr; - QAngle_t bestAngle = { 0, 0, 0 }; - for (auto& Player : cached_players) { - if (!Player.handle.valid() || Player.health <= 0 || Player.handle.index() == INVALID_EHANDLE_INDEX) - continue; - if (Config::teamCheck && (Player.team_num == cached_local.team)) - continue; - Vector_t target_pos = Player.position + Player.viewOffset; - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - const float fov = GetFov(*viewangles, angle); - if (!std::isfinite(fov) || fov > bestFov) - continue; - bestFov = fov; - bestTarget = &Player; - bestAngle = angle; - } - if (bestTarget) { - Vector_t target_pos = bestTarget->position + bestTarget->viewOffset; - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - QAngle_t cur_punch_angle = *(QAngle_t*)((uintptr_t)lp + SchemaFinder::Get(hash_32_fnv1a_const("C_CSPlayerPawn->m_aimPunchAngle"))); - // --- RCS --- - bool rcsActive = false; - if (Config::shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { - rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); - } else { - rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); - } - if (rcsActive && shotsFired > 1) { - // Для прямого изменения viewangles: делить НЕ нужно - //QAngle_t punchDelta = cur_punch_angle - last_punch_angle; - //g_DebugString = "debug: " + std::to_string(punchDelta.x); - angle -= cur_punch_angle * 2.f; - last_punch_angle = cur_punch_angle; - } else { - last_punch_angle = {0,0,0}; - } - angle.z = 0.f; - angle = angle.Normalize(); + // Проверка: стреляет ли игрок (LMB) + // bool isShooting = (GetAsyncKeyState(VK_LBUTTON) & 0x8000); - // --- Smooth --- - QAngle_t delta = (angle - *viewangles).Normalize(); - if (Config::aimbot_smooth > 0.f) { - QAngle_t cur = *viewangles; - float smooth = Config::aimbot_smooth; - if (Config::aimbot_dynamic_smooth) { - float fov = sqrtf(delta.x * delta.x + delta.y * delta.y); - float maxFov = Config::aimbot_fov; - float factor = (maxFov > 0.01f) ? (fov / maxFov) : 0.f; - smooth = smooth + (smooth * factor * Config::aimbot_dynamic_smooth_factor); - } - angle = cur + delta * (1.f / smooth); - angle = angle.Normalize(); - *viewangles = angle; - } else { - *viewangles = angle; - } - } - // В этом режиме не используем lockedTarget и не трогаем targetWasLost/prevAimbotState - return; - } + // --- Новый режим: always_on_aimbot --- + if (Config::always_on_aimbot) { + float bestFov = Config::aimbot_fov; + PlayerCache* bestTarget = nullptr; + QAngle_t bestAngle = { 0, 0, 0 }; + for (auto& Player : cached_players) { + if (!Player.handle.valid() || Player.health <= 0 || Player.handle.index() == INVALID_EHANDLE_INDEX) + continue; + if (Config::teamCheck && (Player.team_num == cached_local.team)) + continue; + Vector_t target_pos = Player.position + Player.viewOffset; + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + const float fov = GetFov(*viewangles, angle); + if (!std::isfinite(fov) || fov > bestFov) + continue; + bestFov = fov; + bestTarget = &Player; + bestAngle = angle; + } + if (bestTarget) { + Vector_t target_pos = bestTarget->position + bestTarget->viewOffset; + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + QAngle_t cur_punch_angle = *(QAngle_t*)((uintptr_t)lp + SchemaFinder::Get(hash_32_fnv1a_const("C_CSPlayerPawn->m_aimPunchAngle"))); + // --- RCS --- + bool rcsActive = false; + if (Config::shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { + rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); + } + else { + rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); + } + if (rcsActive && shotsFired > 1) { + // Для прямого изменения viewangles: делить НЕ нужно + //QAngle_t punchDelta = cur_punch_angle - last_punch_angle; + //g_DebugString = "debug: " + std::to_string(punchDelta.x); + angle -= cur_punch_angle * 2.f; + last_punch_angle = cur_punch_angle; + } + else { + last_punch_angle = { 0,0,0 }; + } + angle.z = 0.f; + angle = angle.Normalize(); - // Если кнопка только что нажата (переход с false на true) — ищем новую цель - if (aimbotActive && !prevAimbotState) { - lastBoneIdx = -1; // Сброс при новой активации - int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); - float bestFov = Config::aimbot_fov; - C_CSPlayerPawn* bestTarget = nullptr; - QAngle_t bestAngle = { 0, 0, 0 }; + // --- Smooth --- + QAngle_t delta = (angle - *viewangles).Normalize(); + if (Config::aimbot_smooth > 0.f) { + QAngle_t cur = *viewangles; + float smooth = Config::aimbot_smooth; + if (Config::aimbot_dynamic_smooth) { + float fov = sqrtf(delta.x * delta.x + delta.y * delta.y); + float maxFov = Config::aimbot_fov; + float factor = (maxFov > 0.01f) ? (fov / maxFov) : 0.f; + smooth = smooth + (smooth * factor * Config::aimbot_dynamic_smooth_factor); + } + angle = cur + delta * (1.f / smooth); + angle = angle.Normalize(); + *viewangles = angle; + } + else { + *viewangles = angle; + } + } + // В этом режиме не используем lockedTarget и не трогаем targetWasLost/prevAimbotState + return; + } - for (int i = 1; i <= nMaxHighestEntity; i++) { - auto Entity = I::GameEntity->Instance->Get(i); - if (!Entity) - continue; - if (!Entity->handle().valid()) - continue; - SchemaClassInfoData_t* _class = nullptr; - Entity->dump_class_info(&_class); - if (!_class) - continue; - const uint32_t hash = HASH(_class->szName); - if (hash == HASH("C_CSPlayerPawn")) { - C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; - if (!pawn) continue; - if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; - if (pawn->getHealth() <= 0) continue; - if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; - Vector_t target_pos = GetEntityEyePos(pawn);//GetAimbotTargetPos(pawn, lep); - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - const float fov = GetFov(*viewangles, angle); - if (!std::isfinite(fov) || fov > bestFov) - continue; - bestFov = fov; - bestTarget = pawn; - bestAngle = angle; - } - } - lockedTarget = bestTarget; - targetWasLost = false; - // Сброс punch_angle при смене цели - last_punch_angle = {0,0,0}; - } + // Если кнопка только что нажата (переход с false на true) — ищем новую цель + if (aimbotActive && !prevAimbotState) { + lastBoneIdx = -1; // Сброс при новой активации + int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); + float bestFov = Config::aimbot_fov; + C_CSPlayerPawn* bestTarget = nullptr; + QAngle_t bestAngle = { 0, 0, 0 }; - // Если кнопка отпущена — сбрасываем захват - if (!aimbotActive) { - lockedTarget = nullptr; - targetWasLost = false; - last_punch_angle = {0,0,0}; // сброс rcs - // Сброс lastBoneIdx при отпускании кнопки аимбота (например, в Aimbot()): - // if (!aimbotActive) lastBoneIdx = -1; - } + for (int i = 1; i <= nMaxHighestEntity; i++) { + auto Entity = I::GameEntity->Instance->Get(i); + if (!Entity) + continue; + if (!Entity->handle().valid()) + continue; + SchemaClassInfoData_t* _class = nullptr; + Entity->dump_class_info(&_class); + if (!_class) + continue; + const uint32_t hash = HASH(_class->szName); + if (hash == HASH("C_CSPlayerPawn")) { + C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; + if (!pawn) continue; + if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; + if (pawn->getHealth() <= 0) continue; + if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; + Vector_t target_pos = GetEntityEyePos(pawn);//GetAimbotTargetPos(pawn, lep); + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + const float fov = GetFov(*viewangles, angle); + if (!std::isfinite(fov) || fov > bestFov) + continue; + bestFov = fov; + bestTarget = pawn; + bestAngle = angle; + } + } + lockedTarget = bestTarget; + targetWasLost = false; + // Сброс punch_angle при смене цели + last_punch_angle = { 0,0,0 }; + } - // Если есть захваченная цель и кнопка удерживается - if (aimbotActive && lockedTarget) { - // Проверяем, что цель всё ещё валидна - if (!lp || !lp->handle().valid() || lp->getHealth() <= 0) { - lockedTarget = nullptr; - targetWasLost = false; - last_punch_angle = {0,0,0}; - return; - } - if ( - lockedTarget->get_entity_by_handle() == lp->get_entity_by_handle() || - lockedTarget->getHealth() <= 0 || - !lockedTarget->handle().valid() - ) { - lockedTarget = nullptr; - targetWasLost = true; - last_punch_angle = {0,0,0}; // сброс rcs - } - else { - Vector_t target_pos = GetAimbotTargetPos(lockedTarget, lep, *viewangles); - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - QAngle_t cur_punch_angle = *(QAngle_t*)((uintptr_t)lp + SchemaFinder::Get(hash_32_fnv1a_const("C_CSPlayerPawn->m_aimPunchAngle"))); - // --- RCS --- - bool rcsActive = false; - if (Config::shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { - rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); - } else { - rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); - } - if (rcsActive && shotCount > 1) { - // Для прямого изменения viewangles: делить НЕ нужно - //QAngle_t punchDelta = cur_punch_angle - last_punch_angle; - //g_DebugString = "debug: " + std::to_string(punchDelta.x); - angle -= cur_punch_angle * 2.f; - last_punch_angle = cur_punch_angle; - } else { - last_punch_angle = {0,0,0}; - } - angle.z = 0.f; - angle = angle.Normalize(); - // --- Smooth --- - if (Config::aimbot_smooth > 0.f) { - QAngle_t cur = *viewangles; - QAngle_t delta = (angle - cur).Normalize(); - float smooth = Config::aimbot_smooth; - if (Config::aimbot_dynamic_smooth) { - float fov = sqrtf(delta.x * delta.x + delta.y * delta.y); - float maxFov = Config::aimbot_fov; - float factor = (maxFov > 0.01f) ? (fov / maxFov) : 0.f; - smooth = smooth + (smooth * factor * Config::aimbot_dynamic_smooth_factor); - } - angle = cur + delta * (1.f / smooth); - angle = angle.Normalize(); - *viewangles = angle; - } else { - *viewangles = angle; - } - } - } + // Если кнопка отпущена — сбрасываем захват + if (!aimbotActive) { + lockedTarget = nullptr; + targetWasLost = false; + last_punch_angle = { 0,0,0 }; // сброс rcs + // Сброс lastBoneIdx при отпускании кнопки аимбота (например, в Aimbot()): + // if (!aimbotActive) lastBoneIdx = -1; + } - //Если кнопка зажата, цели нет, и мы не теряли цель (т.е. только в начале или если цели не было вообще) - if (aimbotActive && !lockedTarget && !targetWasLost) { - int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); - float bestFov = Config::aimbot_fov; - C_CSPlayerPawn* bestTarget = nullptr; - QAngle_t bestAngle = { 0, 0, 0 }; + // Если есть захваченная цель и кнопка удерживается + if (aimbotActive && lockedTarget) { + // Проверяем, что цель всё ещё валидна + if (!lp || !lp->handle().valid() || lp->getHealth() <= 0) { + lockedTarget = nullptr; + targetWasLost = false; + last_punch_angle = { 0,0,0 }; + return; + } + if ( + lockedTarget->get_entity_by_handle() == lp->get_entity_by_handle() || + lockedTarget->getHealth() <= 0 || + !lockedTarget->handle().valid() + ) { + lockedTarget = nullptr; + targetWasLost = true; + last_punch_angle = { 0,0,0 }; // сброс rcs + } + else { + Vector_t target_pos = GetAimbotTargetPos(lockedTarget, lep, *viewangles); + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + QAngle_t cur_punch_angle = *(QAngle_t*)((uintptr_t)lp + SchemaFinder::Get(hash_32_fnv1a_const("C_CSPlayerPawn->m_aimPunchAngle"))); + // --- RCS --- + bool rcsActive = false; + if (Config::shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { + rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); + } + else { + rcsActive = (Config::rcs || Config::shooterAfterAim) && (shotCount > Config::rcsActivationShots); + } + if (rcsActive && shotCount > 1) { + // Для прямого изменения viewangles: делить НЕ нужно + //QAngle_t punchDelta = cur_punch_angle - last_punch_angle; + //g_DebugString = "debug: " + std::to_string(punchDelta.x); + angle -= cur_punch_angle * 2.f; + last_punch_angle = cur_punch_angle; + } + else { + last_punch_angle = { 0,0,0 }; + } + angle.z = 0.f; + angle = angle.Normalize(); + // --- Smooth --- + if (Config::aimbot_smooth > 0.f) { + QAngle_t cur = *viewangles; + QAngle_t delta = (angle - cur).Normalize(); + float smooth = Config::aimbot_smooth; + if (Config::aimbot_dynamic_smooth) { + float fov = sqrtf(delta.x * delta.x + delta.y * delta.y); + float maxFov = Config::aimbot_fov; + float factor = (maxFov > 0.01f) ? (fov / maxFov) : 0.f; + smooth = smooth + (smooth * factor * Config::aimbot_dynamic_smooth_factor); + } + angle = cur + delta * (1.f / smooth); + angle = angle.Normalize(); + *viewangles = angle; + } + else { + *viewangles = angle; + } + } + } - for (int i = 1; i <= nMaxHighestEntity; i++) { - auto Entity = I::GameEntity->Instance->Get(i); - if (!Entity) - continue; - if (!Entity->handle().valid()) - continue; - SchemaClassInfoData_t* _class = nullptr; - Entity->dump_class_info(&_class); - if (!_class) - continue; - const uint32_t hash = HASH(_class->szName); - if (hash == HASH("C_CSPlayerPawn")) { - C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; - if (!pawn) continue; - if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; - if (pawn->getHealth() <= 0) continue; - if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; - Vector_t target_pos = GetEntityEyePos(pawn);//GetAimbotTargetPos(pawn, lep); - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - const float fov = GetFov(*viewangles, angle); - if (!std::isfinite(fov) || fov > bestFov) - continue; - bestFov = fov; - bestTarget = pawn; - bestAngle = angle; - } - } - lockedTarget = bestTarget; - // Сброс punch_angle при смене цели - last_punch_angle = {0,0,0}; - } + //Если кнопка зажата, цели нет, и мы не теряли цель (т.е. только в начале или если цели не было вообще) + if (aimbotActive && !lockedTarget && !targetWasLost) { + int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); + float bestFov = Config::aimbot_fov; + C_CSPlayerPawn* bestTarget = nullptr; + QAngle_t bestAngle = { 0, 0, 0 }; - prevAimbotState = aimbotActive; + for (int i = 1; i <= nMaxHighestEntity; i++) { + auto Entity = I::GameEntity->Instance->Get(i); + if (!Entity) + continue; + if (!Entity->handle().valid()) + continue; + SchemaClassInfoData_t* _class = nullptr; + Entity->dump_class_info(&_class); + if (!_class) + continue; + const uint32_t hash = HASH(_class->szName); + if (hash == HASH("C_CSPlayerPawn")) { + C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; + if (!pawn) continue; + if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; + if (pawn->getHealth() <= 0) continue; + if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; + Vector_t target_pos = GetEntityEyePos(pawn);//GetAimbotTargetPos(pawn, lep); + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + const float fov = GetFov(*viewangles, angle); + if (!std::isfinite(fov) || fov > bestFov) + continue; + bestFov = fov; + bestTarget = pawn; + bestAngle = angle; + } + } + lockedTarget = bestTarget; + // Сброс punch_angle при смене цели + last_punch_angle = { 0,0,0 }; + } + + prevAimbotState = aimbotActive; +} + +void Ver2Aimbot(CUserCmd* pCmd) { + // --- Silent Aim: чистая и безопасная реализация --- + if (!Config::silent_aim || !pCmd) return; + static C_CSPlayerPawn* lockedTarget = nullptr; + static bool prevSilentState = false; + static QAngle_t last_punch_angle = { 0,0,0 }; + static int shotCount = 0; + static bool targetWasLost = false; + static bool targetWasLockedThisPress = false; + C_CSPlayerPawn* lp = H::oGetLocalPlayer(0); + if (!lp || !lp->handle().valid() || lp->getHealth() <= 0) return; + Vector_t lep = GetEntityEyePos(lp); + // Получаем viewangles только из CUserCmd! + QAngle_t* cur = nullptr; + if (pCmd->csgoUserCmd.pBaseCmd && pCmd->csgoUserCmd.pBaseCmd->pViewAngles) { + cur = &pCmd->csgoUserCmd.pBaseCmd->pViewAngles->angValue; + } + if (!cur) return; + // --- Кнопка активации --- + bool silentActive = Config::always_on_silent_aim ? true : (GetAsyncKeyState(Config::silent_aim_key) & 0x8000); + if (Config::silent_shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { + silentActive = true; + } + int shotsFired = lp ? lp->getShotsFired() : 0; + shotCount = shotsFired; + // --- Сброс флагов при новом нажатии --- + if (silentActive && !prevSilentState) { + targetWasLost = false; + targetWasLockedThisPress = false; + } + // --- Поиск цели --- + if (silentActive && !lockedTarget) { + if (Config::silent_rage || (!targetWasLost && !targetWasLockedThisPress)) { + int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); + float bestFov = Config::silent_aim_fov; + C_CSPlayerPawn* bestTarget = nullptr; + QAngle_t bestAngle = { 0, 0, 0 }; + for (int i = 1; i <= nMaxHighestEntity; i++) { + auto Entity = I::GameEntity->Instance->Get(i); + if (!Entity) continue; + if (!Entity->handle().valid()) continue; + SchemaClassInfoData_t* _class = nullptr; + Entity->dump_class_info(&_class); + if (!_class) continue; + const uint32_t hash = HASH(_class->szName); + if (hash == HASH("C_CSPlayerPawn")) { + C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; + if (!pawn) continue; + if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; + if (pawn->getHealth() <= 0) continue; + if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; + // --- Выбор кости для silent aim --- + Vector_t target_pos; + switch (Config::silent_aim_bone) { + case Config::BONE_HEAD: + target_pos = GetBonePosition(pawn, BONE_INDEX_HEAD); break; + case Config::BONE_NECK: + target_pos = GetBonePosition(pawn, BONE_INDEX_NECK); break; + case Config::BONE_BODY: + target_pos = GetBonePosition(pawn, BONE_INDEX_BODY); break; + case Config::BONE_NEAREST: + default: + target_pos = GetAimbotTargetPos(pawn, lep, *cur); break; + } + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + float fov = GetFov(*cur, angle); + if (!std::isfinite(fov) || fov > bestFov) continue; + bestFov = fov; + bestTarget = pawn; + bestAngle = angle; + } + } + lockedTarget = bestTarget; + last_punch_angle = { 0,0,0 }; + if (!Config::silent_rage && lockedTarget) targetWasLockedThisPress = true; + if (!Config::silent_rage && !lockedTarget) targetWasLost = true; + } + } + // --- Сброс при отпускании кнопки --- + if (!silentActive) { + lockedTarget = nullptr; + last_punch_angle = { 0,0,0 }; + targetWasLost = false; + targetWasLockedThisPress = false; + } + // --- Наведение на цель --- + if (silentActive && lockedTarget) { + // Проверка валидности цели + if (!lp || !lp->handle().valid() || lp->getHealth() <= 0 || + lockedTarget->get_entity_by_handle() == lp->get_entity_by_handle() || + lockedTarget->getHealth() <= 0 || + !lockedTarget->handle().valid() || + (Config::team_check && lockedTarget->getTeam() == lp->getTeam())) { + lockedTarget = nullptr; + last_punch_angle = { 0,0,0 }; + targetWasLost = true; + prevSilentState = silentActive; + return; + } + // --- Выбор кости для silent aim --- + Vector_t target_pos; + switch (Config::silent_aim_bone) { + case Config::BONE_HEAD: + target_pos = GetBonePosition(lockedTarget, BONE_INDEX_HEAD); break; + case Config::BONE_NECK: + target_pos = GetBonePosition(lockedTarget, BONE_INDEX_NECK); break; + case Config::BONE_BODY: + target_pos = GetBonePosition(lockedTarget, BONE_INDEX_BODY); break; + case Config::BONE_NEAREST: + default: + target_pos = GetAimbotTargetPos(lockedTarget, lep, *cur); break; + } + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + // --- Smooth --- + if (Config::silent_aim_smooth > 0.f) { + QAngle_t delta = (angle - *cur).Normalize(); + float smooth = Config::silent_aim_smooth; + angle = *cur + delta * (1.f / smooth); + angle = angle.Normalize(); + } + *cur = angle; + } + prevSilentState = silentActive; +} + +// --- Функция для вывода отладочной информации через ImGui --- +void ShowSilentAimDebugInfo(const CUserCmd* pCmd) { + char debugBuf[256]; + _snprintf_s(debugBuf, sizeof(debugBuf), + "CUserCmd: size=%zu, csgoUserCmd@%zu, nButtons@%zu, nSubticks=%d, pRep=%p, pBaseCmd=%p", + sizeof(CUserCmd), + offsetof(CUserCmd, csgoUserCmd), + offsetof(CUserCmd, nButtons), + pCmd->csgoUserCmd.inputHistoryField.nCurrentSize, + (void*)pCmd->csgoUserCmd.inputHistoryField.pRep, + (void*)pCmd->csgoUserCmd.pBaseCmd); + g_DebugString = debugBuf; + // ImGui::SetTooltip("%s", debugBuf); // Можно включить при необходимости } void SilentAimbot(CUserCmd* pCmd) { - if (!Config::silent_aim || !pCmd) return; - static C_CSPlayerPawn* lockedTarget = nullptr; - static bool prevSilentState = false; - static QAngle_t last_punch_angle = {0,0,0}; - static int shotCount = 0; - C_CSPlayerPawn* lp = H::oGetLocalPlayer(0); - if (!lp || !lp->handle().valid() || lp->getHealth() <= 0) return; - Vector_t lep = GetEntityEyePos(lp); - QAngle_t* cur = (QAngle_t*)(modules.getModule("client") + 0x1A78650); - if (!cur) return; - bool silentActive = Config::always_on_silent_aim ? true : (GetAsyncKeyState(Config::silent_aim_key) & 0x8000); - // --- shooterAfterAim + triggerbot_key для сайлент аимбота --- - if (Config::silent_shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { - silentActive = true; + static bool printed = false; + if (!printed) { + std::cout << "RepeatedPtrFieldPB_CS2=" << sizeof(RepeatedPtrFieldPB_CS2) + << ", CBaseUserCmdPB_CS2=" << sizeof(CBaseUserCmdPB_CS2) + << ", CCSGOUserCmdPB_CS2=" << sizeof(CCSGOUserCmdPB_CS2) + << ", CUserCmd=" << sizeof(CUserCmd) + << ", csgoUserCmd@0x" << std::hex << offsetof(CUserCmd, csgoUserCmd) + << ", nButtons@0x" << std::hex << offsetof(CUserCmd, nButtons) + << std::dec << std::endl; + printed = true; } - int shotsFired = lp ? lp->getShotsFired() : 0; - shotCount = shotsFired; + char debugBuf[256]; + if (!Config::silent_aim || !pCmd) return; + static C_CSPlayerPawn* lockedTarget = nullptr; + static bool prevSilentState = false; + static QAngle_t last_punch_angle = { 0,0,0 }; + static int shotCount = 0; + static bool targetWasLost = false; + static bool targetWasLockedThisPress = false; + C_CSPlayerPawn* lp = H::oGetLocalPlayer(0); + if (!lp || !lp->handle().valid() || lp->getHealth() <= 0) return; + Vector_t lep = GetEntityEyePos(lp); + // --- Кнопка активации --- + bool silentActive = Config::always_on_silent_aim ? true : (GetAsyncKeyState(Config::silent_aim_key) & 0x8000); + if (Config::silent_shooterAfterAim && (GetAsyncKeyState(Config::triggerbot_key) & 0x8000)) { + silentActive = true; + } + int shotsFired = lp ? lp->getShotsFired() : 0; + shotCount = shotsFired; - // Если кнопка только что нажата — ищем новую цель - if (silentActive && !prevSilentState) { - int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); - float bestFov = Config::aimbot_fov; - C_CSPlayerPawn* bestTarget = nullptr; - QAngle_t bestAngle = { 0, 0, 0 }; - for (int i = 1; i <= nMaxHighestEntity; i++) { - auto Entity = I::GameEntity->Instance->Get(i); - if (!Entity) continue; - if (!Entity->handle().valid()) continue; - SchemaClassInfoData_t* _class = nullptr; - Entity->dump_class_info(&_class); - if (!_class) continue; - const uint32_t hash = HASH(_class->szName); - if (hash == HASH("C_CSPlayerPawn")) { - C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; - if (!pawn) continue; - if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; - if (pawn->getHealth() <= 0) continue; - if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; - Vector_t target_pos = GetAimbotTargetPos(pawn, lep, *cur); - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - float fov = GetFov(*cur, angle); - if (!std::isfinite(fov) || fov > bestFov) continue; - bestFov = fov; - bestTarget = pawn; - bestAngle = angle; - } - } - lockedTarget = bestTarget; - last_punch_angle = {0,0,0}; - } + if (silentActive && !prevSilentState) { + targetWasLost = false; + targetWasLockedThisPress = false; + } + if (silentActive && !lockedTarget) { + if (Config::silent_rage || (!targetWasLost && !targetWasLockedThisPress)) { + int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); + float bestFov = Config::silent_aim_fov; + C_CSPlayerPawn* bestTarget = nullptr; + QAngle_t bestAngle{}; + for (int i = 1; i <= nMaxHighestEntity; i++) { + auto Entity = I::GameEntity->Instance->Get(i); + if (!Entity) continue; + if (!Entity->handle().valid()) continue; + SchemaClassInfoData_t* _class = nullptr; + Entity->dump_class_info(&_class); + if (!_class) continue; + const uint32_t hash = HASH(_class->szName); + if (hash == HASH("C_CSPlayerPawn")) { + C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; + if (!pawn) continue; + if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; + if (pawn->getHealth() <= 0) continue; + if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; + Vector_t target_pos; + switch (Config::silent_aim_bone) { + case Config::BONE_HEAD: + target_pos = GetBonePosition(pawn, BONE_INDEX_HEAD); break; + case Config::BONE_NECK: + target_pos = GetBonePosition(pawn, BONE_INDEX_NECK); break; + case Config::BONE_BODY: + target_pos = GetBonePosition(pawn, BONE_INDEX_BODY); break; + case Config::BONE_NEAREST: + default: + target_pos = GetAimbotTargetPos(pawn, lep, QAngle_t{}); break; + } + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + float fov = sqrtf(angle.x * angle.x + angle.y * angle.y); + if (!std::isfinite(fov) || fov > bestFov) continue; + bestFov = fov; + bestTarget = pawn; + bestAngle = angle; + } + } + lockedTarget = bestTarget; + last_punch_angle = { 0,0,0 }; + if (!Config::silent_rage && lockedTarget) targetWasLockedThisPress = true; + if (!Config::silent_rage && !lockedTarget) targetWasLost = true; + } + } + if (!silentActive) { + lockedTarget = nullptr; + last_punch_angle = { 0,0,0 }; + targetWasLost = false; + targetWasLockedThisPress = false; + } + if (silentActive && lockedTarget) { + if (!lp || !lp->handle().valid() || lp->getHealth() <= 0 || + lockedTarget->get_entity_by_handle() == lp->get_entity_by_handle() || + lockedTarget->getHealth() <= 0 || + !lockedTarget->handle().valid() || + (Config::team_check && lockedTarget->getTeam() == lp->getTeam())) { + lockedTarget = nullptr; + last_punch_angle = { 0,0,0 }; + targetWasLost = true; + prevSilentState = silentActive; + return; + } + Vector_t target_pos; + switch (Config::silent_aim_bone) { + case Config::BONE_HEAD: + target_pos = GetBonePosition(lockedTarget, BONE_INDEX_HEAD); break; + case Config::BONE_NECK: + target_pos = GetBonePosition(lockedTarget, BONE_INDEX_NECK); break; + case Config::BONE_BODY: + target_pos = GetBonePosition(lockedTarget, BONE_INDEX_BODY); break; + case Config::BONE_NEAREST: + default: + target_pos = GetAimbotTargetPos(lockedTarget, lep, QAngle_t{}); break; + } + QAngle_t angle = CalcAngles(target_pos, lep); + angle.x *= -1.f; + angle.y += 180.f; + // --- Smooth --- + if (Config::silent_aim_smooth > 0.f) { + QAngle_t cur = angle; + bool found = false; + for (int i = 0; i < 8; ++i) { + CCSGOInputHistoryEntryPB_CS2* entry = pCmd->GetInputHistoryEntry(i); + if (entry && entry->pViewAngles) { + cur = entry->pViewAngles->angValue; + found = true; + break; + } + } + QAngle_t delta = (angle - cur).Normalize(); + float smooth = Config::silent_aim_smooth; + angle = cur + delta * (1.f / smooth); + angle = angle.Normalize(); + } + // --- Устанавливаем угол для всех сабтиков --- + int nSubticks = pCmd->csgoUserCmd.inputHistoryField.nCurrentSize; + _snprintf_s(debugBuf, sizeof(debugBuf), "nSubticks=%d, pRep=%p", nSubticks, (void*)pCmd->csgoUserCmd.inputHistoryField.pRep); + // g_DebugString = debugBuf; // Удалено - // Если кнопка зажата, цели нет — постоянный поиск цели - if (silentActive && !lockedTarget) { - int nMaxHighestEntity = I::GameEntity->Instance->GetHighestEntityIndex(); - float bestFov = Config::aimbot_fov; - C_CSPlayerPawn* bestTarget = nullptr; - QAngle_t bestAngle = { 0, 0, 0 }; - for (int i = 1; i <= nMaxHighestEntity; i++) { - auto Entity = I::GameEntity->Instance->Get(i); - if (!Entity) continue; - if (!Entity->handle().valid()) continue; - SchemaClassInfoData_t* _class = nullptr; - Entity->dump_class_info(&_class); - if (!_class) continue; - const uint32_t hash = HASH(_class->szName); - if (hash == HASH("C_CSPlayerPawn")) { - C_CSPlayerPawn* pawn = (C_CSPlayerPawn*)Entity; - if (!pawn) continue; - if (pawn->get_entity_by_handle() == lp->get_entity_by_handle()) continue; - if (pawn->getHealth() <= 0) continue; - if (Config::team_check && pawn->getTeam() == lp->getTeam()) continue; - Vector_t target_pos = GetAimbotTargetPos(pawn, lep, *cur); - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - float fov = GetFov(*cur, angle); - if (!std::isfinite(fov) || fov > bestFov) continue; - bestFov = fov; - bestTarget = pawn; - bestAngle = angle; - } - } - lockedTarget = bestTarget; - last_punch_angle = {0,0,0}; - } + // --- Расширенный отладочный вывод --- + // char debugBuf[256]; // Удалено + // _snprintf_s(debugBuf, sizeof(debugBuf), // Удалено + // "CUserCmd: size=%zu, csgoUserCmd@%zu, nButtons@%zu, nSubticks=%d, pRep=%p, pBaseCmd=%p", // Удалено + // sizeof(CUserCmd), // Удалено + // offsetof(CUserCmd, csgoUserCmd), // Удалено + // offsetof(CUserCmd, nButtons), // Удалено + // pCmd->csgoUserCmd.inputHistoryField.nCurrentSize, // Удалено + // (void*)pCmd->csgoUserCmd.inputHistoryField.pRep, // Удалено + // (void*)pCmd->csgoUserCmd.pBaseCmd); // Удалено + // g_DebugString = debugBuf; // Удалено - // Если кнопка отпущена — сбрасываем захват - if (!silentActive) { - lockedTarget = nullptr; - last_punch_angle = {0,0,0}; - } + ShowSilentAimDebugInfo(pCmd); - // Если есть захваченная цель и кнопка удерживается - if (silentActive && lockedTarget) { - // Проверяем, что цель всё ещё валидна - if (!lp || !lp->handle().valid() || lp->getHealth() <= 0 || - lockedTarget->get_entity_by_handle() == lp->get_entity_by_handle() || - lockedTarget->getHealth() <= 0 || - !lockedTarget->handle().valid() || - (Config::team_check && lockedTarget->getTeam() == lp->getTeam())) { - lockedTarget = nullptr; - last_punch_angle = {0,0,0}; - prevSilentState = silentActive; - return; - } - Vector_t target_pos = GetAimbotTargetPos(lockedTarget, lep, *cur); - QAngle_t angle = CalcAngles(target_pos, lep); - angle.x *= -1.f; - angle.y += 180.f; - //QAngle_t cur_punch_angle = *(QAngle_t*)((uintptr_t)lp + SchemaFinder::Get(hash_32_fnv1a_const("C_CSPlayerPawn->m_aimPunchAngle"))); - //// --- RCS --- - //bool rcsActive = (Config::rcs || Config::silent_shooterAfterAim) && (shotCount > Config::rcsActivationShots); - //if (rcsActive && shotCount > 1) { - // angle -= cur_punch_angle * 2.f; - // last_punch_angle = cur_punch_angle; - //} else { - // last_punch_angle = {0,0,0}; - //} - //angle.z = 0.f; - //angle = angle.Normalize(); - // --- Smooth --- - if (Config::silent_aim_smooth > 0.f) { - QAngle_t delta = (angle - *cur).Normalize(); - float smooth = Config::silent_aim_smooth; - angle = *cur + delta * (1.f / smooth); - angle = angle.Normalize(); - } - *cur = angle; - } - prevSilentState = silentActive; + _snprintf_s(debugBuf, sizeof(debugBuf), + "sizeof(CUserCmd)=%zu, csgoUserCmd@0x%zX, nButtons@0x%zX", + sizeof(CUserCmd), + offsetof(CUserCmd, csgoUserCmd), + offsetof(CUserCmd, nButtons)); + g_DebugString = debugBuf; + + _snprintf_s(debugBuf, sizeof(debugBuf), + "sizeof(CUserCmd)=%zu, csgoUserCmd@0x%zX, nButtons@0x%zX, RepeatedPtrFieldPB_CS2=%zu, CBaseUserCmdPB_CS2=%zu", + sizeof(CUserCmd), + offsetof(CUserCmd, csgoUserCmd), + offsetof(CUserCmd, nButtons), + sizeof(RepeatedPtrFieldPB_CS2), + sizeof(CBaseUserCmdPB_CS2)); + g_DebugString = debugBuf; + + _snprintf_s(debugBuf, sizeof(debugBuf), + "RepeatedPtrFieldPB_CS2=%zu, CBaseUserCmdPB_CS2=%zu, CCSGOUserCmdPB_CS2=%zu, CUserCmd=%zu, csgoUserCmd@0x%zX, nButtons@0x%zX", + sizeof(RepeatedPtrFieldPB_CS2), + sizeof(CBaseUserCmdPB_CS2), + sizeof(CCSGOUserCmdPB_CS2), + sizeof(CUserCmd), + offsetof(CUserCmd, csgoUserCmd), + offsetof(CUserCmd, nButtons)); + g_DebugString = debugBuf; + + + } + prevSilentState = silentActive; } diff --git a/TempleWare-CS2/source/templeware/features/aim/aim.h b/TempleWare-CS2/source/templeware/features/aim/aim.h index 2d4fff9..7b7dd13 100644 --- a/TempleWare-CS2/source/templeware/features/aim/aim.h +++ b/TempleWare-CS2/source/templeware/features/aim/aim.h @@ -4,3 +4,4 @@ void Aimbot(); void SilentAimbot(CUserCmd* pCmd); +void Ver2Aimbot(CUserCmd* pCmd); diff --git a/TempleWare-CS2/source/templeware/hooks/hooks.cpp b/TempleWare-CS2/source/templeware/hooks/hooks.cpp index 79cb2b8..cdeb190 100644 --- a/TempleWare-CS2/source/templeware/hooks/hooks.cpp +++ b/TempleWare-CS2/source/templeware/hooks/hooks.cpp @@ -40,7 +40,8 @@ void* __fastcall H::hkLevelInit(void* pClientModeShared, const char* szNewMap) { bool __fastcall H::hkCreateMove(void* pInput, int nSlot, void* pCmd) { //Aimbot(); - SilentAimbot(reinterpret_cast(pCmd)); + //SilentAimbot(reinterpret_cast(pCmd)); + Ver2Aimbot(reinterpret_cast(pCmd)); Triggerbot(); return CreateMove.GetOriginal()(pInput, nSlot, pCmd); } diff --git a/TempleWare-CS2/source/templeware/menu/menu.cpp b/TempleWare-CS2/source/templeware/menu/menu.cpp index e43dd57..45932d5 100644 --- a/TempleWare-CS2/source/templeware/menu/menu.cpp +++ b/TempleWare-CS2/source/templeware/menu/menu.cpp @@ -209,6 +209,7 @@ void Menu::render() { keybind.menuButton(Config::silent_aim_key); ImGui::Checkbox("Always On##SilentAim", &Config::always_on_silent_aim); ImGui::Checkbox("Shooter After Aim##Silent", &Config::silent_shooterAfterAim); // Новый чекбокс + ImGui::Checkbox("Rage mode##Silent", &Config::silent_rage); // Новый чекбокс ImGui::SliderFloat("Smooth##SilentAim", &Config::silent_aim_smooth_slider, 0.f, 10.f, "%.2f"); Config::silent_aim_smooth = Config::silent_aim_smooth_slider; // Применяем значение ползунка к логике ImGui::SliderFloat("Silent Aim FOV", &Config::silent_aim_fov, 1.f, 180.f, "%1.0f"); diff --git a/x64/Release/TempleWare.dll b/x64/Release/TempleWare.dll index 78300a2..4ebde07 100644 Binary files a/x64/Release/TempleWare.dll and b/x64/Release/TempleWare.dll differ diff --git a/x64/Release/TempleWare.pdb b/x64/Release/TempleWare.pdb index 4b5bc5e..078ffc4 100644 Binary files a/x64/Release/TempleWare.pdb and b/x64/Release/TempleWare.pdb differ