Merge pull request #500 from BenCat07/master

Big update
This commit is contained in:
LightCat 2018-06-12 17:17:42 +02:00 committed by GitHub
commit 72d0052026
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 244 additions and 101 deletions

View File

@ -76,7 +76,7 @@ endif()
configure_file(include/config.h.in ${CMAKE_SOURCE_DIR}/include/config.h @ONLY)
configure_file(include/version.h.in ${CMAKE_SOURCE_DIR}/include/version.h @ONLY)
set_target_properties(cathook PROPERTIES COMPILE_FLAGS "-m32 -msse -msse2 -msse3 -fexceptions" LINK_FLAGS "-m32 -fno-gnu-unique -fexceptions")
set_target_properties(cathook PROPERTIES COMPILE_FLAGS "-m32 -msse -msse2 -msse3 -fexceptions" LINK_FLAGS "-m32 -fno-gnu-unique -fexceptions -DNDEBUG")
target_compile_definitions(cathook PRIVATE
_GLIBCXX_USE_CXX11_ABI=0

4
attach-libnamed.sh Normal file → Executable file
View File

@ -46,14 +46,14 @@ done
# echo $FILENAME > build_id # For detaching
cp "bin/libcathook.so" "/usr/lib64/${FILENAME}"
sudo cp "bin/libcathook.so" "/usr/lib64/${FILENAME}"
echo loading "$FILENAME" to "$proc"
sudo killall -19 steam
sudo killall -19 steamwebhelper
gdb -n -q -batch \
sudo gdb -n -q -batch \
-ex "attach $proc" \
-ex "set \$dlopen = (void*(*)(char*, int)) dlopen" \
-ex "call \$dlopen(\"/usr/lib64/$FILENAME\", 1)" \

View File

@ -146,7 +146,6 @@ struct offsets
{
return PlatformOffset(466, 0, 466);
}
static constexpr uint32_t lastoutgoingcommand()
{
return PlatformOffset(19228, undefined, undefined);
@ -155,10 +154,6 @@ struct offsets
{
return PlatformOffset(8, undefined, undefined);
}
static constexpr uint32_t ProcessMovement()
{
return PlatformOffset(1, undefined, 1);
}
static constexpr uint32_t m_NetChannel()
{
return PlatformOffset(196, undefined, undefined);

View File

@ -30,6 +30,7 @@ struct AimbotCalculatedData_s
// Functions used to calculate aimbot data, and if already calculated use it
const Vector &PredictEntity(CachedEntity *entity);
bool VischeckPredictedEntity(CachedEntity *entity);
bool BacktrackVisCheck(CachedEntity *entity);
// Variable used to tell when the aimbot has found a target
extern bool foundTarget;

View File

@ -53,7 +53,7 @@ struct CIncomingSequence
int sequencenr;
float curtime;
};
typedef boost::circular_buffer<CIncomingSequence> circular_buf;
typedef boost::circular_buffer_space_optimized<CIncomingSequence> circular_buf;
extern circular_buf sequences;
extern CatVar latency;
extern CatVar enable;

View File

@ -12,7 +12,7 @@ CatVar jointeam(CV_SWITCH, "fb_autoteam", "1",
CatVar joinclass(CV_STRING, "fb_autoclass", "spy",
"Class that will be picked after joining a team (NYI)");
CatVar nolerp(CV_SWITCH, "nolerp", "1", "NoLerp mode (experimental)");
CatVar nolerp(CV_SWITCH, "nolerp", "0", "NoLerp mode (experimental)");
CatVar engine_pred(CV_SWITCH, "engine_prediction", "0", "Engine Prediction");
CatVar debug_projectiles(CV_SWITCH, "debug_projectiles", "0",

View File

@ -137,6 +137,13 @@ static CatVar
"Set it to 0.01 if you want to shoot as soon as you "
"start pulling the arrow",
0.01f, 1.0f);
static CatVar
sticky_autoshoot(CV_FLOAT, "aimbot_sticky_charge", "0.5",
"Sticky autoshoot",
"Minimum charge for autoshooting with Pipebomb Launcher.\n"
"Set it to 0.01 if you want to shoot as soon as you "
"start Charging",
0.01f, 4.0f);
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);
@ -268,6 +275,30 @@ void CreateMove()
// Not release type weapon
}
else if (LOCAL_W->m_iClassID() == CL_CLASS(CTFPipebombLauncher))
{
float chargebegin =
*((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
float chargetime = g_GlobalVars->curtime - chargebegin;
DoAutoshoot();
static bool currently_charging_pipe = false;
// Grenade started charging
if (chargetime < 6.0f && chargetime)
currently_charging_pipe = true;
// Grenade was released
if (!(g_pUserCmd->buttons & IN_ATTACK) && currently_charging_pipe)
{
currently_charging_pipe = false;
Aim(target_entity);
}
else
return;
// Not release type weapon
}
else if (GetWeaponMode() == weapon_melee)
{
DoAutoshoot();
@ -321,10 +352,6 @@ bool ShouldAim()
// Is cloaked
if (IsPlayerInvisible(g_pLocalPlayer->entity))
return false;
// Disable aimbot with stickbomb launcher
if (g_pLocalPlayer->weapon()->m_iClassID() ==
CL_CLASS(CTFPipebombLauncher))
return false;
}
IF_GAME(IsTF2())
@ -740,6 +767,7 @@ void Aim(CachedEntity *entity)
miny += (maxy - miny) / 6;
maxz -= (maxz - minz) / 6;
minz += (maxz - minz) / 6;
// Create Vectors
positions.push_back({ minx, centery, minz });
positions.push_back({ maxx, centery, minz });
@ -782,6 +810,7 @@ void Aim(CachedEntity *entity)
// A function to check whether player can autoshoot
bool begancharge = false;
int begansticky = 0;
void DoAutoshoot()
{
// Enable check
@ -816,6 +845,28 @@ void DoAutoshoot()
}
else
begancharge = false;
if (g_pLocalPlayer->weapon()->m_iClassID() == CL_CLASS(CTFPipebombLauncher))
{
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
float chargetime = g_GlobalVars->curtime - chargebegin;
// Release Sticky if > chargetime
if ((chargetime >= (float) sticky_autoshoot) && begansticky > 3)
{
g_pUserCmd->buttons &= ~IN_ATTACK;
hacks::shared::antiaim::SetSafeSpace(3);
begansticky = 0;
}
// Else just keep charging
else
{
g_pUserCmd->buttons |= IN_ATTACK;
begansticky++;
}
return;
}
else
begansticky = 0;
bool attack = true;
// Rifle check
@ -957,7 +1008,8 @@ int BestHitbox(CachedEntity *target)
else if (ci == CL_CLASS(CTFRocketLauncher) ||
ci == CL_CLASS(CTFRocketLauncher_AirStrike) ||
ci == CL_CLASS(CTFRocketLauncher_DirectHit) ||
ci == CL_CLASS(CTFRocketLauncher_Mortar))
ci == CL_CLASS(CTFRocketLauncher_Mortar) ||
ci == CL_CLASS(CTFPipebombLauncher))
{
preferred = hitbox_t::hip_L;
}

View File

@ -420,46 +420,6 @@ int val = 0;
int value[32] = { 0 };
void ProcessUserCmd(CUserCmd *cmd)
{
if (communicate && CE_GOOD(LOCAL_E))
{
for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
{
CachedEntity *ent = ENTITY(i);
if (CE_GOOD(ent))
{
if ((int) (CE_FLOAT(ent, netvar.angEyeAngles)) == 33 &&
(int) (CE_FLOAT(ent, netvar.angEyeAngles + 4)) == 33)
{
player_info_s info;
if (g_IEngine->GetPlayerInfo(ent->m_IDX, &info) &&
playerlist::AccessData(info.friendsID).state !=
playerlist::k_EState::CAT)
{
value[ent->m_IDX]++;
if (value[ent->m_IDX] > 5)
{
playerlist::AccessData(info.friendsID).state =
playerlist::k_EState::CAT;
cmd->viewangles.y = 53;
cmd->viewangles.x = 33;
g_pLocalPlayer->bUseSilentAngles = true;
return;
}
}
}
}
}
if (delay.test_and_set(180000) || val)
{
cmd->viewangles.y = 33;
cmd->viewangles.x = 33;
g_pLocalPlayer->bUseSilentAngles = true;
val++;
if (val == 3)
val = 0;
return;
}
}
if (!ShouldAA(cmd))
return;
static bool angstate = true;

View File

@ -52,20 +52,18 @@ void CreateMove()
return;
if (CE_BAD(LOCAL_E))
return;
if (!HasWeapon(LOCAL_E, 59))
return;
if (CE_INT(LOCAL_E, netvar.iHealth) < 30 && NearbyEntities() > 2)
if (CE_INT(LOCAL_E, netvar.iHealth) < 30 && NearbyEntities() > 1)
g_pUserCmd->buttons |= IN_ATTACK2;
for (int i = 0; i < HIGHEST_ENTITY; i++)
{
CachedEntity *ent = ENTITY(i);
if (CE_BAD(ent))
continue;
if (!IsProjectile(ent))
if (!IsProjectile(ent) && !ent->m_bGrenadeProjectile())
continue;
if (ent->m_bCritProjectile())
if (ent->m_bCritProjectile() && ent->m_flDistance() <= 1000.0f)
g_pUserCmd->buttons |= IN_ATTACK2;
if (ent->m_flDistance() < 100.0f)
if (ent->m_flDistance() < 300.0f)
g_pUserCmd->buttons |= IN_ATTACK2;
}
}

View File

@ -95,24 +95,25 @@ void UpdateSearch()
return;
re::CTFGCClientSystem *gc = re::CTFGCClientSystem::GTFGCClientSystem();
if (g_pUserCmd && gc && gc->BConnectedToMatchServer(false))
if (g_pUserCmd && gc && gc->BConnectedToMatchServer(false) &&
gc->BHaveLiveMatch())
tfmm::queue_leave();
if (autoqueue_timer.test_and_set(60000))
{
if (!gc->BConnectedToMatchServer(false) &&
queuetime.test_and_set(10 * 1000 * 60))
tfmm::queue_leave();
if (gc && !gc->BConnectedToMatchServer(false))
{
logging::Info("Starting queue");
tfmm::queue_start();
}
}
if (req_timer.test_and_set(1800000))
if (!gc->BConnectedToMatchServer(false) &&
queuetime.test_and_set(10 * 1000 * 60) && !gc->BHaveLiveMatch())
tfmm::queue_leave();
if (gc && !gc->BConnectedToMatchServer(false) && !gc->BHaveLiveMatch())
{
logging::Info("Starting queue");
tfmm::queue_start();
}
#if LAGBOT_MODE
if (req_timer.test_and_set(1800000))
{
logging::Info("Stuck in queue, segfaulting");
*(int *) nullptr;
exit(1);
}
#endif
}
Timer timer{};

View File

@ -261,7 +261,7 @@ void WorldTick()
}
}
}
WalkTo(breadcrumbs.at(0));
WalkTo(breadcrumbs[0]);
}
else
idle_time.update();
@ -277,15 +277,15 @@ void DrawTick()
for (size_t i = 0; i < breadcrumbs.size() - 1; i++)
{
Vector wts1, wts2;
if (draw::WorldToScreen(breadcrumbs.at(i), wts1) &&
draw::WorldToScreen(breadcrumbs.at(i + 1), wts2))
if (draw::WorldToScreen(breadcrumbs[i], wts1) &&
draw::WorldToScreen(breadcrumbs[i + 1], wts2))
{
draw_api::draw_line(wts1.x, wts1.y, wts2.x - wts1.x,
wts2.y - wts1.y, colors::white, 0.1f);
}
}
Vector wts;
if (!draw::WorldToScreen(breadcrumbs.at(0), wts))
if (!draw::WorldToScreen(breadcrumbs[0], wts))
return;
draw_api::draw_rect(wts.x - 4, wts.y - 4, 8, 8, colors::white);
draw_api::draw_rect_outlined(wts.x - 4, wts.y - 4, 7, 7, colors::white,

View File

@ -70,7 +70,9 @@ enum EConnectionFlags
CF_CAPPED_2 = (1 << 6),
CF_CAPPED_3 = (1 << 7),
CF_CAPPED_4 = (1 << 8),
CF_CAPPED_5 = (1 << 9)
CF_CAPPED_5 = (1 << 9),
CF_STICKYBOMB = (1 << 10)
};
struct connection_s
@ -643,6 +645,10 @@ std::string DescribeConnection(index_t node, connection conn)
{
extra += "H";
}
if (c.flags & CF_STICKYBOMB)
{
extra += "S";
}
}
std::string result =
format(node, ' ', (broken ? "-x>" : (oneway ? "-->" : "<->")), ' ',
@ -691,6 +697,27 @@ CatCommand c_toggle_cf_health(
c.flags |= CF_LOW_HEALTH;
}
});
CatCommand c_toggle_cf_sticky(
"wb_conn_sticky",
"Toggle 'Sticky' flag on connection from ACTIVE to CLOSEST node", []() {
auto a = state::active();
auto b = state::closest();
if (not(a and b))
return;
for (connection i = 0; i < MAX_CONNECTIONS; i++)
{
auto &c = a->connections[i];
if (c.free())
continue;
if (c.node != state::closest_node)
continue;
// Actually flip the flag
if (c.flags & CF_STICKYBOMB)
c.flags &= ~CF_STICKYBOMB;
else
c.flags |= CF_STICKYBOMB;
}
});
// Displays all info about closest node and its connections
CatCommand c_info("wb_dump", "Show info", []() {
index_t node = state::closest_node;
@ -809,7 +836,7 @@ index_t FindNearestNode(bool traceray)
return r_node;
}
int begansticky = 0;
index_t SelectNextNode()
{
if (not state::node_good(state::active_node))
@ -833,8 +860,45 @@ index_t SelectNextNode()
{
return n.connections[i].node;
}
if (not(n.connections[i].flags & (CF_LOW_AMMO | CF_LOW_HEALTH)))
if (not(n.connections[i].flags & (CF_LOW_AMMO | CF_LOW_HEALTH)) && not(n.connections[i].flags & CF_STICKYBOMB))
chance.push_back(n.connections[i].node);
if ((n.connections[i].flags & CF_STICKYBOMB) && g_pLocalPlayer->clazz == tf_demoman)
{
state::node_good(n.connections[i].node);
if (IsVectorVisible(state::nodes[n.connections[i].node].xyz(), g_pLocalPlayer->v_Eye) && g_pLocalPlayer->v_Eye.DistTo(state::nodes[n.connections[i].node].xyz()) < 400.0f)
{
if (re::C_BaseCombatWeapon::GetSlot(RAW_ENT(LOCAL_W)) != 1)
{
begansticky = 0;
hack::ExecuteCommand("slot1");
}
else if (CanShoot())
{
Vector tr = (state::nodes[n.connections[i].node].xyz() - g_pLocalPlayer->v_Eye);
Vector angles;
VectorAngles(tr, angles);
// Clamping is important
fClampAngle(angles);
g_pLocalPlayer->bUseSilentAngles = true;
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
float chargetime = g_GlobalVars->curtime - chargebegin;
// Release Sticky if > chargetime
if ((chargetime >= 0.1f) && begansticky > 3)
{
g_pUserCmd->buttons &= ~IN_ATTACK;
hacks::shared::antiaim::SetSafeSpace(3);
begansticky = 0;
}
// Else just keep charging
else
{
g_pUserCmd->buttons |= IN_ATTACK;
begansticky++;
}
}
}
}
}
}
if (not chance.empty())

