diff --git a/r5dev/squirrel/sqapi.cpp b/r5dev/squirrel/sqapi.cpp
index 3b19ab71..d46ffddd 100644
--- a/r5dev/squirrel/sqapi.cpp
+++ b/r5dev/squirrel/sqapi.cpp
@@ -44,12 +44,6 @@ void sq_pushinteger(HSQUIRRELVM v, SQInteger val)
 	v_sq_pushinteger(v, val);
 }
 
-//---------------------------------------------------------------------------------
-void sq_pushconstant(HSQUIRRELVM v, const SQChar* name, SQInteger val)
-{
-	v_sq_pushconstant(v, name, val);
-}
-
 //---------------------------------------------------------------------------------
 void sq_newarray(HSQUIRRELVM v, SQInteger size)
 {
@@ -98,7 +92,6 @@ void SQAPI_Attach()
 	DetourAttach((LPVOID*)&v_sq_pushbool, &sq_pushbool);
 	DetourAttach((LPVOID*)&v_sq_pushstring, &sq_pushstring);
 	DetourAttach((LPVOID*)&v_sq_pushinteger, &sq_pushinteger);
-	DetourAttach((LPVOID*)&v_sq_pushconstant, &sq_pushconstant);
 	DetourAttach((LPVOID*)&v_sq_newarray, &sq_newarray);
 	DetourAttach((LPVOID*)&v_sq_newtable, &sq_newtable);
 	DetourAttach((LPVOID*)&v_sq_newslot, &sq_newslot);
@@ -114,7 +107,6 @@ void SQAPI_Detach()
 	DetourDetach((LPVOID*)&v_sq_pushbool, &sq_pushbool);
 	DetourDetach((LPVOID*)&v_sq_pushstring, &sq_pushstring);
 	DetourDetach((LPVOID*)&v_sq_pushinteger, &sq_pushinteger);
-	DetourDetach((LPVOID*)&v_sq_pushconstant, &sq_pushconstant);
 	DetourDetach((LPVOID*)&v_sq_newarray, &sq_newarray);
 	DetourDetach((LPVOID*)&v_sq_newtable, &sq_newtable);
 	DetourDetach((LPVOID*)&v_sq_newslot, &sq_newslot);
diff --git a/r5dev/squirrel/sqapi.h b/r5dev/squirrel/sqapi.h
index 490be28f..8d2eba1c 100644
--- a/r5dev/squirrel/sqapi.h
+++ b/r5dev/squirrel/sqapi.h
@@ -10,7 +10,6 @@ SQRESULT sq_pushroottable(HSQUIRRELVM v);
 void sq_pushbool(HSQUIRRELVM v, SQBool b);
 void sq_pushstring(HSQUIRRELVM v, const SQChar* string, SQInteger len);
 void sq_pushinteger(HSQUIRRELVM v, SQInteger val);
-void sq_pushconstant(HSQUIRRELVM v, const SQChar* name, SQInteger val);
 void sq_newarray(HSQUIRRELVM v, SQInteger size);
 void sq_newtable(HSQUIRRELVM v);
 SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx);
