static void Cmd_Modellist_f (void)
{
int i;
unsigned n;
int maxclientsupportedmodels;
if (sv_client->state != cs_connected)
{
Con_Printf ("modellist not valid -- already spawned\n");
return;
}
// handle the case of a level changing while a client was connecting
if (Q_atoi(Cmd_Argv(1)) != svs.spawncount)
{
SV_ClearReliable (sv_client);
Con_Printf ("SV_Modellist_f from different level\n");
Cmd_New_f ();
return;
}
n = atoi(Cmd_Argv(2));
//NOTE: This doesn't go through ClientReliableWrite since it's before the user
//spawns. These functions are written to not overflow
if (sv_client->num_backbuf)
{
Con_Printf("WARNING %s: [SV_Modellist] Back buffered (%d0), clearing\n", sv_client->name, sv_client->netchan.message.cursize);
sv_client->num_backbuf = 1;
SZ_Clear(&sv_client->netchan.message);
}
if (n >= MAX_MODELS)
{
SV_ClearReliable (sv_client);
SV_ClientPrintf (sv_client, PRINT_HIGH,
"SV_Modellist_f: Invalid modellist index\n");
SV_DropClient (sv_client);
return;
}
if (n >= 255)
{
MSG_WriteByte (&sv_client->netchan.message, svc_modellistshort);
MSG_WriteShort (&sv_client->netchan.message, n);
}
else
{
MSG_WriteByte (&sv_client->netchan.message, svc_modellist);
MSG_WriteByte (&sv_client->netchan.message, n);
}
maxclientsupportedmodels = 256;
if (sv_client->fteprotocolextensions & PEXT_MODELDBL)
maxclientsupportedmodels *= 2;
/*if (sv.democausesreconnect) //read the list from somewhere else
{
for (i = 1+n;
*sv.demmodel_precache[i] && ((n&255)==0||host_client->netchan.message.cursize < (MAX_QWMSGLEN/2));
i++, n++)
MSG_WriteString (&host_client->netchan.message, sv.demmodel_precache[i]);
if (!*sv.demmodel_precache[i])
n = 0;
}
else
{*/
for (i = 1+n;
i < maxclientsupportedmodels && sv.model_precache[i] && sv_client->netchan.message.cursize < (MAX_MSGLEN/2); //make sure we don't send a 0 next...
i++)
{
MSG_WriteString (&sv_client->netchan.message, sv.model_precache[i]);
if (((n&255)==255) && n != i-1)
break;
}
n = i-1;
if (!sv.model_precache[i])
n = 0;
// }
if (i == maxclientsupportedmodels)
n = 0; //doh!
MSG_WriteByte (&sv_client->netchan.message, 0);
// next msg
MSG_WriteByte (&sv_client->netchan.message, n);
}