commit
3dea5e952b
@ -66,7 +66,7 @@ You will want to update these files if you wish to have an updated menu.
|
|||||||
|
|
||||||
## Followbots
|
## Followbots
|
||||||
`cathook-ipc-server` allows you to run and control Followbots to do your evil bidding in-game. The installation for Followbots is quite complex, and will not be covered on this page. Obviously, you must have several user accounts ready to run TF2.
|
`cathook-ipc-server` allows you to run and control Followbots to do your evil bidding in-game. The installation for Followbots is quite complex, and will not be covered on this page. Obviously, you must have several user accounts ready to run TF2.
|
||||||
A guide for Followbots can be found here: [How to setup followbots.](https://github.com/nullifiedcat/cathook/wiki/Setting-up-Followbots) [How to use followbots.](https://github.com/nullifiedcat/cathook/wiki/Using-Followbots)
|
A guide for Followbots can be found here: [How to setup and use followbots.](https://www.youtube.com/watch?v=kns5-nw7xUg)
|
||||||
You may also ask someone in our discord server to help you out.
|
You may also ask someone in our discord server to help you out.
|
||||||
|
|
||||||
The installation script is as followed:
|
The installation script is as followed:
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
const fs = require('fs');
|
const fs = require("fs");
|
||||||
|
|
||||||
var full_class_table = {};
|
var full_class_table = {};
|
||||||
try {
|
try {
|
||||||
full_class_table = JSON.parse(fs.readFileSync('full-class-table.json').toString());
|
full_class_table = JSON.parse(fs.readFileSync("full-class-table.json").toString());
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
const file = fs.readFileSync(process.argv[2]).toString().split('\n');
|
const file = fs.readFileSync(process.argv[2]).toString().split("\n");
|
||||||
const modname = process.argv[3];
|
const modname = process.argv[3];
|
||||||
|
|
||||||
console.log('Generating info for', modname, 'from', process.argv[2]);
|
console.log("Generating info for", modname, "from", process.argv[2]);
|
||||||
|
|
||||||
var classes = {};
|
var classes = {};
|
||||||
for (var i in file) {
|
for (var i in file) {
|
||||||
@ -19,7 +19,7 @@ for (var i in file) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.writeFileSync('full-class-table.json', JSON.stringify(full_class_table));
|
fs.writeFileSync("full-class-table.json", JSON.stringify(full_class_table));
|
||||||
|
|
||||||
var header_constexpr = `/*
|
var header_constexpr = `/*
|
||||||
AUTO-GENERATED HEADER - DO NOT MODIFY
|
AUTO-GENERATED HEADER - DO NOT MODIFY
|
||||||
@ -50,10 +50,10 @@ namespace client_classes {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
for (var clz in full_class_table) {
|
for (var clz in full_class_table) {
|
||||||
var value = '0';
|
var value = "0";
|
||||||
if (classes[clz]) value = classes[clz];
|
if (classes[clz]) value = classes[clz];
|
||||||
header_constexpr += '\t\tstatic constexpr int ' + clz + ' = ' + value + ';\n';
|
header_constexpr += "\t\tstatic constexpr int " + clz + " = " + value + ";\n";
|
||||||
header += '\t\tint ' + clz + ' { ' + value + ' };\n';
|
header += "\t\tint " + clz + " { " + value + " };\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
header += `
|
header += `
|
||||||
@ -70,8 +70,8 @@ header_constexpr += `
|
|||||||
|
|
||||||
#endif /* $mod_CONSTEXPR_AUTOGEN_HPP */`;
|
#endif /* $mod_CONSTEXPR_AUTOGEN_HPP */`;
|
||||||
|
|
||||||
fs.writeFileSync('src/classinfo/' + modname + '.gen.hpp', header.replace(/\$mod/g, modname));
|
fs.writeFileSync("src/classinfo/" + modname + ".gen.hpp", header.replace(/\$mod/g, modname));
|
||||||
fs.writeFileSync('src/classinfo/' + modname + '_constexpr.gen.hpp', header_constexpr.replace(/\$mod/g, modname));
|
fs.writeFileSync("src/classinfo/" + modname + "_constexpr.gen.hpp", header_constexpr.replace(/\$mod/g, modname));
|
||||||
|
|
||||||
|
|
||||||
console.log(classes);
|
console.log(classes);
|
@ -1,11 +1,11 @@
|
|||||||
const fs = require('fs');
|
const fs = require("fs");
|
||||||
|
|
||||||
var full_class_table = {};
|
var full_class_table = {};
|
||||||
try {
|
try {
|
||||||
full_class_table = JSON.parse(fs.readFileSync('full-class-table.json').toString());
|
full_class_table = JSON.parse(fs.readFileSync("full-class-table.json").toString());
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
console.log('Generating dummy class header');
|
console.log("Generating dummy class header");
|
||||||
|
|
||||||
var header = `/*
|
var header = `/*
|
||||||
AUTO-GENERATED HEADER - DO NOT MODIFY
|
AUTO-GENERATED HEADER - DO NOT MODIFY
|
||||||
@ -22,7 +22,7 @@ namespace client_classes {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
for (var clz in full_class_table) {
|
for (var clz in full_class_table) {
|
||||||
header += '\t\tint ' + clz + ' { 0 };\n';
|
header += "\t\tint " + clz + " { 0 };\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
header += `
|
header += `
|
||||||
@ -33,4 +33,4 @@ header += `
|
|||||||
|
|
||||||
#endif /* DUMMY_AUTOGEN_HPP */`;
|
#endif /* DUMMY_AUTOGEN_HPP */`;
|
||||||
|
|
||||||
fs.writeFileSync('src/classinfo/dummy.gen.hpp', header);
|
fs.writeFileSync("src/classinfo/dummy.gen.hpp", header);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
const fs = require('fs');
|
const fs = require("fs");
|
||||||
|
|
||||||
var full_class_table = {};
|
var full_class_table = {};
|
||||||
try {
|
try {
|
||||||
full_class_table = JSON.parse(fs.readFileSync('full-class-table.json').toString());
|
full_class_table = JSON.parse(fs.readFileSync("full-class-table.json").toString());
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
console.log('Generating dummy class header');
|
console.log("Generating dummy class header");
|
||||||
|
|
||||||
var header = `/*
|
var header = `/*
|
||||||
AUTO-GENERATED HEADER - DO NOT MODIFY
|
AUTO-GENERATED HEADER - DO NOT MODIFY
|
||||||
@ -24,7 +24,7 @@ namespace client_classes {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
for (var clz in full_class_table) {
|
for (var clz in full_class_table) {
|
||||||
header += '\t\tint ' + clz + ' { 0 };\n';
|
header += "\t\tint " + clz + " { 0 };\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
header += `
|
header += `
|
||||||
@ -35,7 +35,7 @@ header += `
|
|||||||
|
|
||||||
#endif /* DYNAMIC_AUTOGEN_HPP */`;
|
#endif /* DYNAMIC_AUTOGEN_HPP */`;
|
||||||
|
|
||||||
var POPULATED_MAP = '';
|
var POPULATED_MAP = "";
|
||||||
|
|
||||||
for (var clz in full_class_table) {
|
for (var clz in full_class_table) {
|
||||||
POPULATED_MAP += `\t\tclassid_mapping["${clz}"] = &${clz};\n`;
|
POPULATED_MAP += `\t\tclassid_mapping["${clz}"] = &${clz};\n`;
|
||||||
@ -69,5 +69,5 @@ dynamic dynamic_list;
|
|||||||
}`;
|
}`;
|
||||||
|
|
||||||
|
|
||||||
fs.writeFileSync('src/classinfo/dynamic.gen.hpp', header);
|
fs.writeFileSync("src/classinfo/dynamic.gen.hpp", header);
|
||||||
fs.writeFileSync('src/classinfo/dynamic.gen.cpp', source);
|
fs.writeFileSync("src/classinfo/dynamic.gen.cpp", source);
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit e532876ffd707a48389d54ff904dcc40a84f2839
|
Subproject commit 94a287d6faa00d44e1084b04e602842849858443
|
@ -22,7 +22,10 @@ static CatVar ammobox(CV_SWITCH, "chams_ammo", "0", "Ammoboxes", "Render chams o
|
|||||||
static CatVar buildings(CV_SWITCH, "chams_buildings", "0", "Buildings", "Render chams on buildings");
|
static CatVar buildings(CV_SWITCH, "chams_buildings", "0", "Buildings", "Render chams on buildings");
|
||||||
static CatVar stickies(CV_SWITCH, "chams_stickies", "0", "Stickies", "Render chams on stickybombs");
|
static CatVar stickies(CV_SWITCH, "chams_stickies", "0", "Stickies", "Render chams on stickybombs");
|
||||||
static CatVar teammate_buildings(CV_SWITCH, "chams_teammate_buildings", "0", "Teammate Buildings", "Render chams on teammates buildings");
|
static CatVar teammate_buildings(CV_SWITCH, "chams_teammate_buildings", "0", "Teammate Buildings", "Render chams on teammates buildings");
|
||||||
static CatVar weapons(CV_SWITCH, "chams_weapons", "1", "Weapons", "Render chams on players weapons");
|
static CatVar recursive(CV_SWITCH, "chams_recursive", "1", "Recursive", "Render chams on weapons and cosmetics");
|
||||||
|
static CatVar weapons_white(CV_SWITCH, "chams_weapons_white", "1", "White Weapons", "Should chams on weapons be white");
|
||||||
|
static CatVar legit(CV_SWITCH, "chams_legit", "0", "Legit chams", "Don't show chams through walls");
|
||||||
|
static CatVar singlepass(CV_SWITCH, "chams_singlepass", "0", "Single-pass", "Render chams only once (this disables 'darker' chams on invisible parts of player");
|
||||||
|
|
||||||
void EffectChams::Init() {
|
void EffectChams::Init() {
|
||||||
logging::Info("Init EffectChams...");
|
logging::Info("Init EffectChams...");
|
||||||
@ -102,12 +105,6 @@ bool EffectChams::ShouldRenderChams(IClientEntity* entity) {
|
|||||||
if (entity->entindex() < 0) return false;
|
if (entity->entindex() < 0) return false;
|
||||||
CachedEntity* ent = ENTITY(entity->entindex());
|
CachedEntity* ent = ENTITY(entity->entindex());
|
||||||
if (CE_BAD(ent)) return false;
|
if (CE_BAD(ent)) return false;
|
||||||
if (weapons && vfunc<bool(*)(IClientEntity*)>(entity, 0xBE, 0)(entity)) {
|
|
||||||
IClientEntity* owner = vfunc<IClientEntity*(*)(IClientEntity*)>(entity, 0x1C3, 0)(entity);
|
|
||||||
if (owner) {
|
|
||||||
return ShouldRenderChams(owner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (ent->m_Type) {
|
switch (ent->m_Type) {
|
||||||
case ENTITY_BUILDING:
|
case ENTITY_BUILDING:
|
||||||
if (!buildings) return false;
|
if (!buildings) return false;
|
||||||
@ -141,6 +138,35 @@ bool EffectChams::ShouldRenderChams(IClientEntity* entity) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EffectChams::RenderChamsRecursive(IClientEntity* entity) {
|
||||||
|
entity->DrawModel(1);
|
||||||
|
|
||||||
|
if (!recursive) return;
|
||||||
|
|
||||||
|
IClientEntity *attach;
|
||||||
|
int passes = 0;
|
||||||
|
|
||||||
|
attach = g_IEntityList->GetClientEntity(*(int*)((uintptr_t)entity + netvar.m_Collision - 24) & 0xFFF);
|
||||||
|
while (attach && passes++ < 32) {
|
||||||
|
if (attach->ShouldDraw()) {
|
||||||
|
if (entity->GetClientClass()->m_ClassID == RCC_PLAYER && vfunc<bool(*)(IClientEntity*)>(attach, 190, 0)(attach)) {
|
||||||
|
if (weapons_white) {
|
||||||
|
rgba_t mod_original;
|
||||||
|
g_IVRenderView->GetColorModulation(mod_original.rgba);
|
||||||
|
g_IVRenderView->SetColorModulation(colors::white);
|
||||||
|
attach->DrawModel(1);
|
||||||
|
g_IVRenderView->SetColorModulation(mod_original.rgba);
|
||||||
|
} else {
|
||||||
|
attach->DrawModel(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
attach->DrawModel(1);
|
||||||
|
}
|
||||||
|
attach = g_IEntityList->GetClientEntity(*(int*)((uintptr_t)attach + netvar.m_Collision - 20) & 0xFFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void EffectChams::RenderChams(int idx) {
|
void EffectChams::RenderChams(int idx) {
|
||||||
CMatRenderContextPtr ptr(GET_RENDER_CONTEXT);
|
CMatRenderContextPtr ptr(GET_RENDER_CONTEXT);
|
||||||
IClientEntity* entity = g_IEntityList->GetClientEntity(idx);
|
IClientEntity* entity = g_IEntityList->GetClientEntity(idx);
|
||||||
@ -148,17 +174,22 @@ void EffectChams::RenderChams(int idx) {
|
|||||||
if (ShouldRenderChams(entity)) {
|
if (ShouldRenderChams(entity)) {
|
||||||
rgba_t color = ChamsColor(entity);
|
rgba_t color = ChamsColor(entity);
|
||||||
rgba_t color_2 = color * 0.6f;
|
rgba_t color_2 = color * 0.6f;
|
||||||
|
if (!legit) {
|
||||||
mat_unlit_z->AlphaModulate(1.0f);
|
mat_unlit_z->AlphaModulate(1.0f);
|
||||||
ptr->DepthRange(0.0f, 0.01f);
|
ptr->DepthRange(0.0f, 0.01f);
|
||||||
g_IVRenderView->SetColorModulation(color);
|
|
||||||
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit_z : mat_lit_z);
|
|
||||||
entity->DrawModel(1);
|
|
||||||
//((DrawModelExecute_t)(hooks::hkIVModelRender->GetMethod(hooks::offDrawModelExecute)))(_this, state, info, matrix);
|
|
||||||
mat_unlit->AlphaModulate(1.0f);
|
|
||||||
g_IVRenderView->SetColorModulation(color_2);
|
g_IVRenderView->SetColorModulation(color_2);
|
||||||
|
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit_z : mat_lit_z);
|
||||||
|
|
||||||
|
RenderChamsRecursive(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (legit || !singlepass) {
|
||||||
|
mat_unlit->AlphaModulate(1.0f);
|
||||||
|
g_IVRenderView->SetColorModulation(color);
|
||||||
ptr->DepthRange(0.0f, 1.0f);
|
ptr->DepthRange(0.0f, 1.0f);
|
||||||
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit : mat_lit);
|
g_IVModelRender->ForcedMaterialOverride(flat ? mat_unlit : mat_lit);
|
||||||
entity->DrawModel(1);
|
RenderChamsRecursive(entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ public:
|
|||||||
void RenderChams(int idx);
|
void RenderChams(int idx);
|
||||||
void BeginRenderChams();
|
void BeginRenderChams();
|
||||||
void EndRenderChams();
|
void EndRenderChams();
|
||||||
|
void RenderChamsRecursive(IClientEntity* entity);
|
||||||
public:
|
public:
|
||||||
bool init { false };
|
bool init { false };
|
||||||
bool drawing { false };
|
bool drawing { false };
|
||||||
|
@ -19,6 +19,11 @@ void ThirdpersonCallback(IConVar* var, const char* pOldValue, float flOldValue)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConVar* sv_client_min_interp_ratio;
|
||||||
|
ConVar* cl_interp_ratio;
|
||||||
|
ConVar* cl_interp;
|
||||||
|
ConVar* cl_interpolate;
|
||||||
|
|
||||||
unsigned long tickcount = 0;
|
unsigned long tickcount = 0;
|
||||||
char* force_name_newlined = new char[32] { 0 };
|
char* force_name_newlined = new char[32] { 0 };
|
||||||
bool need_name_change = true;
|
bool need_name_change = true;
|
||||||
@ -38,6 +43,11 @@ CatVar disconnect_reason(CV_STRING, "disconnect_reason", "", "Disconnect reason"
|
|||||||
|
|
||||||
CatVar event_log(CV_SWITCH, "events", "1", "Advanced Events");
|
CatVar event_log(CV_SWITCH, "events", "1", "Advanced Events");
|
||||||
void GlobalSettings::Init() {
|
void GlobalSettings::Init() {
|
||||||
|
sv_client_min_interp_ratio = g_ICvar->FindVar("sv_client_min_interp_ratio");
|
||||||
|
cl_interp_ratio = g_ICvar->FindVar("cl_interp_ratio");
|
||||||
|
cl_interp = g_ICvar->FindVar("cl_interp");
|
||||||
|
cl_interpolate = g_ICvar->FindVar("cl_interpolate");
|
||||||
|
|
||||||
bSendPackets = new bool;
|
bSendPackets = new bool;
|
||||||
*bSendPackets = true;
|
*bSendPackets = true;
|
||||||
force_thirdperson.OnRegister([](CatVar* var) {
|
force_thirdperson.OnRegister([](CatVar* var) {
|
||||||
|
@ -15,6 +15,11 @@ class CatVar;
|
|||||||
extern int g_AppID;
|
extern int g_AppID;
|
||||||
extern unsigned long tickcount;
|
extern unsigned long tickcount;
|
||||||
|
|
||||||
|
extern ConVar* sv_client_min_interp_ratio;
|
||||||
|
extern ConVar* cl_interp_ratio;
|
||||||
|
extern ConVar* cl_interp;
|
||||||
|
extern ConVar* cl_interpolate;
|
||||||
|
|
||||||
extern CatVar event_log;
|
extern CatVar event_log;
|
||||||
extern CatVar cathook; // Master switch
|
extern CatVar cathook; // Master switch
|
||||||
extern CatVar ignore_taunting;
|
extern CatVar ignore_taunting;
|
||||||
|
@ -98,8 +98,11 @@ static CatVar engine_projpred(CV_SWITCH, "debug_aimbot_engine_pp", "0", "Engine
|
|||||||
static CatVar auto_spin_up(CV_SWITCH, "aimbot_spin_up", "0", "Auto Spin Up", "Spin up minigun if you can see target, useful for followbots");
|
static CatVar auto_spin_up(CV_SWITCH, "aimbot_spin_up", "0", "Auto Spin Up", "Spin up minigun if you can see target, useful for followbots");
|
||||||
static CatVar auto_zoom(CV_SWITCH, "aimbot_auto_zoom", "0", "Auto Zoom", "Automatically zoom in if you can see target, useful for followbots");
|
static CatVar auto_zoom(CV_SWITCH, "aimbot_auto_zoom", "0", "Auto Zoom", "Automatically zoom in if you can see target, useful for followbots");
|
||||||
|
|
||||||
|
static CatVar fovcircle_opacity(CV_FLOAT, "aimbot_fov_draw_opacity", "0.7", "FOV Circle Opacity", "Defines opacity of FOV circle", 0.0f, 1.0f);
|
||||||
static CatVar rageonly(CV_SWITCH, "aimbot_rage_only", "0", "Ignore non-rage targets", "Use playerlist to set up rage targets");
|
static CatVar rageonly(CV_SWITCH, "aimbot_rage_only", "0", "Ignore non-rage targets", "Use playerlist to set up rage targets");
|
||||||
|
|
||||||
|
static CatVar miss_chance(CV_FLOAT, "aimbot_miss_chance", "0", "Miss chance", "From 0 to 1. Aimbot will NOT aim in these % cases", 0.0f, 1.0f);
|
||||||
|
|
||||||
// Current Entity
|
// Current Entity
|
||||||
int target_eid { 0 };
|
int target_eid { 0 };
|
||||||
CachedEntity* target = 0;
|
CachedEntity* target = 0;
|
||||||
@ -221,6 +224,7 @@ bool ShouldAim() {
|
|||||||
if (g_pUserCmd->buttons & IN_USE) return false;
|
if (g_pUserCmd->buttons & IN_USE) return false;
|
||||||
// Check if using action slot item
|
// Check if using action slot item
|
||||||
if (g_pLocalPlayer->using_action_slot_item) return false;
|
if (g_pLocalPlayer->using_action_slot_item) return false;
|
||||||
|
|
||||||
IF_GAME (IsTF2()) {
|
IF_GAME (IsTF2()) {
|
||||||
// Check if Carrying A building
|
// Check if Carrying A building
|
||||||
if (CE_BYTE(g_pLocalPlayer->entity, netvar.m_bCarryingObject)) return false;
|
if (CE_BYTE(g_pLocalPlayer->entity, netvar.m_bCarryingObject)) return false;
|
||||||
@ -508,6 +512,12 @@ bool IsTargetStateGood(CachedEntity* entity) {
|
|||||||
|
|
||||||
// A function to aim at a specific entitiy
|
// A function to aim at a specific entitiy
|
||||||
void Aim(CachedEntity* entity) {
|
void Aim(CachedEntity* entity) {
|
||||||
|
if (float(miss_chance) > 0.0f) {
|
||||||
|
if ((rand() % 100) < float(miss_chance) * 100.0f) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Dont aim at a bad entity
|
// Dont aim at a bad entity
|
||||||
if (CE_BAD(entity)) return;
|
if (CE_BAD(entity)) return;
|
||||||
|
|
||||||
@ -969,9 +979,12 @@ void DrawText() {
|
|||||||
// Broken from kathook merge, TODO needs to be adapted for imgui
|
// Broken from kathook merge, TODO needs to be adapted for imgui
|
||||||
if (fov_draw) {
|
if (fov_draw) {
|
||||||
// It cant use fovs greater than 180, so we check for that
|
// It cant use fovs greater than 180, so we check for that
|
||||||
if (fov && float(fov) < 180) {
|
if (float(fov) > 0.0f && float(fov) < 180) {
|
||||||
// Dont show ring while player is dead
|
// Dont show ring while player is dead
|
||||||
if (LOCAL_E->m_bAlivePlayer) {
|
if (LOCAL_E->m_bAlivePlayer) {
|
||||||
|
rgba_t color = GUIColor();
|
||||||
|
color.a = float(fovcircle_opacity);
|
||||||
|
|
||||||
// Grab the screen resolution and save to some vars
|
// Grab the screen resolution and save to some vars
|
||||||
int width, height;
|
int width, height;
|
||||||
g_IEngine->GetScreenSize(width, height);
|
g_IEngine->GetScreenSize(width, height);
|
||||||
@ -995,7 +1008,7 @@ void DrawText() {
|
|||||||
px = width / 2 + radius * cos(ang);
|
px = width / 2 + radius * cos(ang);
|
||||||
py = height / 2 + radius * sin(ang);
|
py = height / 2 + radius * sin(ang);
|
||||||
}
|
}
|
||||||
drawgl::Line(px, py, x - px, y - py, GUIColor());
|
drawgl::Line(px, py, x - px, y - py, color);
|
||||||
px = x;
|
px = x;
|
||||||
py = y;
|
py = y;
|
||||||
}
|
}
|
||||||
|
@ -148,26 +148,25 @@ void CreateMove() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Infinite healthpacks (I'll probably have to move this somewhere else)
|
// Infinite healthpacks (I'll probably have to move this somewhere else)
|
||||||
if (infinite_packs && CE_GOOD(LOCAL_E) && LOCAL_E->m_iHealth != LOCAL_E->m_iMaxHealth) {
|
if (infinite_packs && CE_GOOD(LOCAL_E) && LOCAL_E->m_iHealth < LOCAL_E->m_iMaxHealth) {
|
||||||
ICollideable* p = RAW_ENT(LOCAL_E)->GetCollideable();
|
ICollideable* p = RAW_ENT(LOCAL_E)->GetCollideable();
|
||||||
const Vector& max1 = p->OBBMaxs();
|
const Vector& max1 = p->OBBMaxs() + RAW_ENT(LOCAL_E)->GetAbsOrigin();
|
||||||
const Vector& min1 = p->OBBMins();
|
const Vector& min1 = p->OBBMins() + RAW_ENT(LOCAL_E)->GetAbsOrigin();
|
||||||
for (int i = 1; i < entity_cache::max; i++) {
|
for (int i = 1; i < entity_cache::max; i++) {
|
||||||
CachedEntity* e = ENTITY(i);
|
CachedEntity* e = ENTITY(i);
|
||||||
|
if (CE_BAD(e)) continue;
|
||||||
if (e->m_iClassID != CL_CLASS(CBaseAnimating)) continue;
|
if (e->m_iClassID != CL_CLASS(CBaseAnimating)) continue;
|
||||||
if (e->m_ItemType != ITEM_HEALTH_SMALL && e->m_ItemType != ITEM_HEALTH_MEDIUM && e->m_ItemType != ITEM_HEALTH_LARGE) continue;
|
if (e->m_ItemType != ITEM_HEALTH_SMALL && e->m_ItemType != ITEM_HEALTH_MEDIUM && e->m_ItemType != ITEM_HEALTH_LARGE) continue;
|
||||||
if (e->m_flDistance < 54.0f) amount = 900;
|
ICollideable* c = RAW_ENT(e)->GetCollideable();
|
||||||
// Not working for some reason?
|
const Vector& max2 = c->OBBMaxs() + e->m_vecOrigin;// + Vector(10, 10, 10);
|
||||||
/*ICollideable* c = RAW_ENT(e)->GetCollideable();
|
const Vector& min2 = c->OBBMins() + e->m_vecOrigin;// - Vector(10, 10, 10);
|
||||||
const Vector& max2 = c->OBBMaxs();
|
|
||||||
const Vector& min2 = c->OBBMins();
|
|
||||||
if ( (min1.x <= max2.x && max1.x >= min2.x) &&
|
if ( (min1.x <= max2.x && max1.x >= min2.x) &&
|
||||||
(min1.y <= max2.y && max1.y >= min2.y) &&
|
(min1.y <= max2.y && max1.y >= min2.y) &&
|
||||||
(min1.z <= max2.z && max1.z >= min2.z) ) {
|
(min1.z <= max2.z && max1.z >= min2.z) ) {
|
||||||
logging::Info("Collision with %d", i);
|
//logging::Info("Collision with %d", i);
|
||||||
amount = 900;
|
amount = 900;
|
||||||
break;
|
break;
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,26 +322,20 @@ void CreateMove() {
|
|||||||
|
|
||||||
// Check if user settings allow anti-afk
|
// Check if user settings allow anti-afk
|
||||||
if (anti_afk) {
|
if (anti_afk) {
|
||||||
|
|
||||||
// If the timer exceeds 1 minute, jump and reset the timer
|
// If the timer exceeds 1 minute, jump and reset the timer
|
||||||
if (g_GlobalVars->curtime - 60 > afkTimeIdle) {
|
if ( g_GlobalVars->curtime - afkTimeIdle > 60 ) {
|
||||||
|
|
||||||
// Send random commands
|
// If player didnt jump, then we dont reset the timer
|
||||||
g_pUserCmd->sidemove = RandFloatRange(-450.0, 450.0);
|
if (CE_INT(g_pLocalPlayer->entity, netvar.movetype) == MOVETYPE_FLY)
|
||||||
g_pUserCmd->forwardmove = RandFloatRange(-450.0, 450.0);
|
|
||||||
g_pUserCmd->buttons = rand();
|
|
||||||
|
|
||||||
// After 1 second we reset the idletime
|
|
||||||
if (g_GlobalVars->curtime - 61 > afkTimeIdle) {
|
|
||||||
logging::Info("Finish idle");
|
|
||||||
afkTimeIdle = g_GlobalVars->curtime;
|
afkTimeIdle = g_GlobalVars->curtime;
|
||||||
|
|
||||||
|
// Attemt to jump
|
||||||
|
g_pUserCmd->buttons = g_pUserCmd->buttons &~ IN_JUMP;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// If the player uses a button, reset the timer
|
// 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)
|
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 )
|
||||||
afkTimeIdle = g_GlobalVars->curtime;
|
afkTimeIdle = g_GlobalVars->curtime;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
IF_GAME (IsTF2()) {
|
IF_GAME (IsTF2()) {
|
||||||
if (nopush_enabled == pNoPush-> GetBool()) pNoPush->SetValue (!nopush_enabled);
|
if (nopush_enabled == pNoPush-> GetBool()) pNoPush->SetValue (!nopush_enabled);
|
||||||
|
@ -35,7 +35,7 @@ void Draw() {
|
|||||||
closest_spy_distance = 0.0f;
|
closest_spy_distance = 0.0f;
|
||||||
spy_count = 0;
|
spy_count = 0;
|
||||||
if (last_say > g_GlobalVars->curtime) last_say = 0;
|
if (last_say > g_GlobalVars->curtime) last_say = 0;
|
||||||
for (int i = 0; i < HIGHEST_ENTITY && i < 64; i++) {
|
for (int i = 0; i < HIGHEST_ENTITY && i < 32; i++) {
|
||||||
ent = ENTITY(i);
|
ent = ENTITY(i);
|
||||||
if (CE_BAD(ent)) continue;
|
if (CE_BAD(ent)) continue;
|
||||||
if (CE_BYTE(ent, netvar.iLifeState)) continue;
|
if (CE_BYTE(ent, netvar.iLifeState)) continue;
|
||||||
|
@ -27,7 +27,7 @@ static CatVar trigger_key_mode(trigger_key_modes_enum, "trigger_key_mode", "1",
|
|||||||
static CatEnum hitbox_mode_enum({ "AUTO-HEAD", "AUTO-CLOSEST", "Head only" });
|
static CatEnum hitbox_mode_enum({ "AUTO-HEAD", "AUTO-CLOSEST", "Head only" });
|
||||||
static CatVar hitbox_mode(hitbox_mode_enum, "trigger_hitboxmode", "0", "Hitbox Mode", "Defines hitbox selection mode");
|
static CatVar hitbox_mode(hitbox_mode_enum, "trigger_hitboxmode", "0", "Hitbox Mode", "Defines hitbox selection mode");
|
||||||
|
|
||||||
static CatVar accuracy(CV_INT, "trigger_accuracy", "0", "Improve accuracy", "Improves triggerbot accuracy when aiming for specific hitbox. Recommended to use with sniper rifle/ambassador");
|
static CatVar accuracy(CV_INT, "trigger_accuracy", "1", "Improve accuracy", "Improves triggerbot accuracy when aiming for specific hitbox. Recommended to use with sniper rifle/ambassador");
|
||||||
|
|
||||||
static CatVar ignore_vaccinator(CV_SWITCH, "trigger_ignore_vaccinator", "1", "Ignore Vaccinator", "Hitscan weapons won't fire if enemy is vaccinated against bullets");
|
static CatVar ignore_vaccinator(CV_SWITCH, "trigger_ignore_vaccinator", "1", "Ignore Vaccinator", "Hitscan weapons won't fire if enemy is vaccinated against bullets");
|
||||||
static CatVar ignore_hoovy(CV_SWITCH, "trigger_ignore_hoovy", "1", "Ignore Hoovies", "Triggerbot won't attack hoovies");
|
static CatVar ignore_hoovy(CV_SWITCH, "trigger_ignore_hoovy", "1", "Ignore Hoovies", "Triggerbot won't attack hoovies");
|
||||||
@ -43,12 +43,19 @@ static CatVar max_range(CV_INT, "trigger_maxrange", "0", "Max distance",
|
|||||||
"Max range for triggerbot\n"
|
"Max range for triggerbot\n"
|
||||||
"900-1100 range is efficient for scout/widowmaker engineer", 4096.0f);
|
"900-1100 range is efficient for scout/widowmaker engineer", 4096.0f);
|
||||||
|
|
||||||
|
static CatVar delay(CV_FLOAT, "trigger_delay", "0", "Delay", "Triggerbot delay in seconds", 0.0f, 1.0f);
|
||||||
|
|
||||||
|
float target_time = 0.0f;
|
||||||
|
|
||||||
int last_hb_traced = 0;
|
int last_hb_traced = 0;
|
||||||
Vector forward;
|
Vector forward;
|
||||||
|
|
||||||
// The main "loop" of the triggerbot
|
// The main "loop" of the triggerbot
|
||||||
void CreateMove() {
|
void CreateMove() {
|
||||||
|
|
||||||
|
float backup_time = target_time;
|
||||||
|
target_time = 0;
|
||||||
|
|
||||||
// Check if aimbot is enabled
|
// Check if aimbot is enabled
|
||||||
if (!enabled) return;
|
if (!enabled) return;
|
||||||
|
|
||||||
@ -65,7 +72,23 @@ void CreateMove() {
|
|||||||
if (CE_BAD(ent)) return;
|
if (CE_BAD(ent)) return;
|
||||||
|
|
||||||
// Determine whether the triggerbot should shoot, then act accordingly
|
// Determine whether the triggerbot should shoot, then act accordingly
|
||||||
if (IsTargetStateGood(ent)) g_pUserCmd->buttons |= IN_ATTACK;
|
if (IsTargetStateGood(ent)) {
|
||||||
|
target_time = backup_time;
|
||||||
|
if (delay) {
|
||||||
|
if (target_time > g_GlobalVars->curtime) {
|
||||||
|
target_time = 0.0f;
|
||||||
|
}
|
||||||
|
if (!target_time) {
|
||||||
|
target_time = g_GlobalVars->curtime;
|
||||||
|
} else {
|
||||||
|
if (g_GlobalVars->curtime - float(delay) >= target_time) {
|
||||||
|
g_pUserCmd->buttons |= IN_ATTACK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
g_pUserCmd->buttons |= IN_ATTACK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -95,6 +118,11 @@ bool ShouldShoot() {
|
|||||||
if (HasCondition<TFCond_Taunting>(g_pLocalPlayer->entity)) return false;
|
if (HasCondition<TFCond_Taunting>(g_pLocalPlayer->entity)) return false;
|
||||||
// Check if player is cloaked
|
// Check if player is cloaked
|
||||||
if (IsPlayerInvisible(g_pLocalPlayer->entity)) return false;
|
if (IsPlayerInvisible(g_pLocalPlayer->entity)) return false;
|
||||||
|
|
||||||
|
if (IsAmbassador(g_pLocalPlayer->weapon())) {
|
||||||
|
// Check if ambasador can headshot
|
||||||
|
if (!AmbassadorCanHeadshot()) return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IF_GAME (IsTF2()) {
|
IF_GAME (IsTF2()) {
|
||||||
|
@ -163,15 +163,19 @@ bool CreateMove_hook(void* thisptr, float inputSample, CUserCmd* cmd) {
|
|||||||
time_replaced = false;
|
time_replaced = false;
|
||||||
curtime_old = g_GlobalVars->curtime;
|
curtime_old = g_GlobalVars->curtime;
|
||||||
|
|
||||||
static ConVar* sv_client_min_interp_ratio = g_ICvar->FindVar("sv_client_min_interp_ratio");
|
|
||||||
static ConVar* cl_interp = g_ICvar->FindVar("cl_interp");
|
|
||||||
static ConVar* cl_interp_ratio = g_ICvar->FindVar("cl_interp_ratio");
|
|
||||||
|
|
||||||
if (nolerp) {
|
if (nolerp) {
|
||||||
g_pUserCmd->tick_count += 1;
|
g_pUserCmd->tick_count += 1;
|
||||||
if (sv_client_min_interp_ratio->GetInt() != -1) sv_client_min_interp_ratio->SetValue(-1);
|
if (sv_client_min_interp_ratio->GetInt() != -1) {
|
||||||
if (cl_interp->GetInt() != 0) cl_interp->SetValue(0);
|
//sv_client_min_interp_ratio->m_nFlags = 0;
|
||||||
|
sv_client_min_interp_ratio->SetValue(-1);
|
||||||
|
}
|
||||||
|
if (cl_interp->m_fValue != 0) {
|
||||||
|
cl_interp->SetValue(0);
|
||||||
|
cl_interp->m_fValue = 0.0f;
|
||||||
|
cl_interp->m_nValue = 0;
|
||||||
|
}
|
||||||
if (cl_interp_ratio->GetInt() != 0) cl_interp_ratio->SetValue(0);
|
if (cl_interp_ratio->GetInt() != 0) cl_interp_ratio->SetValue(0);
|
||||||
|
if (cl_interpolate->GetInt() != 0) cl_interpolate->SetValue(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_Settings.bInvalid && CE_GOOD(g_pLocalPlayer->entity)) {
|
if (!g_Settings.bInvalid && CE_GOOD(g_pLocalPlayer->entity)) {
|
||||||
|
@ -12,6 +12,7 @@ class CatVar;
|
|||||||
|
|
||||||
extern CatVar no_zoom;
|
extern CatVar no_zoom;
|
||||||
extern CatVar clean_screenshots;
|
extern CatVar clean_screenshots;
|
||||||
|
extern CatVar disable_visuals;
|
||||||
void PaintTraverse_hook(void*, unsigned int, bool, bool);
|
void PaintTraverse_hook(void*, unsigned int, bool, bool);
|
||||||
|
|
||||||
#endif /* PAINTTRAVERSE_H_ */
|
#endif /* PAINTTRAVERSE_H_ */
|
||||||
|
@ -38,7 +38,7 @@ void SDL_GL_SwapWindow_hook(SDL_Window* window) {
|
|||||||
static SDL_GLContext ctx_tf2 = SDL_GL_GetCurrentContext();
|
static SDL_GLContext ctx_tf2 = SDL_GL_GetCurrentContext();
|
||||||
static SDL_GLContext ctx_imgui = nullptr;
|
static SDL_GLContext ctx_imgui = nullptr;
|
||||||
static SDL_GLContext ctx_text = nullptr;
|
static SDL_GLContext ctx_text = nullptr;
|
||||||
{
|
if (!disable_visuals) {
|
||||||
PROF_SECTION(DRAW_cheat);
|
PROF_SECTION(DRAW_cheat);
|
||||||
if (!ctx_imgui) {
|
if (!ctx_imgui) {
|
||||||
ctx_imgui = SDL_GL_CreateContext(window);
|
ctx_imgui = SDL_GL_CreateContext(window);
|
||||||
@ -55,15 +55,7 @@ void SDL_GL_SwapWindow_hook(SDL_Window* window) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_GL_MakeCurrent(window, ctx_imgui);
|
|
||||||
{
|
|
||||||
PROF_SECTION(DRAW_imgui);
|
|
||||||
ImGui_ImplSdl_NewFrame(window);
|
|
||||||
menu::im::Render();
|
|
||||||
ImGui::Render();
|
|
||||||
}
|
|
||||||
SDL_GL_MakeCurrent(window, ctx_text);
|
SDL_GL_MakeCurrent(window, ctx_text);
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> draw_lock(drawing_mutex);
|
std::lock_guard<std::mutex> draw_lock(drawing_mutex);
|
||||||
drawgl::PreRender();
|
drawgl::PreRender();
|
||||||
@ -79,6 +71,13 @@ void SDL_GL_SwapWindow_hook(SDL_Window* window) {
|
|||||||
|
|
||||||
drawgl::PostRender();
|
drawgl::PostRender();
|
||||||
}
|
}
|
||||||
|
SDL_GL_MakeCurrent(window, ctx_imgui);
|
||||||
|
{
|
||||||
|
PROF_SECTION(DRAW_imgui);
|
||||||
|
ImGui_ImplSdl_NewFrame(window);
|
||||||
|
menu::im::Render();
|
||||||
|
ImGui::Render();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
PROF_SECTION(DRAW_valve);
|
PROF_SECTION(DRAW_valve);
|
||||||
|
@ -135,11 +135,12 @@
|
|||||||
"type": "list",
|
"type": "list",
|
||||||
"name": "Triggerbot Preferences",
|
"name": "Triggerbot Preferences",
|
||||||
"list": [
|
"list": [
|
||||||
|
"trigger_delay",
|
||||||
|
"trigger_accuracy",
|
||||||
"trigger_zoomed",
|
"trigger_zoomed",
|
||||||
"trigger_maxrange",
|
"trigger_maxrange",
|
||||||
"trigger_charge",
|
"trigger_charge",
|
||||||
"trigger_hitboxmode",
|
"trigger_hitboxmode",
|
||||||
"trigger_accuracy",
|
|
||||||
"trigger_key_mode",
|
"trigger_key_mode",
|
||||||
"trigger_key"
|
"trigger_key"
|
||||||
]
|
]
|
||||||
@ -244,13 +245,16 @@
|
|||||||
"name": "Chams",
|
"name": "Chams",
|
||||||
"list": [
|
"list": [
|
||||||
"chams_enable",
|
"chams_enable",
|
||||||
|
"chams_legit",
|
||||||
|
"chams_singlepass",
|
||||||
"chams_health",
|
"chams_health",
|
||||||
"chams_players",
|
"chams_players",
|
||||||
"chams_teammates",
|
"chams_teammates",
|
||||||
"chams_buildings",
|
"chams_buildings",
|
||||||
"chams_teammate_buildings",
|
"chams_teammate_buildings",
|
||||||
"chams_flat",
|
"chams_flat",
|
||||||
"chams_weapons",
|
"chams_recursive",
|
||||||
|
"chams_weapons_white",
|
||||||
"chams_medkits",
|
"chams_medkits",
|
||||||
"chams_ammo",
|
"chams_ammo",
|
||||||
"chams_stickies"
|
"chams_stickies"
|
||||||
|
Reference in New Issue
Block a user