diff --git a/r5dev/client/vengineclient_impl.cpp b/r5dev/client/vengineclient_impl.cpp
index df1bc34a..af9dd4f2 100644
--- a/r5dev/client/vengineclient_impl.cpp
+++ b/r5dev/client/vengineclient_impl.cpp
@@ -9,4 +9,56 @@
 
 //#ifdef GAMEDLL_S3
 bool* m_bRestrictServerCommands = nullptr;
+bool* m_bRestrictClientCommands = nullptr;
 //#endif
+
+//---------------------------------------------------------------------------------
+// Purpose: define if commands from the server should be restricted or not.
+// Input  : bRestricted - 
+// Output :
+//---------------------------------------------------------------------------------
+void CEngineClient::SetRestrictServerCommands(bool bRestricted)
+{
+	*m_bRestrictServerCommands = bRestricted;
+}
+
+//---------------------------------------------------------------------------------
+// Purpose: get value for if commands are restricted from servers.
+// Input  :
+// Output : bool
+//---------------------------------------------------------------------------------
+bool CEngineClient::GetRestrictServerCommands()
+{
+	return *m_bRestrictServerCommands;
+}
+
+//---------------------------------------------------------------------------------
+// Purpose: define if commands on the client should be restricted or not.
+// Input  : bRestricted - 
+// Output :
+//---------------------------------------------------------------------------------
+void CEngineClient::SetRestrictClientCommands(bool bRestricted)
+{
+	*m_bRestrictClientCommands = bRestricted;
+}
+
+//---------------------------------------------------------------------------------
+// Purpose: get value for if commands are restricted for clients.
+// Input  :
+// Output : bool
+//---------------------------------------------------------------------------------
+bool CEngineClient::GetRestrictClientCommands()
+{
+	return *m_bRestrictClientCommands;
+}
+
+
+//---------------------------------------------------------------------------------
+// Purpose: get local player
+// Input  :
+// Output : void* (C_Player)
+//---------------------------------------------------------------------------------
+void* CEngineClient::GetLocalPlayer()
+{
+	return CEngineClient_GetLocalPlayer();
+}
\ No newline at end of file
diff --git a/r5dev/client/vengineclient_impl.h b/r5dev/client/vengineclient_impl.h
index c1d7004f..46f70922 100644
--- a/r5dev/client/vengineclient_impl.h
+++ b/r5dev/client/vengineclient_impl.h
@@ -1,31 +1,68 @@
 #pragma once
 
+class CEngineClient
+{
+public:
+	void SetRestrictServerCommands(bool bRestrict);
+	bool GetRestrictServerCommands();
+	void SetRestrictClientCommands(bool bRestrict);
+	bool GetRestrictClientCommands();
+	void* GetLocalPlayer(); // Is actually C_Player.
+};
+
 /* ==== CVENGINECLIENT ================================================================================================================================================== */
-inline CMemory p_IVEngineClient_CommandExecute;
-inline auto IVEngineClient_CommandExecute = p_IVEngineClient_CommandExecute.RCast<void(*)(void* thisptr, const char* pCmd)>();
+inline CMemory p_CEngineClient_CommandExecute;
+inline auto CEngineClient_CommandExecute = p_CEngineClient_CommandExecute.RCast<void(*)(void* thisptr, const char* pCmd)>();
+
+inline CMemory p_CEngineClient_GetLocalPlayer;
+inline auto CEngineClient_GetLocalPlayer = p_CEngineClient_GetLocalPlayer.RCast<void*(*)()>();
 
 ///////////////////////////////////////////////////////////////////////////////
+inline CEngineClient** g_ppEngineClient = nullptr;
+inline CMemory g_pEngineClient_VTable = nullptr;
+
 extern bool* m_bRestrictServerCommands;
