diff --git a/src/dehacked.c b/src/dehacked.c index 52b2785c3..925d69042 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8735,6 +8735,7 @@ struct { // Custom client features exposed to lua {"FEATURE_INTERMISSIONHUD",1}, + {"FEATURE_VOTEHUD",1}, #endif {NULL,0} diff --git a/src/lua_hud.h b/src/lua_hud.h index 06ba0169b..26b8cf0b0 100644 --- a/src/lua_hud.h +++ b/src/lua_hud.h @@ -44,5 +44,6 @@ boolean LUA_HudEnabled(enum hud option); void LUAh_GameHUD(player_t *stplyr, huddrawlist_h list); void LUAh_ScoresHUD(huddrawlist_h list); void LUAh_IntermissionHUD(huddrawlist_h list); +void LUAh_VoteHUD(huddrawlist_h list); #endif // __LUA_HUD_H__ diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index f2eeae4c9..470fad9b7 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -86,11 +86,13 @@ enum hudhook { hudhook_game = 0, hudhook_scores = 1, hudhook_intermission = 2, + hudhook_vote = 3, }; static const char *const hudhook_opt[] = { "game", "scores", "intermission", + "vote", NULL}; // alignment types for v.drawString @@ -993,6 +995,9 @@ int LUA_HudLib(lua_State *L) lua_newtable(L); lua_rawseti(L, -2, 4); // HUD[4] = intermission rendering functions array + + lua_newtable(L); + lua_rawseti(L, -2, 5); // HUD[5] = vote rendering functions array lua_setfield(L, LUA_REGISTRYINDEX, "HUD"); luaL_newmetatable(L, META_HUDINFO); @@ -1061,7 +1066,7 @@ void LUAh_GameHUD(player_t *stplayr, huddrawlist_h list) lua_getfield(gL, LUA_REGISTRYINDEX, "HUD"); I_Assert(lua_istable(gL, -1)); - lua_rawgeti(gL, -1, 2); // HUD[2] = rendering funcs + lua_rawgeti(gL, -1, hudhook_game+2); // HUD[2] = rendering funcs I_Assert(lua_istable(gL, -1)); lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw @@ -1119,7 +1124,7 @@ void LUAh_ScoresHUD(huddrawlist_h list) lua_getfield(gL, LUA_REGISTRYINDEX, "HUD"); I_Assert(lua_istable(gL, -1)); - lua_rawgeti(gL, -1, 3); // HUD[3] = rendering funcs + lua_rawgeti(gL, -1, hudhook_scores+2); // HUD[3] = rendering funcs I_Assert(lua_istable(gL, -1)); lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw @@ -1152,7 +1157,40 @@ void LUAh_IntermissionHUD(huddrawlist_h list) lua_getfield(gL, LUA_REGISTRYINDEX, "HUD"); I_Assert(lua_istable(gL, -1)); - lua_rawgeti(gL, -1, 4); // HUD[4] = rendering funcs + lua_rawgeti(gL, -1, hudhook_intermission+2); // HUD[4] = rendering funcs + I_Assert(lua_istable(gL, -1)); + + lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw + I_Assert(lua_istable(gL, -1)); + lua_remove(gL, -3); // pop HUD + lua_pushnil(gL); + while (lua_next(gL, -3) != 0) { + lua_pushvalue(gL, -3); // graphics library (HUD[1]) + LUA_Call(gL, 1, 0, 1); + } + lua_settop(gL, 0); + hud_running = false; + + lua_pushlightuserdata(gL, NULL); + lua_setfield(gL, LUA_REGISTRYINDEX, "HUD_DRAW_LIST"); +} + +void LUAh_VoteHUD(huddrawlist_h list) +{ + if (!gL || !(hudAvailable & (1<