Merge remote-tracking branch 'nullworks/master'

This commit is contained in:
TotallyNotElite 2018-06-30 22:36:44 +02:00
commit 8f9c2905a1
39 changed files with 1140 additions and 437 deletions

3
.gitmodules vendored
View File

@ -13,3 +13,6 @@
[submodule "ucccccp"]
path = external/ucccccp
url = https://github.com/nullworks/ucccccp.git
[submodule "external/co-library"]
path = external/co-library
url = https://github.com/nullworks/co-library.git

View File

@ -12,6 +12,8 @@ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_BUILD_TYPE_VALUES})
cmake_minimum_required(VERSION 3.0)
project(cathook VERSION 0.0.1)
set(CMAKE_CXX_STANDARD 17)
add_library(cathook SHARED "")
set(GameSpecific 1 CACHE BOOL "Build for specific target game (As opposed to universal, but slower, lib)")
@ -31,6 +33,7 @@ set(Textmode 0 CACHE BOOL "Various textmode-only features for bots")
set(EnableTextmodeStdin 0 CACHE BOOL "Textmode Stdin -> Console bridge (EXPERIMENTAL)")
set(EnableWarnings 1 CACHE BOOL "Enable compile warnings")
set(EnableNullGraphics 0 CACHE BOOL "Enable experimental textmode hooks (CRASHES)")
set(EnableOnlineFeatures 1 CACHE BOOL "Enable online features (WIP)")
if(NOT EnableVisuals)
set(EnableGUI 0)
@ -62,6 +65,11 @@ if(EnableIPC)
target_link_libraries(cathook SimpleIPC)
endif()
if(EnableOnlineFeatures)
add_subdirectory(external/co-library)
target_link_libraries(cathook co-library)
endif()
if(EnableVisuals)
add_subdirectory(external/libglez)
target_include_directories(cathook PRIVATE include/visual)

5
TODO
View File

@ -1,8 +1,3 @@
// TODO - MUST do before merging into master (unless removed).
1. Re-add radar and emoji esp
2. Locate most of the crashes
//==================================================================================================//
//Big TODO list for cathook //
//Organized by Julianacat //

1
external/co-library vendored Submodule

@ -0,0 +1 @@
Subproject commit 393948a6bf7ee4a62f5a3bd82d94c05d4bc405aa

View File

@ -39,7 +39,8 @@ target_sources(cathook PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/velocity.hpp"
"${CMAKE_CURRENT_LIST_DIR}/votelogger.hpp"
"${CMAKE_CURRENT_LIST_DIR}/MiscTemporary.hpp"
"${CMAKE_CURRENT_LIST_DIR}/Options.hpp")
"${CMAKE_CURRENT_LIST_DIR}/Options.hpp"
"${CMAKE_CURRENT_LIST_DIR}/PlayerTools.hpp")
target_include_directories(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}")
@ -50,6 +51,7 @@ add_subdirectory(hacks)
add_subdirectory(hooks)
add_subdirectory(reclasses)
add_subdirectory(sdk)
add_subdirectory(online)
if(EnableVisuals)
add_subdirectory(visual)

43
include/PlayerTools.hpp Normal file
View File

@ -0,0 +1,43 @@
/*
Created on 23.06.18.
*/
#pragma once
#include "config.h"
#include <optional>
#if ENABLE_VISUALS
#include <colors.hpp>
#endif
class CachedEntity;
namespace player_tools
{
enum class IgnoreReason
{
DO_NOT_IGNORE,
IS_HOOVY,
IS_TAUNTING,
LOCAL_PLAYER_LIST,
ONLINE_NO_TARGET,
ONLINE_FRIENDLY_SOFTWARE,
DEVELOPER,
OTHER
};
IgnoreReason shouldTargetSteamId(unsigned id);
IgnoreReason shouldTarget(CachedEntity *player);
bool shouldAlwaysRenderEspSteamId(unsigned id);
bool shouldAlwaysRenderEsp(CachedEntity *entity);
#if ENABLE_VISUALS
std::optional<colors::rgba_t> forceEspColorSteamId(unsigned id);
std::optional<colors::rgba_t> forceEspColor(CachedEntity *entity);
#endif
void onKilledBy(CachedEntity *entity);
}

View File

@ -23,7 +23,6 @@ extern ConVar *cl_interpolate;
extern CatVar event_log;
extern CatVar cathook; // Master switch
extern CatVar ignore_taunting;
extern bool *bSendPackets;
extern CatVar show_antiaim;
extern CatVar force_thirdperson;

View File