@@ -35,9 +34,6 @@ inline auto v_sq_pushstring = p_sq_pushstring.RCast<void (*)(HSQUIRRELVM v, cons
 inline CMemory p_sq_pushinteger;
 inline auto v_sq_pushinteger = p_sq_pushinteger.RCast<void (*)(HSQUIRRELVM v, SQInteger val)>();
 
-inline CMemory p_sq_pushconstant;
-inline auto v_sq_pushconstant = p_sq_pushconstant.RCast<void (*)(HSQUIRRELVM v, const SQChar* name, SQInteger val)>();
-
 inline CMemory p_sq_newarray;
 inline auto v_sq_newarray = p_sq_newarray.RCast<void (*)(HSQUIRRELVM v, SQInteger size)>();
 
@@ -68,7 +64,6 @@ class VSqapi : public IDetour
 		spdlog::debug("| FUN: sq_pushbool                          : {:#18x} |\n", p_sq_pushbool.GetPtr());
 		spdlog::debug("| FUN: sq_pushstring                        : {:#18x} |\n", p_sq_pushstring.GetPtr());
 		spdlog::debug("| FUN: sq_pushinteger                       : {:#18x} |\n", p_sq_pushinteger.GetPtr());
-		spdlog::debug("| FUN: sq_pushconstant                      : {:#18x} |\n", p_sq_pushconstant.GetPtr());
 		spdlog::debug("| FUN: sq_newarray                          : {:#18x} |\n", p_sq_newarray.GetPtr());
 		spdlog::debug("| FUN: sq_arrayappend                       : {:#18x} |\n", p_sq_arrayappend.GetPtr());
 		spdlog::debug("| FUN: sq_newtable                          : {:#18x} |\n", p_sq_newtable.GetPtr());
@@ -88,7 +83,6 @@ class VSqapi : public IDetour
 		p_sq_pushstring = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x40\x56\x48\x83\xEC\x30\x48\x8B\xF1\x48\x85\xD2\x0F\x84\x8F\x00"), "xxxxxxxxxxxxxxxx");
 #endif
 		p_sq_pushinteger  = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x83\xEC\x38\x33\xC0\x48\xC7\x44\x24\x20\x02\x00\x00\x05\x48"), "xxxxxxxxxxxxxxxx");
-		p_sq_pushconstant = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x00\x48\x89\x6C\x24\x00\x48\x89\x74\x24\x00\x57\x48\x83\xEC\x30\x4C\x8B"), "xxxx?xxxx?xxxx?xxxxxxx");
 		p_sq_newarray     = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x30\x48\x8B\xD9\x48\xC7\x44\x24\x20\x40"), "xxxxxxxxxxxxxxxxxxx");
 		p_sq_newtable     = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x30\x48\x8B\xD9\x48\xC7\x44\x24\x20\x20"), "xxxxxxxxxxxxxxxxxxx");
 		p_sq_newslot      = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x40\x53\x48\x83\xEC\x30\x44\x8B\x49\x00\x48\x8B\xD9\x41\x8B\xC1"), "xxxxxxxxx?xxxxxx");
@@ -105,7 +99,6 @@ class VSqapi : public IDetour
 		v_sq_pushbool      = p_sq_pushbool.RCast<void (*)(HSQUIRRELVM, SQBool)>();                                                             /*48 83 EC 38 33 C0 48 C7 44 24 20 08 00 00 01 48*/
 		v_sq_pushstring    = p_sq_pushstring.RCast<void (*)(HSQUIRRELVM, const SQChar*, SQInteger)>();                                         /*40 56 48 83 EC 30 48 8B F1 48 85 D2 0F 84 8F 00*/
 		v_sq_pushinteger   = p_sq_pushinteger.RCast<void (*)(HSQUIRRELVM, SQInteger)>();                                                       /*48 83 EC 38 33 C0 48 C7 44 24 20 02 00 00 05 48*/
-		v_sq_pushconstant  = p_sq_pushconstant.RCast<void (*)(HSQUIRRELVM, const SQChar*, SQInteger)>();                                       /*48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 48 83 EC 30 4C 8B*/
 		v_sq_newarray      = p_sq_newarray.RCast<void (*)(HSQUIRRELVM, SQInteger)>();                                                          /*48 89 5C 24 08 57 48 83 EC 30 48 8B D9 48 C7 44 24 20 40*/
 		v_sq_newtable      = p_sq_newtable.RCast<void (*)(HSQUIRRELVM)>();                                                                     /*48 89 5C 24 08 57 48 83 EC 30 48 8B D9 48 C7 44 24 20 20*/
 		v_sq_newslot       = p_sq_newslot.RCast<SQRESULT(*)(HSQUIRRELVM, SQInteger)>();                                                        /*40 53 48 83 EC 20 8B 41 ?? 48 8B D9 2B 41 ?? 83 F8 02 7D*/
diff --git a/r5dev/squirrel/sqscript.cpp b/r5dev/squirrel/sqscript.cpp
index 95be0ee8..14cfae3d 100644
--- a/r5dev/squirrel/sqscript.cpp
+++ b/r5dev/squirrel/sqscript.cpp
@@ -125,18 +125,32 @@ void Script_RegisterUIFunctions(CSquirrelVM* pSquirrelVM)
 	Script_RegisterFunction(pSquirrelVM, "ShutdownHostGame", "Script_ShutdownHostGame", "Shuts the local host game down", "void", "", &VSquirrel::SHARED::ShutdownHostGame);
 }
 
