From 085068c25a107e45707c3d16cb59b922a5640b8d Mon Sep 17 00:00:00 2001 From: rei-2 <174158077+rei-2@users.noreply.github.com> Date: Tue, 7 Oct 2025 14:56:48 -0400 Subject: [PATCH] utilize cpredictioncopy for restoring vars rather than hardcoded vars --- Amalgam/Amalgam.vcxproj | 2 + Amalgam/Amalgam.vcxproj.filters | 2 + Amalgam/src/Core/Core.cpp | 5 +- .../Aimbot/AimbotHitscan/AimbotHitscan.cpp | 2 +- .../Aimbot/AimbotMelee/AimbotMelee.cpp | 20 +- .../AimbotProjectile/AimbotProjectile.cpp | 4 +- .../Aimbot/AutoRocketJump/AutoRocketJump.cpp | 4 +- .../EnginePrediction/EnginePrediction.cpp | 37 +++- .../EnginePrediction/EnginePrediction.h | 11 +- .../MovementSimulation/MovementSimulation.cpp | 195 +++++------------- .../MovementSimulation/MovementSimulation.h | 75 ++----- Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp | 2 + Amalgam/src/SDK/Definitions/Classes.h | 1 + Amalgam/src/SDK/Definitions/Interfaces.h | 1 + .../SDK/Definitions/Interfaces/IMemAlloc.h | 66 ++++++ .../src/SDK/Definitions/Main/CBaseEntity.cpp | 5 + .../src/SDK/Definitions/Main/CBaseEntity.h | 1 + .../SDK/Definitions/Main/CPredictionCopy.h | 81 ++++++++ Amalgam/src/Utils/Interfaces/Interfaces.cpp | 48 +++-- Amalgam/src/Utils/Interfaces/Interfaces.h | 27 ++- Amalgam/src/Utils/Signatures/Signatures.cpp | 2 +- Amalgam/src/Utils/Signatures/Signatures.h | 5 +- README.md | 8 +- 23 files changed, 343 insertions(+), 261 deletions(-) create mode 100644 Amalgam/src/SDK/Definitions/Interfaces/IMemAlloc.h create mode 100644 Amalgam/src/SDK/Definitions/Main/CPredictionCopy.h diff --git a/Amalgam/Amalgam.vcxproj b/Amalgam/Amalgam.vcxproj index 3586c1f2..15277e22 100644 --- a/Amalgam/Amalgam.vcxproj +++ b/Amalgam/Amalgam.vcxproj @@ -1259,6 +1259,7 @@ + @@ -1277,6 +1278,7 @@ + diff --git a/Amalgam/Amalgam.vcxproj.filters b/Amalgam/Amalgam.vcxproj.filters index e3508866..2143eb17 100644 --- a/Amalgam/Amalgam.vcxproj.filters +++ b/Amalgam/Amalgam.vcxproj.filters @@ -582,6 +582,8 @@ + + diff --git a/Amalgam/src/Core/Core.cpp b/Amalgam/src/Core/Core.cpp index e6903288..52dd7b06 100644 --- a/Amalgam/src/Core/Core.cpp +++ b/Amalgam/src/Core/Core.cpp @@ -2,10 +2,10 @@ #include "../SDK/SDK.h" #include "../BytePatches/BytePatches.h" -#include "../Features/Visuals/Materials/Materials.h" #include "../Features/Configs/Configs.h" -#include "../Features/Commands/Commands.h" #include "../Features/ImGui/Menu/Menu.h" +#include "../Features/EnginePrediction/EnginePrediction.h" +#include "../Features/Visuals/Materials/Materials.h" #include "../Features/Visuals/Visuals.h" #include "../SDK/Events/Events.h" #include @@ -141,6 +141,7 @@ void CCore::Unload() U::ConVars.FindVar("cl_wpn_sway_scale")->SetValue(0.f); Sleep(250); + F::EnginePrediction.Unload(); U::ConVars.Unload(); F::Materials.UnloadMaterials(); diff --git a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp index 90d67bcd..0112ab73 100644 --- a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp @@ -327,7 +327,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* tTarget.m_vPos = tTarget.m_pEntity->m_vecOrigin(); // not lag compensated (i assume) so run movesim based on ping - PlayerStorage tStorage; + MoveStorage tStorage; F::MoveSim.Initialize(tTarget.m_pEntity, tStorage); if (!tStorage.m_bFailed) { diff --git a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp index 433863d9..a3ace5ba 100644 --- a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp @@ -148,24 +148,24 @@ void CAimbotMelee::UpdateInfo(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCm int iSimTicks = GetSwingTime(pWeapon), iSwingTicks = GetSwingTime(pWeapon, false); - if ((Vars::Aimbot::Melee::SwingPrediction.Value || m_iDoubletapTicks) && G::CanPrimaryAttack && pWeapon->m_flSmackTime() < 0.f) + if ((Vars::Aimbot::Melee::SwingPrediction.Value && iSimTicks || m_iDoubletapTicks) && G::CanPrimaryAttack && pWeapon->m_flSmackTime() < 0.f) { - std::unordered_map mStorage; + std::unordered_map mStorage; F::MoveSim.Initialize(pLocal, mStorage[I::EngineClient->GetLocalPlayer()], false, !m_iDoubletapTicks); for (auto& tTarget : vTargets) F::MoveSim.Initialize(tTarget.m_pEntity, mStorage[tTarget.m_pEntity->entindex()], false); int iMax = std::max(iSimTicks, m_iDoubletapTicks); - int iLocal = iMax; bool bSwung = false; - for (int i = 0; i < iLocal; i++) // intended for plocal to collide with targets + int iTicks = iMax; bool bSwung = false; + for (int i = 0; i < iTicks; i++) // intended for plocal to collide with targets { { auto& tStorage = mStorage[I::EngineClient->GetLocalPlayer()]; if (!bSwung && (!m_iDoubletapTicks || Vars::Doubletap::AntiWarp.Value && pLocal->m_hGroundEntity() || iMax - i <= iSwingTicks)) { - iLocal = std::min(i + iSwingTicks, iMax), bSwung = true; + iTicks = std::min(i + iSwingTicks, iMax), bSwung = true; if (!iSwingTicks) break; @@ -233,7 +233,7 @@ void CAimbotMelee::UpdateInfo(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCm F::MoveSim.Restore(tStorage); } - m_bShouldSwing = m_iDoubletapTicks <= (iSwingTicks) || Vars::Doubletap::AntiWarp.Value && pLocal->m_hGroundEntity(); + m_bShouldSwing = m_iDoubletapTicks <= iSwingTicks || Vars::Doubletap::AntiWarp.Value && pLocal->m_hGroundEntity(); } bool CAimbotMelee::CanBackstab(CBaseEntity* pTarget, CTFPlayer* pLocal, Vec3 vEyeAngles) @@ -395,7 +395,7 @@ int CAimbotMelee::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pW if (bReturn && Vars::Aimbot::Melee::AutoBackstab.Value && pWeapon->GetWeaponID() == TF_WEAPON_KNIFE) bReturn = CanBackstab(tTarget.m_pEntity, pLocal, tTarget.m_vAngleTo); - + tTarget.m_pEntity->SetAbsOrigin(vRestoreOrigin); tTarget.m_pEntity->m_vecMins() = vRestoreMins; tTarget.m_pEntity->m_vecMaxs() = vRestoreMaxs; @@ -414,10 +414,10 @@ int CAimbotMelee::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pW { auto vAngle = Math::CalcAngle(m_vEyePos, tTarget.m_vPos); - Vec3 vForward = Vec3(); Math::AngleVectors(vAngle, &vForward); - Vec3 vTraceEnd = m_vEyePos + (vForward * flRange); + Math::AngleVectors(vAngle, &vForward); + vTraceEnd = m_vEyePos + (vForward * flRange); - SDK::Trace(m_vEyePos, vTraceEnd, MASK_SHOT | CONTENTS_GRATE, &filter, &trace); + SDK::TraceHull(m_vEyePos, vTraceEnd, vSwingMins, vSwingMaxs, MASK_SOLID, &filter, &trace); if (trace.m_pEnt && trace.m_pEnt == tTarget.m_pEntity) return 2; } diff --git a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp index 8fbcb1ca..e32c8dab 100644 --- a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp @@ -1365,7 +1365,7 @@ int CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBas || !F::ProjSim.Initialize(tProjInfo, false)) return false; - PlayerStorage tStorage; + MoveStorage tStorage; F::MoveSim.Initialize(tTarget.m_pEntity, tStorage); tTarget.m_vPos = tTarget.m_pEntity->m_vecOrigin(); @@ -2050,7 +2050,7 @@ bool CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBa if (!F::ProjSim.Initialize(tProjInfo, false, true)) return false; - PlayerStorage tStorage; + MoveStorage tStorage; F::MoveSim.Initialize(tTarget.m_pEntity, tStorage); tTarget.m_vPos = tTarget.m_pEntity->m_vecOrigin(); diff --git a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp index 61508e73..9debc7c9 100644 --- a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp +++ b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp @@ -39,7 +39,7 @@ bool CAutoRocketJump::SetAngles(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUser //float flOffset = pLocal->m_vecMaxs().x; float flOffset = sqrtf(2 * powf(vOffset.y, 2.f) + powf(vOffset.z, 2.f)); bool bShouldReturn = true; - PlayerStorage tStorage; + MoveStorage tStorage; if (F::MoveSim.Initialize(pLocal, tStorage, false)) { for (int n = 1; n < 10; n++) @@ -143,7 +143,7 @@ void CAutoRocketJump::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* p bool bWillHit = false; if (Vars::Misc::Movement::AutoRocketJump.Value || Vars::Misc::Movement::AutoCTap.Value) { - PlayerStorage tStorage; + MoveStorage tStorage; ProjectileInfo tProjInfo = {}; bool bProjSimSetup = F::ProjSim.GetInfo(pLocal, pWeapon, m_vAngles, tProjInfo, ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::NoRandomAngles) && F::ProjSim.Initialize(tProjInfo); diff --git a/Amalgam/src/Features/EnginePrediction/EnginePrediction.cpp b/Amalgam/src/Features/EnginePrediction/EnginePrediction.cpp index c99be556..c0806d58 100644 --- a/Amalgam/src/Features/EnginePrediction/EnginePrediction.cpp +++ b/Amalgam/src/Features/EnginePrediction/EnginePrediction.cpp @@ -72,6 +72,10 @@ void CEnginePrediction::Start(CTFPlayer* pLocal, CUserCmd* pCmd) if (!pLocal->IsAlive()) return; + auto pMap = pLocal->GetPredDescMap(); + if (!pMap) + return; + m_nOldTickCount = I::GlobalVars->tickcount; m_flOldCurrentTime = I::GlobalVars->curtime; m_flOldFrameTime = I::GlobalVars->frametime; @@ -80,8 +84,20 @@ void CEnginePrediction::Start(CTFPlayer* pLocal, CUserCmd* pCmd) I::GlobalVars->curtime = TICKS_TO_TIME(I::GlobalVars->tickcount); I::GlobalVars->frametime = I::Prediction->m_bEnginePaused ? 0.f : TICK_INTERVAL; - m_vOldOrigin = pLocal->m_vecOrigin(); - m_vOldVelocity = pLocal->m_vecVelocity(); + size_t iSize = pLocal->GetIntermediateDataSize(); + if (!m_tLocal.m_pData) + { + m_tLocal.m_pData = reinterpret_cast(I::MemAlloc->Alloc(iSize)); + m_tLocal.m_iSize = iSize; + } + else if (m_tLocal.m_iSize != iSize) + { + m_tLocal.m_pData = reinterpret_cast(I::MemAlloc->Realloc(m_tLocal.m_pData, iSize)); + m_tLocal.m_iSize = iSize; + } + + CPredictionCopy copy = { PC_EVERYTHING, m_tLocal.m_pData, PC_DATA_PACKED, pLocal, PC_DATA_NORMAL }; + copy.TransferData("EnginePredictionStart", pLocal->entindex(), pMap); Simulate(pLocal, pCmd); } @@ -92,10 +108,23 @@ void CEnginePrediction::End(CTFPlayer* pLocal, CUserCmd* pCmd) if (!pLocal->IsAlive()) return; + auto pMap = pLocal->GetPredDescMap(); + if (!pMap) + return; + I::GlobalVars->tickcount = m_nOldTickCount; I::GlobalVars->curtime = m_flOldCurrentTime; I::GlobalVars->frametime = m_flOldFrameTime; - pLocal->SetAbsOrigin(pLocal->m_vecOrigin() = m_vOldOrigin); - pLocal->SetAbsVelocity(pLocal->m_vecVelocity() = m_vOldVelocity); + CPredictionCopy copy = { PC_EVERYTHING, pLocal, PC_DATA_NORMAL, m_tLocal.m_pData, PC_DATA_PACKED }; + copy.TransferData("EnginePredictionEnd", pLocal->entindex(), pMap); +} + +void CEnginePrediction::Unload() +{ + if (m_tLocal.m_pData) + { + I::MemAlloc->Free(m_tLocal.m_pData); + m_tLocal = {}; + } } \ No newline at end of file diff --git a/Amalgam/src/Features/EnginePrediction/EnginePrediction.h b/Amalgam/src/Features/EnginePrediction/EnginePrediction.h index 4a386764..0e47e2b3 100644 --- a/Amalgam/src/Features/EnginePrediction/EnginePrediction.h +++ b/Amalgam/src/Features/EnginePrediction/EnginePrediction.h @@ -1,6 +1,12 @@ #pragma once #include "../../SDK/SDK.h" +struct DatamapRestore_t +{ + byte* m_pData = nullptr; + size_t m_iSize = 0; +}; + struct RestoreInfo_t { Vec3 m_vOrigin = {}; @@ -19,8 +25,7 @@ private: float m_flOldCurrentTime = 0.f; float m_flOldFrameTime = 0.f; - Vec3 m_vOldOrigin = {}; - Vec3 m_vOldVelocity = {}; + DatamapRestore_t m_tLocal = {}; std::unordered_map m_mRestore = {}; @@ -28,6 +33,8 @@ public: void Start(CTFPlayer* pLocal, CUserCmd* pCmd); void End(CTFPlayer* pLocal, CUserCmd* pCmd); + void Unload(); + void AdjustPlayers(CBaseEntity* pLocal); void RestorePlayers(); diff --git a/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.cpp b/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.cpp index 645d676e..a5201189 100644 --- a/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.cpp +++ b/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.cpp @@ -5,106 +5,33 @@ static CUserCmd s_tDummyCmd = {}; -void CMovementSimulation::Store(PlayerStorage& tStorage) +void CMovementSimulation::Store(MoveStorage& tStorage) { - tStorage.m_PlayerData.m_vecOrigin = tStorage.m_pPlayer->m_vecOrigin(); - tStorage.m_PlayerData.m_vecVelocity = tStorage.m_pPlayer->m_vecVelocity(); - tStorage.m_PlayerData.m_vecBaseVelocity = tStorage.m_pPlayer->m_vecBaseVelocity(); - tStorage.m_PlayerData.m_vecViewOffset = tStorage.m_pPlayer->m_vecViewOffset(); - tStorage.m_PlayerData.m_hGroundEntity = tStorage.m_pPlayer->m_hGroundEntity(); - tStorage.m_PlayerData.m_fFlags = tStorage.m_pPlayer->m_fFlags(); - tStorage.m_PlayerData.m_flDucktime = tStorage.m_pPlayer->m_flDucktime(); - tStorage.m_PlayerData.m_flDuckJumpTime = tStorage.m_pPlayer->m_flDuckJumpTime(); - tStorage.m_PlayerData.m_bDucked = tStorage.m_pPlayer->m_bDucked(); - tStorage.m_PlayerData.m_bDucking = tStorage.m_pPlayer->m_bDucking(); - tStorage.m_PlayerData.m_bInDuckJump = tStorage.m_pPlayer->m_bInDuckJump(); - tStorage.m_PlayerData.m_flModelScale = tStorage.m_pPlayer->m_flModelScale(); - tStorage.m_PlayerData.m_nButtons = tStorage.m_pPlayer->m_nButtons(); - tStorage.m_PlayerData.m_flLastMovementStunChange = tStorage.m_pPlayer->m_flLastMovementStunChange(); - tStorage.m_PlayerData.m_flStunLerpTarget = tStorage.m_pPlayer->m_flStunLerpTarget(); - tStorage.m_PlayerData.m_bStunNeedsFadeOut = tStorage.m_pPlayer->m_bStunNeedsFadeOut(); - tStorage.m_PlayerData.m_flPrevTauntYaw = tStorage.m_pPlayer->m_flPrevTauntYaw(); - tStorage.m_PlayerData.m_flTauntYaw = tStorage.m_pPlayer->m_flTauntYaw(); - tStorage.m_PlayerData.m_flCurrentTauntMoveSpeed = tStorage.m_pPlayer->m_flCurrentTauntMoveSpeed(); - tStorage.m_PlayerData.m_iKartState = tStorage.m_pPlayer->m_iKartState(); - tStorage.m_PlayerData.m_flVehicleReverseTime = tStorage.m_pPlayer->m_flVehicleReverseTime(); - tStorage.m_PlayerData.m_flHypeMeter = tStorage.m_pPlayer->m_flHypeMeter(); - tStorage.m_PlayerData.m_flMaxspeed = tStorage.m_pPlayer->m_flMaxspeed(); - tStorage.m_PlayerData.m_nAirDucked = tStorage.m_pPlayer->m_nAirDucked(); - tStorage.m_PlayerData.m_bJumping = tStorage.m_pPlayer->m_bJumping(); - tStorage.m_PlayerData.m_iAirDash = tStorage.m_pPlayer->m_iAirDash(); - tStorage.m_PlayerData.m_flWaterJumpTime = tStorage.m_pPlayer->m_flWaterJumpTime(); - tStorage.m_PlayerData.m_flSwimSoundTime = tStorage.m_pPlayer->m_flSwimSoundTime(); - tStorage.m_PlayerData.m_surfaceProps = tStorage.m_pPlayer->m_surfaceProps(); - tStorage.m_PlayerData.m_pSurfaceData = tStorage.m_pPlayer->m_pSurfaceData(); - tStorage.m_PlayerData.m_surfaceFriction = tStorage.m_pPlayer->m_surfaceFriction(); - tStorage.m_PlayerData.m_chTextureType = tStorage.m_pPlayer->m_chTextureType(); - tStorage.m_PlayerData.m_vecPunchAngle = tStorage.m_pPlayer->m_vecPunchAngle(); - tStorage.m_PlayerData.m_vecPunchAngleVel = tStorage.m_pPlayer->m_vecPunchAngleVel(); - tStorage.m_PlayerData.m_MoveType = tStorage.m_pPlayer->m_MoveType(); - tStorage.m_PlayerData.m_MoveCollide = tStorage.m_pPlayer->m_MoveCollide(); - tStorage.m_PlayerData.m_vecLadderNormal = tStorage.m_pPlayer->m_vecLadderNormal(); - tStorage.m_PlayerData.m_flGravity = tStorage.m_pPlayer->m_flGravity(); - tStorage.m_PlayerData.m_nWaterLevel = tStorage.m_pPlayer->m_nWaterLevel(); - tStorage.m_PlayerData.m_nWaterType = tStorage.m_pPlayer->m_nWaterType(); - tStorage.m_PlayerData.m_flFallVelocity = tStorage.m_pPlayer->m_flFallVelocity(); - tStorage.m_PlayerData.m_nPlayerCond = tStorage.m_pPlayer->m_nPlayerCond(); - tStorage.m_PlayerData.m_nPlayerCondEx = tStorage.m_pPlayer->m_nPlayerCondEx(); - tStorage.m_PlayerData.m_nPlayerCondEx2 = tStorage.m_pPlayer->m_nPlayerCondEx2(); - tStorage.m_PlayerData.m_nPlayerCondEx3 = tStorage.m_pPlayer->m_nPlayerCondEx3(); - tStorage.m_PlayerData.m_nPlayerCondEx4 = tStorage.m_pPlayer->m_nPlayerCondEx4(); - tStorage.m_PlayerData._condition_bits = tStorage.m_pPlayer->_condition_bits(); + auto pMap = tStorage.m_pPlayer->GetPredDescMap(); + if (!pMap) + return; + + size_t iSize = tStorage.m_pPlayer->GetIntermediateDataSize(); + tStorage.m_pData = reinterpret_cast(I::MemAlloc->Alloc(iSize)); + + CPredictionCopy copy = { PC_NETWORKED_ONLY, tStorage.m_pData, PC_DATA_PACKED, tStorage.m_pPlayer, PC_DATA_NORMAL }; + copy.TransferData("MovementSimulationStore", tStorage.m_pPlayer->entindex(), pMap); } -void CMovementSimulation::Reset(PlayerStorage& tStorage) +void CMovementSimulation::Reset(MoveStorage& tStorage) { - tStorage.m_pPlayer->m_vecOrigin() = tStorage.m_PlayerData.m_vecOrigin; - tStorage.m_pPlayer->m_vecVelocity() = tStorage.m_PlayerData.m_vecVelocity; - tStorage.m_pPlayer->m_vecBaseVelocity() = tStorage.m_PlayerData.m_vecBaseVelocity; - tStorage.m_pPlayer->m_vecViewOffset() = tStorage.m_PlayerData.m_vecViewOffset; - tStorage.m_pPlayer->m_hGroundEntity() = tStorage.m_PlayerData.m_hGroundEntity; - tStorage.m_pPlayer->m_fFlags() = tStorage.m_PlayerData.m_fFlags; - tStorage.m_pPlayer->m_flDucktime() = tStorage.m_PlayerData.m_flDucktime; - tStorage.m_pPlayer->m_flDuckJumpTime() = tStorage.m_PlayerData.m_flDuckJumpTime; - tStorage.m_pPlayer->m_bDucked() = tStorage.m_PlayerData.m_bDucked; - tStorage.m_pPlayer->m_bDucking() = tStorage.m_PlayerData.m_bDucking; - tStorage.m_pPlayer->m_bInDuckJump() = tStorage.m_PlayerData.m_bInDuckJump; - tStorage.m_pPlayer->m_flModelScale() = tStorage.m_PlayerData.m_flModelScale; - tStorage.m_pPlayer->m_nButtons() = tStorage.m_PlayerData.m_nButtons; - tStorage.m_pPlayer->m_flLastMovementStunChange() = tStorage.m_PlayerData.m_flLastMovementStunChange; - tStorage.m_pPlayer->m_flStunLerpTarget() = tStorage.m_PlayerData.m_flStunLerpTarget; - tStorage.m_pPlayer->m_bStunNeedsFadeOut() = tStorage.m_PlayerData.m_bStunNeedsFadeOut; - tStorage.m_pPlayer->m_flPrevTauntYaw() = tStorage.m_PlayerData.m_flPrevTauntYaw; - tStorage.m_pPlayer->m_flTauntYaw() = tStorage.m_PlayerData.m_flTauntYaw; - tStorage.m_pPlayer->m_flCurrentTauntMoveSpeed() = tStorage.m_PlayerData.m_flCurrentTauntMoveSpeed; - tStorage.m_pPlayer->m_iKartState() = tStorage.m_PlayerData.m_iKartState; - tStorage.m_pPlayer->m_flVehicleReverseTime() = tStorage.m_PlayerData.m_flVehicleReverseTime; - tStorage.m_pPlayer->m_flHypeMeter() = tStorage.m_PlayerData.m_flHypeMeter; - tStorage.m_pPlayer->m_flMaxspeed() = tStorage.m_PlayerData.m_flMaxspeed; - tStorage.m_pPlayer->m_nAirDucked() = tStorage.m_PlayerData.m_nAirDucked; - tStorage.m_pPlayer->m_bJumping() = tStorage.m_PlayerData.m_bJumping; - tStorage.m_pPlayer->m_iAirDash() = tStorage.m_PlayerData.m_iAirDash; - tStorage.m_pPlayer->m_flWaterJumpTime() = tStorage.m_PlayerData.m_flWaterJumpTime; - tStorage.m_pPlayer->m_flSwimSoundTime() = tStorage.m_PlayerData.m_flSwimSoundTime; - tStorage.m_pPlayer->m_surfaceProps() = tStorage.m_PlayerData.m_surfaceProps; - tStorage.m_pPlayer->m_pSurfaceData() = tStorage.m_PlayerData.m_pSurfaceData; - tStorage.m_pPlayer->m_surfaceFriction() = tStorage.m_PlayerData.m_surfaceFriction; - tStorage.m_pPlayer->m_chTextureType() = tStorage.m_PlayerData.m_chTextureType; - tStorage.m_pPlayer->m_vecPunchAngle() = tStorage.m_PlayerData.m_vecPunchAngle; - tStorage.m_pPlayer->m_vecPunchAngleVel() = tStorage.m_PlayerData.m_vecPunchAngleVel; - tStorage.m_pPlayer->m_MoveType() = tStorage.m_PlayerData.m_MoveType; - tStorage.m_pPlayer->m_MoveCollide() = tStorage.m_PlayerData.m_MoveCollide; - tStorage.m_pPlayer->m_vecLadderNormal() = tStorage.m_PlayerData.m_vecLadderNormal; - tStorage.m_pPlayer->m_flGravity() = tStorage.m_PlayerData.m_flGravity; - tStorage.m_pPlayer->m_nWaterLevel() = tStorage.m_PlayerData.m_nWaterLevel; - tStorage.m_pPlayer->m_nWaterType() = tStorage.m_PlayerData.m_nWaterType; - tStorage.m_pPlayer->m_flFallVelocity() = tStorage.m_PlayerData.m_flFallVelocity; - tStorage.m_pPlayer->m_nPlayerCond() = tStorage.m_PlayerData.m_nPlayerCond; - tStorage.m_pPlayer->m_nPlayerCondEx() = tStorage.m_PlayerData.m_nPlayerCondEx; - tStorage.m_pPlayer->m_nPlayerCondEx2() = tStorage.m_PlayerData.m_nPlayerCondEx2; - tStorage.m_pPlayer->m_nPlayerCondEx3() = tStorage.m_PlayerData.m_nPlayerCondEx3; - tStorage.m_pPlayer->m_nPlayerCondEx4() = tStorage.m_PlayerData.m_nPlayerCondEx4; - tStorage.m_pPlayer->_condition_bits() = tStorage.m_PlayerData._condition_bits; + if (tStorage.m_pData) + { + auto pMap = tStorage.m_pPlayer->GetPredDescMap(); + if (!pMap) + return; + + CPredictionCopy copy = { PC_NETWORKED_ONLY, tStorage.m_pPlayer, PC_DATA_NORMAL, tStorage.m_pData, PC_DATA_PACKED }; + copy.TransferData("MovementSimulationReset", tStorage.m_pPlayer->entindex(), pMap); + + I::MemAlloc->Free(tStorage.m_pData); + tStorage.m_pData = nullptr; + } } void CMovementSimulation::Store() @@ -203,7 +130,7 @@ void CMovementSimulation::Store() -bool CMovementSimulation::Initialize(CBaseEntity* pEntity, PlayerStorage& tStorage, bool bHitchance, bool bStrafe) +bool CMovementSimulation::Initialize(CBaseEntity* pEntity, MoveStorage& tStorage, bool bHitchance, bool bStrafe) { if (!pEntity || !pEntity->IsPlayer() || !pEntity->As()->IsAlive()) { @@ -214,43 +141,41 @@ bool CMovementSimulation::Initialize(CBaseEntity* pEntity, PlayerStorage& tStora auto pPlayer = pEntity->As(); tStorage.m_pPlayer = pPlayer; - I::MoveHelper->SetHost(pPlayer); - pPlayer->m_pCurrentCommand() = &s_tDummyCmd; - - // store player restore data - Store(tStorage); - // store vars m_bOldInPrediction = I::Prediction->m_bInPrediction; m_bOldFirstTimePredicted = I::Prediction->m_bFirstTimePredicted; m_flOldFrametime = I::GlobalVars->frametime; + // store restore data + Store(tStorage); + // the hacks that make it work + I::MoveHelper->SetHost(pPlayer); + pPlayer->m_pCurrentCommand() = &s_tDummyCmd; + + if (auto pAvgVelocity = H::Entities.GetAvgVelocity(pPlayer->entindex())) + pPlayer->m_vecVelocity() = *pAvgVelocity; // only use average velocity here + + if (pPlayer->m_bDucked() = pPlayer->IsDucking()) { - if (auto pAvgVelocity = H::Entities.GetAvgVelocity(pPlayer->entindex())) - pPlayer->m_vecVelocity() = *pAvgVelocity; // only use average velocity here - - if (pPlayer->m_bDucked() = pPlayer->IsDucking()) - { - pPlayer->m_fFlags() &= ~FL_DUCKING; // breaks origin's z if FL_DUCKING is not removed - pPlayer->m_flDucktime() = 0.f; - pPlayer->m_flDuckJumpTime() = 0.f; - pPlayer->m_bDucking() = false; - pPlayer->m_bInDuckJump() = false; - } - - if (pPlayer != H::Entities.GetLocal()) - { - pPlayer->m_vecBaseVelocity() = Vec3(); // residual basevelocity causes issues - if (pPlayer->IsOnGround()) - pPlayer->m_vecVelocity().z = std::min(pPlayer->m_vecVelocity().z, 0.f); // step fix - else - pPlayer->m_hGroundEntity() = nullptr; // fix for velocity.z being set to 0 even if in air - } - else if (Vars::Misc::Movement::Bunnyhop.Value && G::OriginalCmd.buttons & IN_JUMP) - tStorage.m_bBunnyHop = true; + pPlayer->m_fFlags() &= ~FL_DUCKING; // breaks origin's z if FL_DUCKING is not removed + pPlayer->m_flDucktime() = 0.f; + pPlayer->m_flDuckJumpTime() = 0.f; + pPlayer->m_bDucking() = false; + pPlayer->m_bInDuckJump() = false; } + if (pPlayer != H::Entities.GetLocal()) + { + pPlayer->m_vecBaseVelocity() = Vec3(); // residual basevelocity causes issues + if (pPlayer->IsOnGround()) + pPlayer->m_vecVelocity().z = std::min(pPlayer->m_vecVelocity().z, 0.f); // step fix + else + pPlayer->m_hGroundEntity() = nullptr; // fix for velocity.z being set to 0 even if in air + } + else if (Vars::Misc::Movement::Bunnyhop.Value && G::OriginalCmd.buttons & IN_JUMP) + tStorage.m_bBunnyHop = true; + // setup move data if (!SetupMoveData(tStorage)) { @@ -311,7 +236,7 @@ bool CMovementSimulation::Initialize(CBaseEntity* pEntity, PlayerStorage& tStora return true; } -bool CMovementSimulation::SetupMoveData(PlayerStorage& tStorage) +bool CMovementSimulation::SetupMoveData(MoveStorage& tStorage) { if (!tStorage.m_pPlayer) return false; @@ -465,7 +390,7 @@ static inline bool GetYawDifference(MoveData& tRecord1, MoveData& tRecord2, bool } } -void CMovementSimulation::GetAverageYaw(PlayerStorage& tStorage, int iSamples) +void CMovementSimulation::GetAverageYaw(MoveStorage& tStorage, int iSamples) { auto pPlayer = tStorage.m_pPlayer; auto& vRecords = m_mRecords[pPlayer->entindex()]; @@ -549,7 +474,7 @@ void CMovementSimulation::GetAverageYaw(PlayerStorage& tStorage, int iSamples) SDK::Output("MovementSimulation", std::format("flAverageYaw calculated to {} from {} ({}) {}", flAverageYaw, iTicks, iMinimum, pPlayer->entindex() == I::EngineClient->GetLocalPlayer() ? "(local)" : "").c_str(), { 100, 255, 150 }, Vars::Debug::Logging.Value); } -bool CMovementSimulation::StrafePrediction(PlayerStorage& tStorage, int iSamples) +bool CMovementSimulation::StrafePrediction(MoveStorage& tStorage, int iSamples) { if (tStorage.m_bDirectMove ? !(Vars::Aimbot::Projectile::StrafePrediction.Value & Vars::Aimbot::Projectile::StrafePredictionEnum::Ground) @@ -560,7 +485,7 @@ bool CMovementSimulation::StrafePrediction(PlayerStorage& tStorage, int iSamples return true; } -bool CMovementSimulation::SetDuck(PlayerStorage& tStorage, bool bDuck) // this only touches origin, bounds +bool CMovementSimulation::SetDuck(MoveStorage& tStorage, bool bDuck) // this only touches origin, bounds { if (bDuck == tStorage.m_pPlayer->m_bDucked()) return true; @@ -631,7 +556,7 @@ void CMovementSimulation::RestoreBounds(CTFPlayer* pPlayer) } } -void CMovementSimulation::RunTick(PlayerStorage& tStorage, bool bPath, std::function* pCallback) +void CMovementSimulation::RunTick(MoveStorage& tStorage, bool bPath, std::function* pCallback) { if (tStorage.m_bFailed || !tStorage.m_pPlayer || !tStorage.m_pPlayer->IsPlayer()) return; @@ -701,12 +626,12 @@ void CMovementSimulation::RunTick(PlayerStorage& tStorage, bool bPath, std::func RestoreBounds(tStorage.m_pPlayer); } -void CMovementSimulation::RunTick(PlayerStorage& tStorage, bool bPath, std::function fCallback) +void CMovementSimulation::RunTick(MoveStorage& tStorage, bool bPath, std::function fCallback) { RunTick(tStorage, bPath, &fCallback); } -void CMovementSimulation::Restore(PlayerStorage& tStorage) +void CMovementSimulation::Restore(MoveStorage& tStorage) { if (tStorage.m_bInitFailed || !tStorage.m_pPlayer) return; @@ -719,12 +644,6 @@ void CMovementSimulation::Restore(PlayerStorage& tStorage) I::Prediction->m_bInPrediction = m_bOldInPrediction; I::Prediction->m_bFirstTimePredicted = m_bOldFirstTimePredicted; I::GlobalVars->frametime = m_flOldFrametime; - - /* - const bool bInitFailed = tStorage.m_bInitFailed, bFailed = tStorage.m_bFailed; - memset(&tStorage, 0, sizeof(PlayerStorage)); - tStorage.m_bInitFailed = bInitFailed, tStorage.m_bFailed = bFailed; - */ } float CMovementSimulation::GetPredictedDelta(CBaseEntity* pEntity) diff --git a/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.h b/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.h index 864c7efa..68d8f13c 100644 --- a/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.h +++ b/Amalgam/src/Features/Simulation/MovementSimulation/MovementSimulation.h @@ -2,62 +2,11 @@ #include "../../../SDK/SDK.h" #include -struct PlayerData -{ - Vec3 m_vecOrigin = {}; - Vec3 m_vecVelocity = {}; - Vec3 m_vecBaseVelocity = {}; - Vec3 m_vecViewOffset = {}; - EHANDLE m_hGroundEntity = nullptr; - int m_fFlags = 0; - float m_flDucktime = 0.f; - float m_flDuckJumpTime = 0.f; - bool m_bDucked = false; - bool m_bDucking = false; - bool m_bInDuckJump = false; - float m_flModelScale = 0.f; - int m_nButtons = 0; - float m_flLastMovementStunChange = 0.f; - float m_flStunLerpTarget = 0.f; - bool m_bStunNeedsFadeOut = false; - float m_flPrevTauntYaw = 0.f; - float m_flTauntYaw = 0.f; - float m_flCurrentTauntMoveSpeed = 0.f; - int m_iKartState = 0; - float m_flVehicleReverseTime = 0.f; - float m_flHypeMeter = 0.f; - float m_flMaxspeed = 0.f; - int m_nAirDucked = 0; - bool m_bJumping = false; - int m_iAirDash = 0; - float m_flWaterJumpTime = 0.f; - float m_flSwimSoundTime = 0.f; - int m_surfaceProps = 0; - void* m_pSurfaceData = nullptr; - float m_surfaceFriction = 0.f; - char m_chTextureType = 0; - Vec3 m_vecPunchAngle = {}; - Vec3 m_vecPunchAngleVel = {}; - float m_flJumpTime = 0.f; - byte m_MoveType = 0; - byte m_MoveCollide = 0; - Vec3 m_vecLadderNormal = {}; - float m_flGravity = 0.f; - byte m_nWaterLevel = 0; - byte m_nWaterType = 0; - float m_flFallVelocity = 0.f; - int m_nPlayerCond = 0; - int m_nPlayerCondEx = 0; - int m_nPlayerCondEx2 = 0; - int m_nPlayerCondEx3 = 0; - int m_nPlayerCondEx4 = 0; - int _condition_bits = 0; -}; -struct PlayerStorage +struct MoveStorage { CTFPlayer* m_pPlayer = nullptr; CMoveData m_MoveData = {}; - PlayerData m_PlayerData = {}; + byte* m_pData = nullptr; float m_flAverageYaw = 0.f; bool m_bBunnyHop = false; @@ -88,12 +37,12 @@ struct MoveData class CMovementSimulation { private: - void Store(PlayerStorage& tStorage); - void Reset(PlayerStorage& tStorage); + void Store(MoveStorage& tStorage); + void Reset(MoveStorage& tStorage); - bool SetupMoveData(PlayerStorage& tStorage); - void GetAverageYaw(PlayerStorage& tStorage, int iSamples); - bool StrafePrediction(PlayerStorage& tStorage, int iSamples); + bool SetupMoveData(MoveStorage& tStorage); + void GetAverageYaw(MoveStorage& tStorage, int iSamples); + bool StrafePrediction(MoveStorage& tStorage, int iSamples); void SetBounds(CTFPlayer* pPlayer); void RestoreBounds(CTFPlayer* pPlayer); @@ -108,11 +57,11 @@ private: public: void Store(); - bool Initialize(CBaseEntity* pEntity, PlayerStorage& tStorage, bool bHitchance = true, bool bStrafe = true); - bool SetDuck(PlayerStorage& tStorage, bool bDuck); - void RunTick(PlayerStorage& tStorage, bool bPath = true, std::function* pCallback = nullptr); - void RunTick(PlayerStorage& tStorage, bool bPath, std::function fCallback); - void Restore(PlayerStorage& tStorage); + bool Initialize(CBaseEntity* pEntity, MoveStorage& tStorage, bool bHitchance = true, bool bStrafe = true); + bool SetDuck(MoveStorage& tStorage, bool bDuck); + void RunTick(MoveStorage& tStorage, bool bPath = true, std::function* pCallback = nullptr); + void RunTick(MoveStorage& tStorage, bool bPath, std::function fCallback); + void Restore(MoveStorage& tStorage); float GetPredictedDelta(CBaseEntity* pEntity); }; diff --git a/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp b/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp index 3b922d50..15d9cf1e 100644 --- a/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp +++ b/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp @@ -1,5 +1,6 @@ #include "../SDK/SDK.h" +#include "../Features/EnginePrediction/EnginePrediction.h" #include "../Features/Spectate/Spectate.h" MAKE_HOOK(CHLClient_LevelShutdown, U::Memory.GetVirtual(I::Client, 7), void, @@ -11,6 +12,7 @@ MAKE_HOOK(CHLClient_LevelShutdown, U::Memory.GetVirtual(I::Client, 7), void, #endif H::Entities.Clear(true); + F::EnginePrediction.Unload(); F::Spectate.m_iIntendedTarget = -1; CALL_ORIGINAL(rcx); diff --git a/Amalgam/src/SDK/Definitions/Classes.h b/Amalgam/src/SDK/Definitions/Classes.h index 0b85ac94..83493dbb 100644 --- a/Amalgam/src/SDK/Definitions/Classes.h +++ b/Amalgam/src/SDK/Definitions/Classes.h @@ -15,6 +15,7 @@ #include "Main/CEconWearable.h" #include "Main/CEntitySphereQuery.h" #include "Main/CMultiPlayerAnimState.h" +#include "Main/CPredictionCopy.h" #include "Main/CSniperDot.h" #include "Main/CTFPlayer.h" #include "Main/CTFPlayerResource.h" diff --git a/Amalgam/src/SDK/Definitions/Interfaces.h b/Amalgam/src/SDK/Definitions/Interfaces.h index 3d6575c4..75694b74 100644 --- a/Amalgam/src/SDK/Definitions/Interfaces.h +++ b/Amalgam/src/SDK/Definitions/Interfaces.h @@ -21,6 +21,7 @@ #include "Interfaces/IKeyValuesSystem.h" #include "Interfaces/IMaterialSystem.h" #include "Interfaces/IMatSystemSurface.h" +#include "Interfaces/IMemAlloc.h" #include "Interfaces/IMoveHelper.h" #include "Interfaces/IPanel.h" #include "Interfaces/IStudioRender.h" diff --git a/Amalgam/src/SDK/Definitions/Interfaces/IMemAlloc.h b/Amalgam/src/SDK/Definitions/Interfaces/IMemAlloc.h new file mode 100644 index 00000000..026fbc0f --- /dev/null +++ b/Amalgam/src/SDK/Definitions/Interfaces/IMemAlloc.h @@ -0,0 +1,66 @@ +#pragma once +#include "Interface.h" +#include "../Misc/BaseTypes.h" + +typedef size_t(*MemAllocFailHandler_t)(size_t); +class IVirtualMemorySection; + +struct GenericMemoryStat_t +{ + const char* name; + int value; +}; + +class IMemAlloc +{ +public: + virtual void* Alloc(size_t nSize) = 0; + virtual void* Realloc(void* pMem, size_t nSize) = 0; + virtual void Free(void* pMem) = 0; + virtual void* Expand_NoLongerSupported(void* pMem, size_t nSize) = 0; + virtual void* Alloc(size_t nSize, const char* pFileName, int nLine) = 0; + virtual void* Realloc(void* pMem, size_t nSize, const char* pFileName, int nLine) = 0; + virtual void Free(void* pMem, const char* pFileName, int nLine) = 0; + virtual void* Expand_NoLongerSupported(void* pMem, size_t nSize, const char* pFileName, int nLine) = 0; + virtual size_t GetSize(void* pMem) = 0; + virtual void PushAllocDbgInfo(const char* pFileName, int nLine) = 0; + virtual void PopAllocDbgInfo() = 0; + virtual int32 CrtSetBreakAlloc(int32 lNewBreakAlloc) = 0; + virtual int CrtSetReportMode(int nReportType, int nReportMode) = 0; + virtual int CrtIsValidHeapPointer(const void* pMem) = 0; + virtual int CrtIsValidPointer(const void* pMem, unsigned int size, int access) = 0; + virtual int CrtCheckMemory(void) = 0; + virtual int CrtSetDbgFlag(int nNewFlag) = 0; + virtual void CrtMemCheckpoint(_CrtMemState* pState) = 0; + virtual void DumpStats() = 0; + virtual void DumpStatsFileBase(char const* pchFileBase) = 0; + virtual size_t ComputeMemoryUsedBy(char const* pchSubStr) = 0; + virtual void* CrtSetReportFile(int nRptType, void* hFile) = 0; + virtual void* CrtSetReportHook(void* pfnNewHook) = 0; + virtual int CrtDbgReport(int nRptType, const char* szFile, int nLine, const char* szModule, const char* pMsg) = 0; + virtual int heapchk() = 0; + virtual bool IsDebugHeap() = 0; + virtual void GetActualDbgInfo(const char*& pFileName, int& nLine) = 0; + virtual void RegisterAllocation(const char* pFileName, int nLine, size_t nLogicalSize, size_t nActualSize, unsigned nTime) = 0; + virtual void RegisterDeallocation(const char* pFileName, int nLine, size_t nLogicalSize, size_t nActualSize, unsigned nTime) = 0; + virtual int GetVersion() = 0; + virtual void CompactHeap() = 0; + virtual MemAllocFailHandler_t SetAllocFailHandler(MemAllocFailHandler_t pfnMemAllocFailHandler) = 0; + virtual void DumpBlockStats(void*) = 0; + virtual void SetStatsExtraInfo(const char* pMapName, const char* pComment) = 0; + virtual size_t MemoryAllocFailed() = 0; + virtual void CompactIncremental() = 0; + virtual void OutOfMemory(size_t nBytesAttempted = 0) = 0; + virtual void* RegionAlloc(int region, size_t nSize) = 0; + virtual void* RegionAlloc(int region, size_t nSize, const char* pFileName, int nLine) = 0; + virtual void GlobalMemoryStatus(size_t* pUsedMemory, size_t* pFreeMemory) = 0; + virtual IVirtualMemorySection* AllocateVirtualMemorySection(size_t numMaxBytes) = 0; + virtual int GetGenericMemoryStats(GenericMemoryStat_t** ppMemoryStats) = 0; + virtual ~IMemAlloc() {}; + virtual uint32 GetDebugInfoSize() = 0; + virtual void SaveDebugInfo(void* pvDebugInfo) = 0; + virtual void RestoreDebugInfo(const void* pvDebugInfo) = 0; + virtual void InitDebugInfo(void* pvDebugInfo, const char* pchRootFileName, int nLine) = 0; +}; + +MAKE_INTERFACE_EXPORT(IMemAlloc, MemAlloc, "tier0.dll", "g_pMemAlloc", 1); \ No newline at end of file diff --git a/Amalgam/src/SDK/Definitions/Main/CBaseEntity.cpp b/Amalgam/src/SDK/Definitions/Main/CBaseEntity.cpp index cbb4bf75..42f16d09 100644 --- a/Amalgam/src/SDK/Definitions/Main/CBaseEntity.cpp +++ b/Amalgam/src/SDK/Definitions/Main/CBaseEntity.cpp @@ -2,6 +2,11 @@ #include "../../SDK.h" +int CBaseEntity::GetIntermediateDataSize() +{ + return std::max(GetPredDescMap()->packed_size, 4); +} + Vec3 CBaseEntity::GetSize() { return m_vecMaxs() - m_vecMins(); diff --git a/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h b/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h index 631cf4b0..c93c149d 100644 --- a/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h +++ b/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h @@ -290,6 +290,7 @@ public: return vOut; } + int GetIntermediateDataSize(); Vec3 GetSize(); Vec3 GetOffset(); Vec3 GetCenter(); diff --git a/Amalgam/src/SDK/Definitions/Main/CPredictionCopy.h b/Amalgam/src/SDK/Definitions/Main/CPredictionCopy.h new file mode 100644 index 00000000..17a34c94 --- /dev/null +++ b/Amalgam/src/SDK/Definitions/Main/CPredictionCopy.h @@ -0,0 +1,81 @@ +#pragma once +#include "../Misc/Datamap.h" +#include "../../../Utils/Signatures/Signatures.h" + +MAKE_SIGNATURE(CPredictionCopy_TransferData, "client.dll", "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 41 56 48 83 EC ? 8B 3D", 0x0); + +#define PC_DATA_PACKED true +#define PC_DATA_NORMAL false + +enum +{ + PC_EVERYTHING = 0, + PC_NON_NETWORKED_ONLY, + PC_NETWORKED_ONLY, +}; + +typedef void (*FN_FIELD_COMPARE)(const char* classname, const char* fieldname, const char* fieldtype, + bool networked, bool noterrorchecked, bool differs, bool withintolerance, const char* value); + +class CPredictionCopy +{ +public: + typedef enum + { + DIFFERS = 0, + IDENTICAL, + WITHINTOLERANCE, + } difftype_t; + + CPredictionCopy(int type, void* dest, bool dest_packed, void const* src, bool src_packed, + bool counterrors = false, bool reporterrors = false, bool performcopy = true, + bool describefields = false, FN_FIELD_COMPARE func = nullptr) + { + m_nType = type; + m_pDest = dest; + m_pSrc = src; + m_nDestOffsetIndex = dest_packed ? TD_OFFSET_PACKED : TD_OFFSET_NORMAL; + m_nSrcOffsetIndex = src_packed ? TD_OFFSET_PACKED : TD_OFFSET_NORMAL; + m_bErrorCheck = counterrors; + m_bReportErrors = reporterrors; + m_bPerformCopy = performcopy; + m_bDescribeFields = describefields; + + m_pCurrentField = nullptr; + m_pCurrentMap = nullptr; + m_pCurrentClassName = nullptr; + m_bShouldReport = false; + m_bShouldDescribe = false; + m_nErrorCount = 0; + + m_FieldCompareFunc = func; + } + + int TransferData(const char* operation, int entindex, datamap_t* dmap) + { + return S::CPredictionCopy_TransferData.Call(this, operation, entindex, dmap); + } + +public: + int m_nType; + void* m_pDest; + void const* m_pSrc; + int m_nDestOffsetIndex; + int m_nSrcOffsetIndex; + + bool m_bErrorCheck; + bool m_bReportErrors; + bool m_bDescribeFields; + typedescription_t* m_pCurrentField; + char const* m_pCurrentClassName; + datamap_t* m_pCurrentMap; + bool m_bShouldReport; + bool m_bShouldDescribe; + int m_nErrorCount; + bool m_bPerformCopy; + + FN_FIELD_COMPARE m_FieldCompareFunc; + + typedescription_t* m_pWatchField; + char const* m_pOperation; +}; \ No newline at end of file diff --git a/Amalgam/src/Utils/Interfaces/Interfaces.cpp b/Amalgam/src/Utils/Interfaces/Interfaces.cpp index 36b95b85..3d9bbd7b 100644 --- a/Amalgam/src/Utils/Interfaces/Interfaces.cpp +++ b/Amalgam/src/Utils/Interfaces/Interfaces.cpp @@ -10,11 +10,12 @@ #pragma warning (disable: 4172) -InterfaceInit_t::InterfaceInit_t(void** pPtr, const char* sDLLName, const char* sVersion, int nOffset, int nDereferenceCount) +InterfaceInit_t::InterfaceInit_t(void** pPtr, const char* sDLL, const char* sName, int8_t nType, int8_t nOffset, int8_t nDereferenceCount) { m_pPtr = pPtr; - m_sDLLName = sDLLName; - m_sVersion = sVersion; + m_sDLL = sDLL; + m_sName = sName; + m_nType = nType; m_nOffset = nOffset; m_nDereferenceCount = nDereferenceCount; @@ -27,7 +28,7 @@ bool CInterfaces::Initialize() { const char* sModule = nullptr; std::vector vModules; - boost::split(vModules, Interface->m_sDLLName, boost::is_any_of(", ")); + boost::split(vModules, Interface->m_sDLL, boost::is_any_of(", ")); if (vModules.size() == 1) sModule = vModules.front().c_str(); else @@ -46,37 +47,48 @@ bool CInterfaces::Initialize() for (auto& sName : vModules) ssModuleStream << std::format("{}{}", !ssModuleStream.str().empty() ? ", " : "", sName); - U::Core.AppendFailText(std::format("CInterfaces::Initialize() failed to find module:\n {}\n {}", ssModuleStream.str(), Interface->m_sVersion).c_str()); + U::Core.AppendFailText(std::format("CInterfaces::Initialize() failed to find module:\n {}\n {}", ssModuleStream.str(), Interface->m_sName).c_str()); m_bFailed = true; continue; } } - if (Interface->m_nOffset == -1) - *Interface->m_pPtr = U::Memory.FindInterface(sModule, Interface->m_sVersion); - else + switch (Interface->m_nType) { - auto dwDest = U::Memory.FindSignature(sModule, Interface->m_sVersion); + case 0: + { + *Interface->m_pPtr = U::Memory.FindInterface(sModule, Interface->m_sName); + break; + } + case 1: + { + *Interface->m_pPtr = U::Memory.GetModuleExport(sModule, Interface->m_sName); + break; + } + case 2: + { + auto dwDest = U::Memory.FindSignature(sModule, Interface->m_sName); if (!dwDest) { - U::Core.AppendFailText(std::format("CInterfaces::Initialize() failed to find signature:\n {}\n {}", sModule, Interface->m_sVersion).c_str()); - m_bFailed = true; - continue; + U::Core.AppendFailText(std::format("CInterfaces::Initialize() failed to find signature").c_str()); + break; } auto dwAddress = U::Memory.RelToAbs(dwDest); *Interface->m_pPtr = reinterpret_cast(dwAddress + Interface->m_nOffset); + break; + } + } - for (int n = 0; n < Interface->m_nDereferenceCount; n++) - { - if (Interface->m_pPtr) - *Interface->m_pPtr = *reinterpret_cast(*Interface->m_pPtr); - } + for (int n = 0; n < Interface->m_nDereferenceCount; n++) + { + if (Interface->m_pPtr) + *Interface->m_pPtr = *reinterpret_cast(*Interface->m_pPtr); } if (!*Interface->m_pPtr) { - U::Core.AppendFailText(std::format("CInterfaces::Initialize() failed to initialize:\n {}\n {}", sModule, Interface->m_sVersion).c_str()); + U::Core.AppendFailText(std::format("CInterfaces::Initialize() failed to initialize:\n {}\n {}", sModule, Interface->m_sName).c_str()); m_bFailed = true; } } diff --git a/Amalgam/src/Utils/Interfaces/Interfaces.h b/Amalgam/src/Utils/Interfaces/Interfaces.h index 6e32ad78..1ab73df1 100644 --- a/Amalgam/src/Utils/Interfaces/Interfaces.h +++ b/Amalgam/src/Utils/Interfaces/Interfaces.h @@ -5,27 +5,34 @@ struct InterfaceInit_t { void** m_pPtr; - const char* m_sDLLName; - const char* m_sVersion; - int m_nOffset; //if not -1 we're going to sig scan (m_sVersion is the sig) - int m_nDereferenceCount; + const char* m_sDLL; + const char* m_sName; + int8_t m_nType; // 0: find interface, 1: get export, 2: sig scan + int8_t m_nOffset; + int8_t m_nDereferenceCount; - InterfaceInit_t(void** pPtr, const char* sDLLName, const char* sVersion, int nOffset, int nDereferenceCount); + InterfaceInit_t(void** pPtr, const char* sDLL, const char* sName, int8_t nType, int8_t nOffset = 0, int8_t nDereferenceCount = 0); }; -#define MAKE_INTERFACE_VERSION(type, name, dll, version) namespace I { inline type *name = nullptr; } \ +#define MAKE_INTERFACE_VERSION(type, symbol, dll, version) namespace I { inline type *symbol = nullptr; } \ namespace MAKE_INTERFACE_SCOPE \ {\ - inline InterfaceInit_t name##InterfaceInit_t(reinterpret_cast(&I::name), dll, version, -1, 0); \ + inline InterfaceInit_t symbol##InterfaceInit_t(reinterpret_cast(&I::symbol), dll, version, 0); \ } -#define MAKE_INTERFACE_SIGNATURE(type, name, dll, signature, offset, deref) namespace I { inline type *name = nullptr; } \ +#define MAKE_INTERFACE_EXPORT(type, symbol, dll, name, deref) namespace I { inline type *symbol = nullptr; } \ namespace MAKE_INTERFACE_SCOPE \ {\ - inline InterfaceInit_t name##InterfaceInit_t(reinterpret_cast(&I::name), dll, signature, offset, deref); \ + inline InterfaceInit_t symbol##InterfaceInit_t(reinterpret_cast(&I::symbol), dll, name, 1, 0, deref); \ } -#define MAKE_INTERFACE_NULL(type, name) namespace I { inline type *name = nullptr; } +#define MAKE_INTERFACE_SIGNATURE(type, symbol, dll, signature, offset, deref) namespace I { inline type *symbol = nullptr; } \ +namespace MAKE_INTERFACE_SCOPE \ +{\ + inline InterfaceInit_t symbol##InterfaceInit_t(reinterpret_cast(&I::symbol), dll, signature, 2, offset, deref); \ +} + +#define MAKE_INTERFACE_NULL(type, symbol) namespace I { inline type *symbol = nullptr; } class CInterfaces { diff --git a/Amalgam/src/Utils/Signatures/Signatures.cpp b/Amalgam/src/Utils/Signatures/Signatures.cpp index 8bb42911..4ec801d9 100644 --- a/Amalgam/src/Utils/Signatures/Signatures.cpp +++ b/Amalgam/src/Utils/Signatures/Signatures.cpp @@ -5,7 +5,7 @@ #include #include -CSignature::CSignature(const char* sDLLName, const char* sSignature, int nOffset, const char* sName) +CSignature::CSignature(const char* sDLLName, const char* sSignature, int8_t nOffset, const char* sName) { m_dwVal = 0x0; m_sDLLName = sDLLName; diff --git a/Amalgam/src/Utils/Signatures/Signatures.h b/Amalgam/src/Utils/Signatures/Signatures.h index dd192f56..41fa3063 100644 --- a/Amalgam/src/Utils/Signatures/Signatures.h +++ b/Amalgam/src/Utils/Signatures/Signatures.h @@ -1,6 +1,5 @@ #pragma once #include "../Macros/Macros.h" -#include #include class CSignature @@ -9,11 +8,11 @@ private: uintptr_t m_dwVal; const char* m_sDLLName; const char* m_sSignature; - int m_nOffset; + int8_t m_nOffset; const char* m_sName; public: - CSignature(const char* sDLLName, const char* sSignature, int nOffset, const char* sName); + CSignature(const char* sDLLName, const char* sSignature, int8_t nOffset, const char* sName); bool Initialize(); diff --git a/README.md b/README.md index 0b632fbf..7b7a7257 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,8 @@

If nightly.link is down or can't be accessed, you can still download through [GitHub](https://github.com/rei-2/Amalgam/actions) with an account. - + ## -## + Read about Amalgam's documentation and features [here](../../wiki). -[VAC bypass](https://github.com/danielkrupinski/VAC-Bypass-Loader) and [Xenos](https://github.com/DarthTon/Xenos/releases) recommended. - -Read about Amalgam's documentation and features [here](../../wiki). \ No newline at end of file + \ No newline at end of file