@ -13,17 +13,19 @@ namespace hacks::shared::backtrack
{
struct BacktrackData
{
int tickcount;
Vector hitboxpos;
Vector min;
Vector max;
Vector origin;
float viewangles;
int tickcount{ 0 };
Vector hitboxpos{ 0.0f, 0.0f, 0.0f };
Vector min{ 0.0f, 0.0f, 0.0f };
Vector max{ 0.0f, 0.0f, 0.0f };
Vector origin{ 0.0f, 0.0f, 0.0f };
float viewangles{ 0.0f };
float simtime{ 0.0f };
Vector entorigin{ 0.0f, 0.0f, 0.0f };
};
struct BestTickData
{
int tickcount;
int tick;
int tickcount{ 0 };
int tick{ 0 };
bool operator<(const BestTickData &rhs) const
{
return tickcount < rhs.tickcount;
@ -54,6 +56,7 @@ typedef boost::circular_buffer_space_optimized<CIncomingSequence> circular_buf;
extern circular_buf sequences;
extern CatVar latency;
extern CatVar enable;
extern int ticks;
extern BacktrackData headPositions[32][66];
extern BestTickData sorted_ticks[66];
}

View File

@ -15,6 +15,7 @@ namespace hacks::shared::triggerbot
{
void CreateMove();
CachedEntity *FindEntInSight(float range);
bool ShouldShoot();
bool IsTargetStateGood(CachedEntity *entity);
CachedEntity *FindEntInSight(float range);

View File

@ -7,5 +7,7 @@
#pragma once
class CachedEntity;
void UpdateHoovyList();
bool IsHoovy(CachedEntity *entity);

View File

@ -0,0 +1,2 @@
target_sources(cathook PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/Online.hpp")

39
include/online/Online.hpp Normal file
View File

@ -0,0 +1,39 @@
/*
Created on 23.06.18.
*/
#pragma once
#include <string>
#include <colors.hpp>
#include <config.h>
#include <vector>
namespace online
{
struct user_data
{
bool is_anonymous{ false };
bool is_using_friendly_software{ false };
bool is_steamid_verified{ false };
std::string username{};
std::vector<std::string> shown_groups{};
std::string software_name{};
bool has_software{ false };
bool no_target{ false };
bool is_developer{};
#if ENABLE_VISUALS
bool has_color{ false };
colors::rgba_t color{};
bool rainbow{ false };
#endif
};
/*
* Identify unidentified users, send online status, etc
*/
void update();
user_data *getUserData(unsigned steamId);
}

11
include/reclasses/C_BaseEntity.hpp Executable file → Normal file
View File

@ -8,6 +8,7 @@
#pragma once
#include "reclasses.hpp"
#include "copypasted/CSignature.h"
namespace re
{
@ -27,5 +28,15 @@ public:
static int placeholder = 0;
return placeholder;
}
inline static int SetAbsOrigin(IClientEntity *self, Vector const &origin)
{
typedef int (*SetAbsOrigin_t)(IClientEntity *, Vector const &);
uintptr_t addr = gSignatures.GetClientSignature(
"55 89 E5 57 56 53 83 EC ? 8B 5D ? 8B 75 ? 89 1C 24 E8 ? ? ? ? F3 "
"0F 10 06");
SetAbsOrigin_t SetAbsOrigin_fn = SetAbsOrigin_t(addr);
return SetAbsOrigin_fn(self, origin);
}
};
}

12
include/visual/colors.hpp Executable file → Normal file
View File

@ -48,6 +48,8 @@ struct rgba_t
constexpr rgba_t(float _r, float _g, float _b, float _a = 1.0f)
: r(_r), g(_g), b(_b), a(_a){};
explicit rgba_t(const char hex[6]);
constexpr operator glez::rgba() const
{
return *reinterpret_cast<const glez::rgba *>(this);
@ -76,6 +78,16 @@ struct rgba_t
}
};
constexpr bool operator==(const rgba_t &lhs, const rgba_t &rhs)
{
return rhs.r == lhs.r && rhs.g == lhs.g && rhs.b == lhs.b && rhs.a == lhs.a;
}
constexpr bool operator!=(const rgba_t &lhs, const rgba_t &rhs)
{
return !(lhs == rhs);
}
constexpr rgba_t FromRGBA8(float r, float g, float b, float a)
{
return rgba_t{ r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f };

View File

@ -32,7 +32,8 @@ target_sources(cathook PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/velocity.cpp"
"${CMAKE_CURRENT_LIST_DIR}/votelogger.cpp"
"${CMAKE_CURRENT_LIST_DIR}/MiscTemporary.cpp"
"${CMAKE_CURRENT_LIST_DIR}/Options.cpp")
"${CMAKE_CURRENT_LIST_DIR}/Options.cpp"
"${CMAKE_CURRENT_LIST_DIR}/PlayerTools.cpp")
add_subdirectory(core)
add_subdirectory(classinfo)
@ -41,6 +42,7 @@ add_subdirectory(hacks)
add_subdirectory(hooks)
add_subdirectory(reclasses)
add_subdirectory(sdk)
add_subdirectory(online)
if(EnableVisuals)
add_subdirectory(visual)

171
src/PlayerTools.cpp Normal file
View File

@ -0,0 +1,171 @@
/*
Created on 23.06.18.
*/
#include <core/cvwrapper.hpp>
#include <unordered_map>
#include <hoovy.hpp>
#include <playerlist.hpp>
#include <online/Online.hpp>
#include "PlayerTools.hpp"
#include "entitycache.hpp"
static std::unordered_map<unsigned, unsigned> betrayal_list{};
static CatCommand forgive_all("pt_forgive_all", "Clear betrayal list",
[]() { betrayal_list.clear(); });
namespace settings
{
static CatVar online_notarget(CV_SWITCH, "pt_ignore_notarget", "1",
"Ignore notarget",
"Ignore online players with notarget role");
static CatVar hoovy(CV_SWITCH, "pt_ignore_hoovy", "1", "Ignore hoovy");
static CatVar online_friendly_software(CV_SWITCH, "pt_ignore_friendly_software",
"1", "Ignore friendly software",
"Ignore CO-compatible software");
static CatVar online_only_verified(CV_SWITCH, "pt_ignore_only_verified", "0",
"Only ignore verified",
"If online checks are enabled, only apply "
"ignore if SteamID is verified (not "
"recommended right now)");
static CatVar online_anonymous(CV_SWITCH, "pt_ignore_anonymous", "1",
"Ignore anonymous",
"Apply ignore checks to anonymous accounts too");
static CatVar betrayal_limit(
CV_INT, "pt_betrayal_limit", "3", "Betrayal limit",
"Stop ignoring a player after N kills while you ignored them");
static CatVar taunting(CV_SWITCH, "pt_ignore_taunting", "1", "Ignore taunting",
"Don't shoot taunting players");
}
namespace player_tools
{
IgnoreReason shouldTargetSteamId(unsigned id)
{
if (id == 0)
return IgnoreReason::DO_NOT_IGNORE;
if (settings::betrayal_limit)
{
if (betrayal_list[id] > int(settings::betrayal_limit))
return IgnoreReason::DO_NOT_IGNORE;
}
auto &pl = playerlist::AccessData(id);
if (playerlist::IsFriendly(pl.state))
return IgnoreReason::LOCAL_PLAYER_LIST;
auto *co = online::getUserData(id);
if (co)
{
bool check_verified =
!settings::online_only_verified || co->is_steamid_verified;
bool check_anonymous = settings::online_anonymous || !co->is_anonymous;
if (check_verified && check_anonymous)
{
if (settings::online_notarget && co->no_target)
return IgnoreReason::ONLINE_NO_TARGET;
if (settings::online_friendly_software &&
co->is_using_friendly_software)
return IgnoreReason::ONLINE_FRIENDLY_SOFTWARE;
}
// Always check developer status, no exceptions
if (co->is_developer)
return IgnoreReason::DEVELOPER;
}
return IgnoreReason::DO_NOT_IGNORE;
}
IgnoreReason shouldTarget(CachedEntity *entity)
{
if (entity->m_Type() == ENTITY_PLAYER)
{
if (settings::hoovy && IsHoovy(entity))
return IgnoreReason::IS_HOOVY;
if (settings::taunting && HasCondition<TFCond_Taunting>(entity))
return IgnoreReason::IS_TAUNTING;
return shouldTargetSteamId(entity->player_info.friendsID);
}
return IgnoreReason::DO_NOT_IGNORE;
}
bool shouldAlwaysRenderEspSteamId(unsigned id)
{
if (id == 0)
return false;
auto &pl = playerlist::AccessData(id);
if (pl.state != playerlist::k_EState::DEFAULT)
return true;
auto *co = online::getUserData(id);
if (co)
return true;
return false;
}
bool shouldAlwaysRenderEsp(CachedEntity *entity)
{
if (entity->m_Type() == ENTITY_PLAYER)
{
return shouldAlwaysRenderEspSteamId(entity->player_info.friendsID);
}
return false;
}
#if ENABLE_VISUALS
std::optional<colors::rgba_t> forceEspColorSteamId(unsigned id)
{
if (id == 0)
return std::nullopt;
auto pl = playerlist::Color(id);
if (pl != colors::empty)
return std::optional<colors::rgba_t>{ pl };
auto *co = online::getUserData(id);
if (co)
{
if (co->has_color)
return std::optional<colors::rgba_t>{ co->color };
if (co->rainbow)
return std::optional<colors::rgba_t>{ colors::RainbowCurrent() };
}
return std::nullopt;
}
std::optional<colors::rgba_t> forceEspColor(CachedEntity *entity)
{
if (entity->m_Type() == ENTITY_PLAYER)
{
return forceEspColorSteamId(entity->player_info.friendsID);
}
return std::nullopt;
}
#endif
void onKilledBy(unsigned id)
{
auto reason = shouldTargetSteamId(id);
if (reason != IgnoreReason::DO_NOT_IGNORE)
{
// We ignored the gamer, but they still shot us
if (betrayal_list.find(id) == betrayal_list.end())
betrayal_list[id] = 0;
betrayal_list[id]++;
}
}
void onKilledBy(CachedEntity *entity)
{
onKilledBy(entity->player_info.friendsID);
}
}

View File

@ -47,8 +47,8 @@ void EntityHitboxCache::Update()
{
InvalidateCache();
if (CE_BAD(parent_ref))
if (GetHitbox(0))
return;
if (GetHitbox(0))
return;
}
void EntityHitboxCache::Init()

View File

@ -33,8 +33,6 @@ 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 ignore_taunting(CV_SWITCH, "ignore_taunting", "1", "Ignore taunting",
"Aimbot/Triggerbot won't attack taunting enemies");
// CatVar send_packets(CV_SWITCH, "sendpackets", "1", "Send packets", "Internal
// use");
CatVar show_antiaim(CV_SWITCH, "thirdperson_angles", "1", "Real TP angles",

View File

@ -532,6 +532,13 @@ free(logname);*/
#if ENABLE_VISUALS
hacks::shared::esp::Init();
#endif
#if not ENABLE_VISUALS
hack::command_stack().push("exec cat_autoexec_textmode");
#endif
hack::command_stack().push("exec cat_autoexec");
hack::command_stack().push("cat_killsay_reload");
hack::command_stack().push("cat_spam_reload");
logging::Info("Clearing initializer stack");
while (!init_stack().empty())
{
@ -540,12 +547,6 @@ free(logname);*/
}
logging::Info("Initializer stack done");
#if not ENABLE_VISUALS
hack::command_stack().push("exec cat_autoexec_textmode");
#endif
hack::command_stack().push("exec cat_autoexec");
hack::command_stack().push("cat_killsay_reload");
hack::command_stack().push("cat_spam_reload");
hack::initialized = true;
}

View File

@ -9,7 +9,9 @@
#include <hacks/CatBot.hpp>
#include <hacks/AntiAim.hpp>
#include <hacks/ESP.hpp>
#include <hacks/Backtrack.hpp>
#include <glez/draw.hpp>
#include <PlayerTools.hpp>
#include "common.hpp"
namespace hacks::shared::aimbot
@ -60,8 +62,6 @@ static CatVar
static CatVar ignore_vaccinator(
CV_SWITCH, "aimbot_ignore_vaccinator", "1", "Ignore Vaccinator",
"Hitscan weapons won't fire if enemy is vaccinated against bullets");
static CatVar ignore_hoovy(CV_SWITCH, "aimbot_ignore_hoovy", "0",
"Ignore Hoovies", "Aimbot won't attack hoovies");
static CatVar ignore_cloak(CV_SWITCH, "aimbot_ignore_cloak", "1",
"Ignore cloaked", "Don't aim at invisible enemies");
static CatVar ignore_deadringer(CV_SWITCH, "aimbot_ignore_deadringer", "1",
@ -175,7 +175,101 @@ bool projectileAimbotRequired;
// This array will store calculated projectile/hitscan predictions
// for current frame, to avoid performing them again
AimbotCalculatedData_s calculated_data_array[2048]{};
bool BacktrackAimbot()
{
if (!hacks::shared::backtrack::enable)
return false;
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || !CanShoot())
return false;
if (zoomed_only && !g_pLocalPlayer->bZoomed &&
!(g_pUserCmd->buttons & IN_ATTACK))
return false;
int iBestTarget = hacks::shared::backtrack::iBestTarget;
if (iBestTarget == -1)
{
float bestscr = 999.0f;
for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
{
if (i == g_pLocalPlayer->entity_idx)
continue;
CachedEntity *it = ENTITY(i);
if (CE_BAD(it) || !it->m_bAlivePlayer() ||
it->m_Type() != ENTITY_PLAYER)
continue;
if (it->m_iTeam() == LOCAL_E->m_iTeam())
continue;
if (!hacks::shared::backtrack::headPositions[iBestTarget][0].hitboxpos.z)
continue;
if (!it->hitboxes.GetHitbox(0))
continue;
if (IsPlayerInvisible(it) && ignore_cloak)
continue;
float scr =
GetFov(g_pLocalPlayer->v_OrigViewangles, g_pLocalPlayer->v_Eye,
it->hitboxes.GetHitbox(0)->center);
if (scr < bestscr)
{
iBestTarget = it->m_IDX;
bestscr = scr;
}
}
if (iBestTarget == -1)
return true;
};
for (int t = 0; t < hacks::shared::backtrack::ticks; ++t)
hacks::shared::backtrack::sorted_ticks[t] =
hacks::shared::backtrack::BestTickData{ hacks::shared::backtrack::headPositions[iBestTarget][t].tickcount, t };
std::sort(hacks::shared::backtrack::sorted_ticks, hacks::shared::backtrack::sorted_ticks + hacks::shared::backtrack::ticks);
int tickcnt = 0;
for (auto i : hacks::shared::backtrack::headPositions[iBestTarget])
{
bool good_tick = false;
for (int j = 0; j < 12; ++j)
if (tickcnt == hacks::shared::backtrack::sorted_ticks[j].tick)
good_tick = true;
tickcnt++;
if (!i.hitboxpos.z)
continue;
if (!good_tick)
continue;
if (!IsVectorVisible(g_pLocalPlayer->v_Eye, i.hitboxpos))
continue;
float scr = abs(g_pLocalPlayer->v_OrigViewangles.y - i.viewangles);
CachedEntity *tar = ENTITY(iBestTarget);
// ok just in case
if (CE_BAD(tar))
continue;
Vector &angles = NET_VECTOR(tar, netvar.m_angEyeAngles);
float &simtime = NET_FLOAT(tar, netvar.m_flSimulationTime);
angles.y = i.viewangles;
simtime = i.simtime;
g_pUserCmd->tick_count = i.tickcount;
Vector tr = (i.hitboxpos - g_pLocalPlayer->v_Eye);
Vector angles2;
VectorAngles(tr, angles2);
// Clamping is important
fClampAngle(angles2);
// Slow aim
if (slow_aim)
DoSlowAim(angles2);
else if (silent)
g_pLocalPlayer->bUseSilentAngles = true;
// Set angles
g_pUserCmd->viewangles = angles2;
g_pUserCmd->buttons |= IN_ATTACK;
return true;
}
return true;
}
// The main "loop" of the aimbot.
void CreateMove()
{
@ -226,6 +320,8 @@ void CreateMove()
cur_proj_grav = float(proj_gravity);
}
if (BacktrackAimbot())
return;
// Refresh our best target
CachedEntity *target_entity = RetrieveBestTarget(aimkey_status);
if (CE_BAD(target_entity) || !foundTarget)
@ -574,8 +670,11 @@ bool IsTargetStateGood(CachedEntity *entity)
}
}
// Taunting
if (ignore_taunting && HasCondition<TFCond_Taunting>(entity))
// Some global checks
if (player_tools::shouldTarget(entity) !=
player_tools::IgnoreReason::DO_NOT_IGNORE)
return false;
if (hacks::shared::catbot::should_ignore_player(entity))
return false;
// Invulnerable players, ex: uber, bonk
if (IsPlayerInvulnerable(entity))
@ -605,19 +704,7 @@ bool IsTargetStateGood(CachedEntity *entity)
HasCondition<TFCond_UberBulletResist>(entity))
return false;
}
// Friendly player
if (playerlist::IsFriendly(playerlist::AccessData(entity).state))
return false;
IF_GAME(IsTF())
{
// Hoovys
if (ignore_hoovy && IsHoovy(entity))
{
return false;
}
}
if (hacks::shared::catbot::should_ignore_player(entity))
return false;
// Preform hitbox prediction
int hitbox = BestHitbox(entity);
AimbotCalculatedData_s &cd = calculated_data_array[entity->m_IDX];