View File

@ -692,6 +692,15 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
rgrav = 0.5f;
}
}
else if (classid == CL_CLASS(CTFPipebombLauncher))
{
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
float chargetime = g_GlobalVars->curtime - chargebegin;
rspeed =
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * 1500.0f) + 900.0f;
rgrav =
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * -0.70000001f) + 0.5f;
}
else if (classid == CL_CLASS(CTFCompoundBow))
{
float chargetime =

View File

@ -332,10 +332,6 @@ 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_backtracc);
hacks::shared::backtrack::Run();
}
{
PROF_SECTION(CM_lightesp);
hacks::shared::lightesp::run();
@ -344,6 +340,10 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
PROF_SECTION(CM_aimbot);
hacks::shared::aimbot::CreateMove();
}
{
PROF_SECTION(CM_backtracc);
hacks::shared::backtrack::Run();
}
IF_GAME(IsTF2())
{
PROF_SECTION(CM_antibackstab);

View File

@ -8,24 +8,20 @@
#include "Backtrack.hpp"
namespace hooked_methods
{
float latency2 = 0.0f;
DEFINE_HOOKED_METHOD(SendDatagram, int, INetChannel *ch, bf_write *buf)
{
#if not LAGBOT_MODE
if ((float) hacks::shared::backtrack::latency > latency2)
latency2 += 1.0f;
else if ((float) hacks::shared::backtrack::latency < latency2)
latency2 -= 1.0f;
if (latency2 + 1.0f > (float) hacks::shared::backtrack::latency &&
latency2 - 1.0f < (float) hacks::shared::backtrack::latency)
latency2 = (float) hacks::shared::backtrack::latency;
if (!hacks::shared::backtrack::enable || latency2 <= 0.001f)
if (!hacks::shared::backtrack::enable ||
(float) hacks::shared::backtrack::latency <= 200.0f)
return original::SendDatagram(ch, buf);
int in = ch->m_nInSequenceNr;
auto state = ch->m_nInReliableState;
float latencysend = round(
(round((latency2 - 0.5f) / 15.1515151515f) - 0.5f) * 15.1515151515f);
float latencysend =
round((round(((float) hacks::shared::backtrack::latency - 0.5f) /
15.1515151515f) -
0.5f) *
15.1515151515f);
hacks::shared::backtrack::AddLatencyToNetchan(ch, latencysend);
#endif

View File

@ -38,7 +38,9 @@ DEFINE_HOOKED_METHOD(SendNetMsg, bool, INetChannel *this_, INetMessage &msg,
msg = msg.substr(0, msg.length() - 2);
if (msg.find("!!") == 0)
{
msg = ucccccp::encrypt(msg.substr(2));
// Change this version if you want version A back, look at ucccccp docs for more info
char Version = 'B';
msg = ucccccp::encrypt(msg.substr(2), Version);
str = str.substr(0, offset) + msg + "\"\"";
crpt = true;
}

View File

@ -246,8 +246,8 @@ Vector ProjectilePrediction_Engine(CachedEntity *ent, int hb, float speed,
bestpos.z += (400 * besttime * besttime * gravitymod);
// S = at^2/2 ; t = sqrt(2S/a)*/
Vector result = bestpos + hitbox_offset;
logging::Info("[Pred][%d] delta: %.2f %.2f %.2f", result.x - origin.x,
result.y - origin.y, result.z - origin.z);
/*logging::Info("[Pred][%d] delta: %.2f %.2f %.2f", result.x - origin.x,
result.y - origin.y, result.z - origin.z);*/
return result;
}

View File

@ -52,11 +52,14 @@ bool CTFGCClientSystem::BHaveLiveMatch()
typedef int (*BHaveLiveMatch_t)(CTFGCClientSystem *);
static uintptr_t addr =
gSignatures.GetClientSignature("55 31 C0 89 E5 53 8B 4D ? 0F B6 91");
static BHaveLiveMatch_t BHaveLiveMatch_fn = BHaveLiveMatch_t(addr);
if (BHaveLiveMatch_fn == nullptr)
if (!addr)
{
logging::Info("calling NULL!");
addr = gSignatures.GetClientSignature("55 31 C0 89 E5 53 8B 4D ? 0F B6 91");
return true;
}
static BHaveLiveMatch_t BHaveLiveMatch_fn =
BHaveLiveMatch_t(addr);
return BHaveLiveMatch_fn(this);
}

View File

@ -51,6 +51,9 @@ static CatVar chamsself(CV_SWITCH, "chams_self", "0", "Enable chams on self",
static CatVar rainbow(CV_SWITCH, "chams_self_rainbow", "1",
"Enable rainbow chams on self",
"Only visible in thirdperson!");
static CatVar
disco_chams(CV_SWITCH, "chams_disco", "0", "Disco chams",
"Constantly change color of the chams on all players");
static CatVar chamsteam(CV_SWITCH, "chams_self_team", "0", "Team chams color");
static CatVar chamsR(CV_INT, "chams_self_r", "0", "Self chams red", "", 0, 255);
static CatVar chamsG(CV_INT, "chams_self_g", "0", "Self chams green", "", 0,
@ -108,9 +111,68 @@ void EffectChams::SetEntityColor(CachedEntity *ent, rgba_t color)
{
data[ent->m_IDX] = color;
}
Timer t{};
int prevcolor = -1;
rgba_t EffectChams::ChamsColor(IClientEntity *entity)
{
CachedEntity *ent = ENTITY(entity->entindex());
if (disco_chams)
{
static rgba_t disco = { 0, 0, 0, 0 };
if (t.test_and_set(200))
{
int color = rand() % 20;
while (color == prevcolor)
color = rand() % 20;
prevcolor = color;
switch (color)
{
case 2:
disco = colors::pink;
break;
case 3:
disco = colors::red;
break;
case 4:
disco = colors::blu;
break;
case 5:
disco = colors::red_b;
break;
case 6:
disco = colors::blu_b;
break;
case 7:
disco = colors::red_v;
break;
case 8:
disco = colors::blu_v;
break;
case 9:
disco = colors::red_u;
break;
case 10:
disco = colors::blu_u;
break;
case 0:
case 1:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
float color1 = rand() % 256;
float color2 = rand() % 256;
float color3 = rand() % 256;
disco = { color1, color2, color3, 255.0f };
}
}
return disco;
}
if (data[entity->entindex()])
{
data[entity->entindex()] = false;