Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Resolver.h"
- #include "md5.h"
- #include "cvars.h"
- CResolver::CResolver(void)
- {
- }
- bool CResolver::m_bUpdateTick(CBaseEntity* pBaseEntity)
- {
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- auto *m_flLowerBodyYawTarget = reinterpret_cast<float*>(reinterpret_cast<DWORD>(pBaseEntity) + Offsets::m_flLowerBodyYawTarget);
- if (pBaseEntity->GetChokedTicks() <= 1)
- FillSimulationInfo(pBaseEntity, false);
- if (fabs(currenttickdata.m_flLowerBodyYawTarget - *m_flLowerBodyYawTarget) > 5.f)
- {
- currenttickdata.m_fLowerBodyYawArray.push_back(*m_flLowerBodyYawTarget);
- currenttickdata.m_flLowerBodyYawTarget = *m_flLowerBodyYawTarget;
- currenttickdata.m_iLowerbodyTick = TIME_TO_TICKS(g_pGlobalVarsBase->curtime);
- }
- currenttickdata.m_BFlags.push_back(pBaseEntity->GetFlags());
- //currenttickdata.m_nSequence.push_back(pBaseEntity->m_nSequence());
- //currenttickdata.m_flCycle.push_back(pBaseEntity->m_flCycle());
- //for (int i = 0; i < 23; i++) { currenttickdata.m_flPoseParameter[i].push_front(pBaseEntity->get_pose_parameter(i)); }
- currenttickdata.m_vecOriginArray.push_back(pBaseEntity->m_vecNetworkOrigin());
- currenttickdata.m_vecAbsOriginArray.push_back(pBaseEntity->m_vecNetworkOrigin());
- currenttickdata.m_angEyeAngles = pBaseEntity->GetEyeAngles();
- currenttickdata.m_flSimulationTime.push_back(pBaseEntity->m_flSimulationTime());
- currenttickdata.m_fAllLowerBodyYawArray.push_back(*m_flLowerBodyYawTarget);
- currenttickdata.tickcount = TIME_TO_TICKS(g_pGlobalVarsBase->curtime);
- currenttickdata.m_flPitch = pBaseEntity->GetEyeAngles().x;
- currenttickdata.m_flYaw = pBaseEntity->GetEyeAngles().y;
- currenttickdata.m_iChokedTicks.push_back(pBaseEntity->GetChokedTicks());
- currenttickdata.m_vecNetworkOrigin = pBaseEntity->m_vecNetworkOrigin();
- return true;
- }
- template<class T, class U>
- T clamp(T in, U low, U high)
- {
- if (in <= low)
- return low;
- if (in >= high)
- return high;
- return in;
- }
- float CResolver::m_fLerpTime()
- {
- float updaterate = g_pICvar->FindVar("cl_updaterate")->GetFloat();
- ConVar* minupdate = g_pICvar->FindVar("sv_minupdaterate");
- ConVar* maxupdate = g_pICvar->FindVar("sv_maxupdaterate");
- if (minupdate && maxupdate)
- updaterate = clamp(updaterate, minupdate->GetFloat(), maxupdate->GetFloat());//maxupdate->GetFloat();
- float ratio = g_pICvar->FindVar("cl_interp_ratio")->GetFloat();
- if (ratio == 0)
- ratio = 1.0f;
- float lerp = g_pICvar->FindVar("cl_interp")->GetFloat();
- ConVar* cmin = g_pICvar->FindVar("sv_client_min_interp_ratio");
- ConVar* cmax = g_pICvar->FindVar("sv_client_max_interp_ratio");
- if (cmin && cmax && cmin->GetFloat() != 1)
- ratio = clamp(ratio, cmin->GetFloat(), cmax->GetFloat());
- return max(lerp, ratio / updaterate);
- }
- bool CResolver::m_bEmptyAtRecord(CBaseEntity* pBaseEntity, int m_iRecordDest)
- {
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- currenttickdata.m_vecOriginArray.erase(currenttickdata.m_vecOriginArray.begin() + m_iRecordDest);
- currenttickdata.m_vecAbsOriginArray.erase(currenttickdata.m_vecAbsOriginArray.begin() + m_iRecordDest);
- currenttickdata.m_flSimulationTime.erase(currenttickdata.m_flSimulationTime.begin() + m_iRecordDest);
- currenttickdata.m_fLowerBodyYawArray.erase(currenttickdata.m_fLowerBodyYawArray.begin() + m_iRecordDest);
- currenttickdata.m_iChokedTicks.erase(currenttickdata.m_iChokedTicks.begin() + m_iRecordDest);
- currenttickdata.m_fAllLowerBodyYawArray.erase(currenttickdata.m_fAllLowerBodyYawArray.begin() + m_iRecordDest);
- currenttickdata.m_nSequence.erase(currenttickdata.m_nSequence.begin() + m_iRecordDest);
- currenttickdata.m_flCycle.erase(currenttickdata.m_flCycle.begin() + m_iRecordDest);
- currenttickdata.m_BFlags.erase(currenttickdata.m_BFlags.begin() + m_iRecordDest);
- //for (int i = 0; i < 23; i++) { currenttickdata.m_flPoseParameter[i].pop_back(); }
- }
- bool CResolver::m_bEmptyAllRecord(CBaseEntity* pBaseEntity)
- {
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- currenttickdata.m_vecOriginArray.clear();
- currenttickdata.m_vecAbsOriginArray.clear();
- currenttickdata.m_flSimulationTime.clear();
- currenttickdata.m_fLowerBodyYawArray.clear();
- currenttickdata.m_iChokedTicks.clear();
- currenttickdata.m_fAllLowerBodyYawArray.clear();
- }
- //bool CResolver::m_bIsEntitySimulated(CBaseEntity* pBaseEntity)
- //{
- // return m_bBacktracked[pBaseEntity->GetIndex()];
- //}
- bool CResolver::m_bIsEntityBacktracked(CBaseEntity* pBaseEntity)
- {
- return m_bBacktracked[pBaseEntity->GetIndex()];
- }
- bool CResolver::m_iBacktrackedTick(CBaseEntity* pBaseEntity)
- {
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- if (m_bIsEntityBacktracked(pBaseEntity) && !currenttickdata.m_bBreakingLagComp && !m_bSimulated[pBaseEntity->GetIndex()])
- return m_bBacktrackedTick[pBaseEntity->GetIndex()];
- else
- return g_pGlobalVarsBase->curtime;
- }
- bool CResolver::FillSimulationInfo(CBaseEntity* pBaseEntity, bool m_bStoreLowerBodyYaw)
- {
- auto &simdata = CurrentTickPlayerTrack[pBaseEntity->GetIndex()];
- auto &oldsimdata = LastTickPlayerTrack[pBaseEntity->GetIndex()];
- oldsimdata.velocity = simdata.velocity;
- oldsimdata.basevelocity = simdata.basevelocity;
- oldsimdata.flags = simdata.flags;
- oldsimdata.m_pEntity = simdata.m_pEntity;
- oldsimdata.origin = simdata.origin;
- oldsimdata.networkorigin = simdata.networkorigin;
- oldsimdata.m_bLog = simdata.m_bLog;
- simdata.velocity = pBaseEntity->GetVelocity();
- simdata.basevelocity = pBaseEntity->GetBaseVelocity();
- simdata.flags = pBaseEntity->GetFlags();
- simdata.m_pEntity = pBaseEntity;
- simdata.origin = pBaseEntity->m_vecNetworkOrigin();
- simdata.networkorigin = pBaseEntity->m_vecNetworkOrigin();
- simdata.m_bLog = true;
- }
- void CResolver::SimulateMovement(SimulationData& data, bool in_air)
- {
- auto mins = data.m_pEntity->GetCollideable()->OBBMins();
- auto maxs = data.m_pEntity->GetCollideable()->OBBMaxs();
- auto src = data.networkorigin;
- auto end = src + (data.velocity * g_pGlobalVarsBase->interval_per_tick);
- SDK::IEngineTrace::Ray_t ray;
- ray.Init(src, end, mins, maxs);
- SDK::IEngineTrace::trace_t trace;
- SDK::IEngineTrace::CTraceFilter filter;
- filter.pSkip = (IHandleEntity*)data.m_pEntity;
- g_pEngineTrace->TraceRay(ray, CONTENTS_SOLID, &filter, &trace);
- if (trace.fraction != 1.f)
- {
- for (int i = 0; i < 2; ++i)
- {
- data.velocity -= trace.plane.normal * data.velocity.Dot(trace.plane.normal);
- auto dot = data.velocity.Dot(trace.plane.normal);
- if (dot < 0.f)
- {
- data.velocity.x -= dot * trace.plane.normal.x;
- data.velocity.y -= dot * trace.plane.normal.y;
- data.velocity.z -= dot * trace.plane.normal.z;
- }
- end = trace.endpos + (data.velocity * (g_pGlobalVarsBase->interval_per_tick * (1.f - trace.fraction)));
- ray.Init(trace.endpos, end, mins, maxs);
- g_pEngineTrace->TraceRay(ray, CONTENTS_SOLID, &filter, &trace);
- if (trace.fraction == 1.f)
- break;
- }
- }
- data.networkorigin = trace.endpos;
- end = trace.endpos;
- end.z -= 2.f;
- ray.Init(data.networkorigin, end, mins, maxs);
- g_pEngineTrace->TraceRay(ray, CONTENTS_SOLID, &filter, &trace);
- data.flags &= ~FL_ONGROUND;
- if (trace.fraction != 1.f && trace.plane.normal.z > 0.7f)
- data.flags |= FL_ONGROUND;
- }
- void CResolver::ExtrapolateEntityData(CBaseEntity* pBaseEntity)
- {
- auto &data = CurrentTickPlayerTrack[pBaseEntity->GetIndex()];
- auto &olddata = LastTickPlayerTrack[pBaseEntity->GetIndex()];
- if (!olddata.m_pEntity->IsValid())
- return;
- if (!olddata.m_bLog)
- return;
- Vector originalOrigin = pBaseEntity->m_vecNetworkOrigin();
- INetChannelInfo *nci = g_pIVEngineClient->GetNetChannelInfo();
- float flTickInterval = 1.f / g_pGlobalVarsBase->interval_per_tick;
- int iTickCount = TIME_TO_TICKS(g_pGlobalVarsBase->curtime);
- float flDeltaTime = ((floorf(((nci->GetAvgLatency(FLOW_INCOMING) + nci->GetAvgLatency(FLOW_OUTGOING)) * flTickInterval) + 0.5)
- + iTickCount
- + 1)
- * g_pGlobalVarsBase->interval_per_tick)
- - pBaseEntity->m_flSimulationTime();
- if (flDeltaTime > 1.f)
- flDeltaTime = 1.f;
- float velocityDegree = RAD2DEG(atan2(data.velocity.x, data.velocity.y));
- int deltaTicks = floorf((flTickInterval * flDeltaTime) + 0.5);
- float velocityAngle = velocityDegree - RAD2DEG(atan2(olddata.velocity.x, olddata.velocity.y));
- if (velocityAngle <= 180.0)
- {
- if (velocityAngle < -180.0)
- velocityAngle = velocityAngle + 360.0;
- }
- else
- {
- velocityAngle = velocityAngle - 360.0;
- }
- //flNewVelocityAngle = Utils::NormalizeYaw(flNewVelocityAngle);
- float m_flSimTimeDelta = pBaseEntity->m_flSimulationTime() - pBaseEntity->m_flOldSimulationTime();
- // How many ticks the entity is choking
- int iSimulationTicks = clamp(floorf((m_flSimTimeDelta * flTickInterval) + 0.5f), 1, 15);
- // How many ticks since entity was last simulated
- int iDeltaTicks = TIME_TO_TICKS(flDeltaTime);
- // How many ticks have passed since sim time - how many ticks they will choke
- int iSimulationDif = iDeltaTicks - iSimulationTicks;
- // Total angle difference divided by time = angle per unit of time (in this case seconds)
- float flAnglePerSec = velocityAngle / m_flSimTimeDelta;
- //flAnglePerSec = Utils::NormalizeYaw(flAnglePerSec);
- // Just velocity length
- float flVelocityLength2D = data.velocity.Length2D();
- if (iSimulationDif < 0)
- {
- data.networkorigin = originalOrigin;
- }
- else
- {
- do
- {
- if (iSimulationTicks > 0)
- {
- int counter = iSimulationTicks;
- do
- {
- // Add on the estimated angle difference
- float flExtrapolated = velocityDegree + (g_pGlobalVarsBase->interval_per_tick * flAnglePerSec);
- // Calculate the new velocity
- data.velocity.x = cosf(DEG2RAD(flExtrapolated)) * flVelocityLength2D;
- data.velocity.y = sinf(DEG2RAD(flExtrapolated)) * flVelocityLength2D;
- // Check if entity is in air
- bool InAir = !(pBaseEntity->GetFlags() & FL_ONGROUND);
- if (!(data.flags & FL_ONGROUND))
- data.velocity.z -= (g_pGlobalVarsBase->interval_per_tick * g_pICvar->FindVar("sv_gravity")->GetFloat());
- else if (InAir)
- data.velocity.z = sqrt(91200.f);
- // Simulate the movement calculated
- SimulateMovement(data, InAir);
- // Store the new velocity angle
- velocityDegree = flExtrapolated;
- // One tick has been simulated, subtract this from the count
- --counter;
- } while (counter);
- }
- iSimulationDif -= iSimulationTicks;
- } while (iSimulationDif >= 0);
- }
- if (std::isfinite(data.networkorigin.x) && std::isfinite(data.networkorigin.y) && std::isfinite(data.networkorigin.z))
- {
- data.m_vLastFix = data.networkorigin;
- pBaseEntity->SetAbsOrigin(data.networkorigin);
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- m_bBacktracked[pBaseEntity->GetIndex()] = false;
- m_bSimulated[pBaseEntity->GetIndex()] = true;
- }
- else
- {
- m_bBacktracked[pBaseEntity->GetIndex()] = false;
- m_bSimulated[pBaseEntity->GetIndex()] = false;
- }
- }
- bool CResolver::m_bMoveEntityToValidRecord(CBaseEntity* pBaseEntity)
- {
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- if (m_bFindValidRecord(pBaseEntity))
- {
- if (m_iBestTick[pBaseEntity->GetIndex()] = -1)
- return false;
- auto *m_angEyeAnglesY = reinterpret_cast<float*>(reinterpret_cast<DWORD>(pBaseEntity) + Offsets::m_angEyeAnglesY);
- if (Cvars.Aimbot_AntiAimCorrection)
- *m_angEyeAnglesY = currenttickdata.m_fAllLowerBodyYawArray.at(m_iBestTick[pBaseEntity->GetIndex()]);
- if (std::isfinite(currenttickdata.m_vecAbsOriginArray.at(m_iBestTick[pBaseEntity->GetIndex()]).x) && std::isfinite(currenttickdata.m_vecAbsOriginArray.at(m_iBestTick[pBaseEntity->GetIndex()]).y) && std::isfinite(currenttickdata.m_vecAbsOriginArray.at(m_iBestTick[pBaseEntity->GetIndex()]).z))
- pBaseEntity->SetAbsOrigin(currenttickdata.m_vecAbsOriginArray.at(m_iBestTick[pBaseEntity->GetIndex()]));
- else
- {
- m_bBacktracked[pBaseEntity->GetIndex()] = false;
- m_bSimulated[pBaseEntity->GetIndex()] = false;
- return false;
- }
- m_bBacktrackedTick[pBaseEntity->GetIndex()] = currenttickdata.m_flSimulationTime.at(m_iBestTick[pBaseEntity->GetIndex()]);
- m_bBacktracked[pBaseEntity->GetIndex()] = true;
- m_bSimulated[pBaseEntity->GetIndex()] = false;
- return true;
- }
- //else
- //{
- //if (Cvars.Aimbot_AccuracyBoostLevelType > 1)
- // ExtrapolateEntityData(pBaseEntity);
- // m_bBacktracked[pBaseEntity->GetIndex()] = false;
- //}
- return m_bBacktracked[pBaseEntity->GetIndex()];
- }
- bool CResolver::m_bFindValidRecord(CBaseEntity* pBaseEntity)
- {
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- if (currenttickdata.m_vecOriginArray.size() < 2)
- return false;
- auto nci = g_pIVEngineClient->GetNetChannelInfo();
- if (!nci)
- return false;
- int iLerpTicks = TIME_TO_TICKS(m_fLerpTime());
- float flCorrect = nci->GetAvgLatency(FLOW_OUTGOING) + TICKS_TO_TIME(iLerpTicks);
- float flServerTime = TIME_TO_TICKS(g_pGlobalVarsBase->curtime) * g_pGlobalVarsBase->interval_per_tick;
- static auto sv_maxunlag = g_pICvar->FindVar("sv_maxunlag");
- flCorrect = clamp(flCorrect, 0.f, sv_maxunlag->GetFloat());
- bool bFoundRecord = false;
- for (auto i = 0; i < currenttickdata.m_vecOriginArray.size(); i++)
- {
- // If the server lost track, we can't backtrack past here.
- if (((currenttickdata.m_vecOriginArray.at(i)) - pBaseEntity->m_vecNetworkOrigin()).Length() > 64.f)
- {
- m_bEmptyAtRecord(pBaseEntity, i);
- i--;
- break;
- }
- // Calculate delta time like server.
- float flDeltaTime = flCorrect - (flServerTime - currenttickdata.m_flSimulationTime.at(i));
- // If the delta time is too large, we can't backtrack past here.
- if (fabs(flDeltaTime) > 0.2f)
- {
- m_bEmptyAtRecord(pBaseEntity, i);
- i--;
- break;
- }
- if (currenttickdata.m_iChokedTicks.at(i) <= 1)
- {
- m_iBestTick[pBaseEntity->GetIndex()] = i;
- bFoundRecord = true;
- break;
- }
- }
- if (!bFoundRecord)
- m_iBestTick[pBaseEntity->GetIndex()] = -1;
- return bFoundRecord;
- }
- bool CResolver::m_bResolveEntity(CBaseEntity* pBaseEntity)
- {
- auto ¤ttickdata = m_ResolverTrack[pBaseEntity->GetIndex()];
- int m_iLastPushDifference = abs(currenttickdata.m_iLowerbodyTick - TIME_TO_TICKS(g_pGlobalVarsBase->curtime));
- auto *m_angEyeAnglesX = reinterpret_cast<float*>(reinterpret_cast<DWORD>(pBaseEntity) + Offsets::m_angEyeAnglesX);
- auto *m_angEyeAnglesY = reinterpret_cast<float*>(reinterpret_cast<DWORD>(pBaseEntity) + Offsets::m_angEyeAnglesY);
- auto *m_flLowerBodyYawTarget = reinterpret_cast<float*>(reinterpret_cast<DWORD>(pBaseEntity) + Offsets::m_flLowerBodyYawTarget);
- int maxupdate = TIME_TO_TICKS(1.1);
- int doubledupdate = TIME_TO_TICKS(2.2);
- float yaw[] = { 90.f, -90.f, -180.f, 45.f, -45.f };
- //checks
- bool m_bMoving = pBaseEntity->GetVelocity().Length() > 0.0f;
- bool m_bDucking = pBaseEntity->GetFlags() & FL_DUCKING;
- bool m_bOnGround = pBaseEntity->GetFlags() & FL_ONGROUND;
- bool m_bUpdateIsOld = m_iLastPushDifference > maxupdate;
- bool m_bUpdateIsTooOld = m_iLastPushDifference > doubledupdate;
- //inc junk logic
- //entity appears to be walking across the ground which should give us a constant update on their angles
- if (m_bOnGround && m_bMoving && !m_bUpdateIsOld)
- *m_angEyeAnglesY = *m_flLowerBodyYawTarget;
- //entity isnt moving but lby hasnt updated in awhile which tells us their angles probably havent changed much if at all
- if (m_bOnGround && !m_bMoving && m_bUpdateIsOld)
- *m_angEyeAnglesY = *m_flLowerBodyYawTarget;
- //shouldnt ever happen but whatever
- if (!m_bOnGround && !m_bMoving && !m_bUpdateIsOld)
- *m_angEyeAnglesY = *m_flLowerBodyYawTarget + Cvars.m_bShotFiredSwitch ? 15.f : 15.f;
- //entity is moving and is in the air, expand your search
- if (!m_bOnGround && !m_bMoving && m_bUpdateIsOld && !m_bUpdateIsTooOld)
- *m_angEyeAnglesY = *m_flLowerBodyYawTarget + Cvars.m_bShotFiredSwitch ? 45.f : 45.f;
- //entity is moving and our update is way too old expand to reasonable angles
- if (!m_bOnGround && !m_bMoving && m_bUpdateIsOld && m_bUpdateIsTooOld)
- *m_angEyeAnglesY = yaw[Cvars.m_iShotsFired];
- return true;
- }
- CResolver* ResolvePlayer = nullptr;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement