Return full stats struct, dynamically allocate trackedList

This commit is contained in:
AJ Martinez 2023-04-10 18:58:51 -07:00 committed by toaster
parent 4f569641fc
commit 0aabb6ddcd
3 changed files with 78 additions and 26 deletions

View file

@ -4192,10 +4192,10 @@ boolean SV_SpawnServer(void)
SINT8 node = 0;
for (; node < MAXNETNODES; node++)
result |= SV_AddWaitingPlayers(node, availabilitiesbuffer,
cv_playername[0].zstring, PR_GetLocalPlayerProfile(0)->public_key, SV_RetrievePWR(PR_GetLocalPlayerProfile(0)->public_key),
cv_playername[1].zstring, PR_GetLocalPlayerProfile(1)->public_key, SV_RetrievePWR(PR_GetLocalPlayerProfile(1)->public_key),
cv_playername[2].zstring, PR_GetLocalPlayerProfile(2)->public_key, SV_RetrievePWR(PR_GetLocalPlayerProfile(2)->public_key),
cv_playername[3].zstring, PR_GetLocalPlayerProfile(3)->public_key, SV_RetrievePWR(PR_GetLocalPlayerProfile(3)->public_key));
cv_playername[0].zstring, PR_GetLocalPlayerProfile(0)->public_key, SV_RetrieveStats(PR_GetLocalPlayerProfile(0)->public_key)->powerlevels,
cv_playername[1].zstring, PR_GetLocalPlayerProfile(1)->public_key, SV_RetrieveStats(PR_GetLocalPlayerProfile(1)->public_key)->powerlevels,
cv_playername[2].zstring, PR_GetLocalPlayerProfile(2)->public_key, SV_RetrieveStats(PR_GetLocalPlayerProfile(2)->public_key)->powerlevels,
cv_playername[3].zstring, PR_GetLocalPlayerProfile(3)->public_key, SV_RetrieveStats(PR_GetLocalPlayerProfile(3)->public_key)->powerlevels);
}
return result;
#endif
@ -4506,10 +4506,10 @@ static void HandleConnect(SINT8 node)
}
SV_AddWaitingPlayers(node, availabilitiesbuffer,
names[0], lastReceivedKey[node][0], SV_RetrievePWR(lastReceivedKey[node][0]),
names[1], lastReceivedKey[node][1], SV_RetrievePWR(lastReceivedKey[node][1]),
names[2], lastReceivedKey[node][2], SV_RetrievePWR(lastReceivedKey[node][2]),
names[3], lastReceivedKey[node][3], SV_RetrievePWR(lastReceivedKey[node][3]));
names[0], lastReceivedKey[node][0], SV_RetrieveStats(lastReceivedKey[node][0])->powerlevels,
names[1], lastReceivedKey[node][1], SV_RetrieveStats(lastReceivedKey[node][1])->powerlevels,
names[2], lastReceivedKey[node][2], SV_RetrieveStats(lastReceivedKey[node][2])->powerlevels,
names[3], lastReceivedKey[node][3], SV_RetrieveStats(lastReceivedKey[node][3])->powerlevels);
joindelay += cv_joindelay.value * TICRATE;
player_joining = true;
}

View file

@ -17,12 +17,57 @@
#include "m_misc.h" //FIL_WriteFile()
#include "k_serverstats.h"
#include "z_zone.h"
#include "time.h"
static serverplayer_t trackedList[MAXTRACKEDSERVERPLAYERS];
static UINT32 numtracked = 0;
static serverplayer_t *trackedList;
static size_t numtracked = 0;
static size_t numallocated = 0;
static boolean initialized = false;
UINT16 guestpwr[PWRLV_NUMTYPES]; // All-zero power level to reference for guests
static void SV_InitializeStats(void)
{
if (!initialized)
{
numallocated = 8;
trackedList = Z_Calloc(
sizeof(serverplayer_t) * numallocated,
PU_STATIC,
&trackedList
);
if (trackedList == NULL)
{
I_Error("Not enough memory for server stats\n");
}
initialized = true;
}
}
static void SV_ExpandStats(size_t needed)
{
I_Assert(trackedList != NULL);
while (numallocated < needed)
{
numallocated *= numtracked;
trackedList = Z_Realloc(
trackedList,
sizeof(serverplayer_t) * numallocated,
PU_STATIC,
&trackedList
);
if (trackedList == NULL)
{
I_Error("Not enough memory for server stats\n");
}
}
}
// Read stats file to trackedList for ingame use
void SV_LoadStats(void)
{
@ -37,6 +82,8 @@ void SV_LoadStats(void)
return;
}
SV_InitializeStats();
if (strncmp(SERVERSTATSHEADER, (const char *)save.buffer, headerlen))
{
const char *gdfolder = "the Ring Racers folder";
@ -51,8 +98,8 @@ void SV_LoadStats(void)
UINT8 version = READUINT8(save.p);
numtracked = READUINT32(save.p);
if (numtracked > MAXTRACKEDSERVERPLAYERS)
numtracked = MAXTRACKEDSERVERPLAYERS;
SV_ExpandStats(numtracked);
READMEM(save.p, trackedList, (numtracked * sizeof(serverplayer_t)));
}
@ -95,29 +142,33 @@ void SV_SaveStats(void)
}
// New player, grab their stats from trackedList or initialize new ones if they're new
UINT16 *SV_RetrievePWR(uint8_t *key)
serverplayer_t *SV_RetrieveStats(uint8_t *key)
{
UINT32 j;
SV_InitializeStats();
// Existing record?
for(j = 0; j < numtracked; j++)
{
if (memcmp(trackedList[j].public_key, key, PUBKEYLENGTH) == 0)
{
return trackedList[j].powerlevels;
}
return &trackedList[j];
}
// Untracked, make a new record
memcpy(trackedList[numtracked].public_key, key, PUBKEYLENGTH);
// Untracked below this point, make a new record
SV_ExpandStats(numtracked+1);
// Default stats
trackedList[numtracked].lastseen = time(NULL);
memcpy(&trackedList[numtracked].public_key, key, PUBKEYLENGTH);
for(j = 0; j < PWRLV_NUMTYPES; j++)
{
trackedList[numtracked].powerlevels[j] = PR_IsKeyGuest(key) ? 0 : PWRLVRECORD_START;
}
numtracked++;
return trackedList[numtracked - 1].powerlevels;
return &trackedList[numtracked - 1];
}
// Write player stats to trackedList, then save to disk
@ -128,21 +179,22 @@ void SV_UpdateStats(void)
if (!server)
return;
SV_InitializeStats();
for(i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i])
continue;
if (PR_IsKeyGuest(players[i].public_key))
{
continue;
}
for(j = 0; j < numtracked; j++)
{
if (memcmp(trackedList[j].public_key, players[i].public_key, PUBKEYLENGTH) == 0)
if (memcmp(&trackedList[j].public_key, players[i].public_key, PUBKEYLENGTH) == 0)
{
memcpy(trackedList[j].powerlevels, clientpowerlevels[i], sizeof(trackedList[j].powerlevels));
trackedList[j].lastseen = time(NULL);
memcpy(&trackedList[j].powerlevels, clientpowerlevels[i], sizeof(trackedList[j].powerlevels));
break;
}
}

View file

@ -25,13 +25,13 @@ extern "C" {
#endif
#define SERVERSTATSFILE "srvstats.dat"
#define MAXTRACKEDSERVERPLAYERS 9999
#define SERVERSTATSHEADER "Doctor Robotnik's Ring Racers Server Stats"
#define SERVERSTATSVER 1
struct serverplayer_t
{
uint8_t public_key[PUBKEYLENGTH];
time_t lastseen;
UINT16 powerlevels[PWRLV_NUMTYPES];
};
@ -39,7 +39,7 @@ void SV_SaveStats(void);
void SV_LoadStats(void);
UINT16 *SV_RetrievePWR(uint8_t *key);
serverplayer_t *SV_RetrieveStats(uint8_t *key);
void SV_UpdateStats(void);