diff --git a/src/crits.cpp b/src/crits.cpp index a73951df..cb2dd0ba 100644 --- a/src/crits.cpp +++ b/src/crits.cpp @@ -16,7 +16,7 @@ std::unordered_map command_number_mod {}; int* g_PredictionRandomSeed = nullptr; bool AllowAttacking() { - if (!(hacks::shared::misc::crit_hack || ((GetWeaponMode(LOCAL_E) == weapon_melee) && hacks::shared::misc::crit_melee))) return true; + if (!(hacks::shared::misc::crit_hack || ((GetWeaponMode(LOCAL_E) == weapon_melee) && hacks::shared::misc::crit_melee)) && !hacks::shared::misc::crit_suppress) return true; bool crit = IsAttackACrit(g_pUserCmd); if (hacks::shared::misc::crit_suppress && !(hacks::shared::misc::crit_hack || ((GetWeaponMode(LOCAL_E) == weapon_melee) && hacks::shared::misc::crit_melee))) { if (crit && !IsPlayerCritBoosted(LOCAL_E)) { @@ -37,6 +37,50 @@ bool WeaponCanCrit() { return TF && CE_GOOD(LOCAL_W) && vfunc(RAW_ENT(LOCAL_W), 465 + 21, 0)(RAW_ENT(LOCAL_W)); } +struct crithack_saved_state { + float bucket; // 2612 + bool unknown2831; + int seed; // 2868 + float time; // 2872 + int unknown2616; + int unknown2620; + float unknown2856; + float unknown2860; + void Save(IClientEntity* entity) { + bucket = *(float*)((uintptr_t)entity + 2612); + unknown2831 = *(float*)((uintptr_t)entity + 2831); + seed = *(int*)((uintptr_t)entity + 2868); + time = *(float*)((uintptr_t)entity + 2872); + unknown2616 = *(int*)((uintptr_t)entity + 2616); + unknown2620 = *(int*)((uintptr_t)entity + 2620); + unknown2856 = *(float*)((uintptr_t)entity + 2856); + unknown2860 = *(float*)((uintptr_t)entity + 2860); + } + void Load(IClientEntity* entity) { + *(float*)((uintptr_t)entity + 2612) = bucket; + *(float*)((uintptr_t)entity + 2831) = unknown2831; + *(int*)((uintptr_t)entity + 2868) = seed; + *(float*)((uintptr_t)entity + 2872) = time; + *(int*)((uintptr_t)entity + 2616) = unknown2616; + *(int*)((uintptr_t)entity + 2620) = unknown2620; + *(float*)((uintptr_t)entity + 2856) = unknown2856; + *(float*)((uintptr_t)entity + 2860) = unknown2860; + } +}; + +static crithack_saved_state state; +static bool state_saved { false }; +void LoadSavedState() { + if (!state_saved) return; + if (CE_GOOD(LOCAL_W) && TF) { + IClientEntity* weapon = RAW_ENT(LOCAL_W); + state.Load(weapon); + } +} +void ResetCritHack() { + state_saved = false; +} + bool IsAttackACrit(CUserCmd* cmd) { if (CE_GOOD(LOCAL_W) && TF) { IClientEntity* weapon = RAW_ENT(LOCAL_W); @@ -71,14 +115,18 @@ bool IsAttackACrit(CUserCmd* cmd) { bool chc = false; int md5seed = MD5_PseudoRandom(cmd->command_number) & 0x7fffffff; int rseed = md5seed; - float bucket = *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u); + //float bucket = *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u); *g_PredictionRandomSeed = md5seed; int c = LOCAL_W->m_IDX << 8; int b = LOCAL_E->m_IDX; rseed = rseed ^ (b | c); - *(float*)(weapon + 2856ul) = 0.0f; RandomSeed(rseed); + state.Save(weapon); + state_saved = true; + //float saved_time = *(float*)(weapon + 2872ul); + //*(float*)(weapon + 2872ul) = 0.0f; bool crits = vfunc(weapon, 1836 / 4, 0)(weapon); + //*(float*)(weapon + 2872ul) = saved_time; //if (!crits) *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u) = bucket; return crits; } diff --git a/src/crits.h b/src/crits.h index 81199927..8cef3142 100644 --- a/src/crits.h +++ b/src/crits.h @@ -15,6 +15,8 @@ bool AllowAttacking(); bool RandomCrits(); bool WeaponCanCrit(); bool IsAttackACrit(CUserCmd* cmd); +void ResetCritHack(); +void LoadSavedState(); #include "beforecheaders.h" #include diff --git a/src/hacks/Misc.cpp b/src/hacks/Misc.cpp index 43b90a74..7d82a6b0 100644 --- a/src/hacks/Misc.cpp +++ b/src/hacks/Misc.cpp @@ -146,12 +146,12 @@ void CreateMove() { while (!chc && tries < 4096) { int md5seed = MD5_PseudoRandom(cmdn) & 0x7fffffff; int rseed = md5seed; - float bucket = *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u); + //float bucket = *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u); *g_PredictionRandomSeed = md5seed; int c = LOCAL_W->m_IDX << 8; int b = LOCAL_E->m_IDX; rseed = rseed ^ (b | c); - *(float*)(weapon + 2856ul) = 0.0f; + *(float*)(weapon + 2872ul) = 0.0f; RandomSeed(rseed); chc = vfunc(weapon, 1836 / 4, 0)(weapon); if (!chc) { @@ -198,7 +198,8 @@ void Draw() { else AddCenterString("Weapon can randomly crit"); } - AddCenterString(format("Bucket: %.2f", *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u))); + AddCenterString(format("Bucket: ", *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u))); + //AddCenterString(format("Time: ", *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2872u))); } } diff --git a/src/hooks/CreateMove.cpp b/src/hooks/CreateMove.cpp index 0f6c56e8..b98d0925 100644 --- a/src/hooks/CreateMove.cpp +++ b/src/hooks/CreateMove.cpp @@ -77,7 +77,7 @@ bool CreateMove_hook(void* thisptr, float inputSample, CUserCmd* cmd) { //if (!cmd) return ret; bool time_replaced = false; - float curtime_old = g_GlobalVars->curtime;; + float curtime_old = g_GlobalVars->curtime; if (hacks::shared::airstuck::IsStuck()) { return ret; @@ -150,6 +150,7 @@ bool CreateMove_hook(void* thisptr, float inputSample, CUserCmd* cmd) { } if (CE_GOOD(g_pLocalPlayer->entity)) { + ResetCritHack(); if (TF2) SAFE_CALL(UpdateHoovyList()); g_pLocalPlayer->v_OrigViewangles = cmd->viewangles; // PROF_BEGIN(); @@ -242,6 +243,9 @@ bool CreateMove_hook(void* thisptr, float inputSample, CUserCmd* cmd) { } // PROF_END("CreateMove"); + if (!(cmd->buttons & IN_ATTACK)) { + //LoadSavedState(); + } g_pLocalPlayer->bAttackLastTick = (cmd->buttons & IN_ATTACK); return ret;