From bf6c8d8fdcb2b1325c7803a134bf54b44aed9d9c Mon Sep 17 00:00:00 2001 From: nullifiedcat Date: Sun, 29 Jul 2018 12:58:03 +0300 Subject: [PATCH] refactoring --- include/common.hpp | 3 +- include/core/logging.hpp | 2 - include/globals.h | 8 +- include/hacks/AutoHeal.hpp | 2 +- include/hacks/CMakeLists.txt | 1 + include/hacks/Misc.hpp | 47 ------- include/hacks/Spam.hpp | 6 +- include/hacks/Thirdperson.hpp | 12 ++ include/hacks/hacklist.hpp | 2 - include/visual/CMakeLists.txt | 1 + include/visual/EventLogging.hpp | 9 ++ src/MiscTemporary.cpp | 32 ----- src/angles.cpp | 2 +- src/chatlog.cpp | 4 +- src/core/init.cpp | 2 +- src/core/logging.cpp | 11 +- src/crits.cpp | 60 ++++----- src/globals.cpp | 61 ++------- src/hack.cpp | 129 +------------------ src/hacks/AutoJoin.cpp | 2 - src/hacks/AutoReflect.cpp | 8 -- src/hacks/CMakeLists.txt | 3 +- src/hacks/ESP.cpp | 2 - src/hacks/Misc.cpp | 34 ----- src/hacks/SeedPrediction.cpp | 1 - src/hacks/Spam.cpp | 30 ++--- src/hacks/Thirdperson.cpp | 41 ++++++ src/helpers.cpp | 2 +- src/hooks/others.cpp | 5 - src/hooks/visual/FrameStageNotify.cpp | 16 +-- src/visual/CMakeLists.txt | 1 + src/visual/EffectChams.cpp | 3 - src/visual/EventLogging.cpp | 176 ++++++++++++++++++++++++++ 33 files changed, 326 insertions(+), 392 deletions(-) create mode 100644 include/hacks/Thirdperson.hpp create mode 100644 include/visual/EventLogging.hpp create mode 100644 src/hacks/Thirdperson.cpp create mode 100644 src/visual/EventLogging.cpp diff --git a/include/common.hpp b/include/common.hpp index 1e18c9cd..82e7845a 100755 --- a/include/common.hpp +++ b/include/common.hpp @@ -56,7 +56,6 @@ #include #include #include -#include "visual/menu/compatlayer.hpp" #endif #include "core/profiler.hpp" @@ -104,7 +103,7 @@ #include "copypasted/CSignature.h" #if ENABLE_GUI -#include "visual/menu/GUI.h" +// FIXME add gui #endif #include diff --git a/include/core/logging.hpp b/include/core/logging.hpp index 06151652..fbb335a3 100755 --- a/include/core/logging.hpp +++ b/include/core/logging.hpp @@ -9,8 +9,6 @@ #include -typedef void(fn_Msg_t)(const char *msg, va_list); - #ifdef __cplusplus namespace logging { diff --git a/include/globals.h b/include/globals.h index 5120689c..e7966115 100644 --- a/include/globals.h +++ b/include/globals.h @@ -8,7 +8,10 @@ #pragma once #include #include +#include + class Vector; +class CUserCmd; class ConVar; extern int g_AppID; @@ -43,7 +46,8 @@ public: brutestruct brute; }; -class CUserCmd; -extern CUserCmd *g_pUserCmd; +bool isHackActive(); + +extern CUserCmd *current_user_cmd; extern GlobalSettings g_Settings; diff --git a/include/hacks/AutoHeal.hpp b/include/hacks/AutoHeal.hpp index ed6c0222..53b3ba3d 100755 --- a/include/hacks/AutoHeal.hpp +++ b/include/hacks/AutoHeal.hpp @@ -11,7 +11,7 @@ namespace hacks::tf::autoheal { -// TODO extern CatVar target_only; + void CreateMove(); struct patient_data_s diff --git a/include/hacks/CMakeLists.txt b/include/hacks/CMakeLists.txt index 1d5185bd..f7d8c62e 100644 --- a/include/hacks/CMakeLists.txt +++ b/include/hacks/CMakeLists.txt @@ -42,6 +42,7 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/ESP.hpp" "${CMAKE_CURRENT_LIST_DIR}/Radar.hpp" "${CMAKE_CURRENT_LIST_DIR}/SkinChanger.hpp" + "${CMAKE_CURRENT_LIST_DIR}/Thirdperson.hpp" "${CMAKE_CURRENT_LIST_DIR}/SpyAlert.hpp") endif() diff --git a/include/hacks/Misc.hpp b/include/hacks/Misc.hpp index 36f158a6..8ade5e8d 100755 --- a/include/hacks/Misc.hpp +++ b/include/hacks/Misc.hpp @@ -22,50 +22,3 @@ extern int last_number; extern float last_bucket; } - -/*class Misc : public IHack { -public: - Misc(); - - virtual void ProcessUserCmd(CUserCmd*) override; - virtual void Draw() override; - - CatVar* v_bDebugInfo; - ConCommand* c_Name; - ConVar* v_bInfoSpam; - ConVar* v_bFastCrouch; - CatVar* v_bFlashlightSpam; - CatVar* v_bMinigunJump; // TF2C - CatVar* v_bDebugCrits; // TF2C - CatVar* v_bAntiAFK; - CatVar* v_bHookInspect; - CatVar* v_iFakeLag; - CatVar* v_bCritHack; - CatVar* v_bTauntSlide; - CatVar* v_bSuppressCrits; - //ConVar* v_bDumpEventInfo; - ConCommand* c_SaveSettings; - ConCommand* c_Unrestricted; - ConCommand* c_DumpItemAttributes; - ConCommand* c_SayLine; - ConCommand* c_Shutdown; - ConCommand* c_AddFriend; - ConCommand* c_AddRage; - ConCommand* c_DumpVars; - ConCommand* c_DumpPlayers; - ConCommand* c_Teamname; - ConCommand* c_Lockee; - ConCommand* c_Info; - ConCommand* c_DumpConds; - ConCommand* c_Reset; - ConCommand* c_Disconnect; - ConCommand* c_Schema; - ConCommand* c_DisconnectVAC; - - CatVar* v_bCleanChat; -}; - -void Schema_Reload(); -void CC_Misc_Disconnect_VAC(); - -DECLARE_HACK_SINGLETON(Misc);*/ diff --git a/include/hacks/Spam.hpp b/include/hacks/Spam.hpp index 165333ae..3bba268a 100755 --- a/include/hacks/Spam.hpp +++ b/include/hacks/Spam.hpp @@ -22,7 +22,7 @@ extern const std::vector builtin_lmaobox; extern const std::vector builtin_lithium; bool isActive(); -void Init(); -void CreateMove(); -void Reload(); +void init(); +void createMove(); +void reload(); } diff --git a/include/hacks/Thirdperson.hpp b/include/hacks/Thirdperson.hpp new file mode 100644 index 00000000..982d082b --- /dev/null +++ b/include/hacks/Thirdperson.hpp @@ -0,0 +1,12 @@ +/* + Created on 29.07.18. +*/ + +#pragma once + +namespace hacks::tf::thirdperson +{ + +void frameStageNotify(); + +} \ No newline at end of file diff --git a/include/hacks/hacklist.hpp b/include/hacks/hacklist.hpp index 17be958d..d26947aa 100755 --- a/include/hacks/hacklist.hpp +++ b/include/hacks/hacklist.hpp @@ -29,7 +29,6 @@ #include "AntiCheat.hpp" #include "AutoDeadringer.hpp" #include "Bunnyhop.hpp" -#include "LagExploit.hpp" #include "SeedPrediction.hpp" #endif #if ENABLE_VISUALS @@ -43,7 +42,6 @@ #include "AntiBackstab.hpp" #include "AutoBackstab.hpp" #include "FollowBot.hpp" -#include "HealArrows.hpp" #include "Misc.hpp" #include "Trigger.hpp" #include "KillSay.hpp" diff --git a/include/visual/CMakeLists.txt b/include/visual/CMakeLists.txt index d8ca8c2d..eeaa9175 100644 --- a/include/visual/CMakeLists.txt +++ b/include/visual/CMakeLists.txt @@ -6,6 +6,7 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/EffectChams.hpp" "${CMAKE_CURRENT_LIST_DIR}/EffectGlow.hpp" "${CMAKE_CURRENT_LIST_DIR}/fidgetspinner.hpp" + "${CMAKE_CURRENT_LIST_DIR}/EventLogging.hpp" "${CMAKE_CURRENT_LIST_DIR}/SDLHooks.hpp") if(EnableGUI) diff --git a/include/visual/EventLogging.hpp b/include/visual/EventLogging.hpp new file mode 100644 index 00000000..1f60f47b --- /dev/null +++ b/include/visual/EventLogging.hpp @@ -0,0 +1,9 @@ +/* + Created on 29.07.18. +*/ + +#pragma once + +namespace event_logging +{ +} \ No newline at end of file diff --git a/src/MiscTemporary.cpp b/src/MiscTemporary.cpp index 417615e0..72296a06 100644 --- a/src/MiscTemporary.cpp +++ b/src/MiscTemporary.cpp @@ -6,42 +6,10 @@ #include "MiscTemporary.hpp" std::array timers{}; std::array bruteint{}; -CatVar minigun_jump(CV_SWITCH, "minigun_jump", "0", "TF2C minigun jump", - "Allows jumping while shooting with minigun"); - -CatVar jointeam(CV_SWITCH, "fb_autoteam", "1", - "Joins player team automatically (NYI)"); -CatVar joinclass(CV_STRING, "fb_autoclass", "spy", - "Class that will be picked after joining a team (NYI)"); - -CatVar nolerp(CV_SWITCH, "nolerp", "0", "NoLerp mode (experimental)"); - -CatVar engine_pred(CV_SWITCH, "engine_prediction", "0", "Engine Prediction"); -CatVar debug_projectiles(CV_SWITCH, "debug_projectiles", "0", - "Debug Projectiles"); - -CatVar fakelag_amount(CV_INT, "fakelag", "0", "Bad Fakelag"); -CatVar serverlag_amount( - CV_INT, "serverlag", "0", "serverlag", - "Lag the server by spamming this many voicecommands per tick"); -CatVar servercrash(CV_SWITCH, "servercrash", "0", "crash servers", - "Crash servers by spamming signon net messages"); -CatVar semiauto(CV_INT, "semiauto", "0", "Semiauto"); -bool *bSendPackets = nullptr; -CatVar resolver(CV_SWITCH, "resolver", "0", "Resolve angles"); - -CatVar crypt_chat( - CV_SWITCH, "chat_crypto", "1", "Crypto chat", - "Start message with !! and it will be only visible to cathook users"); int spectator_target; CLC_VoiceData *voicecrash{}; bool firstcm = false; Timer DelayTimer{}; -CatVar delay( - CV_INT, "delay", "0", "Delay", - "Delay actions like chat spam and serverlag/crash by this many seconds."); -CatVar adjust(CV_INT, "serverlag_ramp", "0", "Ramp lag", - "keep lag around this many seconds"); float prevflow = 0.0f; int prevflowticks = 0; diff --git a/src/angles.cpp b/src/angles.cpp index a9d5a6ab..e79f5704 100755 --- a/src/angles.cpp +++ b/src/angles.cpp @@ -26,7 +26,7 @@ void Update() } if (i == g_IEngine->GetLocalPlayer()) { - d.push(g_pUserCmd->viewangles); + d.push(current_user_cmd->viewangles); } else { diff --git a/src/chatlog.cpp b/src/chatlog.cpp index 04ed51f5..16c15ab9 100644 --- a/src/chatlog.cpp +++ b/src/chatlog.cpp @@ -109,10 +109,10 @@ void LogMessage(int eid, std::string message) { return; } - if (no_spam && hacks::shared::spam::spam_source and + if (no_spam && hacks::shared::spam::isActive() and eid == g_IEngine->GetLocalPlayer()) return; - player_info_s info; + player_info_s info{}; if (not g_IEngine->GetPlayerInfo(eid, &info)) return; if (no_ipc && diff --git a/src/core/init.cpp b/src/core/init.cpp index c0d2a157..e805a46b 100755 --- a/src/core/init.cpp +++ b/src/core/init.cpp @@ -9,7 +9,7 @@ std::stack &init_stack() { - static std::stack stack; + static std::stack stack{}; return stack; } diff --git a/src/core/logging.cpp b/src/core/logging.cpp index d09cbc35..2e977edc 100644 --- a/src/core/logging.cpp +++ b/src/core/logging.cpp @@ -9,10 +9,13 @@ #include #include +#include #include "common.hpp" -FILE *logging::handle = 0; +settings::Bool log_to_console{ "hack.log-console", "false" }; + +FILE *logging::handle{ nullptr }; void logging::Initialize() { @@ -24,7 +27,7 @@ void logging::Initialize() void logging::Info(const char *fmt, ...) { - if (logging::handle == 0) + if (logging::handle == nullptr) logging::Initialize(); char *buffer = new char[1024]; va_list list; @@ -45,7 +48,7 @@ void logging::Info(const char *fmt, ...) #if ENABLE_VISUALS if (g_ICvar) { - if (console_logging.convar_parent && console_logging) + if (*log_to_console) g_ICvar->ConsolePrintf("%s", result); } #endif @@ -56,5 +59,5 @@ void logging::Info(const char *fmt, ...) void logging::Shutdown() { fclose(logging::handle); - logging::handle = 0; + logging::handle = nullptr } diff --git a/src/crits.cpp b/src/crits.cpp index 088bfe00..5fd86706 100644 --- a/src/crits.cpp +++ b/src/crits.cpp @@ -23,10 +23,10 @@ namespace criticals int find_next_random_crit_for_weapon(IClientEntity *weapon) { - int tries = 0, number = g_pUserCmd->command_number, found = 0, seed, + int tries = 0, number = current_user_cmd->command_number, found = 0, seed, seed_md5, seed_backup; - crithack_saved_state state; + crithack_saved_state state{}; state.Save(weapon); seed_backup = *g_PredictionRandomSeed; @@ -56,7 +56,7 @@ void unfuck_bucket(IClientEntity *weapon) static float last_bucket; static int last_weapon; - if (g_pUserCmd->command_number) + if (current_user_cmd->command_number) changed = false; float &bucket = re::C_TFWeaponBase::crit_bucket_(weapon); @@ -92,15 +92,17 @@ static const model_t *lastweapon = nullptr; bool force_crit(IClientEntity *weapon) { - if (lastnumber < g_pUserCmd->command_number || + auto command_number = current_user_cmd->command_number; + + if (lastnumber < command_number || lastweapon != weapon->GetModel() || - lastnumber - g_pUserCmd->command_number > 1000) + lastnumber - command_number > 1000) { - if (cached_calculation.init_command > g_pUserCmd->command_number || - g_pUserCmd->command_number - cached_calculation.init_command > + if (cached_calculation.init_command > command_number || + command_number - cached_calculation.init_command > 4096 || - (g_pUserCmd->command_number && - (cached_calculation.command_number < g_pUserCmd->command_number))) + (command_number && + (cached_calculation.command_number < command_number))) cached_calculation.weapon_entity = 0; if (cached_calculation.weapon_entity == weapon->entindex()) return bool(cached_calculation.command_number); @@ -109,7 +111,7 @@ bool force_crit(IClientEntity *weapon) } else number = lastnumber; - logging::Info("Found critical: %d -> %d", g_pUserCmd->command_number, + logging::Info("Found critical: %d -> %d", command_number, number); lastweapon = weapon->GetModel(); lastnumber = number; @@ -117,16 +119,16 @@ bool force_crit(IClientEntity *weapon) { if (!crit_legiter) { - if (number && number != g_pUserCmd->command_number) - command_number_mod[g_pUserCmd->command_number] = number; + if (number && number != command_number) + command_number_mod[command_number] = number; cached_calculation.command_number = number; cached_calculation.weapon_entity = LOCAL_W->m_IDX; } else { - if (number && number - 30 < g_pUserCmd->command_number) - command_number_mod[g_pUserCmd->command_number] = number; + if (number && number - 30 < command_number) + command_number_mod[command_number] = number; cached_calculation.command_number = number; cached_calculation.weapon_entity = LOCAL_W->m_IDX; @@ -136,22 +138,22 @@ bool force_crit(IClientEntity *weapon) { if (!crit_legiter) { - if (g_pUserCmd->command_number != number && number && - number != g_pUserCmd->command_number) - g_pUserCmd->buttons &= ~IN_ATTACK; + if (command_number != number && number && + number != command_number) + current_user_cmd->buttons &= ~IN_ATTACK; else - g_pUserCmd->buttons |= IN_ATTACK; + current_user_cmd->buttons |= IN_ATTACK; } else { - if (g_pUserCmd->command_number + 30 > number && number && - number != g_pUserCmd->command_number) - g_pUserCmd->buttons &= ~IN_ATTACK; + if (command_number + 30 > number && number && + number != command_number) + current_user_cmd->buttons &= ~IN_ATTACK; else - g_pUserCmd->buttons |= IN_ATTACK; + current_user_cmd->buttons |= IN_ATTACK; } } - return !!number; + return number != 0; } void create_move() @@ -162,20 +164,20 @@ void create_move() return; if (CE_BAD(LOCAL_W)) return; - if (g_pUserCmd->command_number) - lastusercmd = g_pUserCmd->command_number; + if (current_user_cmd->command_number) + lastusercmd = current_user_cmd->command_number; IClientEntity *weapon = RAW_ENT(LOCAL_W); if (!re::C_TFWeaponBase::IsBaseCombatWeapon(weapon)) return; if (!re::C_TFWeaponBase::AreRandomCritsEnabled(weapon)) return; unfuck_bucket(weapon); - if ((g_pUserCmd->buttons & IN_ATTACK) && crit_key && crit_key.isKeyDown() && - g_pUserCmd->command_number) + if ((current_user_cmd->buttons & IN_ATTACK) && crit_key && crit_key.isKeyDown() && + current_user_cmd->command_number) { force_crit(weapon); } - else if ((g_pUserCmd->buttons & IN_ATTACK) && g_pUserCmd->command_number && + else if ((current_user_cmd->buttons & IN_ATTACK) && current_user_cmd->command_number && GetWeaponMode() == weapon_melee && crit_melee && g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife)) { @@ -204,7 +206,7 @@ void draw() return; if (crit_info && CE_GOOD(LOCAL_W)) { - if (crit_key.KeyDown()) + if (crit_key.isKeyDown()) { AddCenterString("FORCED CRITS!", colors::red); } diff --git a/src/globals.cpp b/src/globals.cpp index d9f80a15..7793110d 100755 --- a/src/globals.cpp +++ b/src/globals.cpp @@ -5,21 +5,17 @@ * Author: nullifiedcat */ +#include +#include + #include "common.hpp" +static settings::Bool global_enable{ "hack.enable", "true" }; + time_t time_injected{ 0 }; int g_AppID = 0; -void ThirdpersonCallback(IConVar *var, const char *pOldValue, float flOldValue) -{ - if (force_thirdperson.convar_parent && !force_thirdperson) - { - if (g_pLocalPlayer && CE_GOOD(g_pLocalPlayer->entity)) - CE_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 0; - } -} - ConVar *sv_client_min_interp_ratio; ConVar *cl_interp_ratio; ConVar *cl_interp; @@ -29,28 +25,7 @@ unsigned long tickcount = 0; char *force_name_newlined = new char[32]{ 0 }; bool need_name_change = true; int last_cmd_number = 0; -CatVar force_name(CV_STRING, "name", "", "Force name"); -CatVar - cathook(CV_SWITCH, "enabled", "1", "CatHook enabled", - "Disabling this completely disables cathook (can be re-enabled)"); -// CatVar send_packets(CV_SWITCH, "sendpackets", "1", "Send packets", "Internal -// use"); -CatVar show_antiaim(CV_SWITCH, "thirdperson_angles", "1", "Real TP angles", - "You can see your own AA/Aimbot angles in thirdperson"); -CatVar force_thirdperson(CV_SWITCH, "thirdperson", "0", "Thirdperson", - "Enable thirdperson view"); -CatVar console_logging( - CV_SWITCH, "log", "0", "Debug Log", - "Disable this if you don't need cathook messages in your console"); -// CatVar fast_outline(CV_SWITCH, "fastoutline", "0", "Low quality outline", -// "Might increase performance when there is a lot of ESP text to draw"); -CatVar roll_speedhack(CV_KEY, "rollspeedhack", "0", "Roll Speedhack", - "Roll speedhack key"); -char *disconnect_reason_newlined = new char[256]{ 0 }; -CatVar disconnect_reason(CV_STRING, "disconnect_reason", "", - "Disconnect reason", "A custom disconnect reason"); -CatVar event_log(CV_SWITCH, "events", "0", "Advanced Events"); void GlobalSettings::Init() { sv_client_min_interp_ratio = g_ICvar->FindVar("sv_client_min_interp_ratio"); @@ -58,26 +33,14 @@ void GlobalSettings::Init() cl_interp = g_ICvar->FindVar("cl_interp"); cl_interpolate = g_ICvar->FindVar("cl_interpolate"); - force_thirdperson.OnRegister([](CatVar *var) { - var->convar_parent->InstallChangeCallback(ThirdpersonCallback); - }); - force_name.InstallChangeCallback( - [](IConVar *var, const char *old, float oldfl) { - std::string nl(force_name.GetString()); - ReplaceString(nl, "\\n", "\n"); - strncpy(force_name_newlined, nl.c_str(), 31); - (void) oldfl; - }); - disconnect_reason.InstallChangeCallback( - [](IConVar *var, const char *old, float oldfl) { - std::string nl(disconnect_reason.GetString()); - ReplaceString(nl, "\\n", "\n"); - strncpy(disconnect_reason_newlined, nl.c_str(), 255); - (void) oldfl; - }); bInvalid = true; } -CUserCmd *g_pUserCmd = nullptr; +CUserCmd *current_user_cmd{ nullptr }; -GlobalSettings g_Settings; +bool isHackActive() +{ + return *global_enable; +} + +GlobalSettings g_Settings{}; diff --git a/src/hack.cpp b/src/hack.cpp index 8f55f678..6992fe91 100644 --- a/src/hack.cpp +++ b/src/hack.cpp @@ -102,129 +102,6 @@ std::stack &hack::command_stack() return stack; } -#if ENABLE_VISUALS /* Why would we need colored chat stuff in textmode? \ - */ -#define red 184, 56, 59, 255 -#define blu 88, 133, 162, 255 - -class AdvancedEventListener : public IGameEventListener -{ -public: - virtual void FireGameEvent(KeyValues *event) - { - if (!event_log) - return; - const char *name = event->GetName(); - if (!strcmp(name, "player_connect_client")) - PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 joining", 0xa06ba0, - event->GetString("name"), 0x914e65, - event->GetString("networkid")); - else if (!strcmp(name, "player_activate")) - { - int uid = event->GetInt("userid"); - int entity = g_IEngine->GetPlayerForUserID(uid); - player_info_s info; - if (g_IEngine->GetPlayerInfo(entity, &info)) - PrintChat("\x07%06X%s\x01 connected", 0xa06ba0, info.name); - } - else if (!strcmp(name, "player_disconnect")) - { - CachedEntity *player = - ENTITY(g_IEngine->GetPlayerForUserID(event->GetInt("userid"))); - PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 disconnected", - colors::chat::team(player->m_iTeam()), - event->GetString("name"), 0x914e65, - event->GetString("networkid")); - } - else if (!strcmp(name, "player_team")) - { - if (event->GetBool("disconnect") != 1) - { - int oteam = event->GetInt("oldteam"); - int nteam = event->GetInt("team"); - const char *oteam_s = teamname(oteam); - const char *nteam_s = teamname(nteam); - PrintChat("\x07%06X%s\x01 changed team (\x07%06X%s\x01 -> " - "\x07%06X%s\x01)", - 0xa06ba0, event->GetString("name"), - colors::chat::team(oteam), oteam_s, - colors::chat::team(nteam), nteam_s); - } - } - else if (!strcmp(name, "player_hurt")) - { - int victim = event->GetInt("userid"); - int attacker = event->GetInt("attacker"); - int health = event->GetInt("health"); - player_info_s kinfo; - player_info_s vinfo; - g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim), - &vinfo); - g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker), - &kinfo); - CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim)); - CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker)); - PrintChat( - "\x07%06X%s\x01 hurt \x07%06X%s\x01 down to \x07%06X%d\x01hp", - colors::chat::team(att->m_iTeam()), kinfo.name, - colors::chat::team(vic->m_iTeam()), vinfo.name, 0x2aaf18, - health); - } - else if (!strcmp(name, "player_death")) - { - int victim = event->GetInt("userid"); - int attacker = event->GetInt("attacker"); - player_info_s kinfo; - player_info_s vinfo; - g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim), - &vinfo); - g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker), - &kinfo); - CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim)); - CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker)); - PrintChat("\x07%06X%s\x01 killed \x07%06X%s\x01", - colors::chat::team(att->m_iTeam()), kinfo.name, - colors::chat::team(vic->m_iTeam()), vinfo.name); - } - else if (!strcmp(name, "player_spawn")) - { - int id = event->GetInt("userid"); - player_info_s info; - g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info); - CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id)); - PrintChat("\x07%06X%s\x01 (re)spawned", - colors::chat::team(player->m_iTeam()), info.name); - } - else if (!strcmp(name, "player_changeclass")) - { - int id = event->GetInt("userid"); - player_info_s info; - g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info); - CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id)); - PrintChat("\x07%06X%s\x01 changed to \x07%06X%s\x01", - colors::chat::team(player->m_iTeam()), info.name, - 0xa06ba0, classname(event->GetInt("class"))); - } - else if (!strcmp(name, "vote_cast")) - { - int vote_option = event->GetInt("vote_option"); - int team = event->GetInt("team"); - int idx = event->GetInt("entityid"); - player_info_s info; - const char *team_s = teamname(team); - g_IEngine->GetPlayerInfo(idx, &info); - PrintChat( - "\x07%06X%s\x01 Voted \x07%06X%d\x01 on team \x07%06X%s\x01", - colors::chat::team(team), info.name, colors::chat::team(team), - vote_option, colors::chat::team(team), team_s); - }; - } -}; - -AdvancedEventListener adv_event_listener{}; - -#endif /* TEXTMODE */ - void hack::ExecuteCommand(const std::string command) { std::lock_guard guard(hack::command_stack_mutex); @@ -374,10 +251,7 @@ free(logname);*/ #if ENABLE_VISUALS draw::Initialize(); #if ENABLE_GUI - - g_pGUI = new CatGUI(); - g_pGUI->Setup(); - + // FIXME put gui here #endif #endif /* TEXTMODE */ @@ -505,7 +379,6 @@ free(logname);*/ #endif sdl_hooks::applySdlHooks(); logging::Info("SDL hooking done"); - g_IGameEventManager->AddListener(&adv_event_listener, false); #endif /* TEXTMODE */ #if not LAGBOT_MODE diff --git a/src/hacks/AutoJoin.cpp b/src/hacks/AutoJoin.cpp index b23c27cb..ce8b2687 100644 --- a/src/hacks/AutoJoin.cpp +++ b/src/hacks/AutoJoin.cpp @@ -38,8 +38,6 @@ bool UnassignedClass() Timer autoqueue_timer{}; Timer queuetime{}; Timer req_timer{}; -/*CatVar party_bypass(CV_SWITCH, "party_bypass", "0", "Party Bypass", - "Bypass Party restrictions");*/ void UpdateSearch() { // segfaults for no reason diff --git a/src/hacks/AutoReflect.cpp b/src/hacks/AutoReflect.cpp index ceb99e17..475014f8 100644 --- a/src/hacks/AutoReflect.cpp +++ b/src/hacks/AutoReflect.cpp @@ -27,14 +27,6 @@ static settings::Float fovcircle_opacity{ "autoreflect.draw-fov-opacity", "0.7" namespace hacks::tf::autoreflect { -// TODO setup proj sorting -// TODO CatVar big_proj(CV_SWITCH, "reflect_big_projectile", "0", "Reflect big -// projectiles", "Reflect Rockets"); -// TODO CatVar small_proj(CV_SWITCH, "reflect_small_projectile", "0", "Reflect -// small projectiles", "Reflect Huntsman arrows, Crusaders bolts"); -// TODO CatVar misc_proj(CV_SWITCH, "reflect_misc_projectile", "0", "Reflect -// other", "Reflect jarate, milk"); - // Function called by game for movement void CreateMove() { diff --git a/src/hacks/CMakeLists.txt b/src/hacks/CMakeLists.txt index 40a9d3a6..ea0f57f0 100644 --- a/src/hacks/CMakeLists.txt +++ b/src/hacks/CMakeLists.txt @@ -39,5 +39,6 @@ if(EnableVisuals) "${CMAKE_CURRENT_LIST_DIR}/ESP.cpp" "${CMAKE_CURRENT_LIST_DIR}/Radar.cpp" "${CMAKE_CURRENT_LIST_DIR}/SkinChanger.cpp" - "${CMAKE_CURRENT_LIST_DIR}/SpyAlert.cpp") + "${CMAKE_CURRENT_LIST_DIR}/SpyAlert.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Thirdperson.cpp") endif() diff --git a/src/hacks/ESP.cpp b/src/hacks/ESP.cpp index fd187066..456661be 100644 --- a/src/hacks/ESP.cpp +++ b/src/hacks/ESP.cpp @@ -79,8 +79,6 @@ static settings::Bool online_software{ "esp.online.software", "true" }; namespace hacks::shared::esp { -// CatVar draw_hitbox(CV_SWITCH, "esp_hitbox", "1", "Draw Hitbox"); - // Unknown std::mutex threadsafe_mutex; // Storage array for keeping strings and other data diff --git a/src/hacks/Misc.cpp b/src/hacks/Misc.cpp index 0fc3b3b4..e60728c4 100644 --- a/src/hacks/Misc.cpp +++ b/src/hacks/Misc.cpp @@ -22,40 +22,6 @@ namespace hacks::shared::misc { -static CatVar debug_info(CV_SWITCH, "debug_info", "0", "Debug info", - "Shows some debug info in-game"); -static CatVar flashlight_spam(CV_SWITCH, "flashlight", "0", "Flashlight spam", - "HL2DM flashlight spam"); -static CatVar - auto_balance_spam(CV_SWITCH, "request_balance_spam", "0", - "Inf Auto Balance Spam", - "Use to send a autobalance request to the server that " - "doesnt prevent you from using it again\nCredits to " - "Blackfire"); -static CatVar - anti_afk(CV_SWITCH, "anti_afk", "0", "Anti-AFK", - "Sends random commands to prevent being kicked from server"); -static CatVar auto_strafe(CV_SWITCH, "auto_strafe", "0", "Auto-Strafe", - "Automaticly airstrafes for you."); -static CatVar - render_zoomed(CV_SWITCH, "render_zoomed", "0", - "Render model when zoomed-in", - "Renders player model while being zoomed in as Sniper"); -static CatVar nopush_enabled(CV_SWITCH, "nopush_enabled", "0", "No Push", - "Prevents other players from pushing you around."); - -static CatVar no_homo(CV_SWITCH, "no_homo", "1", "No Homo", "read if gay"); -// Taunting stuff -static CatVar tauntslide(CV_SWITCH, "tauntslide", "0", "TF2C tauntslide", - "Allows moving and shooting while taunting"); -static CatVar tauntslide_tf2(CV_SWITCH, "tauntslide_tf2", "0", "Tauntslide", - "Allows free movement while taunting with movable " - "taunts\nOnly works in tf2"); -static CatVar - show_spectators(CV_SWITCH, "show_spectators", "0", "Show spectators", - "Show who's spectating you\nonly works in valve servers"); -static CatVar god_mode(CV_SWITCH, "godmode", "0", "no description", - "no description"); void *C_TFPlayer__ShouldDraw_original = nullptr; bool C_TFPlayer__ShouldDraw_hook(IClientEntity *thisptr) diff --git a/src/hacks/SeedPrediction.cpp b/src/hacks/SeedPrediction.cpp index a9276610..d79a08bf 100644 --- a/src/hacks/SeedPrediction.cpp +++ b/src/hacks/SeedPrediction.cpp @@ -11,7 +11,6 @@ constexpr double MIN_CLOCKRES = 0.25; constexpr double MAX_CLOCKRES = 8192.5; double clockRes; float seedFraction = 0.0f; -//static CatVar enableSeedPrediction(CV_SWITCH, "seed_prediction", "1", "Seed Predcition", "Enable Seed prediction"); namespace hacks::tf2::seedprediction { buf bases{9999}; diff --git a/src/hacks/Spam.cpp b/src/hacks/Spam.cpp index 4535c74d..1ad474f1 100644 --- a/src/hacks/Spam.cpp +++ b/src/hacks/Spam.cpp @@ -110,7 +110,7 @@ bool PlayerPassesQuery(Query query, int idx) Query QueryFromSubstring(const std::string &string) { - Query result; + Query result{}; bool read = true; for (auto it = string.begin(); read && *it; it++) { @@ -211,13 +211,6 @@ int QueryPlayer(Query query) return index_result; } -void Init() -{ - filename.installChangeCallback([](settings::VariableBase& var, std::string after) { - file.TryLoad(after); - }); -} - bool SubstituteQueries(std::string &input) { size_t index = input.find("%query:"); @@ -252,7 +245,14 @@ bool FormatSpamMessage(std::string &message) return SubstituteQueries(message); } -void CreateMove() +void init() +{ + filename.installChangeCallback([](settings::VariableBase& var, std::string after) { + file.TryLoad(after); + }); +} + +void createMove() { IF_GAME(IsTF2()) { @@ -380,11 +380,16 @@ void CreateMove() } } -void Reload() +void reload() { file.Load(std::string(filename.GetString())); } +bool isActive() +{ + return bool(spam_source); +} + const std::vector builtin_default = { "cathook - more fun than a ball of yarn!", "GNU/Linux is the best OS!", "visit youtube.com/c/nullifiedcat for more information!", @@ -423,9 +428,4 @@ const std::vector builtin_lithium = { "SAVE YOUR MONEY AND GET LITHIUMCHEAT! IT IS FREE!", "GOT ROLLED BY LITHIUM? HEY, THAT MEANS IT'S TIME TO GET LITHIUMCHEAT!!" }; - -bool isActive() -{ - return bool(spam_source); -} } diff --git a/src/hacks/Thirdperson.cpp b/src/hacks/Thirdperson.cpp new file mode 100644 index 00000000..0cf184d9 --- /dev/null +++ b/src/hacks/Thirdperson.cpp @@ -0,0 +1,41 @@ +/* + Created on 29.07.18. +*/ + +#include +#include +#include +#include +#include + +static settings::Bool enable{ "visual.thirdperson.enable", "false" }; +static settings::Bool angles{ "visual.thirdperson.real-angles", "false" }; +static bool was_enabled{ false }; + +void hacks::tf::thirdperson::frameStageNotify() +{ + if (CE_BAD(LOCAL_E)) + return; + + if (enable) + { + // Add thirdperson + if (!g_pLocalPlayer->life_state) + CE_INT(LOCAL_E, netvar.nForceTauntCam) = 1; + was_enabled = true; + } + if (!enable && was_enabled) + { + // Remove thirdperson + CE_INT(LOCAL_E, netvar.nForceTauntCam) = 0; + was_enabled = false; + } + if (angles && g_IInput->CAM_IsThirdPerson()) + { + CE_FLOAT(LOCAL_E, netvar.deadflag + 4) = + g_Settings.brute.last_angles[LOCAL_E->m_IDX].x; + CE_FLOAT(LOCAL_E, netvar.deadflag + 8) = + g_Settings.brute.last_angles[LOCAL_E->m_IDX].y; + } +} + diff --git a/src/helpers.cpp b/src/helpers.cpp index 62bc7c14..142f4736 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -446,7 +446,7 @@ std::pair ComputeMove(const Vector &a, const Vector &b) float speed = sqrt(vsilent.x * vsilent.x + vsilent.y * vsilent.y); Vector ang; VectorAngles(vsilent, ang); - float yaw = DEG2RAD(ang.y - g_pUserCmd->viewangles.y); + float yaw = DEG2RAD(ang.y - current_user_cmd->viewangles.y); return { cos(yaw) * 450, -sin(yaw) * 450 }; } diff --git a/src/hooks/others.cpp b/src/hooks/others.cpp index 06deb09a..1a6af640 100644 --- a/src/hooks/others.cpp +++ b/src/hooks/others.cpp @@ -65,8 +65,3 @@ static CatCommand minus_use_action_slot_item_server( g_IEngine->ServerCmdKeyValues(kv); }); -// TODO replace \\n with \n -// TODO name \\n = \n -// static CatVar queue_messages(CV_SWITCH, "chat_queue", "0", "Queue messages", -// "Use this if you want to use spam/killsay and still be able to chat normally -// (without having your msgs eaten by valve cooldown)"); diff --git a/src/hooks/visual/FrameStageNotify.cpp b/src/hooks/visual/FrameStageNotify.cpp index 77997160..f93b3616 100644 --- a/src/hooks/visual/FrameStageNotify.cpp +++ b/src/hooks/visual/FrameStageNotify.cpp @@ -104,21 +104,7 @@ DEFINE_HOOKED_METHOD(FrameStageNotify, void, void *this_, if (CE_GOOD(LOCAL_E) && no_zoom) RemoveCondition(LOCAL_E); } - if (force_thirdperson && !g_pLocalPlayer->life_state && - CE_GOOD(g_pLocalPlayer->entity)) - { - CE_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 1; - } - if (stage == 5 && show_antiaim && g_IInput->CAM_IsThirdPerson()) - { - if (CE_GOOD(g_pLocalPlayer->entity)) - { - CE_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 4) = - g_Settings.brute.last_angles[LOCAL_E->m_IDX].x; - CE_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 8) = - g_Settings.brute.last_angles[LOCAL_E->m_IDX].y; - } - } + hacks::tf::thirdperson::frameStageNotify(); } return original::FrameStageNotify(this_, stage); } diff --git a/src/visual/CMakeLists.txt b/src/visual/CMakeLists.txt index 5434bad9..cc633bc2 100644 --- a/src/visual/CMakeLists.txt +++ b/src/visual/CMakeLists.txt @@ -6,6 +6,7 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/EffectChams.cpp" "${CMAKE_CURRENT_LIST_DIR}/EffectGlow.cpp" "${CMAKE_CURRENT_LIST_DIR}/fidgetspinner.cpp" + "${CMAKE_CURRENT_LIST_DIR}/EventLogging.cpp" "${CMAKE_CURRENT_LIST_DIR}/SDLHooks.cpp") if(EnableGUI) diff --git a/src/visual/EffectChams.cpp b/src/visual/EffectChams.cpp index 97d14f0c..9329a846 100644 --- a/src/visual/EffectChams.cpp +++ b/src/visual/EffectChams.cpp @@ -29,9 +29,6 @@ static settings::Bool chamsself{ "chams.self", "true" }; static settings::Bool rainbow{ "chams.self-rainbow", "true" }; static settings::Bool disco_chams{ "chams.disco", "false" }; -// static CatVar chams_experimental(CV_SWITCH, "chams_effect", "0", -// "Experimental Chams"); - namespace effect_chams { diff --git a/src/visual/EventLogging.cpp b/src/visual/EventLogging.cpp new file mode 100644 index 00000000..a690ce47 --- /dev/null +++ b/src/visual/EventLogging.cpp @@ -0,0 +1,176 @@ +/* + Created on 29.07.18. +*/ + +#include +#include +#include +#include +#include + +static settings::Bool enable{ "chat.log-events", "false" }; + +static void handlePlayerConnectClient(KeyValues *kv) +{ + PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 joining", 0xa06ba0, + kv->GetString("name"), 0x914e65, + kv->GetString("networkid")); +} + +static void handlePlayerActivate(KeyValues *kv) +{ + int uid = kv->GetInt("userid"); + int entity = g_IEngine->GetPlayerForUserID(uid); + player_info_s info{}; + if (g_IEngine->GetPlayerInfo(entity, &info)) + PrintChat("\x07%06X%s\x01 connected", 0xa06ba0, info.name); +} + +static void handlePlayerDisconnect(KeyValues *kv) +{ + CachedEntity *player = + ENTITY(g_IEngine->GetPlayerForUserID(kv->GetInt("userid"))); + if (player == nullptr) + return; + PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 disconnected", + colors::chat::team(player->m_iTeam()), + kv->GetString("name"), 0x914e65, + kv->GetString("networkid")); +} + +static void handlePlayerTeam(KeyValues *kv) +{ + if (kv->GetBool("disconnect")) + return; + + int oteam = kv->GetInt("oldteam"); + int nteam = kv->GetInt("team"); + const char *oteam_s = teamname(oteam); + const char *nteam_s = teamname(nteam); + PrintChat("\x07%06X%s\x01 changed team (\x07%06X%s\x01 -> " + "\x07%06X%s\x01)", + 0xa06ba0, kv->GetString("name"), + colors::chat::team(oteam), oteam_s, + colors::chat::team(nteam), nteam_s); +} + +static void handlePlayerHurt(KeyValues *kv) +{ + int victim = kv->GetInt("userid"); + int attacker = kv->GetInt("attacker"); + int health = kv->GetInt("health"); + player_info_s kinfo{}; + player_info_s vinfo{}; + g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim), + &vinfo); + g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker), + &kinfo); + CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim)); + CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker)); + + if (vic == nullptr || att == nullptr) + return; + + PrintChat( + "\x07%06X%s\x01 hurt \x07%06X%s\x01 down to \x07%06X%d\x01hp", + colors::chat::team(att->m_iTeam()), kinfo.name, + colors::chat::team(vic->m_iTeam()), vinfo.name, 0x2aaf18, + health); +} + +static void handlePlayerDeath(KeyValues *kv) +{ + int victim = kv->GetInt("userid"); + int attacker = kv->GetInt("attacker"); + player_info_s kinfo{}; + player_info_s vinfo{}; + g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim), + &vinfo); + g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker), + &kinfo); + CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim)); + CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker)); + + if (vic == nullptr || att == nullptr) + return; + + PrintChat("\x07%06X%s\x01 killed \x07%06X%s\x01", + colors::chat::team(att->m_iTeam()), kinfo.name, + colors::chat::team(vic->m_iTeam()), vinfo.name); +} + +static void handlePlayerSpawn(KeyValues *kv) +{ + int id = kv->GetInt("userid"); + player_info_s info{}; + g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info); + CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id)); + if (player == nullptr) + return; + PrintChat("\x07%06X%s\x01 (re)spawned", + colors::chat::team(player->m_iTeam()), info.name); +} + +static void handlePlayerChangeClass(KeyValues *kv) +{ + int id = kv->GetInt("userid"); + player_info_s info{}; + g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info); + CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id)); + if (player == nullptr) + return; + PrintChat("\x07%06X%s\x01 changed to \x07%06X%s\x01", + colors::chat::team(player->m_iTeam()), info.name, + 0xa06ba0, classname(kv->GetInt("class"))); +} + +static void handleVoteCast(KeyValues *kv) +{ + int vote_option = kv->GetInt("vote_option"); + int team = kv->GetInt("team"); + int idx = kv->GetInt("entityid"); + player_info_s info{}; + const char *team_s = teamname(team); + if (g_IEngine->GetPlayerInfo(idx, &info)) + PrintChat( + "\x07%06X%s\x01 Voted \x07%06X%d\x01 on team \x07%06X%s\x01", + colors::chat::team(team), info.name, colors::chat::team(team), + vote_option, colors::chat::team(team), team_s); +} + +class LoggingEventListener: public IGameEventListener +{ +public: + void FireGameEvent(KeyValues *event) override + { + if (!enable) + return; + + const char *name = event->GetName(); + if (!strcmp(name, "player_connect_client")) + handlePlayerConnectClient(event); + else if (!strcmp(name, "player_activate")) + handlePlayerActivate(event); + else if (!strcmp(name, "player_disconnect")) + handlePlayerDisconnect(event); + else if (!strcmp(name, "player_team")) + handlePlayerTeam(event); + else if (!strcmp(name, "player_hurt")) + handlePlayerHurt(event); + else if (!strcmp(name, "player_death")) + handlePlayerDeath(event); + else if (!strcmp(name, "player_spawn")) + handlePlayerSpawn(event); + else if (!strcmp(name, "player_changeclass")) + handlePlayerChangeClass(event); + else if (!strcmp(name, "vote_cast")) + handleVoteCast(event); + } +}; + +LoggingEventListener listener{}; + +InitRoutine init([]() { + g_IGameEventManager->AddListener(&listener, false); +}); +