Compensate for punch angles in Aiming

This commit is contained in:
BenCat07 2020-05-30 16:19:26 +02:00
parent bc3887d75a
commit 09342a3131
9 changed files with 39 additions and 64 deletions

View File

@ -116,8 +116,8 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity);
bool IsVectorVisible(Vector a, Vector b, bool enviroment_only = false, CachedEntity *self = LOCAL_E, unsigned int mask = MASK_SHOT_HULL);
// A Special function for navparser to check if a Vector is visible.
bool IsVectorVisibleNavigation(Vector a, Vector b, unsigned int mask = MASK_SHOT_HULL);
Vector GetForwardVector(Vector origin, Vector viewangles, float distance);
Vector GetForwardVector(float distance);
Vector GetForwardVector(Vector origin, Vector viewangles, float distance, CachedEntity *punch_entity = nullptr);
Vector GetForwardVector(float distance, CachedEntity *punch_entity = nullptr);
CachedEntity *getClosestEntity(Vector vec);
bool IsSentryBuster(CachedEntity *ent);
std::unique_ptr<char[]> strfmt(const char *fmt, ...);
@ -156,16 +156,20 @@ void ChangeName(std::string name);
void WhatIAmLookingAt(int *result_eindex, Vector *result_pos);
inline Vector GetAimAtAngles(Vector origin, Vector target)
inline Vector GetAimAtAngles(Vector origin, Vector target, CachedEntity *punch_correct = nullptr)
{
Vector angles, tr;
tr = (target - origin);
VectorAngles(tr, angles);
// Apply punchangle correction
if (punch_correct)
angles -= CE_VECTOR(punch_correct, netvar.vecPunchAngle);
fClampAngle(angles);
return angles;
}
void AimAt(Vector origin, Vector target, CUserCmd *cmd);
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd);
void AimAt(Vector origin, Vector target, CUserCmd *cmd, bool compensate_punch = true);
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd, bool compensate_punch = true);
bool IsProjectileCrit(CachedEntity *ent);
QAngle VectorToQAngle(Vector in);

View File

@ -606,11 +606,11 @@ bool IsTargetStateGood(CachedEntity *entity)
int hb = BestHitbox(entity);
if (hb == -1)
return false;
Vector newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, entity->hitboxes.GetHitbox(hb)->center);
Vector newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, entity->hitboxes.GetHitbox(hb)->center, LOCAL_E);
trace_t trace;
Ray_t ray;
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange, LOCAL_E));
g_ITrace->TraceRay(ray, MASK_SHOT_HULL, &trace::filter_default, &trace);
if ((IClientEntity *) trace.m_pEnt != RAW_ENT(entity))
return false;
@ -887,7 +887,7 @@ void Aim(CachedEntity *entity)
return;
// Get angles
Vector tr = (PredictEntity(entity) - g_pLocalPlayer->v_Eye);
Vector angles = GetAimAtAngles(g_pLocalPlayer->v_Eye, PredictEntity(entity), LOCAL_E);
// Multipoint
if (multipoint && !projectile_mode)
@ -931,14 +931,10 @@ void Aim(CachedEntity *entity)
for (int i = 0; i < 13; ++i)
if (IsEntityVectorVisible(entity, positions[i]))
{
tr = (positions[i] - g_pLocalPlayer->v_Eye);
angles = GetAimAtAngles(g_pLocalPlayer->v_Eye, positions[i], LOCAL_E);
break;
}
}
Vector angles;
VectorAngles(tr, angles);
// Clamping is important
fClampAngle(angles);
// Slow aim
if (slow_aim)

View File

@ -165,14 +165,14 @@ static bool doRageBackstab()
auto hitbox = ClosestDistanceHitbox(ent);
if (hitbox == -1)
continue;
auto angle = GetAimAtAngles(g_pLocalPlayer->v_Eye, ent->hitboxes.GetHitbox(hitbox)->center);
auto angle = GetAimAtAngles(g_pLocalPlayer->v_Eye, ent->hitboxes.GetHitbox(hitbox)->center, LOCAL_E);
if (!angleCheck(ent, std::nullopt, angle) && !canFaceStab(ent))
continue;
trace_t trace;
Ray_t ray;
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, angle, swingrange));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, angle, swingrange, LOCAL_E));
g_ITrace->TraceRay(ray, MASK_SHOT_HULL, &trace::filter_default, &trace);
if (trace.m_pEnt)
{
@ -198,7 +198,7 @@ static bool doRageBackstab()
trace_t trace;
Ray_t ray;
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange, LOCAL_E));
g_ITrace->TraceRay(ray, MASK_SHOT_HULL, &trace::filter_default, &trace);
if (trace.m_pEnt)
{
@ -243,7 +243,7 @@ bool backtrackFilter(CachedEntity *ent, hacks::tf2::backtrack::BacktrackData tic
if (legit_stab)
newangle = g_pLocalPlayer->v_OrigViewangles;
else
newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, distcheck);
newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, distcheck, LOCAL_E);
if (!angleCheck(ent, target_worldspace, newangle) && !canFaceStab(ent))
return false;

View File

@ -190,7 +190,7 @@ void CreateMove()
if (!legit)
{
// Aim at predicted projectile
AimAt(g_pLocalPlayer->v_Eye, closest_vec, current_user_cmd);
AimAt(g_pLocalPlayer->v_Eye, closest_vec, current_user_cmd, false);
// Use silent angles
g_pLocalPlayer->bUseSilentAngles = true;
}

View File

@ -308,7 +308,7 @@ static void SapperAimbot()
{
float range = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
Vector angle = GetAimAtAngles(g_pLocalPlayer->v_Eye, GetBuildingPosition(target));
Vector forward = GetForwardVector(g_pLocalPlayer->v_Eye, angle, range);
Vector forward = GetForwardVector(g_pLocalPlayer->v_Eye, angle, range, LOCAL_E);
trace_t trace;
if (IsEntityVectorVisible(target, forward, MASK_SHOT, &trace))
{
@ -536,7 +536,7 @@ static void BuildingAimbot()
if (target)
{
Vector angle = GetAimAtAngles(g_pLocalPlayer->v_Eye, GetBuildingPosition(target));
Vector forward = GetForwardVector(g_pLocalPlayer->v_Eye, angle, wrench_range);
Vector forward = GetForwardVector(g_pLocalPlayer->v_Eye, angle, wrench_range, LOCAL_E);
trace_t trace;

View File

@ -103,17 +103,7 @@ void CreateMove()
else
{
// Set up forward Vector
float sp, sy, cp, cy;
QAngle angle;
g_IEngine->GetViewAngles(angle);
sy = sinf(DEG2RAD(angle[1]));
cy = cosf(DEG2RAD(angle[1]));
sp = sinf(DEG2RAD(angle[0]));
cp = cosf(DEG2RAD(angle[0]));
forward.x = cp * cy;
forward.y = cp * sy;
forward.z = -sp;
forward = forward * EffectiveTargetingRange() + g_pLocalPlayer->v_Eye;
forward = GetForwardVector(EffectiveTargetingRange(), LOCAL_E);
// Call closest tick with our Tick filter func
auto closest_data = hacks::tf2::backtrack::getClosestTick(g_pLocalPlayer->v_Eye, hacks::tf2::backtrack::defaultEntFilter, tick_filter);
@ -403,18 +393,8 @@ CachedEntity *FindEntInSight(float range, bool no_players)
trace_t trace;
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
// Use math to get a vector in front of the player
float sp, sy, cp, cy;
QAngle angle;
g_IEngine->GetViewAngles(angle);
sy = sinf(DEG2RAD(angle[1]));
cy = cosf(DEG2RAD(angle[1]));
sp = sinf(DEG2RAD(angle[0]));
cp = cosf(DEG2RAD(angle[0]));
forward.x = cp * cy;
forward.y = cp * sy;
forward.z = -sp;
forward = forward * range + g_pLocalPlayer->v_Eye;
// Get Forward vector
forward = GetForwardVector(range, LOCAL_E);
// Setup the trace starting with the origin of the local players eyes
// attemting to hit the end vector we determined

View File

@ -1404,11 +1404,14 @@ void WhatIAmLookingAt(int *result_eindex, Vector *result_pos)
*result_eindex = ((IClientEntity *) (trace.m_pEnt))->entindex();
}
Vector GetForwardVector(Vector origin, Vector viewangles, float distance)
Vector GetForwardVector(Vector origin, Vector viewangles, float distance, CachedEntity *punch_entity)
{
Vector forward;
float sp, sy, cp, cy;
QAngle angle = VectorToQAngle(viewangles);
// Compensate for punch angle
if (punch_entity)
angle += VectorToQAngle(CE_VECTOR(punch_entity, netvar.vecPunchAngle));
trace_t trace;
sy = sinf(DEG2RAD(angle[1]));
@ -1422,9 +1425,9 @@ Vector GetForwardVector(Vector origin, Vector viewangles, float distance)
return forward;
}
Vector GetForwardVector(float distance)
Vector GetForwardVector(float distance, CachedEntity *punch_entity)
{
return GetForwardVector(g_pLocalPlayer->v_Eye, g_pLocalPlayer->v_OrigViewangles, distance);
return GetForwardVector(g_pLocalPlayer->v_Eye, g_pLocalPlayer->v_OrigViewangles, distance, punch_entity);
}
bool IsSentryBuster(CachedEntity *entity)
@ -1561,17 +1564,17 @@ Vector QAngleToVector(QAngle in)
return *(Vector *) &in;
}
void AimAt(Vector origin, Vector target, CUserCmd *cmd)
void AimAt(Vector origin, Vector target, CUserCmd *cmd, bool compensate_punch)
{
cmd->viewangles = GetAimAtAngles(origin, target);
cmd->viewangles = GetAimAtAngles(origin, target, compensate_punch ? LOCAL_E : nullptr);
}
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd)
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd, bool compensate_punch)
{
Vector r;
r = ent->m_vecOrigin();
GetHitbox(ent, hitbox, r);
AimAt(g_pLocalPlayer->v_Eye, r, cmd);
AimAt(g_pLocalPlayer->v_Eye, r, cmd, compensate_punch);
}
bool IsEntityVisiblePenetration(CachedEntity *entity, int hb)