1
src/hacks/Announcer.cpp Executable file → Normal file
View File

@ -177,4 +177,3 @@ void shutdown()
g_IEventManager2->RemoveListener(&listener());
}
}

View File

@ -15,29 +15,20 @@ CatVar communicate(CV_SWITCH, "identify", "0", "identify",
"Auto identify for other cathook users");
CatVar enabled(CV_SWITCH, "aa_enabled", "0", "Anti-Aim",
"Master AntiAim switch");
static CatVar trueang(CV_SWITCH, "aa_realfakes", "0", "Real fakes",
"Do real fakeangles (Unresolveable)");
static CatVar yaw(CV_FLOAT, "aa_yaw", "0.0", "Yaw", "Static yaw (left/right)",
360.0);
static CatVar pitch(CV_FLOAT, "aa_pitch", "-89.0", "Pitch",
"Static pitch (up/down)", -89.0, 89.0);
static CatVar yaw_real(CV_FLOAT, "aa_yaw_real", "0.0", "Real Yaw",
"Static yaw (left/right)", 360.0);
static CatVar pitch_real(CV_FLOAT, "aa_pitch_real", "-89.0", "Real Pitch",
"Static pitch (up/down)", -89.0, 89.0);
static CatEnum yaw_mode_enum({ "KEEP", "STATIC", "JITTER", "BIGRANDOM",
"RANDOM", "SPIN", "OFFSETKEEP", "EDGE", "HECK",
"FAKESIDEWAYS" });
"FAKESIDEWAYS", "FAKERIGHT", "FAKELEFT",
"FAKEFUCK" });
static CatEnum pitch_mode_enum({ "KEEP", "STATIC", "JITTER", "RANDOM", "FLIP",
"FAKEFLIP", "FAKEUP", "FAKEDOWN", "FAKECENTER",
"UP", "DOWN", "HECK" });
CatVar yaw_mode(yaw_mode_enum, "aa_yaw_mode", "0", "Yaw mode", "Yaw mode");
static CatVar pitch_mode(pitch_mode_enum, "aa_pitch_mode", "0", "Pitch mode",
"Pitch mode");
static CatVar true_yaw_mode(yaw_mode_enum, "aa_yaw_mode_real", "0",
"The Real Yaw", "Yaw mode");
static CatVar true_pitch_mode(pitch_mode_enum, "aa_pitch_mode_real", "0",
"The Real Pitch", "Pitch mode");
static CatVar roll(CV_FLOAT, "aa_roll", "0", "Roll",
"Roll angle (viewangles.z)", -180, 180);
static CatVar
@ -72,37 +63,16 @@ bool aaaa_key_pressed = false;
float GetAAAAPitch()
{
if (!trueang)
switch ((int) aaaa_mode)
{
switch ((int) aaaa_mode)
{
case 0:
return aaaa_stage ? -271 : -89;
case 1:
return aaaa_stage ? 271 : 89;
default:
break;
}
return 0;
}
else
{
if (*bSendPackets == true)
{
switch ((int) aaaa_mode)
{
case 0:
return aaaa_stage ? -271 : -89;
case 1:
return aaaa_stage ? 271 : 89;
default:
break;
}
}
else if (*bSendPackets == false)
return g_pUserCmd->viewangles.x;
return 0;
case 0:
return aaaa_stage ? -271 : -89;
case 1:
return aaaa_stage ? 271 : 89;
default:
break;
}
return 0;
}
float GetAAAATimerLength()
@ -419,12 +389,13 @@ void ProcessUserCmd(CUserCmd *cmd)
if (!ShouldAA(cmd))
return;
static bool angstate = true;
if (trueang)
if ((int) yaw_mode >= 9)
angstate = !angstate;
else
angstate = true;
if (!LOCAL_E->m_bAlivePlayer())
angstate = true;
if (lagexploit::ExploitActive() || g_pUserCmd->buttons & IN_ATTACK ||
g_pUserCmd->buttons & IN_ATTACK2)
if (g_pUserCmd->buttons & IN_ATTACK || g_pUserCmd->buttons & IN_ATTACK2)
angstate = true;
*bSendPackets = angstate;
float &p = cmd->viewangles.x;
@ -438,180 +409,103 @@ void ProcessUserCmd(CUserCmd *cmd)
g_pLocalPlayer->bUseSilentAngles = true;
return;
}
if (!*bSendPackets)
switch ((int) true_yaw_mode)
{
case 1: // FIXED
y = (float) yaw_real;
break;
case 2: // JITTER
if (flip)
y += 90;
else
y -= 90;
break;
case 3: // BIGRANDOM
y = RandFloatRange(-65536.0f, 65536.0f);
clamp = false;
break;
case 4: // RANDOM
y = RandFloatRange(-180.0f, 180.0f);
break;
case 5: // SPIN
cur_yaw += (float) spin;
if (cur_yaw > 180)
cur_yaw = -180;
if (cur_yaw < -180)
cur_yaw = 180;
y = cur_yaw;
break;
case 6: // OFFSETKEEP
y += (float) yaw_real;
break;
case 7: // Edge
// Attemt to find an edge and if found, edge
if (findEdge(y))
y = useEdge(y);
break;
case 8:
FuckYaw(y);
clamp = false;
break;
default:
break;
}
if (*bSendPackets)
switch ((int) yaw_mode)
{
case 1: // FIXED
y = (float) yaw;
break;
case 2: // JITTER
if (flip)
y += 90;
else
y -= 90;
break;
case 3: // BIGRANDOM
y = RandFloatRange(-65536.0f, 65536.0f);
clamp = false;
break;
case 4: // RANDOM
y = RandFloatRange(-180.0f, 180.0f);
break;
case 5: // SPIN
cur_yaw += (float) spin;
if (cur_yaw > 180)
cur_yaw = -180;
if (cur_yaw < -180)
cur_yaw = 180;
y = cur_yaw;
break;
case 6: // OFFSETKEEP
y += (float) yaw;
break;
case 7: // Edge
// Attemt to find an edge and if found, edge
if (findEdge(y))
y = useEdge(y);
break;
case 8:
FuckYaw(y);
clamp = false;
break;
default:
break;
}
if (yaw_mode == 9)
switch ((int) yaw_mode)
{
case 1: // FIXED
y = (float) yaw;
break;
case 2: // JITTER
if (flip)
y += 90;
else
y -= 90;
break;
case 3: // BIGRANDOM
y = RandFloatRange(-65536.0f, 65536.0f);
clamp = false;
break;
case 4: // RANDOM
y = RandFloatRange(-180.0f, 180.0f);
break;
case 5: // SPIN
cur_yaw += (float) spin;
if (cur_yaw > 180)
cur_yaw = -180;
if (cur_yaw < -180)
cur_yaw = 180;
y = cur_yaw;
break;
case 6: // OFFSETKEEP
y += (float) yaw;
break;
case 7: // Edge
// Attemt to find an edge and if found, edge
if (findEdge(y))
y = useEdge(y);
break;
case 8:
FuckYaw(y);
clamp = false;
break;
case 9:
y += *bSendPackets ? 90.0f : -90.0f;
if (!*bSendPackets)
switch (int(true_pitch_mode))
{
case 1:
p = float(pitch_real);
break;
case 2:
if (flip)
p += 30.0f;
else
p -= 30.0f;
break;
case 3:
p = RandFloatRange(-89.0f, 89.0f);
break;
case 4:
p = flip ? 89.0f : -89.0f;
break;
case 5:
p = flip ? 271.0f : -271.0f;
clamp = false;
break;
case 6:
p = -271.0f;
clamp = false;
break;
case 7:
p = 271.0f;
clamp = false;
break;
case 8:
p = -3256.0f;
clamp = false;
break;
case 9:
p = -89.0f;
break;
case 10:
p = 89.0f;
break;
case 11:
FuckPitch(p);
clamp = false;
}
if (*bSendPackets)
switch (int(pitch_mode))
{
case 1:
p = float(pitch);
break;
case 2:
if (flip)
p += 30.0f;
else
p -= 30.0f;
break;
case 3:
p = RandFloatRange(-89.0f, 89.0f);
break;
case 4:
p = flip ? 89.0f : -89.0f;
break;
case 5:
p = flip ? 271.0f : -271.0f;
clamp = false;
break;
case 6:
p = -271.0f;
clamp = false;
break;
case 7:
p = 271.0f;
clamp = false;
break;
case 8:
p = -3256.0f;
clamp = false;
break;
case 9:
p = -89.0f;
break;
case 10:
p = 89.0f;
break;
case 11:
FuckPitch(p);
clamp = false;
}
break;
case 10:
y += *bSendPackets ? 0.0f : 90.0f;
break;
case 11:
y += *bSendPackets ? 0.0f : -90.0f;
break;
case 12:
if (*bSendPackets)
FuckYaw(y);
break;
default:
break;
}
switch (int(pitch_mode))
{
case 1:
p = float(pitch);
break;
case 2:
if (flip)
p += 30.0f;
else
p -= 30.0f;
break;
case 3:
p = RandFloatRange(-89.0f, 89.0f);
break;
case 4:
p = flip ? 89.0f : -89.0f;
break;
case 5:
p = flip ? 271.0f : -271.0f;
clamp = false;
break;
case 6:
p = -271.0f;
clamp = false;
break;
case 7:
p = 271.0f;
clamp = false;
break;
case 8:
p = -3256.0f;
clamp = false;
break;
case 9:
p = -89.0f;
break;
case 10:
p = 89.0f;
break;
case 11:
FuckPitch(p);
clamp = false;
}
flip = !flip;
if (clamp)
fClampAngle(cmd->viewangles);

