Merge pull request #1048 from nullworks/misc_improvements
Fix hitbox interpolation and fix punch angles in aiming functions
This commit is contained in:
commit
f3479a9883
@ -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);
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include <settings/Int.hpp>
|
||||
#include "common.hpp"
|
||||
#include "MiscTemporary.hpp"
|
||||
|
||||
namespace hitbox_cache
|
||||
{
|
||||
@ -127,10 +128,12 @@ matrix3x4_t *EntityHitboxCache::GetBones(int numbones)
|
||||
if (!bones_setup)
|
||||
{
|
||||
// Reset game cache
|
||||
if (!bonecache_enabled)
|
||||
if (!bonecache_enabled && CE_GOOD(parent_ref))
|
||||
{
|
||||
re::C_BaseAnimating::InvalidateBoneCache(RAW_ENT(parent_ref));
|
||||
re::C_BaseAnimating::Interpolate(RAW_ENT(parent_ref), bones_setup_time);
|
||||
// Only use when nolerp is on as this breaks game visuals a tad
|
||||
if (nolerp)
|
||||
re::C_BaseAnimating::Interpolate(RAW_ENT(parent_ref), bones_setup_time);
|
||||
}
|
||||
|
||||
// If numbones is not set, get it from some terrible and unnamed variable
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 *) ∈
|
||||
}
|
||||
|
||||
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)
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user