+extern bool* m_bRestrictClientCommands;
 
 ///////////////////////////////////////////////////////////////////////////////
 class HVEngineClient : public IDetour
 {
 	virtual void GetAdr(void) const
 	{
-		std::cout << "| FUN: IVEngineClient::CommandExecute       : 0x" << std::hex << std::uppercase << p_IVEngineClient_CommandExecute.GetPtr() << std::setw(nPad) << " |" << std::endl;
+		std::cout << "| FUN: IVEngineClient::CommandExecute       : 0x" << std::hex << std::uppercase << p_CEngineClient_CommandExecute.GetPtr() << std::setw(nPad) << " |" << std::endl;
 		std::cout << "| VAR: m_bRestrictServerCommands            : 0x" << std::hex << std::uppercase << m_bRestrictServerCommands                << std::setw(0)    << " |" << std::endl;
+		std::cout << "| VAR: m_bRestrictClientCommands            : 0x" << std::hex << std::uppercase << m_bRestrictClientCommands                << std::setw(0)    << " |" << std::endl;
+		std::cout << "| CON: g_ppEngineClient                     : 0x" << std::hex << std::uppercase << g_ppEngineClient                         << std::setw(0)    << " |" << std::endl;
+		std::cout << "| CON: g_pEngineClient_VTable               : 0x" << std::hex << std::uppercase << g_pEngineClient_VTable.GetPtr()          << std::setw(0) << " |" << std::endl;
 		std::cout << "+----------------------------------------------------------------+" << std::endl;
 	}
 	virtual void GetFun(void) const
 	{
-		p_IVEngineClient_CommandExecute = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x20\x48\x8D\x0D\x27\x61\xa5\x1E\x41\x8B\xD8"), "xxxx?xxxxxxxx????xxx");
-		IVEngineClient_CommandExecute = p_IVEngineClient_CommandExecute.RCast<void(*)(void* thisptr, const char* pCmd)>(); /*48 89 5C 24 ?? 57 48 83 EC 20 48 8D 0D ?? ?? ?? ?? 41 8B D8*/
+		p_CEngineClient_CommandExecute = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x20\x48\x8D\x0D\x27\x61\xa5\x1E\x41\x8B\xD8"), "xxxx?xxxxxxxx????xxx");
+		CEngineClient_CommandExecute = p_CEngineClient_CommandExecute.RCast<void(*)(void* thisptr, const char* pCmd)>(); /*48 89 5C 24 ?? 57 48 83 EC 20 48 8D 0D ?? ?? ?? ?? 41 8B D8*/
+
+#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
+		p_CEngineClient_GetLocalPlayer = g_pEngineClient_VTable.WalkVTable(35).Deref().RCast<void*(*)()>();
+#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
+		p_CEngineClient_GetLocalPlayer = g_pEngineClient_VTable.WalkVTable(36).Deref().RCast<void*(*)()>();
+#endif
 	}
 	virtual void GetVar(void) const
 	{
-		m_bRestrictServerCommands = reinterpret_cast<bool*>(g_mGameDll.FindString("DevShotGenerator_Init()").FindPatternSelf("88 05", CMemory::Direction::UP).ResolveRelativeAddressSelf(0x2).OffsetSelf(0x2).GetPtr());
+		CMemory clRestrict = g_mGameDll.FindString("DevShotGenerator_Init()").FindPatternSelf("88 05", CMemory::Direction::UP).ResolveRelativeAddressSelf(0x2).OffsetSelf(0x2);
+		m_bRestrictServerCommands = clRestrict.RCast<bool*>();
+		m_bRestrictClientCommands = clRestrict.Offset(0x1).RCast<bool*>();
+	}
+	virtual void GetCon(void) const 
+	{
+#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
+		g_pEngineClient_VTable = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x8D\x05\x00\x00\x00\x00\x48\x8B\xD9\x48\x89\x01\xF6\xC2\x01\x74\x0A\xBA\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x48\x8B\xC3\x48\x83\xC4\x20\x5B\xC3\xCC\xCC\xCC\xCC\xCC\x48\x85\xC9\x48\x8D\x41\xF8"),
+			"xxx????xxxxxxxxxxxx????x????xxxxxxxxxxxxxxxxxxxxx").ResolveRelativeAddressSelf(0x3, 0x7); /*48 8D 05 ? ? ? ? 48 8B D9 48 89 01 F6 C2 01 74 0A BA ? ? ? ? E8 ? ? ? ? 48 8B C3 48 83 C4 20 5B C3 CC CC CC CC CC 48 85 C9 48 8D 41 F8*/
+#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
+		g_pEngineClient_VTable = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x8B\x05\x00\x00\x00\x00\xFF\x90\x00\x00\x00\x00\x4C\x8D\x05\x00\x00\x00\x00"), "xxx????xx????xxx????").ResolveRelativeAddressSelf(0x3, 0x7).Deref(); /*48 8B 05 ? ? ? ? FF 90 ? ? ? ? 4C 8D 05 ? ? ? ? */
+#endif
+		g_ppEngineClient = g_mGameDll.FindString("reload_script_callbacks_server").FindPatternSelf("48 8B", CMemory::Direction::UP).ResolveRelativeAddressSelf(0x3, 0x7).RCast<CEngineClient**>();
 	}
-	virtual void GetCon(void) const { }
 	virtual void Attach(void) const { }
 	virtual void Detach(void) const { }
 };
