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