Add auto charge/demoknight support
This commit is contained in:
parent
3b57ca33c1
commit
19da6f98d4
@ -1,4 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* entity.h
|
* entity.h
|
||||||
*
|
*
|
||||||
* Created on: Oct 6, 2016
|
* Created on: Oct 6, 2016
|
||||||
@ -169,7 +169,8 @@ public:
|
|||||||
offset_t res_bAlive;
|
offset_t res_bAlive;
|
||||||
offset_t m_nChargeResistType;
|
offset_t m_nChargeResistType;
|
||||||
offset_t m_hHealingTarget;
|
offset_t m_hHealingTarget;
|
||||||
offset_t m_flChargeLevel;
|
offset_t m_flChargeLevel; // Medigun
|
||||||
|
offset_t m_flChargeMeter; // Demoman Shield
|
||||||
|
|
||||||
offset_t m_rgflCoordinateFrame;
|
offset_t m_rgflCoordinateFrame;
|
||||||
offset_t m_bFeignDeathReady;
|
offset_t m_bFeignDeathReady;
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
namespace hacks::shared::catbot
|
namespace hacks::shared::catbot
|
||||||
{
|
{
|
||||||
extern Timer timer_votekicks;
|
extern Timer timer_votekicks;
|
||||||
bool should_ignore_player(CachedEntity *player);
|
|
||||||
void update();
|
void update();
|
||||||
void init();
|
void init();
|
||||||
void level_init();
|
void level_init();
|
||||||
|
@ -27,5 +27,12 @@ public:
|
|||||||
typedef Vector &(*fn_t)(IClientEntity *);
|
typedef Vector &(*fn_t)(IClientEntity *);
|
||||||
return vfunc<fn_t>(self, offsets::PlatformOffset(196, offsets::undefined, 196), 0)(self);
|
return vfunc<fn_t>(self, offsets::PlatformOffset(196, offsets::undefined, 196), 0)(self);
|
||||||
}
|
}
|
||||||
|
inline static IClientEntity *GetEquippedDemoShield(IClientEntity *self)
|
||||||
|
{
|
||||||
|
static auto signature = gSignatures.GetClientSignature("55 89 E5 57 56 53 83 EC 2C 8B 45 ? 8B 98 ? ? ? ? 85 DB 7E");
|
||||||
|
typedef IClientEntity *(*GetEquippedDemoShield_t)(IClientEntity *);
|
||||||
|
static GetEquippedDemoShield_t GetEquippedDemoShield_fn = GetEquippedDemoShield_t(signature);
|
||||||
|
return GetEquippedDemoShield_fn(self);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} // namespace re
|
} // namespace re
|
||||||
|
@ -59,6 +59,7 @@ void NetVars::Init()
|
|||||||
this->m_nChargeResistType = gNetvars.get_offset("DT_WeaponMedigun", "m_nChargeResistType");
|
this->m_nChargeResistType = gNetvars.get_offset("DT_WeaponMedigun", "m_nChargeResistType");
|
||||||
this->m_hHealingTarget = gNetvars.get_offset("DT_WeaponMedigun", "m_hHealingTarget");
|
this->m_hHealingTarget = gNetvars.get_offset("DT_WeaponMedigun", "m_hHealingTarget");
|
||||||
this->m_flChargeLevel = gNetvars.get_offset("DT_WeaponMedigun", "NonLocalTFWeaponMedigunData", "m_flChargeLevel");
|
this->m_flChargeLevel = gNetvars.get_offset("DT_WeaponMedigun", "NonLocalTFWeaponMedigunData", "m_flChargeLevel");
|
||||||
|
this->m_flChargeMeter = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_flChargeMeter");
|
||||||
this->m_bFeignDeathReady = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_bFeignDeathReady");
|
this->m_bFeignDeathReady = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_bFeignDeathReady");
|
||||||
this->m_bCarryingObject = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_bCarryingObject");
|
this->m_bCarryingObject = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_bCarryingObject");
|
||||||
this->m_hCarriedObject = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_hCarriedObject");
|
this->m_hCarriedObject = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_hCarriedObject");
|
||||||
|
@ -681,8 +681,6 @@ bool IsTargetStateGood(CachedEntity *entity)
|
|||||||
// Some global checks
|
// Some global checks
|
||||||
if (!player_tools::shouldTarget(entity))
|
if (!player_tools::shouldTarget(entity))
|
||||||
return false;
|
return false;
|
||||||
if (hacks::shared::catbot::should_ignore_player(entity))
|
|
||||||
return false;
|
|
||||||
// Invulnerable players, ex: uber, bonk
|
// Invulnerable players, ex: uber, bonk
|
||||||
if (IsPlayerInvulnerable(entity))
|
if (IsPlayerInvulnerable(entity))
|
||||||
return false;
|
return false;
|
||||||
|
@ -541,14 +541,6 @@ static Timer waiting_for_quit_timer{};
|
|||||||
|
|
||||||
static std::vector<unsigned> ipc_blacklist{};
|
static std::vector<unsigned> ipc_blacklist{};
|
||||||
|
|
||||||
bool should_ignore_player(CachedEntity *player)
|
|
||||||
{
|
|
||||||
if (CE_INVALID(player))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return playerlist::IsFriend(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ENABLE_IPC
|
#if ENABLE_IPC
|
||||||
void update_ipc_data(ipc::user_data_s &data)
|
void update_ipc_data(ipc::user_data_s &data)
|
||||||
{
|
{
|
||||||
@ -643,7 +635,7 @@ void smart_crouch()
|
|||||||
for (int i = 0; i <= g_IEngine->GetMaxClients(); i++)
|
for (int i = 0; i <= g_IEngine->GetMaxClients(); i++)
|
||||||
{
|
{
|
||||||
auto ent = ENTITY(i);
|
auto ent = ENTITY(i);
|
||||||
if (CE_BAD(ent) || ent->m_Type() != ENTITY_PLAYER || ent->m_iTeam() == LOCAL_E->m_iTeam() || !(ent->hitboxes.GetHitbox(0)) || !(ent->m_bAlivePlayer()) || !player_tools::shouldTarget(ent) || should_ignore_player(ent))
|
if (CE_BAD(ent) || ent->m_Type() != ENTITY_PLAYER || ent->m_iTeam() == LOCAL_E->m_iTeam() || !(ent->hitboxes.GetHitbox(0)) || !(ent->m_bAlivePlayer()) || !player_tools::shouldTarget(ent))
|
||||||
continue;
|
continue;
|
||||||
bool failedvis = false;
|
bool failedvis = false;
|
||||||
for (int j = 0; j < 18; j++)
|
for (int j = 0; j < 18; j++)
|
||||||
|
@ -688,6 +688,24 @@ static CatCommand dump_vars_by_name("debug_dump_netvars_name", "Dump netvars of
|
|||||||
DumpRecvTable(ent, clz->m_pRecvTable, 0, ft, 0);
|
DumpRecvTable(ent, clz->m_pRecvTable, 0, ft, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
static CatCommand debug_print_weaponid("debug_weaponid", "Print the weapon IDs of all currently equiped weapons", [](const CCommand &) {
|
||||||
|
// Invalid player
|
||||||
|
if (CE_BAD(LOCAL_E))
|
||||||
|
return;
|
||||||
|
int *hWeapons = &CE_INT(LOCAL_E, netvar.hMyWeapons);
|
||||||
|
// Go through the handle array and search for the item
|
||||||
|
for (int i = 0; hWeapons[i]; i++)
|
||||||
|
{
|
||||||
|
if (IDX_BAD(HandleToIDX(hWeapons[i])))
|
||||||
|
continue;
|
||||||
|
// Get the weapon
|
||||||
|
CachedEntity *weapon = ENTITY(HandleToIDX(hWeapons[i]));
|
||||||
|
// Print weaponid
|
||||||
|
logging::Info("weapon %i: %i", i, re::C_TFWeaponBase::GetWeaponID(RAW_ENT(weapon)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
#if ENABLE_VISUALS && !ENFORCE_STREAM_SAFETY
|
#if ENABLE_VISUALS && !ENFORCE_STREAM_SAFETY
|
||||||
// This makes us able to see enemy class and status in scoreboard and player panel
|
// This makes us able to see enemy class and status in scoreboard and player panel
|
||||||
static std::unique_ptr<BytePatch> patch_playerpanel;
|
static std::unique_ptr<BytePatch> patch_playerpanel;
|
||||||
|
@ -617,10 +617,45 @@ bool meleeAttack(int slot, std::pair<CachedEntity *, float> &nearest)
|
|||||||
if (navparser::NavEngine::current_priority > prio_melee)
|
if (navparser::NavEngine::current_priority > prio_melee)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
static Timer melee_cooldown{};
|
auto raw_local = RAW_ENT(LOCAL_E);
|
||||||
|
|
||||||
|
// We are charging, let the charge aimbot do it's job
|
||||||
|
if (HasCondition<TFCond_Charging>(LOCAL_E))
|
||||||
|
{
|
||||||
|
navparser::NavEngine::cancelPath();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Timer melee_cooldown{};
|
||||||
|
bool isVisible;
|
||||||
|
|
||||||
|
{
|
||||||
|
Ray_t ray;
|
||||||
|
trace_t trace;
|
||||||
|
trace::filter_default.SetSelf(raw_local);
|
||||||
|
|
||||||
|
auto hb = nearest.first->hitboxes.GetHitbox(spine_3);
|
||||||
|
if (hb)
|
||||||
|
{
|
||||||
|
ray.Init(g_pLocalPlayer->v_Origin + Vector{ 0, 0, 20 }, hb->center, raw_local->GetCollideable()->OBBMins(), raw_local->GetCollideable()->OBBMaxs());
|
||||||
|
g_ITrace->TraceRay(ray, MASK_PLAYERSOLID, &trace::filter_default, &trace);
|
||||||
|
isVisible = (IClientEntity *) trace.m_pEnt == RAW_ENT(nearest.first);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
isVisible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: FIXME We make no effort to determine if the charge aimbot is actually on or not
|
||||||
|
if (re::C_BasePlayer::GetEquippedDemoShield(raw_local) && re::CTFPlayerShared::GetChargeMeter(re::CTFPlayerShared::GetPlayerShared(raw_local)) == 100.0f && nearest.second < 1.5f * 750 - 100 && isVisible)
|
||||||
|
{
|
||||||
|
// Charge
|
||||||
|
current_user_cmd->buttons |= IN_ATTACK2;
|
||||||
|
AimAt(g_pLocalPlayer->v_Eye, nearest.first->m_vecOrigin(), current_user_cmd);
|
||||||
|
navparser::NavEngine::cancelPath();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
// If we are close enough, don't even bother with using the navparser to get there
|
// If we are close enough, don't even bother with using the navparser to get there
|
||||||
if (nearest.second < 200 && nearest.first->IsVisible())
|
else if (nearest.second < 200 && isVisible)
|
||||||
{
|
{
|
||||||
WalkTo(nearest.first->m_vecOrigin());
|
WalkTo(nearest.first->m_vecOrigin());
|
||||||
navparser::NavEngine::cancelPath();
|
navparser::NavEngine::cancelPath();
|
||||||
|
Reference in New Issue
Block a user