View File

@ -37,7 +37,8 @@ void CreateMove()
return;
if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife))
return;
if (CE_BYTE(g_pLocalPlayer->weapon(), netvar.m_bReadyToBackstab))
if (!hacks::shared::backtrack::enable &&
CE_BYTE(g_pLocalPlayer->weapon(), netvar.m_bReadyToBackstab))
g_pUserCmd->buttons |= IN_ATTACK;
else
{
@ -46,22 +47,34 @@ void CreateMove()
if (hacks::shared::backtrack::iBestTarget == -1)
return;
int iBestTarget = hacks::shared::backtrack::iBestTarget;
int BestTick = hacks::shared::backtrack::BestTick;
float scr =
abs(g_pLocalPlayer->v_OrigViewangles.y -
hacks::shared::backtrack::headPositions[iBestTarget][BestTick]
.viewangles);
if (scr < 40.0f &&
hacks::shared::backtrack::headPositions[iBestTarget][BestTick]
.origin.DistTo(g_pLocalPlayer->v_Eye) <=
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)))
int tickcnt = 0;
for (auto i : hacks::shared::backtrack::headPositions[iBestTarget])
{
g_pUserCmd->tick_count =
hacks::shared::backtrack::headPositions[iBestTarget][BestTick]
.tickcount;
g_pUserCmd->buttons |= IN_ATTACK;
bool good_tick = false;
for (int j = 0; j < 12; ++j)
if (tickcnt == hacks::shared::backtrack::sorted_ticks[j].tick)
good_tick = true;
tickcnt++;
if (!good_tick)
continue;
float scr = abs(g_pLocalPlayer->v_OrigViewangles.y - i.viewangles);
if (scr <= 90.0f &&
i.origin.DistTo(g_pLocalPlayer->v_Eye) <=
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)))
{
CachedEntity *tar = ENTITY(iBestTarget);
// ok just in case
if (CE_BAD(tar))
continue;
Vector &angles = NET_VECTOR(tar, netvar.m_angEyeAngles);
float &simtime = NET_FLOAT(tar, netvar.m_flSimulationTime);
angles.y = i.viewangles;
g_pUserCmd->tick_count = i.tickcount;
g_pUserCmd->buttons |= IN_ATTACK;
break;
}
}
}
}