+//---------------------------------------------------------------------------------
+// Purpose: registers global constant for target context
+// Input  : *pSquirrelVM - 
+//			*name - 
+//			val - 
+//---------------------------------------------------------------------------------
+SQRESULT Script_RegisterConstant(CSquirrelVM* pSquirrelVM, const SQChar* name, SQInteger val)
+{
+	return v_Script_RegisterConstant(pSquirrelVM, name, val);
+}
+
 //---------------------------------------------------------------------------------
 // Purpose: Initialize all CLIENT/UI global structs and register SDK (CLIENT/UI) script functions
 // Input  : *pSquirrelVM - 
 //			context - (1 = CLIENT 2 = UI)
 //---------------------------------------------------------------------------------
-SQRESULT Script_InitializeCLGlobalStructs(CSquirrelVM* pSquirrelVM, SQCONTEXT context)
+SQRESULT Script_InitializeCLGlobalStructs(HSQUIRRELVM v, SQCONTEXT context)
 {
-	SQRESULT results = v_Script_InitializeCLGlobalStructs(pSquirrelVM, context);
+	SQRESULT results = v_Script_InitializeCLGlobalStructs(v, context);
+
 	if (context == SQCONTEXT::CLIENT)
 		Script_RegisterClientFunctions(g_pClientScript.GetValue<CSquirrelVM*>());
 	if (context == SQCONTEXT::UI)
 		Script_RegisterUIFunctions(g_pUIScript.GetValue<CSquirrelVM*>());
+
+	Script_RegisterConstant(Script_GetContextObject(context), "DEVELOPER", developer->GetInt());
 	return results;
 }
 #endif // !DEDICATED
