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:
parent
ed461703b3
commit
eef0d966a3
8 changed files with 126 additions and 29 deletions
|
|
@ -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!
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
};
|
||||
|
|
|
|||
76
src/k_hud.c
76
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;
|
||||
}
|
||||
|
|
|
|||
24
src/k_hud.h
24
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);
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue