diff --git a/memory-external/classes/auto_updater.cpp b/memory-external/classes/auto_updater.cpp index 36542ca..2d67842 100644 --- a/memory-external/classes/auto_updater.cpp +++ b/memory-external/classes/auto_updater.cpp @@ -211,6 +211,8 @@ namespace updater { offsets::m_iAccount = data["m_iAccount"]; if (data["m_vecAbsOrigin"].is_number()) offsets::m_vecAbsOrigin = data["m_vecAbsOrigin"]; + if (data["m_vOldOrigin"].is_number()) + offsets::m_vOldOrigin = data["m_vOldOrigin"]; if (data["m_pGameSceneNode"].is_number()) offsets::m_pGameSceneNode = data["m_pGameSceneNode"]; if (data["m_flFlashOverlayAlpha"].is_number()) @@ -231,8 +233,6 @@ namespace updater { offsets::m_sSanitizedPlayerName = data["m_sSanitizedPlayerName"]; if (data["m_iTeamNum"].is_number()) offsets::m_iTeamNum = data["m_iTeamNum"]; - if (data["m_vecOrigin"].is_number()) - offsets::m_vecOrigin = data["m_vecOrigin"]; return true; } @@ -255,6 +255,7 @@ namespace updater { data["m_pInGameMoneyServices"] = offsets::m_pInGameMoneyServices; data["m_iAccount"] = offsets::m_iAccount; data["m_vecAbsOrigin"] = offsets::m_vecAbsOrigin; + data["m_vOldOrigin"] = offsets::m_vOldOrigin; data["m_pGameSceneNode"] = offsets::m_pGameSceneNode; data["m_flFlashOverlayAlpha"] = offsets::m_flFlashOverlayAlpha; data["m_bIsDefusing"] = offsets::m_bIsDefusing; @@ -265,7 +266,6 @@ namespace updater { data["m_hPlayerPawn"] = offsets::m_hPlayerPawn; data["m_sSanitizedPlayerName"] = offsets::m_sSanitizedPlayerName; data["m_iTeamNum"] = offsets::m_iTeamNum; - data["m_vecOrigin"] = offsets::m_vecOrigin; std::ofstream output(file_path); output << std::setw(4) << data << std::endl; diff --git a/memory-external/classes/auto_updater.hpp b/memory-external/classes/auto_updater.hpp index 8060724..d863c4d 100644 --- a/memory-external/classes/auto_updater.hpp +++ b/memory-external/classes/auto_updater.hpp @@ -46,6 +46,7 @@ namespace updater { inline std::ptrdiff_t m_pInGameMoneyServices = 0x6D0; inline std::ptrdiff_t m_iAccount = 0x40; inline std::ptrdiff_t m_vecAbsOrigin = 0xC8; + inline std::ptrdiff_t m_vOldOrigin = 0x1224; inline std::ptrdiff_t m_pGameSceneNode = 0x310; inline std::ptrdiff_t m_flFlashOverlayAlpha = 0x1444; inline std::ptrdiff_t m_bIsDefusing = 0x1390; @@ -56,6 +57,5 @@ namespace updater { inline std::ptrdiff_t m_hPlayerPawn = 0x7BC; inline std::ptrdiff_t m_sSanitizedPlayerName = 0x720; inline std::ptrdiff_t m_iTeamNum = 0x3BF; - inline std::ptrdiff_t m_vecOrigin = 0x1214; } } diff --git a/memory-external/classes/config.cpp b/memory-external/classes/config.cpp index b0946da..0d987b8 100644 --- a/memory-external/classes/config.cpp +++ b/memory-external/classes/config.cpp @@ -20,8 +20,10 @@ namespace config { if (data.empty()) return false; - if (data["show_head_tracker"].is_boolean()) - show_head_tracker = data["show_head_tracker"]; + if (data["show_box_esp"].is_boolean()) + show_box_esp = data["show_box_esp"]; + if (data["show_skeleton_esp"].is_boolean()) + show_skeleton_esp = data["show_skeleton_esp"]; if (data["team_esp"].is_boolean()) team_esp = data["team_esp"]; if (data["automatic_update"].is_boolean()) @@ -49,6 +51,22 @@ namespace config { }; } + if (data.find("esp_skeleton_color_team") != data.end()) { + esp_box_color_team = { + data["esp_skeleton_color_team"][0].get(), + data["esp_skeleton_color_team"][1].get(), + data["esp_skeleton_color_team"][2].get() + }; + } + + if (data.find("esp_skeleton_color_enemy") != data.end()) { + esp_box_color_enemy = { + data["esp_skeleton_color_enemy"][0].get(), + data["esp_skeleton_color_enemy"][1].get(), + data["esp_skeleton_color_enemy"][2].get() + }; + } + if (data.find("esp_name_color") != data.end()) { esp_name_color = { data["esp_name_color"][0].get(), @@ -76,7 +94,7 @@ namespace config { void save() { json data; - data["show_head_tracker"] = show_head_tracker; + data["show_box_esp"] = show_box_esp; data["team_esp"] = team_esp; data["automatic_update"] = automatic_update; data["render_distance"] = render_distance; @@ -85,6 +103,8 @@ namespace config { data["esp_box_color_team"] = { esp_box_color_team.r, esp_box_color_team.g, esp_box_color_team.b }; data["esp_box_color_enemy"] = { esp_box_color_enemy.r, esp_box_color_enemy.g, esp_box_color_enemy.b }; + data["esp_skeleton_color_team"] = { esp_box_color_team.r, esp_box_color_team.g, esp_box_color_team.b }; + data["esp_skeleton_color_enemy"] = { esp_box_color_enemy.r, esp_box_color_enemy.g, esp_box_color_enemy.b }; data["esp_name_color"] = { esp_name_color.r, esp_name_color.g, esp_name_color.b }; data["esp_distance_color"] = { esp_distance_color.r, esp_distance_color.g, esp_distance_color.b }; diff --git a/memory-external/classes/config.hpp b/memory-external/classes/config.hpp index 213527b..5a168f2 100644 --- a/memory-external/classes/config.hpp +++ b/memory-external/classes/config.hpp @@ -27,11 +27,14 @@ namespace config { inline bool team_esp = false; inline float render_distance = -1.f; inline int flag_render_distance = 200; + inline bool show_box_esp = true; + inline bool show_skeleton_esp = false; inline bool show_extra_flags = false; - inline bool show_head_tracker = false; inline RGB esp_box_color_team = { 75, 175, 75 }; inline RGB esp_box_color_enemy = { 175, 75, 75 }; + inline RGB esp_skeleton_color_team = { 75, 175, 75 }; + inline RGB esp_skeleton_color_enemy = { 175, 75, 75 }; inline RGB esp_name_color = { 75, 75, 175 }; inline RGB esp_distance_color = { 75, 75, 175 }; } diff --git a/memory-external/classes/render.hpp b/memory-external/classes/render.hpp index 2bcc887..5d03446 100644 --- a/memory-external/classes/render.hpp +++ b/memory-external/classes/render.hpp @@ -3,6 +3,18 @@ namespace render { + void DrawLine(HDC hdc, int x1, int y1, int x2, int y2, COLORREF color) + { + HPEN hPen = CreatePen(PS_SOLID, 2, color); + HPEN hOldPen = (HPEN)SelectObject(hdc, hPen); + + MoveToEx(hdc, x1, y1, NULL); + LineTo(hdc, x2, y2); + + SelectObject(hdc, hOldPen); + DeleteObject(hPen); + } + void DrawCircle(HDC hdc, int x, int y, int radius, COLORREF color) { HPEN hPen = CreatePen(PS_SOLID, 2, color); diff --git a/memory-external/hacks/hack.hpp b/memory-external/hacks/hack.hpp index 1da4705..12cd2bb 100644 --- a/memory-external/hacks/hack.hpp +++ b/memory-external/hacks/hack.hpp @@ -59,28 +59,45 @@ namespace hack { float distance = g_game.localOrigin.calculate_distance(player->origin); int roundedDistance = std::round(distance / 10.f); - if (config::show_head_tracker) { - const Vector3 screenHeadPos = g_game.world_to_screen(&player->skull); - const float head_height = (screenHeadPos.y - screenHeadPos.y) / 8; - const float head_width = (head_height / 2.4f) / 4; - + if (config::show_skeleton_esp) { render::DrawCircle( g::hdcBuffer, - screenHeadPos.x, - screenHeadPos.y, + player->bones.bonePositions["head"].x, + player->bones.bonePositions["head"].y - width / 12, width / 5, - config::esp_box_color_enemy ); + + // render::DrawLine(g::hdcBuffer, player->bones.bonePositions["head"].x, player->bones.bonePositions["head"].y, player->bones.bonePositions["neck_0"].x, player->bones.bonePositions["neck_0"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["neck_0"].x, player->bones.bonePositions["neck_0"].y, player->bones.bonePositions["spine_1"].x, player->bones.bonePositions["spine_1"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["spine_1"].x, player->bones.bonePositions["spine_1"].y, player->bones.bonePositions["spine_2"].x, player->bones.bonePositions["spine_2"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["spine_2"].x, player->bones.bonePositions["spine_2"].y, player->bones.bonePositions["pelvis"].x, player->bones.bonePositions["pelvis"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["spine_1"].x, player->bones.bonePositions["spine_1"].y, player->bones.bonePositions["arm_upper_L"].x, player->bones.bonePositions["arm_upper_L"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["arm_upper_L"].x, player->bones.bonePositions["arm_upper_L"].y, player->bones.bonePositions["arm_lower_L"].x, player->bones.bonePositions["arm_lower_L"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["arm_lower_L"].x, player->bones.bonePositions["arm_lower_L"].y, player->bones.bonePositions["hand_L"].x, player->bones.bonePositions["hand_L"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["spine_1"].x, player->bones.bonePositions["spine_1"].y, player->bones.bonePositions["arm_upper_R"].x, player->bones.bonePositions["arm_upper_R"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["arm_upper_R"].x, player->bones.bonePositions["arm_upper_R"].y, player->bones.bonePositions["arm_lower_R"].x, player->bones.bonePositions["arm_lower_R"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["arm_lower_R"].x, player->bones.bonePositions["arm_lower_R"].y, player->bones.bonePositions["hand_R"].x, player->bones.bonePositions["hand_R"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["pelvis"].x, player->bones.bonePositions["pelvis"].y, player->bones.bonePositions["leg_upper_L"].x, player->bones.bonePositions["leg_upper_L"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["leg_upper_L"].x, player->bones.bonePositions["leg_upper_L"].y, player->bones.bonePositions["leg_lower_L"].x, player->bones.bonePositions["leg_lower_L"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["leg_lower_L"].x, player->bones.bonePositions["leg_lower_L"].y, player->bones.bonePositions["ankle_L"].x, player->bones.bonePositions["ankle_L"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["pelvis"].x, player->bones.bonePositions["pelvis"].y, player->bones.bonePositions["leg_upper_R"].x, player->bones.bonePositions["leg_upper_R"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["leg_upper_R"].x, player->bones.bonePositions["leg_upper_R"].y, player->bones.bonePositions["leg_lower_R"].x, player->bones.bonePositions["leg_lower_R"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); + render::DrawLine(g::hdcBuffer, player->bones.bonePositions["leg_lower_R"].x, player->bones.bonePositions["leg_lower_R"].y, player->bones.bonePositions["ankle_R"].x, player->bones.bonePositions["ankle_R"].y, g_game.localTeam == player->team ? config::esp_skeleton_color_team : config::esp_skeleton_color_enemy); } - render::DrawBorderBox( - g::hdcBuffer, - screenHead.x - width / 2, - screenHead.y, - width, - height, - (g_game.localTeam == player->team ? config::esp_box_color_team : config::esp_box_color_enemy) - ); + if (config::show_box_esp) + { + render::DrawBorderBox( + g::hdcBuffer, + screenHead.x - width / 2, + screenHead.y, + width, + height, + (g_game.localTeam == player->team ? config::esp_box_color_team : config::esp_box_color_enemy) + ); + } render::DrawBorderBox( g::hdcBuffer, diff --git a/memory-external/hacks/reader.cpp b/memory-external/hacks/reader.cpp index f7dab94..ae9a25b 100644 --- a/memory-external/hacks/reader.cpp +++ b/memory-external/hacks/reader.cpp @@ -1,8 +1,34 @@ #include "reader.hpp" #include +#include +#include #include "../classes/auto_updater.hpp" #include "../classes/config.hpp" +#ifndef M_PI +#define M_PI (3.14159265358979323846264338327950288) +#endif + +std::map boneMap = { + {"head", 6}, + {"neck_0", 5}, + {"spine_1", 4}, + {"spine_2", 2}, + {"pelvis", 0}, + {"arm_upper_L", 8}, + {"arm_lower_L", 9}, + {"hand_L", 10}, + {"arm_upper_R", 13}, + {"arm_lower_R", 14}, + {"hand_R", 15}, + {"leg_upper_L", 22}, + {"leg_lower_L", 23}, + {"ankle_L", 24}, + {"leg_upper_R", 25}, + {"leg_lower_R", 26}, + {"ankle_R", 27} +}; + // CC4 uintptr_t CC4::get_planted() { return g_game.process->read(g_game.process->read(g_game.base_client.base + updater::offsets::dwPlantedC4)); @@ -57,27 +83,27 @@ void CGame::loop() { entity_list = process->read(base_client.base + updater::offsets::dwEntityList); - const uintptr_t localList_entry2 = process->read(entity_list + 0x8 * ((localPlayerPawn & 0x7FFF) >> 9) + 16); - const uintptr_t localpCSPlayerPawn = process->read(localList_entry2 + 120 * (localPlayerPawn & 0x1FF)); + localList_entry2 = process->read(entity_list + 0x8 * ((localPlayerPawn & 0x7FFF) >> 9) + 16); + localpCSPlayerPawn = process->read(localList_entry2 + 120 * (localPlayerPawn & 0x1FF)); if (!localpCSPlayerPawn) return; view_matrix = process->read(base_client.base + updater::offsets::dwViewMatrix); localTeam = process->read(localPlayer + updater::offsets::m_iTeamNum); - localOrigin = process->read(localpCSPlayerPawn + updater::offsets::m_vecOrigin); + localOrigin = process->read(localpCSPlayerPawn + updater::offsets::m_vOldOrigin); isC4Planted = process->read(base_client.base + updater::offsets::dwPlantedC4 - 0x8); inGame = true; int playerIndex = 0; std::vector list; + CPlayer player; + uintptr_t list_entry, list_entry2, playerPawn, playerMoneyServices, clippingWeapon, weaponData, playerNameData; while (true) { playerIndex++; - uintptr_t list_entry = process->read(entity_list + (8 * (playerIndex & 0x7FFF) >> 9) + 16); + list_entry = process->read(entity_list + (8 * (playerIndex & 0x7FFF) >> 9) + 16); if (!list_entry) break; - CPlayer player; - player.entity = process->read(list_entry + 120 * (playerIndex & 0x1FF)); if (!player.entity) continue; @@ -90,9 +116,9 @@ void CGame::loop() { player.team = process->read(player.entity + updater::offsets::m_iTeamNum); if (config::team_esp && (player.team == localTeam)) continue; - const std::uint32_t playerPawn = process->read(player.entity + updater::offsets::m_hPlayerPawn); + playerPawn = process->read(player.entity + updater::offsets::m_hPlayerPawn); - const uintptr_t list_entry2 = process->read(entity_list + 0x8 * ((playerPawn & 0x7FFF) >> 9) + 16); + list_entry2 = process->read(entity_list + 0x8 * ((playerPawn & 0x7FFF) >> 9) + 16); if (!list_entry2) continue; player.pCSPlayerPawn = process->read(list_entry2 + 120 * (playerPawn & 0x1FF)); @@ -103,10 +129,23 @@ void CGame::loop() { if (player.health <= 0 || player.health > 100) continue; if (config::team_esp && (player.pCSPlayerPawn == localPlayer)) continue; + + /* + * Unused for now, but for a vis check + * + * player.spottedState = process->read(player.pCSPlayerPawn + 0x1630); + * player.is_spotted = process->read(player.spottedState + 0xC); // bSpottedByMask + * player.is_spotted = process->read(player.spottedState + 0x8); // bSpotted + */ - player.name = read_string(player.entity + updater::offsets::m_sSanitizedPlayerName); + playerNameData = process->read(player.entity + updater::offsets::m_sSanitizedPlayerName); + char buffer[256]; + process->read_raw(playerNameData, buffer, sizeof(buffer)); + std::string name = std::string(buffer); + player.name = name; - player.origin = process->read(player.pCSPlayerPawn + updater::offsets::m_vecOrigin); + player.gameSceneNode = process->read(player.pCSPlayerPawn + updater::offsets::m_pGameSceneNode); + player.origin = process->read(player.pCSPlayerPawn + updater::offsets::m_vOldOrigin); player.head = { player.origin.x, player.origin.y, player.origin.z + 75.f }; if (player.origin.x == localOrigin.x && player.origin.y == localOrigin.y && player.origin.z == localOrigin.z) @@ -115,13 +154,12 @@ void CGame::loop() { if (config::render_distance != -1 && (localOrigin - player.origin).length2d() > config::render_distance) continue; if (player.origin.x == 0 && player.origin.y == 0) continue; - if (config::show_head_tracker) { - const uintptr_t gamescene = process->read(player.pCSPlayerPawn + 0x310); - const uintptr_t bonearray = process->read(gamescene + 0x160 + 0x80); - player.skull = process->read(bonearray + 6 * 32); + if (config::show_skeleton_esp) { + player.gameSceneNode = process->read(player.pCSPlayerPawn + 0x310); + player.boneArray = process->read(player.gameSceneNode + 0x160 + 0x80); + player.ReadBones(); } - if (config::show_extra_flags) { /* * Reading values for extra flags is now seperated from the other reads @@ -129,14 +167,17 @@ void CGame::loop() { */ player.is_defusing = process->read(player.pCSPlayerPawn + updater::offsets::m_bIsDefusing); - const uintptr_t playerMoneyServices = process->read(player.entity + updater::offsets::m_pInGameMoneyServices); + playerMoneyServices = process->read(player.entity + updater::offsets::m_pInGameMoneyServices); player.money = process->read(playerMoneyServices + updater::offsets::m_iAccount); player.flashAlpha = process->read(player.pCSPlayerPawn + updater::offsets::m_flFlashOverlayAlpha); - const auto clippingWeapon = process->read(player.pCSPlayerPawn + updater::offsets::m_pClippingWeapon); - const auto weaponData = process->read(clippingWeapon + 0x360); - std::string weaponName = read_string(weaponData + updater::offsets::m_szName); + clippingWeapon = process->read(player.pCSPlayerPawn + updater::offsets::m_pClippingWeapon); + weaponData = process->read(clippingWeapon + 0x360); + weaponData = process->read(weaponData + updater::offsets::m_szName); + char buffer[MAX_PATH]; + process->read_raw(weaponData, buffer, sizeof(buffer)); + std::string weaponName = std::string(buffer); if (weaponName.compare(0, 7, "weapon_") == 0) player.weapon = weaponName.substr(7, weaponName.length()); // Remove weapon_ prefix else @@ -150,14 +191,14 @@ void CGame::loop() { players.assign(list.begin(), list.end()); } -std::string CGame::read_string(uintptr_t addr) { - const DWORD64 address = process->read(addr); - if (address) { - char buffer[256]; - process->read_raw(address, buffer, sizeof(buffer)); - return std::string(buffer); +void CPlayer::ReadBones() { + for (const auto& entry : boneMap) { + const std::string& boneName = entry.first; + int boneIndex = entry.second; + uintptr_t boneAddress = boneArray + boneIndex * 32; + Vector3 bonePosition = g_game.process->read(boneAddress); + bones.bonePositions[boneName] = g_game.world_to_screen(&bonePosition); } - return "invalid"; } Vector3 CGame::world_to_screen(Vector3* v) { diff --git a/memory-external/hacks/reader.hpp b/memory-external/hacks/reader.hpp index 5cf69fc..0b997fa 100644 --- a/memory-external/hacks/reader.hpp +++ b/memory-external/hacks/reader.hpp @@ -1,6 +1,8 @@ #pragma once #include "../memory/memory.hpp" #include "../classes/vector.hpp" +#include +#include struct view_matrix_t { float* operator[ ](int index) { @@ -10,6 +12,11 @@ struct view_matrix_t { float matrix[4][4]; }; +class PBones { +public: + std::map bonePositions; +}; + class CC4 { public: uintptr_t get_planted(); @@ -22,16 +29,21 @@ public: uintptr_t entity; int team; uintptr_t pCSPlayerPawn; + uintptr_t gameSceneNode; + uintptr_t boneArray; + uintptr_t spottedState; int health; int armor; std::string name; Vector3 origin; Vector3 head; - Vector3 skull; + PBones bones; bool is_defusing; + bool is_spotted; int32_t money; float flashAlpha; std::string weapon; + void ReadBones(); }; class CGame @@ -56,10 +68,9 @@ private: view_matrix_t view_matrix; uintptr_t entity_list; uintptr_t localPlayer; + uintptr_t localpCSPlayerPawn; std::uint32_t localPlayerPawn; uintptr_t localList_entry2; - uintptr_t localpCSPlayerPawn; - std::string read_string(uintptr_t addr); }; inline CGame g_game; \ No newline at end of file diff --git a/memory-external/main.cpp b/memory-external/main.cpp index 88cbdbc..bfe0961 100644 --- a/memory-external/main.cpp +++ b/memory-external/main.cpp @@ -143,9 +143,9 @@ int main() { std::thread read(read_thread); #ifndef _UC - std::cout << "\n[settings] In Game keybinds:\n\t[F5] enable/disable Team ESP\n\t[F6] enable/disable automatic updates\n\t[F7] enable/disable extra flags\n\t[F8] enable/disable head tracker circle\n\t[end] Unload esp.\n" << std::endl; + std::cout << "\n[settings] In Game keybinds:\n\t[F4] enable/disable Box ESP\n\t[F5] enable/disable Team ESP\n\t[F6] enable/disable automatic updates\n\t[F7] enable/disable extra flags\n\t[F8] enable/disable skeleton esp\n\t[end] Unload esp.\n" << std::endl; #else - std::cout << "\n[settings] In Game keybinds:\n\t[F5] enable/disable Team ESP\n\t[F7] enable/disable extra flags[F8] enable/disable head tracker circle\n\t[end] Unload esp.\n" << std::endl; + std::cout << "\n[settings] In Game keybinds:\n\t[F4] enable/disable Box ESP\n\t[F5] enable/disable Team ESP\n\t[F7] enable/disable extra flags[F8] enable/disable skeleton esp\n\t[end] Unload esp.\n" << std::endl; #endif std::cout << "[settings] Make sure you check the config for additional settings!" << std::endl; @@ -155,13 +155,15 @@ int main() { { if (GetAsyncKeyState(VK_END) & 0x8000) finish = true; + if (GetAsyncKeyState(VK_F4) & 0x8000) { config::show_box_esp = !config::show_box_esp; config::save(); Beep(700, 100); }; + if (GetAsyncKeyState(VK_F5) & 0x8000) { config::team_esp = !config::team_esp; config::save(); Beep(700, 100); }; #ifndef _UC if (GetAsyncKeyState(VK_F6) & 0x8000) { config::automatic_update = !config::automatic_update; config::save(); Beep(700, 100); } #endif if (GetAsyncKeyState(VK_F7) & 0x8000) { config::show_extra_flags = !config::show_extra_flags; config::save(); Beep(700, 100); }; - if (GetAsyncKeyState(VK_F8) & 0x8000) { config::show_head_tracker = !config::show_head_tracker; config::save(); Beep(700, 100); }; + if (GetAsyncKeyState(VK_F8) & 0x8000) { config::show_skeleton_esp = !config::show_skeleton_esp; config::save(); Beep(700, 100); }; TranslateMessage(&msg); DispatchMessage(&msg); diff --git a/memory-external/memory-external.vcxproj.filters b/memory-external/memory-external.vcxproj.filters index 8d1391e..60b10ee 100644 --- a/memory-external/memory-external.vcxproj.filters +++ b/memory-external/memory-external.vcxproj.filters @@ -27,6 +27,9 @@ Source Files + + Source Files + @@ -56,5 +59,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/offsets/offsets.json b/offsets/offsets.json index 101e4ac..6f2bdc5 100644 --- a/offsets/offsets.json +++ b/offsets/offsets.json @@ -11,6 +11,7 @@ "m_pInGameMoneyServices": 1744, "m_iAccount": 64, "m_vecAbsOrigin": 200, + "m_vOldOrigin": 4644, "m_pGameSceneNode": 784, "m_flFlashOverlayAlpha": 5212, "m_bIsDefusing": 5032,