@@ -146,10 +160,11 @@ SQRESULT Script_InitializeCLGlobalStructs(CSquirrelVM* pSquirrelVM, SQCONTEXT co
 // Purpose: Initialize all SERVER global structs and register SDK (SERVER) script functions
 // Input  : *pSquirrelVM - 
 //---------------------------------------------------------------------------------
-void Script_InitializeSVGlobalStructs(CSquirrelVM* pSquirrelVM)
+void Script_InitializeSVGlobalStructs(HSQUIRRELVM v)
 {
-	v_Script_InitializeSVGlobalStructs(pSquirrelVM);
-	Script_RegisterServerFunctions(g_pServerScript.GetValue<CSquirrelVM*>());
+	v_Script_InitializeSVGlobalStructs(v);
+	Script_RegisterServerFunctions(Script_GetContextObject(SQCONTEXT::SERVER));
+	Script_RegisterConstant(Script_GetContextObject(SQCONTEXT::SERVER), "DEVELOPER", developer->GetInt());
 }
 
 //---------------------------------------------------------------------------------
@@ -160,7 +175,7 @@ SQBool Script_CreateServerVM()
 {
 	SQBool results = v_Script_CreateServerVM();
 	if (results)
-		DevMsg(eDLL_T::SERVER, "Created SERVER VM: '%p'\n", g_pServerScript.GetValue<CSquirrelVM*>());
+		DevMsg(eDLL_T::SERVER, "Created SERVER VM: '%p'\n", Script_GetContextObject(SQCONTEXT::SERVER));
 	else
 		Error(eDLL_T::SERVER, EXIT_FAILURE, "Failed to create SERVER VM\n");
 	return results;
@@ -177,7 +192,7 @@ SQBool Script_CreateClientVM(CHLClient* pHlClient)
 {
 	SQBool results = v_Script_CreateClientVM(pHlClient);
 	if (results)
-		DevMsg(eDLL_T::CLIENT, "Created CLIENT VM: '%p'\n", g_pClientScript.GetValue<CSquirrelVM*>());
+		DevMsg(eDLL_T::CLIENT, "Created CLIENT VM: '%p'\n", Script_GetContextObject(SQCONTEXT::CLIENT));
 	else
 		Error(eDLL_T::CLIENT, EXIT_FAILURE, "Failed to create CLIENT VM\n");
 	return results;
@@ -191,7 +206,7 @@ SQBool Script_CreateUIVM()
 {
 	SQBool results = v_Script_CreateUIVM();
 	if (results)
-		DevMsg(eDLL_T::UI, "Created UI VM: '%p'\n", g_pUIScript.GetValue<CSquirrelVM*>());
+		DevMsg(eDLL_T::UI, "Created UI VM: '%p'\n", Script_GetContextObject(SQCONTEXT::UI));
 	else
 		Error(eDLL_T::UI, EXIT_FAILURE, "Failed to create UI VM\n");
 	return results;
@@ -298,6 +313,7 @@ void Script_Execute(const SQChar* code, const SQCONTEXT context)
 //---------------------------------------------------------------------------------
 void SQScript_Attach()
 {
+	DetourAttach((LPVOID*)&v_Script_RegisterConstant, &Script_RegisterConstant);
 #ifndef DEDICATED
 	DetourAttach((LPVOID*)&v_Script_InitializeCLGlobalStructs, &Script_InitializeCLGlobalStructs);
 #endif // !DEDICATED
@@ -315,6 +331,7 @@ void SQScript_Attach()
 //---------------------------------------------------------------------------------
 void SQScript_Detach()
 {
+	DetourDetach((LPVOID*)&v_Script_RegisterConstant, &Script_RegisterConstant);
 #ifndef DEDICATED
 	DetourDetach((LPVOID*)&v_Script_InitializeCLGlobalStructs, &Script_InitializeCLGlobalStructs);
 #endif // !DEDICATED
diff --git a/r5dev/squirrel/sqscript.h b/r5dev/squirrel/sqscript.h
index 1d09d352..2cb8c933 100644
--- a/r5dev/squirrel/sqscript.h
+++ b/r5dev/squirrel/sqscript.h
@@ -60,13 +60,16 @@ private:
 
 inline CMemory p_Script_RegisterFunction;
 inline auto v_Script_RegisterFunction = p_Script_RegisterFunction.RCast<SQRESULT(*)(CSquirrelVM* pSquirrelVM, ScriptFunctionBinding_t* sqFunc, SQInteger a1)>();
+
+inline CMemory p_Script_RegisterConstant;
+inline auto v_Script_RegisterConstant = p_Script_RegisterConstant.RCast<SQRESULT(*)(CSquirrelVM* pSquirrelVM, const SQChar* name, SQInteger val)>();
 #if !defined (CLIENT_DLL)
 inline CMemory p_Script_InitializeSVGlobalStructs;
-inline auto v_Script_InitializeSVGlobalStructs = p_Script_InitializeSVGlobalStructs.RCast<SQRESULT(*)(CSquirrelVM* pSquirrelVM)>();
+inline auto v_Script_InitializeSVGlobalStructs = p_Script_InitializeSVGlobalStructs.RCast<SQRESULT(*)(HSQUIRRELVM v)>();
 #endif // !CLIENT_DLL
 #if !defined (DEDICATED)
 inline CMemory p_Script_InitializeCLGlobalStructs;
-inline auto v_Script_InitializeCLGlobalStructs = p_Script_InitializeCLGlobalStructs.RCast<SQRESULT(*)(CSquirrelVM* pSquirrelVM, SQCONTEXT context)>();
+inline auto v_Script_InitializeCLGlobalStructs = p_Script_InitializeCLGlobalStructs.RCast<SQRESULT(*)(HSQUIRRELVM v, SQCONTEXT context)>();
 #endif // !DEDICATED
 #if !defined (CLIENT_DLL) && defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
 inline CMemory p_Script_CreateServerVM;
@@ -100,14 +103,15 @@ inline CMemory g_pClientScript;
 inline CMemory g_pUIScript;
 #endif // !DEDICATED
 
+SQRESULT Script_RegisterConstant(CSquirrelVM* pSquirrelVM, const SQChar* name, SQInteger val);
 SQRESULT Script_RegisterFunction(CSquirrelVM* pSquirrelVM, const SQChar* szScriptName, const SQChar* szNativeName,
 	const SQChar* szHelpString, const SQChar* szRetValType, const SQChar* szArgTypes, void* pFunction);
 void Script_RegisterServerFunctions(CSquirrelVM* pSquirrelVM);
 void Script_RegisterClientFunctions(CSquirrelVM* pSquirrelVM);
 void Script_RegisterUIFunctions(CSquirrelVM* pSquirrelVM);
 
-SQRESULT Script_InitializeCLGlobalStructs(CSquirrelVM*, SQCONTEXT context);
-void Script_InitializeSVGlobalStructs(CSquirrelVM* pSquirrelVM);
+SQRESULT Script_InitializeCLGlobalStructs(HSQUIRRELVM v, SQCONTEXT context);
+void Script_InitializeSVGlobalStructs(HSQUIRRELVM v);
 
 SQBool Script_CreateServerVM();
 #ifndef DEDICATED
@@ -128,7 +132,8 @@ class VSquirrelVM : public IDetour
 {
 	virtual void GetAdr(void) const
 	{
-		spdlog::debug("| FUN: Script_RegisterFunc                  : {:#18x} |\n", p_Script_RegisterFunction.GetPtr());
+		spdlog::debug("| FUN: Script_RegisterConstant              : {:#18x} |\n", p_Script_RegisterConstant.GetPtr());
+		spdlog::debug("| FUN: Script_RegisterFunction              : {:#18x} |\n", p_Script_RegisterFunction.GetPtr());
 #ifndef CLIENT_DLL
 		spdlog::debug("| FUN: Script_InitializeSVGlobalStructs     : {:#18x} |\n", p_Script_InitializeSVGlobalStructs.GetPtr());
 #endif // !CLIENT_DLL
@@ -155,6 +160,7 @@ class VSquirrelVM : public IDetour
 	}
 	virtual void GetFun(void) const
 	{
+		p_Script_RegisterConstant = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x00\x48\x89\x6C\x24\x00\x48\x89\x74\x24\x00\x57\x48\x83\xEC\x30\x4C\x8B"), "xxxx?xxxx?xxxx?xxxxxxx");
 		p_Script_RegisterFunction = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x83\xEC\x38\x45\x0F\xB6\xC8"), "xxxxxxxx");
 #if !defined (CLIENT_DLL)
 		p_Script_InitializeSVGlobalStructs = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x74\x24\x00\x57\x48\x83\xEC\x30\x48\x8B\x3D\x00\x00\x00\x00\x48\x8B\xF1"), "xxxx?xxxxxxxx????xxx");
@@ -181,12 +187,13 @@ class VSquirrelVM : public IDetour
 #elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
 		p_Script_LoadScript = g_GameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x8B\xC4\x48\x89\x48\x08\x55\x41\x56\x48\x8D\x68"), "xxxxxxxxxxxxx");
 #endif
+		v_Script_RegisterConstant = p_Script_RegisterConstant.RCast<SQRESULT(*)(CSquirrelVM*, const SQChar*, SQInteger)>();            /*48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 48 83 EC 30 4C 8B*/
 		v_Script_RegisterFunction = p_Script_RegisterFunction.RCast<SQRESULT(*)(CSquirrelVM*, ScriptFunctionBinding_t*, SQInteger)>(); /*48 83 EC 38 45 0F B6 C8*/
 #if !defined (CLIENT_DLL)
-		v_Script_InitializeSVGlobalStructs = p_Script_InitializeSVGlobalStructs.RCast<SQRESULT(*)(CSquirrelVM*)>();                    /*48 89 74 24 ?? 57 48 83 EC 30 48 8B 3D ?? ?? ?? ?? 48 8B F1*/
+		v_Script_InitializeSVGlobalStructs = p_Script_InitializeSVGlobalStructs.RCast<SQRESULT(*)(HSQUIRRELVM)>();                     /*48 89 74 24 ?? 57 48 83 EC 30 48 8B 3D ?? ?? ?? ?? 48 8B F1*/
 #endif // !CLIENT_DLL
 #if !defined (DEDICATED)
-		v_Script_InitializeCLGlobalStructs = p_Script_InitializeCLGlobalStructs.RCast<SQRESULT(*)(CSquirrelVM*, SQCONTEXT)>();         /*48 89 74 24 ?? 48 89 7C 24 ?? 41 56 48 83 EC 30 48 63 C2 48 8D 3D ?? ?? ?? ??*/
+		v_Script_InitializeCLGlobalStructs = p_Script_InitializeCLGlobalStructs.RCast<SQRESULT(*)(HSQUIRRELVM, SQCONTEXT)>();          /*48 89 74 24 ?? 48 89 7C 24 ?? 41 56 48 83 EC 30 48 63 C2 48 8D 3D ?? ?? ?? ??*/
 #endif // !DEDICATED
 #if !defined (CLIENT_DLL)
 		v_Script_CreateServerVM = p_Script_CreateServerVM.RCast<SQBool(*)(void)>();                                                    /*40 53 56 48 83 EC 48 48 8D 0D ?? ?? ?? ??*/
diff --git a/r5dev/tier1/IConVar.cpp b/r5dev/tier1/IConVar.cpp
index 92e2b9e6..cc685943 100644
--- a/r5dev/tier1/IConVar.cpp
+++ b/r5dev/tier1/IConVar.cpp
@@ -230,6 +230,7 @@ void ConVar::InitShipped(void) const
 #if !defined (GAMEDLL_S0) && !defined (GAMEDLL_S1)
 	bhit_enable                      = g_pCVar->FindVar("bhit_enable");
 #endif // !GAMEDLL_S0 && !GAMEDLL_S1
+	developer                        = g_pCVar->FindVar("developer");
 #endif // !CLIENT_DLL
 #ifndef DEDICATED
 	cl_threaded_bone_setup           = g_pCVar->FindVar("cl_threaded_bone_setup");
diff --git a/r5dev/tier1/cvar.cpp b/r5dev/tier1/cvar.cpp
index fe9e5758..73921678 100644
--- a/r5dev/tier1/cvar.cpp
+++ b/r5dev/tier1/cvar.cpp
@@ -14,6 +14,8 @@ ConVar* old_gather_props                   = nullptr;
 ConVar* enable_debug_overlays              = nullptr;
 ConVar* cm_unset_all_cmdquery              = nullptr;
 
+ConVar* developer                          = nullptr;
+
 ConVar* staticProp_defaultBuildFrustum     = nullptr;
 ConVar* staticProp_no_fade_scalar          = nullptr;
 ConVar* staticProp_gather_size_weight      = nullptr;
diff --git a/r5dev/tier1/cvar.h b/r5dev/tier1/cvar.h
index 9b3db641..ae9be600 100644
--- a/r5dev/tier1/cvar.h
+++ b/r5dev/tier1/cvar.h
@@ -10,6 +10,8 @@ extern ConVar* old_gather_props;
 extern ConVar* enable_debug_overlays;
 extern ConVar* cm_unset_all_cmdquery;
 
+extern ConVar* developer;
+
 extern ConVar* staticProp_defaultBuildFrustum;
 extern ConVar* staticProp_no_fade_scalar;
 extern ConVar* staticProp_gather_size_weight;