Merge pull request #10 from nullifiedcat/master

update fork
This commit is contained in:
julianacat 2017-07-21 12:34:22 -05:00 committed by GitHub
commit 3dea5e952b
18 changed files with 180 additions and 91 deletions

View File

@ -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:

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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);
}
} }
} }
} }

View File

@ -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 };

View File

@ -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) {

View File

@ -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;

View File

@ -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;
} }

View File

@ -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;
}*/ }
} }
} }

View File

@ -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);

View File

@ -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;

View File

@ -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()) {

View File

@ -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)) {

View File

@ -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_ */

View File

@ -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);

View File

@ -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"