All pastes #805673 Raw Edit

Untitled

public text v1 · immutable
·published 2007-12-04 15:46 UTC
rendered paste body
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);
}