This commit is contained in:
nullifiedcat 2018-07-29 14:10:15 +03:00
parent f8ec03e1ec
commit a6d4a510d5
3 changed files with 106 additions and 192 deletions

View File

@ -12,9 +12,8 @@ class CUserCmd;
namespace hacks::shared::antiaim namespace hacks::shared::antiaim
{ {
extern int safe_space;
void SetSafeSpace(int safespace); void SetSafeSpace(int safespace);
bool ShouldAA(CUserCmd *cmd); bool ShouldAA(CUserCmd *cmd);
void ProcessUserCmd(CUserCmd *cmd); void ProcessUserCmd(CUserCmd *cmd);
bool isEnabled();
} }

View File

@ -8,6 +8,8 @@
#include <hacks/hacklist.hpp> #include <hacks/hacklist.hpp>
#include <glez/draw.hpp> #include <glez/draw.hpp>
#include <settings/Bool.hpp> #include <settings/Bool.hpp>
#include <hacks/AntiAim.hpp>
#include "common.hpp" #include "common.hpp"
static settings::Bool communicate{ "antiaim.identify", "0" }; static settings::Bool communicate{ "antiaim.identify", "0" };
@ -616,4 +618,9 @@ void ProcessUserCmd(CUserCmd *cmd)
g_pLocalPlayer->bUseSilentAngles = true; g_pLocalPlayer->bUseSilentAngles = true;
FakeCrouch(cmd); FakeCrouch(cmd);
} }
bool antiaim::isEnabled()
{
return *enable;
}
} }

View File

