#pragma once #include class CEngine; /* ==== CENGINE ======================================================================================================================================================= */ inline bool(*CEngine__Frame)(CEngine* thisp); extern CEngine* g_pEngine; extern IEngine::QuitState_t* gsm_Quitting; class CEngine : public IEngine { public: static bool _Frame(CEngine* const thisp); inline IEngine::QuitState_t GetQuitting() const { return *gsm_Quitting; } private: EngineState_t m_nDLLState; EngineState_t m_nNextDLLState; double m_flCurrentTime; double m_flPreviousTime; float m_flFrameTime; float m_flPreviousFrameTime; float m_flFilteredTime; char padding[4]; // <- free data double m_flBenchmarkTime; bool m_bShouldPause; bool m_bPaused; }; static_assert(sizeof(CEngine) == 0x40); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// class VEngine : public IDetour { virtual void GetAdr(void) const { LogFunAdr("CEngine::Frame", CEngine__Frame); LogVarAdr("g_Engine", g_pEngine); LogVarAdr("sm_Quitting", gsm_Quitting); } virtual void GetFun(void) const { g_GameDll.FindPatternSIMD("48 8B C4 55 56 48 8D A8 ?? ?? ?? ?? 48 81 EC ?? ?? ?? ?? 0F 29 70 B8").GetPtr(CEngine__Frame); } virtual void GetVar(void) const { g_pEngine = g_GameDll.FindPatternSIMD("40 53 48 83 EC 20 80 B9 ?? ?? ?? ?? ?? BB ?? ?? ?? ??").FindPatternSelf("48 8B ?? ?? ?? ?? 01", CMemory::Direction::DOWN, 150).ResolveRelativeAddressSelf(0x3, 0x7).RCast(); gsm_Quitting = g_GameDll.FindPatternSIMD("89 15 ?? ?? ?? ?? C3 CC CC CC CC CC CC CC CC CC 83 C1 F4").ResolveRelativeAddressSelf(0x2, 0x6).RCast(); } virtual void GetCon(void) const { } virtual void Detour(const bool bAttach) const; }; ///////////////////////////////////////////////////////////////////////////////