Allow Lua to add new scoreboard mods

This is just how HostMod does it, so this doesn't need networking
This commit is contained in:
NepDisk 2025-09-03 19:58:27 -04:00
parent ed461703b3
commit eef0d966a3
8 changed files with 126 additions and 29 deletions

View file

@ -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!

View file

@ -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;

View file

@ -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();

View file

@ -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}
};

View file

@ -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;
}

View file

@ -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);

View file

@ -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},

View file

@ -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);