@ -13,21 +13,35 @@
#include <link.h> #include <link.h>
#include <hacks/AntiAim.hpp> #include <hacks/AntiAim.hpp>
#include <glez/draw.hpp> #include <glez/draw.hpp>
#include <settings/Bool.hpp>
#include "core/sharedobj.hpp" #include "core/sharedobj.hpp"
#include "hack.hpp" #include "hack.hpp"
#include "common.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 == if (thisptr ==
g_IEntityList->GetClientEntity(g_IEngine->GetLocalPlayer()) && g_IEntityList->GetClientEntity(g_IEngine->GetLocalPlayer()) &&
g_pLocalPlayer->bZoomed && thisptr) g_pLocalPlayer->bZoomed && thisptr)
{ {
// NET_INT(thisptr, netvar.iCond) &= ~(1 << TFCond_Zoomed); // NET_INT(thisptr, netvar.iCond) &= ~(1 << TFCond_Zoomed);
@ -39,28 +53,55 @@ bool C_TFPlayer__ShouldDraw_hook(IClientEntity *thisptr)
else else
{ {
return ((bool (*)(IClientEntity *)) C_TFPlayer__ShouldDraw_original)( 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( static void updateAntiAfk()
"debug_print_chat", "machine broke", [](const CCommand &args) { {
CHudBaseChat *chat = (CHudBaseChat *) g_CHUD->FindElement("CHudChat"); if (current_user_cmd->buttons != last_buttons || g_pLocalPlayer->life_state)
if (chat) {
anti_afk_timer.update();
last_buttons = current_user_cmd->buttons;
}
else
{
if (anti_afk_timer.check(60000))
{ {
std::unique_ptr<char> str( // Send random commands
strfmt("\x07%06X[CAT]\x01 %s", 0x4D7942, args.ArgS()).get()); current_user_cmd->sidemove = RandFloatRange(-450.0, 450.0);
chat->Printf(str.get()); 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 // Use to send a autobalance request to the server that doesnt prevent you from
// using it again, Allowing infinite use of it. // using it again, Allowing infinite use of it.
@ -72,167 +113,49 @@ void SendAutoBalanceRequest()
kv->SetInt("response", 1); kv->SetInt("response", 1);
g_IEngine->ServerCmdKeyValues(kv); g_IEngine->ServerCmdKeyValues(kv);
} }
// Catcommand for above // Catcommand for above
CatCommand CatCommand
SendAutoBlRqCatCom("request_balance", "Request Infinite Auto-Balance", SendAutoBlRqCatCom("request_balance", "Request Infinite Auto-Balance",
[](const CCommand &args) { SendAutoBalanceRequest(); }); [](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() void CreateMove()
{ {
#if !LAGBOT_MODE #if !LAGBOT_MODE
// Crithack if (current_user_cmd->command_number)
static IClientEntity *localplayer, *weapon, *last_weapon = nullptr; last_number = current_user_cmd->command_number;
static int tries, cmdn, md5seed, rseed, c, b;
static crithack_saved_state state;
static bool chc;
static bool changed = false;
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<bool(*)(IClientEntity*)>(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<bool(*)(IClientEntity*)>(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 // TODO FIXME this should be moved out of here
IF_GAME(IsTF2()) IF_GAME(IsTF2())
{ {
PROF_SECTION(CM_misc_hook_checks); if (render_zoomed && CE_GOOD(LOCAL_E))
static IClientEntity *localplayer = nullptr; tryPatchLocalPlayerShouldDraw();
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);
}
}
} }
// AntiAfk That after a certian time without movement keys depressed, causes // AntiAfk That after a certian time without movement keys depressed, causes
// random keys to be spammed for 1 second // random keys to be spammed for 1 second
if (anti_afk) if (anti_afk)
{ updateAntiAfk();
// 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;
}
}
// Automaticly airstrafes in the air // Automaticly airstrafes in the air
if (auto_strafe) 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 (!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) if (flashlight_spam)
{ {
static bool flswitch = false; if (flash_light_spam_switch && !current_user_cmd->impulse)
if (flswitch && !g_pUserCmd->impulse) current_user_cmd->impulse = 100;
g_pUserCmd->impulse = 100; flash_light_spam_switch = !flash_light_spam_switch;
flswitch = !flswitch;
} }
} }
IF_GAME(IsTF2()) IF_GAME(IsTF2())
{ {
// Tauntslide needs improvement for movement but it mostly works // Tauntslide needs improvement for movement but it mostly works
if (tauntslide_tf2) if (tauntslide_tf2)
{ {
@ -270,26 +191,24 @@ void CreateMove()
// get directions // get directions
float forward = 0; float forward = 0;
float side = 0; float side = 0;
if (g_pUserCmd->buttons & IN_FORWARD) if (current_user_cmd->buttons & IN_FORWARD)
forward += 450; forward += 450;
if (g_pUserCmd->buttons & IN_BACK) if (current_user_cmd->buttons & IN_BACK)
forward -= 450; forward -= 450;
if (g_pUserCmd->buttons & IN_MOVELEFT) if (current_user_cmd->buttons & IN_MOVELEFT)
side -= 450; side -= 450;
if (g_pUserCmd->buttons & IN_MOVERIGHT) if (current_user_cmd->buttons & IN_MOVERIGHT)
side += 450; side += 450;
g_pUserCmd->forwardmove = forward; current_user_cmd->forwardmove = forward;
g_pUserCmd->sidemove = side; current_user_cmd->sidemove = side;
static QAngle camera_angle; QAngle camera_angle;
g_IEngine->GetViewAngles(camera_angle); g_IEngine->GetViewAngles(camera_angle);
// Doesnt work with anti-aim as well as I hoped... I guess // 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 // this is as far as I can go with such a simple tauntslide
if (!(hacks::shared::antiaim::enabled && if (!hacks::shared::antiaim::isEnabled())
hacks::shared::antiaim::yaw_mode && current_user_cmd->viewangles.y = camera_angle[1];
!(side || forward)))
g_pUserCmd->viewangles.y = camera_angle[1];
g_pLocalPlayer->v_OrigViewangles.y = camera_angle[1]; g_pLocalPlayer->v_OrigViewangles.y = camera_angle[1];
// Use silent since we dont want to prevent the player from // Use silent since we dont want to prevent the player from
@ -300,23 +219,12 @@ void CreateMove()
} }
// Spams infinite autobalance spam function // Spams infinite autobalance spam function
if (auto_balance_spam) if (auto_balance_spam && auto_balance_timer.test_and_set(150))
{ SendAutoBalanceRequest();
static float auto_balance_time = 0;
if (g_GlobalVars->curtime - 0.15 > auto_balance_time)
{
SendAutoBalanceRequest();
// Reset
auto_balance_time = g_GlobalVars->curtime;
}
}
// Simple No-Push through cvars // Simple No-Push through cvars
static ConVar *pNoPush = g_ICvar->FindVar("tf_avoidteammates_pushaway"); if (*nopush_enabled == teammatesPushaway->GetBool())
if (nopush_enabled == pNoPush->GetBool()) teammatesPushaway->SetValue(!nopush_enabled);
pNoPush->SetValue(!nopush_enabled);
} }
#endif #endif
} }
@ -413,7 +321,7 @@ void DrawText()
AddSideString(format("Velocity2: ", vel.Length2D())); AddSideString(format("Velocity2: ", vel.Length2D()));
AddSideString(format("flSimTime: ", AddSideString(format("flSimTime: ",
LOCAL_E->var<float>(netvar.m_flSimulationTime))); LOCAL_E->var<float>(netvar.m_flSimulationTime)));
if (g_pUserCmd) if (current_user_cmd)
AddSideString(format("command_number: ", last_cmd_number)); AddSideString(format("command_number: ", last_cmd_number));
AddSideString(format( AddSideString(format(
"clip: ", CE_INT(g_pLocalPlayer->weapon(), netvar.m_iClip1))); "clip: ", CE_INT(g_pLocalPlayer->weapon(), netvar.m_iClip1)));