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)