View File

@ -50,10 +50,13 @@ void CreateMove()
return;
if (CE_BAD(LOCAL_E))
return;
if (g_pLocalPlayer->clazz != tf_spy)
return;
if (CE_BYTE(LOCAL_E, netvar.m_bFeignDeathReady))
return;
if (HasCondition<TFCond_Cloaked>(LOCAL_E) || HasCondition<TFCond_CloakFlicker>(LOCAL_E))
return;
if (HasCondition<TFCond_Cloaked>(LOCAL_E) ||
HasCondition<TFCond_CloakFlicker>(LOCAL_E))
return;
if (CE_INT(LOCAL_E, netvar.iHealth) < (int) trigger_health &&
NearbyEntities() > 1)
g_pUserCmd->buttons |= IN_ATTACK2;
@ -64,6 +67,10 @@ void CreateMove()
continue;
if (!IsProjectile(ent) && !ent->m_bGrenadeProjectile())
continue;
if (!ent->m_bEnemy())
continue;
if (ent->m_Type() != ENTITY_PROJECTILE)
continue;
if (ent->m_bCritProjectile() && ent->m_flDistance() <= 1000.0f)
g_pUserCmd->buttons |= IN_ATTACK2;
if (ent->m_flDistance() < 300.0f)

View File

@ -5,6 +5,7 @@
* Author: nullifiedcat & Lighty
*/
#include <PlayerTools.hpp>
#include "common.hpp"
namespace hacks::tf::autodetonator
@ -53,20 +54,17 @@ bool IsTarget(CachedEntity *ent)
// Dont detonate on dead players
if (!ent->m_bAlivePlayer())
return false;
// Dont detonate on friendly players
if (playerlist::IsFriendly(playerlist::AccessData(ent).state))
return false;
// Global checks
if (player_tools::shouldTarget(ent) !=
player_tools::IgnoreReason::DO_NOT_IGNORE)
return false;
IF_GAME(IsTF())
{
// Dont target invulnerable players, ex: uber, bonk
if (IsPlayerInvulnerable(ent))
return false;
// If settings allow, ignore taunting players
if (ignore_taunting && HasCondition<TFCond_Taunting>(ent))
return false;
// If settings allow, dont target cloaked players
if (legit && IsPlayerInvisible(ent))
return false;

View File

@ -351,29 +351,31 @@ bool IsPopped()
bool ShouldChargePlayer(int idx)
{
CachedEntity *target = ENTITY(idx);
const int health = target->m_iHealth();
const int health = target->m_iHealth();
if (float(pop_uber_percent) > 0)
{
const float pophealth = target->m_iMaxHealth() * (float(pop_uber_percent) / 100);
const float pophealth =
target->m_iMaxHealth() * (float(pop_uber_percent) / 100);
if (health < pophealth)
return true;
}
else
{
const float damage_accum_duration =
g_GlobalVars->curtime - data[idx].accum_damage_start;
if (!data[idx].accum_damage_start)
const float damage_accum_duration =
g_GlobalVars->curtime - data[idx].accum_damage_start;
if (!data[idx].accum_damage_start)
return false;
if (health > 30 && data[idx].accum_damage < 45)
return false;
const float dd =
((float) data[idx].accum_damage / damage_accum_duration);
if (dd > 40)
{
return true;
}
if (health < 30 && data[idx].accum_damage > 10)
return true;
return false;
if (health > 30 && data[idx].accum_damage < 45)
return false;
const float dd = ((float) data[idx].accum_damage / damage_accum_duration);
if (dd > 40)
{
return true;
}
if (health < 30 && data[idx].accum_damage > 10)
return true;
return false;
}
return false;
}

View File

@ -7,6 +7,7 @@
#include "common.hpp"
#include <hacks/AutoSticky.hpp>
#include <PlayerTools.hpp>
namespace hacks::tf::autosticky
{
@ -58,8 +59,10 @@ bool IsTarget(CachedEntity *ent)
// Dont detonate on dead players
if (!ent->m_bAlivePlayer())
return false;
// Dont detonate on friendly players
if (playerlist::IsFriendly(playerlist::AccessData(ent).state))
// Global checks
if (player_tools::shouldTarget(ent) !=
player_tools::IgnoreReason::DO_NOT_IGNORE)
return false;
IF_GAME(IsTF())

View File

@ -25,8 +25,8 @@ static CatEnum slots_enum({ "All", "Primary", "Secondary", "Melee",
static CatVar slots(slots_enum, "backtrack_slots", "0", "Enabled Slots",
"Select what slots backtrack should be enabled on.");
BacktrackData headPositions[32][66];
BestTickData sorted_ticks[66];
BacktrackData headPositions[32][66]{};
BestTickData sorted_ticks[66]{};
int highesttick[32]{};
int lastincomingsequencenumber = 0;
static bool shouldDrawBt;
@ -69,10 +69,11 @@ int ticks = 12;
void Init()
{
for (int i = 0; i < 32; i++)
for (int j = 0; j < 66; j++)
headPositions[i][j] = BacktrackData{
0, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }
};
for (int j = 0; j < 66; j++)
headPositions[i][j] =
BacktrackData{ 0, { 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 }, 0,
0, { 0, 0, 0 } };
if (!installed)
{
latency.InstallChangeCallback(
@ -115,7 +116,8 @@ void Run()
{
for (BacktrackData &btd : headPositions[i])
btd = BacktrackData{ 0, { 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 }, 0 };
{ 0, 0, 0 }, { 0, 0, 0 }, 0,
0, { 0, 0, 0 } };
continue;
}
if (pEntity->m_iTeam() == LOCAL_E->m_iTeam())
@ -131,10 +133,12 @@ void Run()
NET_VECTOR(RAW_ENT(pEntity), netvar.m_angEyeAngles).y;
float viewangles =
(_viewangles > 180) ? _viewangles - 360 : _viewangles;
float simtime = CE_FLOAT(pEntity, netvar.m_flSimulationTime);
Vector hitbox_spine = pEntity->hitboxes.GetHitbox(3)->center;
Vector ent_orig = pEntity->InternalEntity()->GetAbsOrigin();
headPositions[i][cmd->command_number % ticks] =
BacktrackData{ cmd->tick_count, hitboxpos, min, max,
hitbox_spine, viewangles };
BacktrackData{ cmd->tick_count, hitboxpos, min, max,
hitbox_spine, viewangles, simtime, ent_orig };
float FOVDistance = GetFov(g_pLocalPlayer->v_OrigViewangles,
g_pLocalPlayer->v_Eye, hitboxpos);
float distance = g_pLocalPlayer->v_Eye.DistTo(hitbox_spine);
@ -189,7 +193,18 @@ void Run()
BestTick = bestTick;
if (cmd->buttons & IN_ATTACK)
cmd->tick_count = headPositions[iBestTarget][bestTick].tickcount;
{
CachedEntity *tar = ENTITY(iBestTarget);
// ok just in case
if (CE_BAD(tar))
return;
auto i = headPositions[iBestTarget][bestTick];
cmd->tick_count = i.tickcount;
Vector &angles = NET_VECTOR(tar, netvar.m_angEyeAngles);
float &simtime = NET_FLOAT(tar, netvar.m_flSimulationTime);
angles.y = i.viewangles;
simtime = i.simtime;
}
}
}
void Draw()

View File

@ -7,6 +7,8 @@
#include <hacks/ESP.hpp>
#include <glez/draw.hpp>
#include <online/Online.hpp>
#include <PlayerTools.hpp>
#include "common.hpp"
namespace hacks::shared::esp
@ -146,6 +148,14 @@ static CatVar entity_model(CV_SWITCH, "esp_model_name", "0", "Model name ESP",
static CatVar entity_id(CV_SWITCH, "esp_entity_id", "1", "Entity ID",
"Used with Entity ESP. Shows entityID");
// Online
static CatVar online(CV_SWITCH, "esp_online", "1", "Show online info",
"Username, etc");
static CatVar online_groups(CV_SWITCH, "esp_online_groups", "1",
"Show online groups", "Admin, developer, etc");
static CatVar online_software(CV_SWITCH, "esp_online_software", "1",
"Show software", "cathook, lmaobox, etc");
// CatVar draw_hitbox(CV_SWITCH, "esp_hitbox", "1", "Draw Hitbox");
// Unknown
@ -349,7 +359,7 @@ void CreateMove()
ProcessEntity(ent);
// Update Bones
if (i <= 32)
ent->hitboxes.GetHitbox(0);
ent->hitboxes.GetHitbox(0);
// Dont know what this check is for
if (data[i].string_count)
{
@ -1153,10 +1163,13 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
if (!g_IEngine->GetPlayerInfo(ent->m_IDX, &info))
return;
online::user_data *data =
online ? online::getUserData(info.friendsID) : nullptr;
// TODO, check if u can just use "ent->m_bEnemy()" instead of m_iTeam
// Legit mode handling
if (legit && ent->m_iTeam() != g_pLocalPlayer->team &&
playerlist::IsDefault(info.friendsID))
playerlist::IsDefault(info.friendsID) && !(data))
{
if (IsPlayerInvisible(ent))
return; // Invis check
@ -1168,6 +1181,24 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
// return;
}
if (data)
{
AddEntityString(ent, "CO: " + data->username, colors::yellow);
if (data->is_steamid_verified)
AddEntityString(ent, "Verified SteamID", colors::green);
if (online_groups)
for (auto &s : data->shown_groups)
AddEntityString(ent, s, colors::orange);
if (online_software && data->has_software)
{
if (data->is_using_friendly_software)
AddEntityString(ent, "Software: " + data->software_name);
else
AddEntityString(ent, "Software: " + data->software_name,
colors::red);
}
}
// Powerup handling
if (powerup_esp)
{
@ -1178,7 +1209,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
// Dont understand reasoning for this check
if (ent->m_bEnemy() || teammates ||
!playerlist::IsDefault(info.friendsID))
player_tools::shouldAlwaysRenderEsp(ent))
{
// Playername

View File

@ -65,8 +65,8 @@ static const int crumb_limit = 64; // limit
int follow_target = 0;
bool inited;
Timer lastTaunt{}; //time since taunt was last executed, used to avoid kicks
std::array<Timer, 32> afkTicks; //for how many ms the player hasn't been moving
Timer lastTaunt{}; // time since taunt was last executed, used to avoid kicks
std::array<Timer, 32> afkTicks; // for how many ms the player hasn't been moving
void checkAFK()
{
@ -234,7 +234,9 @@ void WorldTick()
continue;
if (entity->m_bEnemy())
continue;
if (afk && afkTicks[i].check(int(afktime))) //don't follow target that was determined afk
if (afk &&
afkTicks[i].check(int(
afktime))) // don't follow target that was determined afk
continue;
if (IsPlayerDisguised(entity) || IsPlayerInvisible(entity))
continue;
@ -277,7 +279,7 @@ void WorldTick()
continue;
// ooooo, a target
follow_target = i;
afkTicks[i].update(); //set afk time to 0
afkTicks[i].update(); // set afk time to 0
}
}
// last check for entity before we continue
@ -294,7 +296,7 @@ void WorldTick()
follow_target = 0;
return;
}
//check if target is afk
// check if target is afk
if (afk)
{
if (afkTicks[follow_target].check(int(afktime)))
@ -302,7 +304,6 @@ void WorldTick()
follow_target = 0;
return;
}
}
// if(!checkPath()) //wip do not merge if you see this
@ -345,9 +346,11 @@ void WorldTick()
}
}
//moved because its worthless otherwise
if (sync_taunt && HasCondition<TFCond_Taunting>(followtar) && lastTaunt.test_and_set(1000)) {
g_IEngine->ClientCmd("taunt");
// moved because its worthless otherwise
if (sync_taunt && HasCondition<TFCond_Taunting>(followtar) &&
lastTaunt.test_and_set(1000))
{
g_IEngine->ClientCmd("taunt");
}
// Follow the crumbs when too far away, or just starting to follow

View File

@ -9,6 +9,7 @@
#include <hacks/Trigger.hpp>
#include "common.hpp"
#include <hacks/Backtrack.hpp>
#include <PlayerTools.hpp>
namespace hacks::shared::triggerbot
{
@ -79,43 +80,57 @@ int last_hb_traced = 0;
Vector forward;
bool CanBacktrack()
{
int target = hacks::shared::backtrack::iBestTarget;
int BestTick = hacks::shared::backtrack::BestTick;
auto min = hacks::shared::backtrack::headPositions[target][BestTick].min;
auto max = hacks::shared::backtrack::headPositions[target][BestTick].max;
if (!min.x && !max.x)
return false;
// Get the min and max for the hitbox
Vector minz(std::min(min.x, max.x), std::min(min.y, max.y),
std::min(min.z, max.z));
Vector maxz(std::max(min.x, max.x), std::max(min.y, max.y),
std::max(min.z, max.z));
// Shrink the hitbox here
Vector size = maxz - minz;
Vector smod = size * 0.05f * (int) accuracy;
// Save the changes to the vectors
minz += smod;
maxz -= smod;
// Trace and test if it hits the smaller hitbox, if it fails
// we
// return false
Vector hit;
if (!IsVectorVisible(g_pLocalPlayer->v_Eye, minz) &&
!IsVectorVisible(g_pLocalPlayer->v_Eye, maxz))
int target = hacks::shared::backtrack::iBestTarget;
int tickcnt = 0;
for (auto i : hacks::shared::backtrack::headPositions[target])
{
return true;
}
if (CheckLineBox(minz, maxz, g_pLocalPlayer->v_Eye, forward, hit))
{
g_pUserCmd->tick_count =
hacks::shared::backtrack::headPositions[target][BestTick].tickcount;
g_pUserCmd->buttons |= IN_ATTACK;
return false;
bool good_tick = false;
for (int j = 0; j < 12; ++j)
if (tickcnt == hacks::shared::backtrack::sorted_ticks[j].tick)
good_tick = true;
tickcnt++;
if (!good_tick)
continue;
auto min = i.min;
auto max = i.max;
if (!min.x && !max.x)
continue;
// Get the min and max for the hitbox
Vector minz(fminf(min.x, max.x), fminf(min.y, max.y),
fminf(min.z, max.z));
Vector maxz(fmaxf(min.x, max.x), fmaxf(min.y, max.y),
fmaxf(min.z, max.z));
// Shrink the hitbox here
Vector size = maxz - minz;
Vector smod = size * 0.05f * (int) accuracy;
// Save the changes to the vectors
minz += smod;
maxz -= smod;
// Trace and test if it hits the smaller hitbox, if it fails
// we
// return false
Vector hit;
if (!IsVectorVisible(g_pLocalPlayer->v_Eye, minz) &&
!IsVectorVisible(g_pLocalPlayer->v_Eye, maxz))
continue;
if (CheckLineBox(minz, maxz, g_pLocalPlayer->v_Eye, forward, hit))
{
CachedEntity *tar = ENTITY(target);
// ok just in case
if (CE_BAD(tar))
continue;
Vector &angles = NET_VECTOR(tar, netvar.m_angEyeAngles);
float &simtime = NET_FLOAT(tar, netvar.m_flSimulationTime);
angles.y = i.viewangles;
g_pUserCmd->tick_count = i.tickcount;
g_pUserCmd->buttons |= IN_ATTACK;
return false;
}
}
return true;
}
@ -141,7 +156,7 @@ void CreateMove()
CachedEntity *ent = FindEntInSight(EffectiveTargetingRange());
// Check if can backtrack, shoot if we can
if (!CanBacktrack())
if (!CanBacktrack() || hacks::shared::backtrack::enable)
return;
// Check if dormant or null to prevent crashes
@ -272,6 +287,11 @@ bool IsTargetStateGood(CachedEntity *entity)
if (!entity->m_bEnemy() && !teammates)
return false;
// Global checks
if (player_tools::shouldTarget(entity) !=
player_tools::IgnoreReason::DO_NOT_IGNORE)
return false;
IF_GAME(IsTF())
{
// If settings allow waiting for charge, and current charge cant
@ -291,9 +311,6 @@ bool IsTargetStateGood(CachedEntity *entity)
return false;
}
}
// If settings allow, ignore taunting players
if (ignore_taunting && HasCondition<TFCond_Taunting>(entity))
return false;
// Dont target invulnerable players, ex: uber, bonk
if (IsPlayerInvulnerable(entity))
return false;
@ -307,17 +324,6 @@ bool IsTargetStateGood(CachedEntity *entity)
HasCondition<TFCond_UberBulletResist>(entity))
return false;
}
// Dont target players marked as friendly
if (playerlist::IsFriendly(playerlist::AccessData(entity).state))
return false;
IF_GAME(IsTF())
{
// If settings allow, ignore hoovys
if (ignore_hoovy && IsHoovy(entity))
{
return false;
}
}
// Head hitbox detection
if (HeadPreferable(entity))
@ -339,12 +345,12 @@ bool IsTargetStateGood(CachedEntity *entity)
if (hb)
{
// Get the min and max for the hitbox
Vector minz(std::min(hb->min.x, hb->max.x),
std::min(hb->min.y, hb->max.y),
std::min(hb->min.z, hb->max.z));
Vector maxz(std::max(hb->min.x, hb->max.x),
std::max(hb->min.y, hb->max.y),
std::max(hb->min.z, hb->max.z));
Vector minz(fminf(hb->min.x, hb->max.x),
fminf(hb->min.y, hb->max.y),
fminf(hb->min.z, hb->max.z));
Vector maxz(fmaxf(hb->min.x, hb->max.x),
fmaxf(hb->min.y, hb->max.y),
fmaxf(hb->min.z, hb->max.z));
// Shrink the hitbox here
Vector size = maxz - minz;
@ -623,25 +629,17 @@ bool UpdateAimkey()
float EffectiveTargetingRange()
{
if (GetWeaponMode() == weapon_melee)
{
return re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
// Pyros only have so much untill their flames hit
}
// Pyros only have so much untill their flames hit
else if (g_pLocalPlayer->weapon()->m_iClassID() ==
CL_CLASS(CTFFlameThrower))
{
return 185.0f;
}
return 200.0f;
// If user has set a max range, then use their setting,
if (max_range)
{
return (float) max_range;
// else use a pre-set range
}
// else use a pre-set range
else
{
return 8012.0f;
}
}
// Helper functions to trace for hitboxes

1
src/hacks/ac/antiaim.cpp Executable file → Normal file
View File

@ -74,4 +74,3 @@ void Event(KeyValues *event)
{
}
}

