diff --git a/include/hacks/AntiAim.hpp b/include/hacks/AntiAim.hpp index 3c544b2c..0bb74e53 100755 --- a/include/hacks/AntiAim.hpp +++ b/include/hacks/AntiAim.hpp @@ -12,9 +12,8 @@ class CUserCmd; namespace hacks::shared::antiaim { -extern int safe_space; - void SetSafeSpace(int safespace); bool ShouldAA(CUserCmd *cmd); void ProcessUserCmd(CUserCmd *cmd); +bool isEnabled(); } diff --git a/src/hacks/AntiAim.cpp b/src/hacks/AntiAim.cpp index b5a91484..3816c68e 100644 --- a/src/hacks/AntiAim.cpp +++ b/src/hacks/AntiAim.cpp @@ -8,6 +8,8 @@ #include #include #include +#include + #include "common.hpp" static settings::Bool communicate{ "antiaim.identify", "0" }; @@ -616,4 +618,9 @@ void ProcessUserCmd(CUserCmd *cmd) g_pLocalPlayer->bUseSilentAngles = true; FakeCrouch(cmd); } + +bool antiaim::isEnabled() +{ + return *enable; +} } diff --git a/src/hacks/Misc.cpp b/src/hacks/Misc.cpp index 0c25ec70..d0a16b5e 100644 --- a/src/hacks/Misc.cpp +++ b/src/hacks/Misc.cpp @@ -13,21 +13,35 @@ #include #include #include +#include #include "core/sharedobj.hpp" #include "hack.hpp" #include "common.hpp" -namespace hacks::shared::misc -{ +static settings::Bool render_zoomed{ "visuals.render-local-zoomed", "false" }; +static settings::Bool anti_afk{ "misc.anti-afk", "false" }; +static settings::Bool auto_strafe{ "misc.autostrafe", "false" }; +static settings::Bool tauntslide{ "misc.tauntslide-tf2c", "false" }; +static settings::Bool tauntslide_tf2{ "misc.tauntslide", "false" }; +static settings::Bool flashlight_spam{ "misc.flashlight-spam", "false" }; +static settings::Bool auto_balance_spam{ "misc.auto-balance-spam", "false" }; +static settings::Bool nopush_enabled{ "misc.no-push", "false" }; -void *C_TFPlayer__ShouldDraw_original = nullptr; +#if ENABLE_VISUALS +static settings::Bool god_mode{ "misc.god-mode", "false" }; +static settings::Bool debug_info{ "misc.debug-info", "false" }; +static settings::Bool no_homo{ "misc.no-homo", "false" }; +static settings::Bool show_spectators{ "misc.show-spectators", "false" }; +#endif -bool C_TFPlayer__ShouldDraw_hook(IClientEntity *thisptr) +static void *C_TFPlayer__ShouldDraw_original = nullptr; + +static bool C_TFPlayer__ShouldDraw_hook(IClientEntity *thisptr) { if (thisptr == - g_IEntityList->GetClientEntity(g_IEngine->GetLocalPlayer()) && + g_IEntityList->GetClientEntity(g_IEngine->GetLocalPlayer()) && g_pLocalPlayer->bZoomed && thisptr) { // NET_INT(thisptr, netvar.iCond) &= ~(1 << TFCond_Zoomed); @@ -39,28 +53,55 @@ bool C_TFPlayer__ShouldDraw_hook(IClientEntity *thisptr) else { return ((bool (*)(IClientEntity *)) C_TFPlayer__ShouldDraw_original)( - thisptr); + thisptr); } } -int last_number = 0; +static void tryPatchLocalPlayerShouldDraw() +{ + // Patching local player + void **vtable = *(void ***) (g_pLocalPlayer->entity->InternalEntity()); + if (vtable[offsets::ShouldDraw()] != C_TFPlayer__ShouldDraw_hook) + { + C_TFPlayer__ShouldDraw_original = vtable[offsets::ShouldDraw()]; + void *page = (void *) ((uintptr_t) vtable & ~0xFFF); + mprotect(page, 0xFFF, PROT_READ | PROT_WRITE | PROT_EXEC); + vtable[offsets::ShouldDraw()] = + (void *) C_TFPlayer__ShouldDraw_hook; + mprotect(page, 0xFFF, PROT_READ | PROT_EXEC); + } +} -float last_bucket = 0; +static Timer anti_afk_timer{}; +static int last_buttons{ 0 }; -static CatCommand test_chat_print( - "debug_print_chat", "machine broke", [](const CCommand &args) { - CHudBaseChat *chat = (CHudBaseChat *) g_CHUD->FindElement("CHudChat"); - if (chat) +static void updateAntiAfk() +{ + if (current_user_cmd->buttons != last_buttons || g_pLocalPlayer->life_state) + { + anti_afk_timer.update(); + last_buttons = current_user_cmd->buttons; + } + else + { + if (anti_afk_timer.check(60000)) { - std::unique_ptr str( - strfmt("\x07%06X[CAT]\x01 %s", 0x4D7942, args.ArgS()).get()); - chat->Printf(str.get()); + // Send random commands + current_user_cmd->sidemove = RandFloatRange(-450.0, 450.0); + current_user_cmd->forwardmove = RandFloatRange(-450.0, 450.0); + current_user_cmd->buttons = rand(); + // Prevent attack command + current_user_cmd->buttons &= ~IN_ATTACK; + if (anti_afk_timer.check(61000)) + { + anti_afk_timer.update(); + } } - else - { - logging::Info("Chat is null!"); - } - }); + } +} + +namespace hacks::shared::misc +{ // Use to send a autobalance request to the server that doesnt prevent you from // using it again, Allowing infinite use of it. @@ -72,167 +113,49 @@ void SendAutoBalanceRequest() kv->SetInt("response", 1); g_IEngine->ServerCmdKeyValues(kv); } + // Catcommand for above CatCommand SendAutoBlRqCatCom("request_balance", "Request Infinite Auto-Balance", [](const CCommand &args) { SendAutoBalanceRequest(); }); +static int last_number{ 0 }; +static int last_checked_command_number{ 0 }; +static IClientEntity *last_checked_weapon{ nullptr }; +static bool flash_light_spam_switch{ false }; +static Timer auto_balance_timer{}; + +static ConVar *teammatesPushaway{ nullptr }; +InitRoutine init([]() { + teammatesPushaway = g_ICvar->FindVar("tf_avoidteammates_pushaway"); +}); + void CreateMove() { #if !LAGBOT_MODE - // Crithack - static IClientEntity *localplayer, *weapon, *last_weapon = nullptr; - static int tries, cmdn, md5seed, rseed, c, b; - static crithack_saved_state state; - static bool chc; - static bool changed = false; + if (current_user_cmd->command_number) + last_number = current_user_cmd->command_number; - if (g_pUserCmd->command_number) - last_number = g_pUserCmd->command_number; - - static int last_checked_command_number = 0; - static IClientEntity *last_checked_weapon = nullptr; - - /*IF_GAME (IsTF2()) { - if (crit_hack_next && CE_GOOD(LOCAL_E) && CE_GOOD(LOCAL_W) && - WeaponCanCrit() && RandomCrits()) { - PROF_SECTION(CM_misc_crit_hack_prediction); - weapon = RAW_ENT(LOCAL_W); - // IsBaseCombatWeapon - if (weapon && - vfunc(weapon, 1944 / 4, 0)(weapon)) { - /*if (experimental_crit_hack.KeyDown()) { - if (!g_pUserCmd->command_number || critWarmup < 8) { - if (g_pUserCmd->buttons & IN_ATTACK) { - critWarmup++; - } else { - critWarmup = 0; - } - g_pUserCmd->buttons &= ~(IN_ATTACK); - } - }*/ /* - if (g_pUserCmd->command_number && - (last_checked_weapon != - weapon || last_checked_command_number < - g_pUserCmd->command_number)) - { - tries = 0; - cmdn = g_pUserCmd->command_number; - chc = false; - state.Save(weapon); - while (!chc && tries < 4096) { - md5seed = MD5_PseudoRandom(cmdn) & - 0x7fffffff; - rseed = md5seed; - //float bucket = - *(float*)((uintptr_t)RAW_ENT(LOCAL_W) - + 2612u); *g_PredictionRandomSeed = md5seed; c = LOCAL_W->m_IDX - << 8; - b = - LOCAL_E->m_IDX; rseed = rseed ^ (b | c); - *(float*)(weapon + 2872ul) = 0.0f; - RandomSeed(rseed); - chc = - vfunc(weapon, 1836 - / 4, - 0)(weapon); if (!chc) { tries++; cmdn++; - } - } - last_checked_command_number = cmdn; - last_checked_weapon = weapon; - state.Load(weapon); - last_bucket = state.bucket; - if (chc) { - found_crit_weapon = weapon; - found_crit_number = cmdn; - } - } - if (g_pUserCmd->buttons & (IN_ATTACK)) { - if (found_crit_weapon == weapon && - g_pUserCmd->command_number < found_crit_number) { if - (g_IInputSystem->IsButtonDown((ButtonCode_t)((int)experimental_crit_hack))) - { command_number_mod[g_pUserCmd->command_number] = cmdn; - } - } - } - } - } - }*/ - /* - { - PROF_SECTION(CM_misc_crit_hack_apply); - if (!AllowAttacking()) g_pUserCmd->buttons &= ~IN_ATTACK; - }*/ - // Spycrab stuff // TODO FIXME this should be moved out of here IF_GAME(IsTF2()) { - PROF_SECTION(CM_misc_hook_checks); - static IClientEntity *localplayer = nullptr; - localplayer = - g_IEntityList->GetClientEntity(g_IEngine->GetLocalPlayer()); - if (render_zoomed && localplayer) - { - // Patchking local player - void **vtable = *(void ***) (localplayer); - if (vtable[offsets::ShouldDraw()] != C_TFPlayer__ShouldDraw_hook) - { - C_TFPlayer__ShouldDraw_original = vtable[offsets::ShouldDraw()]; - void *page = (void *) ((uintptr_t) vtable & ~0xFFF); - mprotect(page, 0xFFF, PROT_READ | PROT_WRITE | PROT_EXEC); - vtable[offsets::ShouldDraw()] = - (void *) C_TFPlayer__ShouldDraw_hook; - mprotect(page, 0xFFF, PROT_READ | PROT_EXEC); - } - } + if (render_zoomed && CE_GOOD(LOCAL_E)) + tryPatchLocalPlayerShouldDraw(); } // AntiAfk That after a certian time without movement keys depressed, causes // random keys to be spammed for 1 second if (anti_afk) - { - - // Time last idle - static float afk_time_idle = 0; - - // If the timer exceeds 1 minute, jump and reset the timer - if (g_GlobalVars->curtime - 60 > afk_time_idle) - { - - // Send random commands - g_pUserCmd->sidemove = RandFloatRange(-450.0, 450.0); - g_pUserCmd->forwardmove = RandFloatRange(-450.0, 450.0); - g_pUserCmd->buttons = rand(); - // Prevent attack command - g_pUserCmd->buttons &= ~IN_ATTACK; - - // After 1 second we reset the idletime - if (g_GlobalVars->curtime - 61 > afk_time_idle) - { - logging::Info("Finish anti-idle"); - afk_time_idle = g_GlobalVars->curtime; - } - } - else - { - // If the player uses a button, reset the timer - if (g_pUserCmd->buttons & IN_FORWARD || - g_pUserCmd->buttons & IN_BACK || - g_pUserCmd->buttons & IN_MOVELEFT || - g_pUserCmd->buttons & IN_MOVERIGHT || - g_pUserCmd->buttons & IN_JUMP || !LOCAL_E->m_bAlivePlayer()) - afk_time_idle = g_GlobalVars->curtime; - } - } + updateAntiAfk(); // Automaticly airstrafes in the air if (auto_strafe) { - bool ground = CE_INT(g_pLocalPlayer->entity, netvar.iFlags) & (1 << 0); + auto ground = (bool)(CE_INT(g_pLocalPlayer->entity, netvar.iFlags) & FL_ONGROUND); if (!ground) { - if (g_pUserCmd->mousedx > 1 || g_pUserCmd->mousedx < -1) + if (current_user_cmd->mousedx) { - g_pUserCmd->sidemove = g_pUserCmd->mousedx > 1 ? 450.f : -450.f; + current_user_cmd->sidemove = current_user_cmd->mousedx > 1 ? 450.f : -450.f; } } } @@ -249,16 +172,14 @@ void CreateMove() { if (flashlight_spam) { - static bool flswitch = false; - if (flswitch && !g_pUserCmd->impulse) - g_pUserCmd->impulse = 100; - flswitch = !flswitch; + if (flash_light_spam_switch && !current_user_cmd->impulse) + current_user_cmd->impulse = 100; + flash_light_spam_switch = !flash_light_spam_switch; } } IF_GAME(IsTF2()) { - // Tauntslide needs improvement for movement but it mostly works if (tauntslide_tf2) { @@ -270,26 +191,24 @@ void CreateMove() // get directions float forward = 0; float side = 0; - if (g_pUserCmd->buttons & IN_FORWARD) + if (current_user_cmd->buttons & IN_FORWARD) forward += 450; - if (g_pUserCmd->buttons & IN_BACK) + if (current_user_cmd->buttons & IN_BACK) forward -= 450; - if (g_pUserCmd->buttons & IN_MOVELEFT) + if (current_user_cmd->buttons & IN_MOVELEFT) side -= 450; - if (g_pUserCmd->buttons & IN_MOVERIGHT) + if (current_user_cmd->buttons & IN_MOVERIGHT) side += 450; - g_pUserCmd->forwardmove = forward; - g_pUserCmd->sidemove = side; + current_user_cmd->forwardmove = forward; + current_user_cmd->sidemove = side; - static QAngle camera_angle; + QAngle camera_angle; g_IEngine->GetViewAngles(camera_angle); // Doesnt work with anti-aim as well as I hoped... I guess // this is as far as I can go with such a simple tauntslide - if (!(hacks::shared::antiaim::enabled && - hacks::shared::antiaim::yaw_mode && - !(side || forward))) - g_pUserCmd->viewangles.y = camera_angle[1]; + if (!hacks::shared::antiaim::isEnabled()) + current_user_cmd->viewangles.y = camera_angle[1]; g_pLocalPlayer->v_OrigViewangles.y = camera_angle[1]; // Use silent since we dont want to prevent the player from @@ -300,23 +219,12 @@ void CreateMove() } // Spams infinite autobalance spam function - if (auto_balance_spam) - { - - static float auto_balance_time = 0; - if (g_GlobalVars->curtime - 0.15 > auto_balance_time) - { - - SendAutoBalanceRequest(); - // Reset - auto_balance_time = g_GlobalVars->curtime; - } - } + if (auto_balance_spam && auto_balance_timer.test_and_set(150)) + SendAutoBalanceRequest(); // Simple No-Push through cvars - static ConVar *pNoPush = g_ICvar->FindVar("tf_avoidteammates_pushaway"); - if (nopush_enabled == pNoPush->GetBool()) - pNoPush->SetValue(!nopush_enabled); + if (*nopush_enabled == teammatesPushaway->GetBool()) + teammatesPushaway->SetValue(!nopush_enabled); } #endif } @@ -413,7 +321,7 @@ void DrawText() AddSideString(format("Velocity2: ", vel.Length2D())); AddSideString(format("flSimTime: ", LOCAL_E->var(netvar.m_flSimulationTime))); - if (g_pUserCmd) + if (current_user_cmd) AddSideString(format("command_number: ", last_cmd_number)); AddSideString(format( "clip: ", CE_INT(g_pLocalPlayer->weapon(), netvar.m_iClip1)));