diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 54a5443c9..815461f62 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -163,8 +163,6 @@ SINT8 joinnode = 0; // used for CL_VIEWSERVER char connectedservername[MAXSERVERNAME]; char connectedservercontact[MAXSERVERCONTACT]; char connectedserverdescription[MAXSERVERDESCRIPTION]; -servermods_t connectedservercustommods[MAXSERVERMODS]; -UINT8 numcustomservermods = 0; /// \brief do we accept new players? /// \todo WORK! diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 2a0ae8c7c..0002cdb80 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -47,17 +47,6 @@ applications may follow different packet versions. #define MAXSERVERDESCRIPTIONLINE 40 #define DEFAULTDESCSTRING "Welcome to my SRB2Kart server!\n" -#define MAXSERVERMODS 255 -#define MAXSERVERMODNAME 13 - -struct servermods_t -{ - char modname[MAXSERVERMODNAME]; - consvar_t *cvar; - SINT8 active; // -1 is N/A (example:if using cvar activation), 0 is off, 1 is on. - boolean valid; -}; - // Sends over info via packets to client players. void ServerInfoUpdateSend(void); @@ -488,8 +477,6 @@ extern SINT8 servernode; extern char connectedservername[MAXSERVERNAME]; extern char connectedservercontact[MAXSERVERCONTACT]; extern char connectedserverdescription[MAXSERVERDESCRIPTION]; -extern servermods_t connectedservercustommods[MAXSERVERMODS]; -extern UINT8 numcustomservermods; void Command_Ping_f(void); extern tic_t connectiontimeout; diff --git a/src/d_main.cpp b/src/d_main.cpp index 6c682d9d9..52c714584 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -76,6 +76,7 @@ // SRB2Kart #include "k_grandprix.h" #include "k_boss.h" +#include "k_hud.h" #include "doomstat.h" #include "m_random.h" // P_ClearRandom #include "acs/interface.h" @@ -1213,6 +1214,10 @@ void D_StartTitle(void) // Reset GP memset(&grandprixinfo, 0, sizeof(struct grandprixinfo)); + // Reset Server mods + numcustomservermods = 0; + memset(customservermods, 0, sizeof(customservermods)); + // Reset boss info K_ResetBossInfo(); diff --git a/src/deh_tables.c b/src/deh_tables.c index 9b350cb81..e6037e5de 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -30,6 +30,7 @@ #include "k_bot.h" // bot constants (for lua) #include "g_input.h" // Game controls (for lua) #include "k_kart.h" // awardscaledrings_t +#include "k_hud.h" // scoreboardmod_e #include "k_waypoint.h" // waypoint values (for lua) #include "deh_tables.h" @@ -1636,5 +1637,10 @@ struct int_const_s const INT_CONST[] = { // k_waypoint.h values {"DEFAULT_WAYPOINT_RADIUS",DEFAULT_WAYPOINT_RADIUS}, + // scoreboardmod + {"SCOREBOARDMOD_NOTUSED", SCOREBOARDMOD_NOTUSED}, + {"SCOREBOARDMOD_INACTIVE", SCOREBOARDMOD_INACTIVE}, + {"SCOREBOARDMOD_ACTIVE", SCOREBOARDMOD_ACTIVE}, + {NULL,0} }; diff --git a/src/k_hud.c b/src/k_hud.c index 002a36789..0894b5b6c 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -2208,6 +2208,56 @@ INT32 K_DrawNeoTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines return x+rightoffset; } +servermods_t customservermods[MAXSERVERMODS]; +UINT8 numcustomservermods = 0; + +// Adds a new mod to the scoreboard display. +void K_AddNewScoreboardMod(const char *name, const consvar_t *cvar, SINT8 active) +{ + UINT32 hashcompare = HASH32(name, MAXSERVERMODNAME); + UINT8 i; + + for (i = 0; i < MAXSERVERMODS; i++) + { + if (customservermods[i].hash == hashcompare) + { + CONS_Alert(CONS_WARNING, "Scoreboard mod '%s' has already been added to the scoreboard.\n", name); + return; + } + } + + if (numcustomservermods+1 == MAXSERVERMODS) + { + CONS_Alert(CONS_ERROR, "Maximum Amount of scoreboard mods has been reached.\n"); + return; + } + + strncpy(customservermods[numcustomservermods].modname, name, MAXSERVERMODNAME); + customservermods[numcustomservermods].hash = hashcompare; + customservermods[numcustomservermods].cvar = cvar; + customservermods[numcustomservermods].active = CLAMP(active, SCOREBOARDMOD_NOTUSED, SCOREBOARDMOD_ACTIVE); + customservermods[numcustomservermods].valid = true; + numcustomservermods++; +} + +// Change the status of static scoreboard displays. +void K_SetScoreboardModStatus(const char *name, SINT8 active) +{ + UINT32 hashcompare = HASH32(name, MAXSERVERMODNAME); + UINT8 i; + + for (i = 0; i < MAXSERVERMODS; i++) + { + if (customservermods[i].hash == hashcompare) + { + customservermods[i].active = CLAMP(active, SCOREBOARDMOD_NOTUSED, SCOREBOARDMOD_ACTIVE); + return; + } + } + + CONS_Alert(CONS_WARNING, "Server mod '%s' does not exist so status cannot be changed.\n", name); +} + #define BASEMODS 11 void K_DrawServerMods(INT32 x, INT32 y) { @@ -2217,23 +2267,23 @@ void K_DrawServerMods(INT32 x, INT32 y) servermods_t basemods[BASEMODS] = { - {"Rings", NULL, K_RingsActive() > 0, true}, - {"4-Tier Drifts", NULL, K_PurpleDriftActive() > 0, true}, - {"Slipdash", NULL, K_SlipdashActive() > 0, true}, - {"Stacking", NULL, K_StackingActive() > 0, true}, - {"Chaining", NULL, K_ChainingActive() > 0, true}, - {"Chain Offroad", &cv_kartchainingoffroad, -1, true}, - {"Slope Boost", NULL, K_PurpleDriftActive() > 0, true}, - {"Drafting", NULL, K_PurpleDriftActive() > 0, true}, - {"Bump Spark", &cv_kartbumpspark, -1, true}, - {"Bump Spring", &cv_kartbumpspring, -1, true}, - {"Alt. Invin.", NULL, K_GetKartInvinType() == KARTINVIN_ALTERN, true} + {"Rings", 0, NULL, K_RingsActive() > 0, true}, + {"4-Tier Drifts", 0, NULL, K_PurpleDriftActive() > 0, true}, + {"Slipdash", 0, NULL, K_SlipdashActive() > 0, true}, + {"Stacking", 0, NULL, K_StackingActive() > 0, true}, + {"Chaining", 0, NULL, K_ChainingActive() > 0, true}, + {"Chain Offroad", 0, &cv_kartchainingoffroad, -1, true}, + {"Slope Boost", 0, NULL, K_PurpleDriftActive() > 0, true}, + {"Drafting", 0, NULL, K_PurpleDriftActive() > 0, true}, + {"Bump Spark", 0, &cv_kartbumpspark, -1, true}, + {"Bump Spring", 0, &cv_kartbumpspring, -1, true}, + {"Alt. Invin.", 0, NULL, K_GetKartInvinType() == KARTINVIN_ALTERN, true} }; for (j = 0; j < 2; j++) { UINT8 modcount = j == 0 ? BASEMODS : numcustomservermods; - servermods_t *modslist = j == 0 ? basemods : connectedservercustommods; + servermods_t *modslist = j == 0 ? basemods : customservermods; // Draw the the modlist. for (i = 0; i < modcount; i++) @@ -2246,7 +2296,7 @@ void K_DrawServerMods(INT32 x, INT32 y) { drawdis = true; } - else if (modslist[i].active == 1) + else if (modslist[i].active == SCOREBOARDMOD_ACTIVE) { drawdis = true; } diff --git a/src/k_hud.h b/src/k_hud.h index 7052614d4..5e4d4e6ab 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -102,6 +102,30 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI INT32 K_DrawNeoTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol, boolean split); void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol); +#define MAXSERVERMODS 255 +#define MAXSERVERMODNAME 13 + +struct servermods_t +{ + char modname[MAXSERVERMODNAME]; + UINT32 hash; + const consvar_t *cvar; + SINT8 active; // -1 is N/A (example: if using cvar activation), 0 is off, 1 is on. + boolean valid; +}; + +typedef enum +{ + SCOREBOARDMOD_NOTUSED = -1, + SCOREBOARDMOD_INACTIVE, + SCOREBOARDMOD_ACTIVE, +} scoreboardmod_e; + +extern servermods_t customservermods[MAXSERVERMODS]; +extern UINT8 numcustomservermods; +void K_AddNewScoreboardMod(const char *name, const consvar_t *cvar, SINT8 active); +void K_SetScoreboardModStatus(const char *name, SINT8 active); + void K_DrawServerDescrption(INT32 x, INT32 y); void K_DrawDriftGauge(void); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 9aeff1ce8..8d9b23125 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4349,6 +4349,29 @@ static int lib_kAwardScaledPlayerRings(lua_State *L) return 0; } +static int lib_kAddNewScoreboardMod(lua_State *L) +{ + const char *modname = luaL_checkstring(L, 1); + const char *cvarname = lua_isnil(L, 2) ? NULL : luaL_checkstring(L, 2); + const consvar_t *cvar = lua_isnil(L, 2) ? NULL : CV_FindVar(cvarname); + SINT8 active = SCOREBOARDMOD_NOTUSED; + + if (!cvarname || !cvar) + active = SCOREBOARDMOD_ACTIVE; + + K_AddNewScoreboardMod(modname, cvar, active); + return 0; +} + +static int lib_kSetScoreboardModStatus(lua_State *L) +{ + const char *modname = luaL_checkstring(L, 1); + SINT8 active = CLAMP(luaL_checkinteger(L, 2), SCOREBOARDMOD_NOTUSED, SCOREBOARDMOD_ACTIVE); + + K_SetScoreboardModStatus(modname, active); + return 0; +} + static int lib_kPlayerUsesBotMovement(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); @@ -5257,6 +5280,10 @@ static luaL_Reg lib[] = { {"K_AwardPlayerRings", lib_kAwardPlayerRings}, {"K_AwardScaledPlayerRings", lib_kAwardScaledPlayerRings}, + // k_hud + {"K_AddNewScoreboardMod", lib_kAddNewScoreboardMod}, + {"K_SetScoreboardModStatus", lib_kSetScoreboardModStatus}, + // k_waypoint {"K_NextRespawnWaypointIndex", lib_kNextRespawnWaypointIndex}, {"K_GetFinishLineWaypoint", lib_kGetFinishLineWaypoint}, diff --git a/src/typedef.h b/src/typedef.h index 81b686f84..b34af2b44 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -72,7 +72,6 @@ TYPEDEF (doomdata_t); TYPEDEF (serverelem_t); TYPEDEF (rewind_t); TYPEDEF (netinfo_pak); -TYPEDEF (servermods_t); // d_event.h TYPEDEF (event_t); @@ -178,6 +177,7 @@ TYPEDEF (followercategory_t); // k_hud.h TYPEDEF (trackingResult_t); +TYPEDEF (servermods_t); // k_menu.h TYPEDEF (menucolor_t);