View File

@ -89,7 +89,8 @@ void RunEnginePrediction(IClientEntity *ent, CUserCmd *ucmd)
#else
#define antikick_time 90
#endif
const char *cmds[7] = {"use", "voicecommand", "spec_next", "spec_prev", "spec_player", "invprev", "invnext"};
const char *cmds[7] = { "use", "voicecommand", "spec_next", "spec_prev",
"spec_player", "invprev", "invnext" };
namespace hooked_methods
{
DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
@ -338,14 +339,14 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
if (engine_pred)
engine_prediction::RunEnginePrediction(RAW_ENT(LOCAL_E),
g_pUserCmd);
{
PROF_SECTION(CM_aimbot);
hacks::shared::aimbot::CreateMove();
}
{
PROF_SECTION(CM_backtracc);
hacks::shared::backtrack::Run();
}
{
PROF_SECTION(CM_aimbot);
hacks::shared::aimbot::CreateMove();
}
IF_GAME(IsTF2())
{
PROF_SECTION(CM_antibackstab);
@ -537,12 +538,12 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
{
for (int i = 0; i < 7800; i += sizeof(cmds[nextdata]))
{
senddata.m_szCommand = cmds[nextdata];
senddata.m_szCommand = cmds[nextdata];
ch->SendNetMsg(senddata);
if (nextdata == 6)
nextdata = 0;
nextdata = 0;
else
nextdata++;
nextdata++;
}
ch->Transmit();
}
@ -581,12 +582,12 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
for (int i = 0; i < 7800 + additionallag;
i += sizeof(cmds[nextdata]))
{
senddata.m_szCommand = cmds[nextdata];
senddata.m_szCommand = cmds[nextdata];
ch->SendNetMsg(senddata, false);
if (nextdata == 6)
nextdata = 0;
nextdata = 0;
else
nextdata++;
nextdata++;
}
ch->Transmit();
}
@ -595,11 +596,11 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
{
for (int i = 0; i < (int) serverlag_amount; i++)
{
senddata.m_szCommand = cmds[nextdata];
senddata.m_szCommand = cmds[nextdata];
if (nextdata == 6)
nextdata = 0;
nextdata = 0;
else
nextdata++;
nextdata++;
ch->SendNetMsg(senddata, false);
}
ch->Transmit();

View File

@ -6,6 +6,7 @@
*/
#include <hacks/hacklist.hpp>
#include <online/Online.hpp>
#include "common.hpp"
#include "hitrate.hpp"
#include "hack.hpp"
@ -31,6 +32,7 @@ DEFINE_HOOKED_METHOD(Paint, void, IEngineVGui *this_, PaintMode_t mode)
{
hitrate::Update();
}
online::update();
#if ENABLE_IPC
static Timer nametimer{};
if (nametimer.test_and_set(1000 * 10))

View File

@ -0,0 +1,2 @@
target_sources(cathook PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/Online.cpp")

333
src/online/Online.cpp Normal file
View File

@ -0,0 +1,333 @@
/*
Created on 23.06.18.
*/
#include <online/Online.hpp>
#include <core/cvwrapper.hpp>
#include <unordered_map>
#include <optional>
#include <timer.hpp>
#include <sstream>
#undef null
#include <co/OnlineService.hpp>
#include <fstream>
#include <init.hpp>
#include <thread>
namespace online
{
void saveApiKeyAndHost(std::string host);
void claimSteamId();
static co::OnlineService cathookOnlineService{};
static std::unordered_map<unsigned, std::optional<user_data>> data{};
static std::unordered_map<unsigned, bool> identify_queue{};
static Timer identify_timer{};
static bool identify_stale{ false };
static std::string api_key{};
static CatVar enable(CV_SWITCH, "online", "1", "Enable online features");
static CatCommand login("online_login", "Login", [](const CCommand &args) {
if (args.ArgC() != 3)
{
logging::Info("\nUsage: online_login <API_KEY> \"<IP:PORT>\"\nKey will "
"be saved in your data folder");
return;
}
std::string host(args.Arg(2));
logging::Info("[CO] Host = %s", host.c_str());
try
{
cathookOnlineService.setHost(host);
}
catch (std::exception &ex)
{
logging::Info("[CO] Error setting host: %s", ex.what());
return;
}
std::string key(args.Arg(1));
try
{
cathookOnlineService.login(
key, [key, host](co::ApiCallResult result,
std::optional<co::logged_in_user> me) {
if (result == co::ApiCallResult::OK)
{
logging::Info("[CO] Successfully logged in. Welcome, %s",
me->username.c_str());
api_key = key;
saveApiKeyAndHost(host);
claimSteamId();
}
else
{
logging::Info("[CO] There was an error logging in: code %d",
result);
}
});
}
catch (std::exception &ex)
{
logging::Info("[CO] Exception: %s", ex.what());
}
});
static CatCommand flush("online_flush_cache", "Flush player cache",
[](const CCommand &args) {
data.clear();
identify_queue.clear();
identify_stale = true;
});
// INTERNAL METHODS
void claimSteamId()
{
auto id = g_ISteamUser->GetSteamID();
logging::Info("[CO] Claiming SteamID %u", id.GetAccountID());
try
{
cathookOnlineService.gameStartup(id.GetAccountID());
}
catch (std::exception &ex)
{
logging::Info("[CO] Exception: %s", ex.what());
}
}
bool tryLoadApiKeyAndHost()
{
std::ifstream keyfile(DATA_PATH "/api_key", std::ios::in);
if (keyfile)
{
std::string host{};
keyfile >> api_key >> host;
if (!api_key.empty() && !host.empty())
{
try
{
cathookOnlineService.setHost(host);
}
catch (std::exception &ex)
{
logging::Info("Error while setting host: %s", ex.what());
}
return true;
}
}
return false;
}
void saveApiKeyAndHost(std::string host)
{
std::ofstream keyfile(DATA_PATH "/api_key", std::ios::out);
if (!keyfile)
{
logging::Info("[CO] Something went wrong while saving API key");
return;
}
keyfile << api_key << '\n' << host << '\n';
}
void queueUserForIdentification(unsigned steamId)
{
identify_queue[steamId] = false;
identify_timer.update();
identify_stale = true;
}
void markSteamIdNonOnline(unsigned id)
{
logging::Info("[CO] %u - not online", id);
data[id] = std::nullopt;
}
void processOnlineIdentity(unsigned id, co::identified_user &user)
{
logging::Info("[CO] %u - online", id);
user_data udata{};
udata.username = user.username;
udata.is_anonymous = (user.username == "anonymous");
udata.is_steamid_verified = user.steamid_verified;
for (auto &i : user.groups)
{
if (i.display_name.has_value())
udata.shown_groups.push_back(*i.display_name);
if (i.name == "notarget")
udata.no_target = true;
if (i.name == "owner" || i.name == "contributor")
{
udata.is_developer = true;
#if ENABLE_VISUALS
udata.rainbow = true;
#endif
}
}
#if ENABLE_VISUALS
if (user.color.has_value())
{
udata.has_color = true;
udata.color = colors::rgba_t(user.color->c_str());
}
#endif
if (user.uses_software.has_value())
{
udata.has_software = true;
udata.is_using_friendly_software = user.uses_software->friendly;
udata.software_name = user.uses_software->name;
}
data[id] = std::move(udata);
}
void processIdentifyResponse(std::vector<unsigned> input,
co::identified_user_group &group)
{
logging::Info(
"[CO] Processing identify response containing %u / %u entries",
group.users.size(), input.size());
for (auto i : input)
{
auto u = group.users.find(i);
if (u == group.users.end())
markSteamIdNonOnline(i);
else
processOnlineIdentity(i, (*u).second);
identify_queue.erase(i);
logging::Info("[CO] Removed %u from identify queue, left %u\n", i,
identify_queue.size());
}
}
void sendIdentifyRequest()
{
std::vector<unsigned> steamIds{};
auto it = identify_queue.begin();
// Create a list of up to 32 steamId's
for (int i = 0; i < 32 && it != identify_queue.end(); ++i, ++it)
{
if (!it->second)
{
it->second = true;
steamIds.push_back(it->first);
}
}
logging::Info("[CO] Sending identify request for %u players",
steamIds.size());
try
{
cathookOnlineService.userIdentify(
steamIds,
(std::function<void(
co::ApiCallResult,
std::optional<co::identified_user_group>)>) [steamIds](
co::ApiCallResult result,
std::optional<co::identified_user_group> group) {
if (result == co::ApiCallResult::OK)
{
processIdentifyResponse(steamIds, *group);
}
else
{
logging::Info("[CO] Something went wrong while identifying "
"%u players: code %d",
steamIds.size(), result);
for (auto i : steamIds)
{
identify_queue[i] = false;
}
identify_stale = true;
}
});
}
catch (std::exception &ex)
{
logging::Info("[CO] Exception: %s", ex.what());
}
}
InitRoutine init([]() {
cathookOnlineService.setErrorHandler((std::function<void(std::string)>) [](
std::string error) { logging::Info("[CO] Error: %s", error.c_str()); });
if (tryLoadApiKeyAndHost())
{
logging::Info("[CO] API key loaded successfully");
try
{
cathookOnlineService.login(
api_key, [](co::ApiCallResult result,
std::optional<co::logged_in_user> me) {
if (result == co::ApiCallResult::OK)
{
logging::Info(
"[CO] Successfully logged in. Welcome, %s",
me->username.c_str());
claimSteamId();
}
else
{
logging::Info(
"[CO] There was an error logging in: code %d",
result);
}
});
}
catch (std::exception &ex)
{
logging::Info("[CO] Exception: %s", ex.what());
}
}
});
// EXTERNAL METHODS
void update()
{
if (!enable)
return;
// Only send a request after 3 seconds passed since last unknown steamId was
// added to the queue
if (!api_key.empty() && identify_stale && identify_timer.check(3000) &&
!identify_queue.empty())
{
sendIdentifyRequest();
identify_stale = false;
}
try
{
cathookOnlineService.processPendingCalls();
}
catch (std::exception &ex)
{
logging::Info("[CO] Exception: %s", ex.what());
}
}
user_data *getUserData(unsigned steamId)
{
if (!enable)
return nullptr;
if (!steamId)
return nullptr;
auto it = data.find(steamId);
// User not identified
if (it == data.end())
{
// Queue user for identification
if (identify_queue.find(steamId) == identify_queue.end())
queueUserForIdentification(steamId);
return nullptr;
}
// SteamID belongs to online user
if (it->second.has_value())
return &*it->second;
// SteamID does not belong to online user
return nullptr;
}
}

View File

@ -8,6 +8,7 @@
#include <visual/EffectChams.hpp>
#include <MiscTemporary.hpp>
#include "common.hpp"
#include "Backtrack.hpp"
// static CatVar chams_experimental(CV_SWITCH, "chams_effect", "0",
// "Experimental Chams");
@ -320,29 +321,28 @@ void EffectChams::RenderChamsRecursive(IClientEntity *entity)
void EffectChams::RenderChams(IClientEntity *entity)
{
CMatRenderContextPtr ptr(GET_RENDER_CONTEXT);
if (ShouldRenderChams(entity))
if (ShouldRenderChams(entity))
{
rgba_t color = ChamsColor(entity);
rgba_t color_2 = color * 0.6f;
if (!legit)
{
rgba_t color = ChamsColor(entity);
rgba_t color_2 = color * 0.6f;
if (!legit)
{
mat_unlit_z->AlphaModulate(1.0f);
ptr->DepthRange(0.0f, 0.01f);
g_IVRenderView->SetColorModulation(color_2);
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit_z
: mat_lit_z);
mat_unlit_z->AlphaModulate(1.0f);
ptr->DepthRange(0.0f, 0.01f);
g_IVRenderView->SetColorModulation(color_2);
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit_z
: mat_lit_z);
RenderChamsRecursive(entity);
}
RenderChamsRecursive(entity);
}
if (legit || !singlepass)
{
mat_unlit->AlphaModulate(1.0f);
g_IVRenderView->SetColorModulation(color);
ptr->DepthRange(0.0f, 1.0f);
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit
: mat_lit);
RenderChamsRecursive(entity);
if (legit || !singlepass)
{
mat_unlit->AlphaModulate(1.0f);
g_IVRenderView->SetColorModulation(color);
ptr->DepthRange(0.0f, 1.0f);
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit : mat_lit);
RenderChamsRecursive(entity);
}
}
}