View File

@ -29,10 +29,6 @@ static settings::Int fullauto{ "misc.full-auto", "0" };
static settings::Int fakelag_amount{ "misc.fakelag", "0" };
static settings::Boolean fuckmode{ "misc.fuckmode", "false" };
#if !ENABLE_VISUALS
static settings::Boolean no_shake{ "visual.no-shake", "true" };
#endif
class CMoveData;
namespace engine_prediction
{
@ -231,13 +227,6 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time, CUs
PROF_SECTION(EntityCache);
entity_cache::Update();
}
#if !ENABLE_VISUALS
if (no_shake && CE_GOOD(LOCAL_E) && LOCAL_E->m_bAlivePlayer())
{
NET_VECTOR(RAW_ENT(LOCAL_E), netvar.vecPunchAngle) = { 0.0f, 0.0f, 0.0f };
NET_VECTOR(RAW_ENT(LOCAL_E), netvar.vecPunchAngleVel) = { 0.0f, 0.0f, 0.0f };
}
#endif
// PROF_END("Entity Cache updating");
{
PROF_SECTION(CM_PlayerResource);

View File

@ -121,19 +121,22 @@ DEFINE_HOOKED_METHOD(FrameStageNotify, void, void *this_, ClientFrameStage_t sta
fire = fire->m_pNext;
}
}*/
std::optional<Vector> backup_punch;
if (isHackActive() && !g_Settings.bInvalid && stage == FRAME_RENDER_START)
{
IF_GAME(IsTF())
{
if (no_shake && CE_GOOD(LOCAL_E) && LOCAL_E->m_bAlivePlayer())
{
NET_VECTOR(RAW_ENT(LOCAL_E), netvar.vecPunchAngle) = { 0.0f, 0.0f, 0.0f };
NET_VECTOR(RAW_ENT(LOCAL_E), netvar.vecPunchAngleVel) = { 0.0f, 0.0f, 0.0f };
backup_punch = NET_VECTOR(RAW_ENT(LOCAL_E), netvar.vecPunchAngle);
NET_VECTOR(RAW_ENT(LOCAL_E), netvar.vecPunchAngle) = { 0.0f, 0.0f, 0.0f };
}
}
hacks::tf::thirdperson::frameStageNotify();
}
return original::FrameStageNotify(this_, stage);
original::FrameStageNotify(this_, stage);
if (backup_punch)
NET_VECTOR(RAW_ENT(LOCAL_E), netvar.vecPunchAngle) = *backup_punch;
}
template <typename T> void rvarCallback(settings::VariableBase<T> &, T)
{