diff --git a/r5dev/common/netmessages.h b/r5dev/common/netmessages.h
index 46c8a40b..4246ed3a 100644
--- a/r5dev/common/netmessages.h
+++ b/r5dev/common/netmessages.h
@@ -69,13 +69,13 @@ inline CMemory MM_Heartbeat__ToString; // server HeartBeat? (baseserver.cpp).
 // SVC_Print
 //-------------------------------------------------------------------------
 inline auto SVC_Print_Process = CMemory().RCast<bool(*)(SVC_Print* thisptr)>();
-inline void* g_pSVC_Print_VTable;
+inline void* g_pSVC_Print_VTable = nullptr;
 
 //-------------------------------------------------------------------------
 // SVC_UserMessage
 //-------------------------------------------------------------------------
 inline auto SVC_UserMessage_Process = CMemory().RCast<bool(*)(SVC_UserMessage* thisptr)>();
-inline void* g_pSVC_UserMessage_VTable;
+inline void* g_pSVC_UserMessage_VTable = nullptr;
 
 void CNetMessages_Attach();
 void CNetMessages_Detach();
diff --git a/r5dev/core/init.cpp b/r5dev/core/init.cpp
index 4263ed00..8e164034 100644
--- a/r5dev/core/init.cpp
+++ b/r5dev/core/init.cpp
@@ -123,9 +123,9 @@ void Systems_Init()
 	initTimer.Start();
 	for (IDetour* pDetour : vDetour)
 	{
+		pDetour->GetCon();
 		pDetour->GetFun();
 		pDetour->GetVar();
-		pDetour->GetCon();
 	}
 	initTimer.End();
 	spdlog::info("+-------------------------------------------------------------+\n");
diff --git a/r5dev/engine/sys_dll2.cpp b/r5dev/engine/sys_dll2.cpp
index 4b0c2140..e3f36776 100644
--- a/r5dev/engine/sys_dll2.cpp
+++ b/r5dev/engine/sys_dll2.cpp
@@ -50,7 +50,7 @@ bool CEngineAPI::ModInit(CEngineAPI* pEngineAPI, const char* pModName, const cha
 	bool results = CEngineAPI_ModInit(pEngineAPI, pModName, pGameDir);
 	if (!IsValveMod(pModName) && IsRespawnMod(pModName))
 	{
-		*m_bRestrictServerCommands = true; // Restrict commands.
+		(*g_ppEngineClient)->SetRestrictServerCommands(true); // Restrict commands.
 
 		ConCommandBase* disconnect = g_pCVar->FindCommandBase("disconnect");
 		disconnect->AddFlags(FCVAR_SERVER_CAN_EXECUTE); // Make sure server is not restricted to this.
diff --git a/r5dev/gameui/IBrowser.cpp b/r5dev/gameui/IBrowser.cpp
index fdceff51..3d3109da 100644
--- a/r5dev/gameui/IBrowser.cpp
+++ b/r5dev/gameui/IBrowser.cpp
@@ -669,7 +669,7 @@ void IBrowser::SendHostingPostRequest(void)
 //-----------------------------------------------------------------------------
 void IBrowser::ProcessCommand(const char* pszCommand)
 {
-    std::thread t(IVEngineClient_CommandExecute, this, pszCommand);
+    std::thread t(CEngineClient_CommandExecute, this, pszCommand);
     t.detach(); // Detach from render thread.
 
     // This is to avoid a race condition.
diff --git a/r5dev/gameui/IConsole.cpp b/r5dev/gameui/IConsole.cpp
index c1ffe2d7..b128a3d4 100644
--- a/r5dev/gameui/IConsole.cpp
+++ b/r5dev/gameui/IConsole.cpp
@@ -522,7 +522,7 @@ void CConsole::ProcessCommand(const char* pszCommand)
 {
     AddLog("# %s\n", pszCommand);
 
-    std::thread t(IVEngineClient_CommandExecute, this, pszCommand);
+    std::thread t(CEngineClient_CommandExecute, this, pszCommand);
     t.detach(); // Detach from render thread.
 
     // This is to avoid a race condition.
diff --git a/r5dev/public/include/memaddr.h b/r5dev/public/include/memaddr.h
index bb6cb7e8..666bc1fe 100644
--- a/r5dev/public/include/memaddr.h
+++ b/r5dev/public/include/memaddr.h
@@ -103,6 +103,18 @@ public:
 		return *this;
 	}
 
+	inline CMemory WalkVTable(ptrdiff_t vfuncIndex)
+	{
+		ptr += (8 * vfuncIndex);
+		return CMemory(this);
+	}
+
+	inline CMemory WalkVTableSelf(ptrdiff_t vfuncIndex)
+	{
+		ptr += (8 * vfuncIndex);
+		return *this;
+	}
+
 	bool CheckOpCodes(const vector<uint8_t> vOpcodeArray) const;
 	void Patch(vector<uint8_t> vOpcodes) const;
 	void PatchString(const string& svString) const;