View File

@ -5,6 +5,8 @@
* Author: nullifiedcat
*/
#include <online/Online.hpp>
#include <PlayerTools.hpp>
#include "common.hpp"
static CatVar user_red_blue(CV_INT, "esp_color_red_b", "0", "Red Team: Blue",
@ -130,9 +132,10 @@ rgba_t colors::EntityF(CachedEntity *ent)
else if (ent->m_iTeam() == TEAM_RED)
result = red_v;
}
plclr = playerlist::Color(ent);
if (plclr.a)
result = plclr;
auto o = player_tools::forceEspColor(ent);
if (o.has_value())
return *o;
}
}
@ -144,3 +147,30 @@ rgba_t colors::RainbowCurrent()
return colors::FromHSL(fabs(sin(g_GlobalVars->curtime / 2.0f)) * 360.0f,
0.85f, 0.9f);
}
static unsigned char hexToChar(char i)
{
if (i >= '0' && i <= '9')
return i - '0';
if (i >= 'a' && i <= 'f')
return i - 'a' + 10;
if (i >= 'A' && i <= 'F')
return i - 'A' + 10;
return 0;
}
static unsigned int hexToByte(char hi, char lo)
{
return (hexToChar(hi) << 4) | (hexToChar(lo));
}
colors::rgba_t::rgba_t(const char hex[6])
{
auto ri = hexToByte(hex[0], hex[1]);
auto gi = hexToByte(hex[2], hex[3]);
auto bi = hexToByte(hex[4], hex[5]);
r = float(ri) / 255.0f;
g = float(gi) / 255.0f;
b = float(bi) / 255.0f;
a = 1.0f;
}

View File

@ -308,8 +308,6 @@ static const std::string list_tf2 = R"(
"aimbot_ignore_cloak"
"aimbot_ignore_deadringer"
"aimbot_ignore_vaccinator"
"ignore_taunting"
"aimbot_ignore_hoovy"
"aimbot_teammates"
]
"Auto Heal" [
@ -598,11 +596,6 @@ static const std::string list_tf2 = R"(
"Anti-Aim" [
"Anti-Aim Menu"
"aa_enabled"
"aa_realfakes"
"aa_pitch_real"
"aa_yaw_real"
"aa_pitch_mode_real"
"aa_yaw_mode_real"
"aa_pitch"
"aa_yaw"
"aa_pitch_mode"