diff --git a/src/lua_hook.h b/src/lua_hook.h
index da2dcdc380461cefd958b9f42bfbe738a98d724b..cfa9a1446354d975d4f9d739f7bba7390ce79728 100644
--- a/src/lua_hook.h
+++ b/src/lua_hook.h
@@ -14,6 +14,7 @@
 
 #include "r_defs.h"
 #include "d_player.h"
+#include "blua/lua.h"
 
 enum hook {
 	hook_NetVars=0,
@@ -47,6 +48,7 @@ enum hook {
 };
 extern const char *const hookNames[];
 
+void LUAh_NetArchiveHook(lua_CFunction archFunc);
 void LUAh_MapChange(void); // Hook for map change (before load)
 void LUAh_MapLoad(void); // Hook for map load
 void LUAh_PlayerJoin(int playernum); // Hook for Got_AddPlayer
diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c
index 0415d23e61acfe98705ec8855846b06297fcdf02..273c70a12343582a96e25a9bfa7971bbbc7b7394 100644
--- a/src/lua_hooklib.c
+++ b/src/lua_hooklib.c
@@ -173,6 +173,34 @@ int LUA_HookLib(lua_State *L)
 	return 0;
 }
 
+void LUAh_NetArchiveHook(lua_CFunction archFunc)
+{
+	int TABLESINDEX;
+	hook_p hookp;
+
+	if (!gL)
+		return;
+
+	TABLESINDEX = lua_gettop(gL);
+
+	lua_settop(gL, 0);
+
+	lua_pushvalue(gL, TABLESINDEX);
+	lua_pushcclosure(gL, archFunc, 1);
+	lua_pushnil(gL);
+
+	for (hookp = roothook; hookp; hookp = hookp->next)
+		if (hookp->type == hook_NetVars)
+		{
+			lua_pushfstring(gL, FMT_HOOKID, hookp->id);
+			lua_gettable(gL, LUA_REGISTRYINDEX);
+			lua_pushvalue(gL, -2);
+			LUA_Call(gL, 1);
+		}
+
+	lua_pop(gL, 2);
+}
+
 boolean LUAh_MobjHook(mobj_t *mo, enum hook which)
 {
 	hook_p hookp;
diff --git a/src/lua_script.c b/src/lua_script.c
index a7315ad622438608ad207d805ea455aec3570a3a..9925bac02ee05cf5d7f686b6ddde09005f69f5be 100644
--- a/src/lua_script.c
+++ b/src/lua_script.c
@@ -915,30 +915,6 @@ static void UnArchiveTables(void)
 	}
 }
 
-static void NetArchiveHook(lua_CFunction archFunc)
-{
-	int TABLESINDEX;
-
-	if (!gL)
-		return;
-
-	TABLESINDEX = lua_gettop(gL);
-	lua_getfield(gL, LUA_REGISTRYINDEX, "hook");
-	I_Assert(lua_istable(gL, -1));
-	lua_rawgeti(gL, -1, hook_NetVars);
-	lua_remove(gL, -2);
-	I_Assert(lua_istable(gL, -1));
-
-	lua_pushvalue(gL, TABLESINDEX);
-	lua_pushcclosure(gL, archFunc, 1);
-	lua_pushnil(gL);
-	while (lua_next(gL, -3) != 0) {
-		lua_pushvalue(gL, -3); // function
-		LUA_Call(gL, 1);
-	}
-	lua_pop(gL, 2);
-}
-
 void LUA_Step(void)
 {
 	if (!gL)
@@ -972,7 +948,7 @@ void LUA_Archive(void)
 		}
 	WRITEUINT32(save_p, UINT32_MAX); // end of mobjs marker, replaces mobjnum.
 
-	NetArchiveHook(NetArchive); // call the NetArchive hook in archive mode
+	LUAh_NetArchiveHook(NetArchive); // call the NetArchive hook in archive mode
 	ArchiveTables();
 
 	if (gL)
@@ -1003,7 +979,7 @@ void LUA_UnArchive(void)
 				UnArchiveExtVars(th); // apply variables
 	} while(mobjnum != UINT32_MAX); // repeat until end of mobjs marker.
 
-	NetArchiveHook(NetUnArchive); // call the NetArchive hook in unarchive mode
+	LUAh_NetArchiveHook(NetUnArchive); // call the NetArchive hook in unarchive mode
 	UnArchiveTables();
 
 	if (gL)